package Builder; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import Common.Box2; import Common.Size2; import Common.Vector2f; import LDraw.Support.LDrawPaths; import LDraw.Support.LDrawUtilities; import LDraw.Support.type.LDrawGridTypeT; import Notification.NotificationCenter; import Notification.NotificationMessageT; public class BuilderConfigurationManager { private static BuilderConfigurationManager _instance = null; private String configurationFilename = getDefaultDataDirectoryPath() + "MOCBuilder.ini"; private static String DefaultDataDirectoryPath = null; private String ldrawDirectory; private Box2 windowBoundingBox; private boolean resetConfiguration; private int[] sashDivision; private int partBrowserMode; private boolean useConnectivity; private boolean useCollision; private LDrawGridTypeT gridUnit; private boolean useDefaultBaseplate; private boolean turnOffSound; private final String DefaultLDrawDirectory; private final Box2 DefaultWindowBoundingBox; private final boolean DefaultResetConfiguration; private final int[] DefaultSashDivision; private final int DefaultPartBrowserMode; private final boolean DefaultUseConnectivity; private final boolean DefaultUseCollision; private final LDrawGridTypeT DefaultGridUnit; private final boolean DefaultUseDefaultBasePlate; private final boolean DefaultTurnOffSound; public static final String getDefaultDataDirectoryPath() { if (DefaultDataDirectoryPath == null) { if (System.getProperty("os.name").toLowerCase().contains("windows")) { DefaultDataDirectoryPath = (System.getProperty("user.home") + "/MOC Builder/"); } else DefaultDataDirectoryPath = (System.getProperty("user.dir") + "/"); } return DefaultDataDirectoryPath; } private BuilderConfigurationManager() { getDefaultDataDirectoryPath(); DefaultLDrawDirectory = getDefaultDataDirectoryPath() + "LDraw/"; DefaultWindowBoundingBox = new Box2(); DefaultWindowBoundingBox.setOrigin(new Vector2f(0, 0)); DefaultWindowBoundingBox.setSize(new Size2(800, 600)); DefaultResetConfiguration = false; DefaultSashDivision = new int[] { 100, 400, 100 }; DefaultPartBrowserMode = 0; DefaultUseConnectivity = true; DefaultUseCollision = true; DefaultGridUnit = LDrawGridTypeT.Medium; DefaultUseDefaultBasePlate = true; DefaultTurnOffSound = false; ldrawDirectory = DefaultLDrawDirectory; resetConfiguration = DefaultResetConfiguration; windowBoundingBox = new Box2(); windowBoundingBox.setOrigin(DefaultWindowBoundingBox.getOrigin()); windowBoundingBox.setSize(DefaultWindowBoundingBox.getSize()); sashDivision = new int[3]; sashDivision[0] = DefaultSashDivision[0]; sashDivision[1] = DefaultSashDivision[1]; sashDivision[2] = DefaultSashDivision[2]; partBrowserMode = DefaultPartBrowserMode; useConnectivity = DefaultUseConnectivity; useCollision = DefaultUseCollision; gridUnit = DefaultGridUnit; useDefaultBaseplate = DefaultUseDefaultBasePlate; turnOffSound = DefaultTurnOffSound; loadFromFile(); if (resetConfiguration == true) resetConfigurationFile(); checkLdrawDirectory(ldrawDirectory); NotificationCenter.getInstance().postNotification( NotificationMessageT.BrickbuilderConfigurationChanged); } public synchronized static BuilderConfigurationManager getInstance() { if (_instance == null) { _instance = new BuilderConfigurationManager(); } return _instance; } private boolean writeToFile() { File directory = new File(getDefaultDataDirectoryPath()); if (directory.exists() == false) directory.mkdir(); File file = new File(configurationFilename); StringBuilder fileContents = new StringBuilder(); // #LDrawPath(String) default: C:/Program Files (x86)/LDraw/ fileContents .append("#LDrawPath(String) default: C:/Program Files (x86)/LDraw/"); fileContents.append("\r\n"); fileContents.append("LDrawDirectory = " + ldrawDirectory); fileContents.append("\r\n"); fileContents.append("\r\n"); // // #Reset to default setting(boolean) default: false fileContents .append("#Reset to default setting(boolean) default: false"); fileContents.append("\r\n"); fileContents.append("Reset = " + resetConfiguration); fileContents.append("\r\n"); fileContents.append("\r\n"); // // #window pos(int, int) default: 0, 0 fileContents.append("#Window Position(int, int) default: 0, 0"); fileContents.append("\r\n"); fileContents .append("WindowPosition = " + windowBoundingBox.getOrigin()); fileContents.append("\r\n"); fileContents.append("\r\n"); // // #window size(int, int) default: 800, 600 fileContents.append("#window size(int, int) default: 800, 600"); fileContents.append("\r\n"); fileContents.append("WindowSize = " + windowBoundingBox.getSize()); fileContents.append("\r\n"); fileContents.append("\r\n"); // #window sash division(int, int, int) default: 100, 300, 100 fileContents .append("#window sash division(int, int, int) default: 100, 400, 100"); fileContents.append("\r\n"); fileContents.append("WindowSashDivision = " + sashDivision[0] + ", " + sashDivision[1] + ", " + sashDivision[2]); fileContents.append("\r\n"); fileContents.append("\r\n"); // #partBrowser slide size fileContents.append("#PartBrowser Mode"); fileContents.append("\r\n"); fileContents.append("PartBrowserMode = " + partBrowserMode); fileContents.append("\r\n"); fileContents.append("\r\n"); // #use connectivity fileContents.append("#Use Connectivity"); fileContents.append("\r\n"); fileContents.append("UseConnectivity = " + useConnectivity); fileContents.append("\r\n"); fileContents.append("\r\n"); // #use Collision Detection fileContents.append("#Use Collision"); fileContents.append("\r\n"); fileContents.append("UseCollision = " + useCollision); fileContents.append("\r\n"); fileContents.append("\r\n"); // #use Default BasePlate fileContents.append("#Use Default Baseplate"); fileContents.append("\r\n"); fileContents.append("UseDefaultBaseplate = " + useDefaultBaseplate); fileContents.append("\r\n"); fileContents.append("\r\n"); // #use Default BasePlate fileContents.append("#Turn Off Sound"); fileContents.append("\r\n"); fileContents.append("TurnOffSound = " + turnOffSound); fileContents.append("\r\n"); fileContents.append("\r\n"); // #Grid Unit fileContents.append("#Grid Unit"); fileContents.append("\r\n"); fileContents.append("GridUnit = " + gridUnit); fileContents.append("\r\n"); fileContents.append("\r\n"); try { BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(file)); bos.write(fileContents.toString().getBytes()); bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } public void loadFromFile() { String fileContents = null; fileContents = LDrawUtilities.stringFromFile(configurationFilename); if (fileContents == null) { resetConfigurationFile(); } else { String[] lines = fileContents.replaceAll("\r", "").split("\n"); for (String line : lines) { parseLine(line); } } } private void parseLine(String line) { if (line.startsWith("LDrawDirectory")) { try { String tempString = line.substring(line.indexOf("=") + 1); if (tempString.endsWith("/") == false && tempString.endsWith("\\") == false) ldrawDirectory = tempString + "/"; else ldrawDirectory = tempString; ldrawDirectory = ldrawDirectory.trim(); } catch (Exception e) { } } else if (line.startsWith("Reset")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); resetConfiguration = Boolean.parseBoolean(tempString); } catch (Exception e) { } } else if (line.startsWith("WindowPosition")) { try { String tempString = line.substring(line.indexOf("=") + 1); String[] tokens = tempString.split(","); Vector2f pos = new Vector2f(Float.parseFloat(tokens[0]), Float.parseFloat(tokens[1])); windowBoundingBox.setOrigin(pos); } catch (Exception e) { e.printStackTrace(); } } else if (line.startsWith("WindowSize")) { try { String tempString = line.substring(line.indexOf("=") + 1); String[] tokens = tempString.split(","); Size2 size = new Size2(Float.parseFloat(tokens[0]), Float.parseFloat(tokens[1])); windowBoundingBox.setSize(size); } catch (Exception e) { } } else if (line.startsWith("WindowSashDivision")) { try { String tempString = line.substring(line.indexOf("=") + 1); String[] tokens = tempString.split(","); for (int i = 0; i < 3; i++) { int value = Integer.parseInt(tokens[i].trim()); sashDivision[i] = value; } } catch (Exception e) { } } else if (line.startsWith("PartBrowserMode")) { try { String tempString = line.substring(line.indexOf("=") + 1); int value = Integer.parseInt(tempString.trim()); partBrowserMode = value; } catch (Exception e) { } } else if (line.startsWith("UseConnectivity")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); useConnectivity = Boolean.parseBoolean(tempString); } catch (Exception e) { } } else if (line.startsWith("UseCollision")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); useCollision = Boolean.parseBoolean(tempString); } catch (Exception e) { } } else if (line.startsWith("UseDefaultBaseplate")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); useDefaultBaseplate = Boolean.parseBoolean(tempString); } catch (Exception e) { } } else if (line.startsWith("TurnOffSound")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); turnOffSound = Boolean.parseBoolean(tempString); } catch (Exception e) { } } else if (line.startsWith("GridUnit")) { try { String tempString = line.substring(line.indexOf("=") + 1) .trim(); gridUnit = LDrawGridTypeT.valueOf(tempString); } catch (Exception e) { } } } public void resetConfigurationFile() { ldrawDirectory = DefaultLDrawDirectory; windowBoundingBox = DefaultWindowBoundingBox; resetConfiguration = DefaultResetConfiguration; sashDivision = new int[3]; sashDivision[0] = DefaultSashDivision[0]; sashDivision[1] = DefaultSashDivision[1]; sashDivision[2] = DefaultSashDivision[2]; partBrowserMode = DefaultPartBrowserMode; useDefaultBaseplate = DefaultUseDefaultBasePlate; turnOffSound = DefaultTurnOffSound; writeToFile(); } public void checkLdrawDirectory(String path) { if (path == null) { System.exit(0); } if (path.endsWith("/") == false && path.endsWith("\\") == false) path += File.separator; File ldrawPath = new File(path + LDrawPaths.LDCONFIG_FILE_NAME); if (ldrawPath.exists() == false) { Display display = Display.getDefault(); Shell shell = display.getActiveShell(); if (shell == null) { shell = new Shell(display); } DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN); dialog.setMessage("Locate LDraw directory"); dialog.setFilterPath(getDefaultDataDirectoryPath() + "ldraw"); dialog.setText("Open Directory"); checkLdrawDirectory(dialog.open()); if (!shell.isDisposed()) { shell.dispose(); } } else { setLDrawDirectory(path); } } public String getLDrawDirectory() { return ldrawDirectory; } public void setLDrawDirectory(String ldrawDirectory) { LDrawPaths.getInstance().setPreferredLDrawPath(ldrawDirectory); this.ldrawDirectory = ldrawDirectory; } public Vector2f getWindowPosition() { return windowBoundingBox.getOrigin(); } public void setWindowPosition(int x, int y) { this.windowBoundingBox.setOrigin(new Vector2f(x, y)); } public Size2 getWindowSize() { return windowBoundingBox.getSize(); } public void setWindowSize(int width, int height) { this.windowBoundingBox.setSize(new Size2(width, height)); } public int[] getSashDivision() { return this.sashDivision; } public void setSashDivision(int[] division) { for (int i = 0; i < 3; i++) sashDivision[i] = division[i]; } public void updateFile() { writeToFile(); } public void setPartBrowserMode(int mode) { partBrowserMode = mode; } public int getPartBrowserMode() { return partBrowserMode; } public boolean isUseConnectivity() { return useConnectivity; } public void setUseConnectivity(boolean useConnectivity) { this.useConnectivity = useConnectivity; } public boolean isUseCollision() { return useCollision; } public void setUseCollision(boolean useCollision) { this.useCollision = useCollision; } public LDrawGridTypeT getGridUnit() { return gridUnit; } public void setGridUnit(LDrawGridTypeT gridUnit) { this.gridUnit = gridUnit; } public boolean isUseDefaultBaseplate() { return useDefaultBaseplate; } public void setUseDefaultBaseplate(boolean enable) { useDefaultBaseplate = enable; } public boolean isTurnOffSound() { return turnOffSound; } public void setTurnOffSound(boolean turnOffSound) { this.turnOffSound = turnOffSound; } }