package dasherJava.core.settings; import java.io.BufferedWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.List; public class SettingsFileWriter { private static final OpenOption[] DEFAULT_OPEN_OPTIONS = new OpenOption[] {StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE}; private static final OpenOption[] FAIL_IF_EXISTING_OPEN_OPTIONS = new OpenOption[] {StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE}; public static void writeSettingsFile(String fileName, Settings settings, boolean failIfExisting) throws IOException { try (BufferedWriter writer = Files.newBufferedWriter(Path.of(fileName), StandardCharsets.UTF_8, failIfExisting ? FAIL_IF_EXISTING_OPEN_OPTIONS : DEFAULT_OPEN_OPTIONS)) { writeIntSetting(writer, "frameRate", settings.getFrameRate()); writeStringSetting(writer, "antialiasing", settings.getAntialiasing()); writeStringSetting(writer, "textAntialiasing", settings.getTextAntialiasing()); writeIntSetting(writer, "windowX", settings.getWindowX()); writeIntSetting(writer, "windowY", settings.getWindowY()); writeIntSetting(writer, "windowWidth", settings.getWindowWidth()); writeIntSetting(writer, "windowHeight", settings.getWindowHeight()); writeIntSetting(writer, "spaceBehindNodes", settings.getSpaceBehindNodes()); writeStringSetting(writer, "windowAlwaysOnTop", settings.getWindowAlwaysOnTop()); writeStringSetting(writer, "windowUnfocusable", settings.getWindowUnfocusable()); writeBooleanSetting(writer, "rememberWindowPosition", settings.getRememberWindowPosition()); writeBooleanSetting(writer, "rememberWindowSize", settings.getRememberWindowSize()); writeBooleanSetting(writer, "showStatusBar", settings.getShowStatusBar()); writeStringSetting(writer, "confirmExit", settings.getConfirmExit()); writeListSetting(writer, "alphabetHistory", settings.getAlphabetHistory()); writeIntSetting(writer, "maxAlphabetHistoryLength", settings.getMaxAlphabetHistoryLength()); writeStringSetting(writer, "colorPaletteNameOverride", settings.getColorPaletteNameOverride()); writeStringSetting(writer, "orientationOverride", settings.getOrientationOverride()); writeIntSetting(writer, "ppmMaxOrder", settings.getPPMMaxOrder()); writeIntSetting(writer, "ppmAlpha", settings.getPPMAlpha()); writeIntSetting(writer, "ppmBeta", settings.getPPMBeta()); writeIntSetting(writer, "ppmUniform", settings.getPPMUniform()); writeStringSetting(writer, "textOutputTarget", settings.getTextOutputTarget()); writeStringSetting(writer, "inputProvider", settings.getInputProvider()); writeBooleanSetting(writer, "startStopOnLeftClick", settings.getStartStopOnLeftClick()); writeFloatSetting(writer, "movementSpeed", settings.getMovementSpeed()); writeBooleanSetting(writer, "onlineLearning", settings.getOnlineLearning()); writeIntSetting(writer, "onlineLearningDelay", settings.getOnlineLearningDelay()); writeIntSetting(writer, "maxNumberOfNodes", settings.getMaxNumberOfNodes()); writeIntSetting(writer, "maxNumberOfOldRootNodes", settings.getMaxNumberOfOldRootNodes()); writeFloatSetting(writer, "minGainForNodeTrade", settings.getMinGainForNodeTrade()); writeFloatSetting(writer, "minNodeSizeForExpansion", settings.getMinNodeSizeForExpansion()); writeFloatSetting(writer, "maxNodeSizeForCollapse", settings.getMaxNodeSizeForCollapse()); writeFloatSetting(writer, "minNodeSizeForRendering", settings.getMinNodeSizeForRendering()); writeFloatSetting(writer, "minGroupSizeForRendering", settings.getMinGroupSizeForRendering()); writeFloatSetting(writer, "dropRootNodeMarginTop", settings.getDropRootNodeMarginTop()); writeFloatSetting(writer, "dropRootNodeMarginBottom", settings.getDropRootNodeMarginBottom()); writeFloatSetting(writer, "dropRootNodeMarginSize", settings.getDropRootNodeMarginSize()); writeFloatSetting(writer, "zoomOutMarginTop", settings.getZoomOutMarginTop()); writeFloatSetting(writer, "zoomOutMarginBottom", settings.getZoomOutMarginBottom()); writeFloatSetting(writer, "zoomOutMarginSize", settings.getZoomOutMarginSize()); writeIntSetting(writer, "normalFontSize", settings.getNormalFontSize()); writeIntSetting(writer, "mediumFontSize", settings.getMediumFontSize()); writeIntSetting(writer, "highlightFontSize", settings.getHighlightFontSize()); writeFloatSetting(writer, "mediumFontSizeMarginBefore", settings.getMediumFontSizeMarginBefore()); writeFloatSetting(writer, "mediumFontSizeMarginAfter", settings.getMediumFontSizeMarginAfter()); writeFloatSetting(writer, "nodeOutlineThickness", settings.getNodeOutlineThickness()); writeFloatSetting(writer, "inputLineThickness", settings.getInputLineThickness()); writeFloatSetting(writer, "crosshairThickness", settings.getCrosshairThickness()); writeFloatSetting(writer, "crosshairWidth", settings.getCrosshairWidth()); writeStringSetting(writer, "startStopHandler", settings.getStartStopHandler()); writeFloatSetting(writer, "circleSize", settings.getCircleSize()); writeFloatSetting(writer, "circleOutlineThickness", settings.getCircleOutlineThickness()); writeFloatSetting(writer, "circleOutlineThicknessHold", settings.getCircleOutlineThicknessHold()); writeIntSetting(writer, "circleHoldStartTime", settings.getCircleHoldStartTime()); writeIntSetting(writer, "circleHoldStopTime", settings.getCircleHoldStopTime()); writeFloatSetting(writer, "firstBoxSize", settings.getFirstBoxSize()); writeFloatSetting(writer, "firstBoxLeftInset", settings.getFirstBoxLeftInset()); writeFloatSetting(writer, "firstBoxRightInset", settings.getFirstBoxRightInset()); writeFloatSetting(writer, "firstBoxOutlineThickness", settings.getFirstBoxOutlineThickness()); writeFloatSetting(writer, "firstBoxOutlineThicknessHold", settings.getFirstBoxOutlineThicknessHold()); writeIntSetting(writer, "firstBoxHoldTime", settings.getFirstBoxHoldTime()); writeIntSetting(writer, "firstBoxResetTime", settings.getFirstBoxResetTime()); writeFloatSetting(writer, "secondBoxSize", settings.getSecondBoxSize()); writeFloatSetting(writer, "secondBoxLeftInset", settings.getSecondBoxLeftInset()); writeFloatSetting(writer, "secondBoxRightInset", settings.getSecondBoxRightInset()); writeFloatSetting(writer, "secondBoxOutlineThickness", settings.getSecondBoxOutlineThickness()); writeFloatSetting(writer, "secondBoxOutlineThicknessHold", settings.getSecondBoxOutlineThicknessHold()); writeIntSetting(writer, "secondBoxHoldTime", settings.getSecondBoxHoldTime()); writeIntSetting(writer, "socketOutputPort", settings.getSocketOutputPort()); writeStringSetting(writer, "joystickInputName", settings.getJoystickInputName()); writeStringSetting(writer, "joystickInputComponentNameX", settings.getJoystickInputComponentNameX()); writeFloatSetting(writer, "joystickInputSensitivityX", settings.getJoystickInputSensitivityX()); writeFloatSetting(writer, "joystickInputOffsetX", settings.getJoystickInputOffsetX()); writeStringSetting(writer, "joystickInputComponentNameY", settings.getJoystickInputComponentNameY()); writeFloatSetting(writer, "joystickInputSensitivityY", settings.getJoystickInputSensitivityY()); writeFloatSetting(writer, "joystickInputOffsetY", settings.getJoystickInputOffsetY()); writeStringSetting(writer, "joystickInputComponentNameStartStop", settings.getJoystickInputComponentNameStartStop()); writeIntSetting(writer, "socketInputPort", settings.getSocketInputPort()); writeStringSetting(writer, "socketInputLabelX", settings.getSocketInputLabelX()); writeFloatSetting(writer, "socketInputMinX", settings.getSocketInputMinX()); writeFloatSetting(writer, "socketInputMaxX", settings.getSocketInputMaxX()); writeStringSetting(writer, "socketInputLabelY", settings.getSocketInputLabelY()); writeFloatSetting(writer, "socketInputMinY", settings.getSocketInputMinY()); writeFloatSetting(writer, "socketInputMaxY", settings.getSocketInputMaxY()); writeStringSetting(writer, "socketInputLabelStartStop", settings.getSocketInputLabelStartStop()); } } private static void writeStringSetting(BufferedWriter writer, String settingName, String value) throws IOException { writer.write(settingName+"="+value); writer.newLine(); } private static void writeIntSetting(BufferedWriter writer, String settingName, int value) throws IOException { writer.write(settingName+"="+value); writer.newLine(); } private static void writeFloatSetting(BufferedWriter writer, String settingName, float value) throws IOException { writer.write(settingName+"="+value); writer.newLine(); } private static void writeBooleanSetting(BufferedWriter writer, String settingName, boolean value) throws IOException { writer.write(settingName+"="+value); writer.newLine(); } private static void writeListSetting(BufferedWriter writer, String settingName, List list) throws IOException { StringBuilder sb = new StringBuilder(settingName); sb.append("="); for (String s : list) { sb.append(s.replace(";", "\\;")); //escape existing semicolons with a backslash sb.append(";"); } writer.write(sb.toString()); writer.newLine(); } }