DasherJava / src / dasherJava / core / settings / SettingsFileWriter.java
SettingsFileWriter.java
Raw
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();
	}
}