diff --git a/src/main/java/com/ardublock/Main.java b/src/main/java/com/ardublock/Main.java index facd690ddd5124acba82f5c7dbaa7cfdcf74ca4f..1f4d9ead41228e75dc564d19b303e9ac705c911b 100644 --- a/src/main/java/com/ardublock/Main.java +++ b/src/main/java/com/ardublock/Main.java @@ -1,5 +1,6 @@ package com.ardublock; +import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; @@ -33,6 +34,7 @@ public class Main { openblocksFrame = new OpenblocksFrame(); openblocksFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + Context context = Context.getContext(); context.setInArduino(false); openblocksFrame.setVisible(true); diff --git a/src/main/java/com/ardublock/core/Context.java b/src/main/java/com/ardublock/core/Context.java index 7ab7e7d6dc4b4bce300832ccb1dc3745a9835851..ecd42a1d8349f635fec18bc4e7785465f2bb11a7 100644 --- a/src/main/java/com/ardublock/core/Context.java +++ b/src/main/java/com/ardublock/core/Context.java @@ -16,17 +16,21 @@ import java.util.Set; import processing.app.Editor; +import processing.app.PreferencesData; + import com.ardublock.ui.listener.OpenblocksFrameListener; import edu.mit.blocks.controller.WorkspaceController; import edu.mit.blocks.renderable.RenderableBlock; import edu.mit.blocks.workspace.Workspace; + public class Context { public final static String LANG_DTD_PATH = "/com/ardublock/block/lang_def.dtd"; public final static String ARDUBLOCK_LANG_PATH = "/com/ardublock/block/ardublock.xml"; public final static String ARDUBLOCK_LANG_RESOURCE_BUNDLE = "com/ardublock/block/ardublock"; public final static String DEFAULT_ARDUBLOCK_PROGRAM_PATH = "/com/ardublock/defaultProgram.abp"; + public final static String DEFAULT_ARDUBLOCK_PREFRENCES_PATH = "/com/ardublock/defaultArduBlockPreferences.txt"; public final static String ARDUINO_VERSION_UNKNOWN = "unknown"; public final boolean isNeedAutoFormat = true; @@ -80,6 +84,11 @@ public class Context private Context() { + //set default values to preferences.txt + if(!PreferencesData.has("ardublock")){ + setDefaultPreferences(); + } + workspaceController = new WorkspaceController(); resetWorkspace(); workspace = workspaceController.getWorkspace(); @@ -124,8 +133,7 @@ public class Context } private void loadDefaultArdublockProgram() - { - + { workspaceController.resetWorkspace(); String loadPath = ""; @@ -137,7 +145,12 @@ public class Context e2.printStackTrace(); } try { - workspaceController.loadProjectFromPath(loadPath); + if(PreferencesData.get("ardublock.workspace.mode").contains("custom") || PreferencesData.get("ardublock.workspace.mode").contains("page")) { + workspaceController.loadProjectFromPath(loadPath, PreferencesData.get("ardublock.workspace.mode")); + }else { + workspaceController.loadProjectFromPath(loadPath); + } + } catch (IOException e1) { try { InputStream is = getClass().getResourceAsStream(DEFAULT_ARDUBLOCK_PROGRAM_PATH); @@ -153,8 +166,12 @@ public class Context br.close(); isr.close(); is.close(); - - workspaceController.loadProject(defaultFileString, null , "default"); + + if(PreferencesData.get("ardublock.workspace.mode").contains("custom") || PreferencesData.get("ardublock.workspace.mode").contains("page")) { + workspaceController.loadProject(defaultFileString, null , PreferencesData.get("ardublock.workspace.mode")); + } else { + workspaceController.loadProject(defaultFileString, null , "default"); + } } catch (IOException e) { // TODO Auto-generated catch block @@ -163,6 +180,14 @@ public class Context } } + private void setDefaultPreferences() {//letsgoING + PreferencesData.setBoolean("ardublock", true); + //PreferencesData.set("ardublock.ui.language", "DE"); //TODO: implement + PreferencesData.set("ardublock.workspace.mode", "default"); //"default" / "custom" / "page" + PreferencesData.setInteger("ardublock.workspace.zoom", 10); // float values between + //PreferencesData.set("ardublock.workspace.code", "simple"); //TODO: implement +} + //determine OS private OsType determineOsType() { diff --git a/src/main/java/com/ardublock/ui/OpenblocksFrame.java b/src/main/java/com/ardublock/ui/OpenblocksFrame.java index bf10a0c2632d74c3efc98508c9e1a79d61098cd4..37ae8f113d8a6a1649f8b35a417c2c333befef68 100644 --- a/src/main/java/com/ardublock/ui/OpenblocksFrame.java +++ b/src/main/java/com/ardublock/ui/OpenblocksFrame.java @@ -11,6 +11,8 @@ import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; @@ -65,6 +67,7 @@ import edu.mit.blocks.controller.WorkspaceController; import edu.mit.blocks.workspace.SearchBar; import edu.mit.blocks.workspace.SearchableContainer; import edu.mit.blocks.workspace.Workspace; +import processing.app.PreferencesData; //import edu.mit.blocks.workspace.ZoomSlider; import tec.letsgoing.ardublock.simulator.view.GUI; @@ -83,14 +86,17 @@ public class OpenblocksFrame extends JFrame private JFileChooser fileChooser; private FileFilter ffilter; private boolean workspaceModeState = false; - private ResourceBundle uiMessageBundle; private String appPrefix = ""; + //private ResourceBundle uiMessageBundle; + private static ResourceBundle uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock"); - JButton modeBasicButton = null; - JButton modeProButton = null; - JButton modeSimButton = null; + private JButton modeBasicButton = null; + private JButton modeProButton = null; + private JButton modeSimButton = null; - SearchBar searchBar = null; + private SearchBar searchBar = null; + + private String blockMenuMode = "default"; public void addListener(OpenblocksFrameListener ofl) { @@ -98,7 +104,7 @@ public class OpenblocksFrame extends JFrame } public String makeFrameTitle() - { + { String title = Context.APP_NAME + " " + appPrefix +" "+context.getSaveFileName(); if (context.isWorkspaceChanged()) { @@ -118,8 +124,6 @@ public class OpenblocksFrame extends JFrame this.setLocationRelativeTo(null); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock"); - fileChooser = new JFileChooser(); ffilter = new FileNameExtensionFilter(uiMessageBundle.getString("ardublock.file.suffix"), "abp"); fileChooser.setFileFilter(ffilter); @@ -133,7 +137,7 @@ public class OpenblocksFrame extends JFrame } private void initOpenBlocks() - { + { final Context context = Context.getContext(); /* @@ -143,6 +147,18 @@ public class OpenblocksFrame extends JFrame final Workspace workspace = context.getWorkspace(); + + //override close operation + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent we) { + PreferencesData.set("ardublock.workspace.mode", blockMenuMode); + PreferencesData.setInteger("ardublock.workspace.zoom", (int)(workspace.getCurrentWorkspaceZoom()*10)); + if(context.isWorkspaceChanged() && askUserSaveFileOnExit()){ + doSaveArduBlockFile(); + } + } + }); + // WTF I can't add workspacelistener by workspace controller workspace.addWorkspaceListener(new ArdublockWorkspaceListener(this)); @@ -151,6 +167,21 @@ public class OpenblocksFrame extends JFrame searchBar = new SearchBar(uiMessageBundle.getString("ardublock.ui.search"), uiMessageBundle.getString("ardublock.ui.search.tooltip"), workspace); addSearchableBlocks(workspace); + + blockMenuMode = PreferencesData.get("ardublock.workspace.mode"); + + String zoomString = PreferencesData.get("ardublock.workspace.zoom"); + if(zoomString != null && zoomString.matches("[0-9.]+")) { + workspace.setWorkspaceZoom(((double) Integer.parseInt(zoomString))/10.0); + } + + if(blockMenuMode.contentEquals("custom")) { + appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.pro"); + }else if (blockMenuMode.contentEquals("page")) { + appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.sim"); + } else { + appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.standard"); + } //NEW //********** @@ -521,6 +552,8 @@ public class OpenblocksFrame extends JFrame ButtonMouseListener modeProButtonMouseListener = new ButtonMouseListener(modeProButtonIcon, modeProButtonIconHovered, modeProButtonIconPressed, modeProButtonIconSelected); ButtonMouseListener modeSimButtonMouseListener = new ButtonMouseListener(modeSimButtonIcon, modeSimButtonIconHovered, modeSimButtonIconPressed, modeSimButtonIconSelected); + + //Workspace: BASIC //***************** ActionListener modeBasicButtonListener = new ActionListener () { @@ -564,6 +597,7 @@ public class OpenblocksFrame extends JFrame appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.standard"); setTitle(makeFrameTitle()); + blockMenuMode = "default"; //zoomSlider.reset(); //zoomSlider.setValue(currentWorkspaceZoom); workspace.setWorkspaceZoom(currentWorkspaceZoom); @@ -633,7 +667,7 @@ public class OpenblocksFrame extends JFrame //modeSimButton.setFont(new Font("Sans", Font.PLAIN, 12)); appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.pro"); setTitle(makeFrameTitle()); - + blockMenuMode = "custom"; //zoomSlider.reset(); //zoomSlider.setValue(currentWorkspaceZoom); workspace.setWorkspaceZoom(currentWorkspaceZoom); @@ -702,7 +736,7 @@ public class OpenblocksFrame extends JFrame //modeSimButton.setFont(new Font("Sans", Font.BOLD, 12)); appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.sim"); setTitle(makeFrameTitle()); - + blockMenuMode = "page"; //zoomSlider.reset(); //zoomSlider.setValue(currentWorkspaceZoom); workspace.setWorkspaceZoom(currentWorkspaceZoom); @@ -730,6 +764,51 @@ public class OpenblocksFrame extends JFrame //***************************************** + if(PreferencesData.get("ardublock.workspace.mode").contentEquals("custom")) { + generateButton.setVisible(true); + generateMenuItem.setVisible(true); + generateMenuItem.registerKeyboardAction(generateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW); + simulateButton.setVisible(false); + simulateMenuItem.setVisible(false); + simulateMenuItem.unregisterKeyboardAction(ctrluKeyStroke); + //helpButton.setVisible(false); + helpButton.removeActionListener(simulatorHelpButtonListener); + helpButton.addActionListener(helpButtonListener); + helpButton.setToolTipText(uiMessageBundle.getString("ardublock.ui.help.tooltip")); + serialMonitorButton.setVisible(true); + serialPlotterButton.setVisible(true); + modeBasicButtonMouseListener.setSelected(false); + modeProButtonMouseListener.setSelected(true); + modeSimButtonMouseListener.setSelected(false); + modeBasicButton.setIcon(modeBasicButtonIcon); + modeProButton.setIcon(modeProButtonIconSelected); + modeSimButton.setIcon(modeSimButtonIcon); + }else if (PreferencesData.get("ardublock.workspace.mode").contentEquals("page")) { + generateButton.setVisible(false); + generateMenuItem.setVisible(false); + generateMenuItem.unregisterKeyboardAction(ctrluKeyStroke); + simulateButton.setVisible(true); + simulateMenuItem.setVisible(true); + simulateMenuItem.registerKeyboardAction(simulateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW); + //helpButton.setVisible(true); + helpButton.removeActionListener(helpButtonListener); + helpButton.addActionListener(simulatorHelpButtonListener); + helpButton.setToolTipText(uiMessageBundle.getString("ardublock.ui.simulatorHelp.tooltip")); + serialMonitorButton.setVisible(false); + serialPlotterButton.setVisible(false); + modeBasicButtonMouseListener.setSelected(false); + modeProButtonMouseListener.setSelected(false); + modeSimButtonMouseListener.setSelected(true); + modeBasicButton.setIcon(modeBasicButtonIcon); + modeProButton.setIcon(modeProButtonIcon); + modeSimButton.setIcon(modeSimButtonIconSelected); + } else { + //modeBasicButtonMouseListener.setSelected(true); + //modeProButtonMouseListener.setSelected(false); + //modeSimButtonMouseListener.setSelected(false); + } + + //COPY PROGRAM //***************************************** KeyStroke ctrlcKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK); @@ -1114,9 +1193,15 @@ public class OpenblocksFrame extends JFrame return null; } + private boolean askUserSaveFileOnExit() + { + int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.saveOnExit"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION); + return (optionValue == JOptionPane.YES_OPTION); + } + private boolean askUserOverwriteExistedFile() { - int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.overwrite"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION); + int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.overwrite"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION); return (optionValue == JOptionPane.YES_OPTION); } @@ -1297,6 +1382,14 @@ public class OpenblocksFrame extends JFrame return workspaceModeState; } + + + + private void savePreferences(Workspace workspace) { //on ArduBlock close??? + //PreferencesData.set("ardublock.workspace.mode", blockMenuMode); //"default" / "standard" / "custom"; + PreferencesData.setInteger("ardublock.workspace.zoom", (int)(workspace.getCurrentWorkspaceZoom()*10)); // float values between + } + //TODO: TESTTESTTEST private void addLibrary(String libraryName) { diff --git a/src/main/resources/com/ardublock/block/ardublock.properties b/src/main/resources/com/ardublock/block/ardublock.properties index 4649738ea521a99a3002f688452baaeb6f5403ab..38d61eb46a4648a62398d792105e954de7fff8f2 100644 --- a/src/main/resources/com/ardublock/block/ardublock.properties +++ b/src/main/resources/com/ardublock/block/ardublock.properties @@ -142,6 +142,7 @@ message.content.overwriteDefault=Do you want to overwrite default file? message.file_not_found=File not found or permission denied message.file_not_found_new_file=File Not Found or permission denied.\nCreate new file? message.content.overwriteImage=Do you want to overwrite existing image? +message.content.saveOnExit=Do you want to save the file before closing ArduBlock? message.question.newfile_on_workspace_changed=The program has changed, do you want to create a new Ardublock file? diff --git a/src/main/resources/com/ardublock/block/ardublock_de.properties b/src/main/resources/com/ardublock/block/ardublock_de.properties index 33bbb7922931d687a64e17f9f81382b07691e73f..d2b41b88da9058b5107551941296e30400061961 100644 --- a/src/main/resources/com/ardublock/block/ardublock_de.properties +++ b/src/main/resources/com/ardublock/block/ardublock_de.properties @@ -146,6 +146,7 @@ message.file_not_found=Datei wurde nicht gefunden oder der Zugriff wurde verweig message.file_not_found_new_file=Datei wurde nicht gefunden oder der Zugriff wurde verweigert.\nSoll eine neue Datei erstellt werden? message.question.newfile_on_workspace_changed=Das Programm hat sich geändert, soll eine neue Ardublock-Datei erstellt werden? message.content.overwriteImage=Soll das vorhandene Bild überschrieben werden? +message.content.saveOnExit=Soll das Programm gespeichert werden bevor ArduBlock geschlossen wird? ################## # BLOCK CONFIG # diff --git a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties index 80189ecde1f3da08d0354f738bcdc25f5711263f..de3fdf2c1c27ab00a120faedfa9e810bfc445ea2 100644 --- a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties +++ b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties @@ -147,6 +147,7 @@ message.file_not_found=Datei wurde nicht gefunden oder der Zugriff wurde verweig message.file_not_found_new_file=Datei wurde nicht gefunden oder der Zugriff wurde verweigert.\nSoll eine neue Datei erstellt werden? message.question.newfile_on_workspace_changed=Das Programm hat sich geändert, soll eine neue Ardublock-Datei erstellt werden? message.content.overwriteImage=Soll das vorhandene Bild überschrieben werden? +message.content.saveOnExit=Soll das Programm gespeichert werden bevor ArduBlock geschlossen wird? ################## # BLOCK CONFIG #