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<String> 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();
}
}