diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 727c5e465..4ed003d9f 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -295,11 +295,16 @@ public class Base { Preferences.setInteger("last.screen.width", screen.width); Preferences.setInteger("last.screen.height", screen.height); + String untitledPath = untitledFolder.getAbsolutePath(); + // Save the sketch path and window placement for each open sketch Preferences.setInteger("last.sketch.count", editorCount); //System.out.println("saving sketch count " + editorCount); for (int i = 0; i < editorCount; i++) { String path = editors[i].sketch.getMainFilePath(); + if (path.startsWith(untitledPath)) { + path = ""; // this will prevent it from opening + } Preferences.set("last.sketch" + i + ".path", path); int[] location = editors[i].getPlacement(); @@ -307,6 +312,37 @@ public class Base { Preferences.set("last.sketch" + i + ".location", locationStr); } } + + + // If a sketch is untitled on quit, may need to store the new name + // rather than the location from the temp folder. + protected void storeSketchPath(Editor editor, int index) { + String path = editor.sketch.getMainFilePath(); + String untitledPath = untitledFolder.getAbsolutePath(); + if (path.startsWith(untitledPath)) { + path = ""; + } + Preferences.set("last.sketch" + index + ".path", path); + } + + + /* + public void storeSketch(Editor editor) { + int index = -1; + for (int i = 0; i < editorCount; i++) { + if (editors[i] == editor) { + index = i; + break; + } + } + if (index == -1) { + System.err.println("Problem storing sketch " + editor.sketch.name); + } else { + String path = editor.sketch.getMainFilePath(); + Preferences.set("last.sketch" + index + ".path", path); + } + } + */ // ................................................................. @@ -528,9 +564,11 @@ public class Base { } + /* public void handleOpen(File file) { handleOpen(file.getAbsolutePath()); } + */ /** @@ -614,9 +652,13 @@ public class Base { boolean canceled = false; for (int i = 0; i < editorCount; i++) { - if (!handleClose(editors[i], true)) { + Editor editor = editors[i]; + if (!handleClose(editor, true)) { canceled = true; break; + } else { + // Update to the new/final sketch path for this fella + storeSketchPath(editor, i); } } if (!canceled) { diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index f0daaf576..b8cb8aacc 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -47,7 +47,7 @@ public class Editor extends JFrame { Base base; // yeah - static final String WINDOW_TITLE = "Processing" + " - " + Base.VERSION_NAME; + static final String WINDOW_TITLE = "Processing " + Base.VERSION_NAME; // p5 icon for the window static Image icon; @@ -59,14 +59,19 @@ public class Editor extends JFrame { " " + " "; + /** Command on Mac OS X, Ctrl on Windows and Linux */ static final int SHORTCUT_KEY_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + /** Command-W on Mac OS X, Ctrl-W on Windows and Linux */ static public final KeyStroke WINDOW_CLOSE_KEYSTROKE = KeyStroke.getKeyStroke('W', SHORTCUT_KEY_MASK); + /** Command-Option on Mac OS X, Ctrl-Alt on Windows and Linux */ + static public final int SHORTCUT_ALT_KEY_MASK = ActionEvent.ALT_MASK | + Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - static final int HANDLE_NEW = 1; - static final int HANDLE_OPEN = 2; - static final int HANDLE_QUIT = 3; + //static final int HANDLE_NEW = 1; + //static final int HANDLE_OPEN = 2; + //static final int HANDLE_QUIT = 3; //int checkModifiedMode; //String handleOpenPath; @@ -112,8 +117,6 @@ public class Editor extends JFrame { // True if the sketchbook has changed since this Editor was last active. boolean sketchbookUpdated; - // - boolean running; boolean presenting; @@ -125,8 +128,6 @@ public class Editor extends JFrame { // used internally, and only briefly CompoundEdit compoundEdit; - // - //SketchHistory history; // TODO re-enable history //Sketchbook sketchbook; FindReplace find; @@ -280,7 +281,8 @@ public class Editor extends JFrame { String name = filename.substring(0, filename.length() - 4); File parent = file.getParentFile(); if (name.equals(parent.getName())) { - base.handleOpen(file); + base.handleOpen(file.getAbsolutePath()); + // Only opens the first sketch dragged into the window return true; } } @@ -883,6 +885,15 @@ public class Editor extends JFrame { return menuItem; } + + static public JMenuItem newJMenuItemAlt(String title, int what) { + JMenuItem menuItem = new JMenuItem(title); + //int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + //menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers)); + menuItem.setAccelerator(KeyStroke.getKeyStroke(what, SHORTCUT_ALT_KEY_MASK)); + return menuItem; + } + // ................................................................... @@ -1314,111 +1325,6 @@ public class Editor extends JFrame { } - /** - * Check to see if there have been changes. If so, prompt user - * whether or not to save first. If the user cancels, just ignore. - * Otherwise, one of the other methods will handle calling - * checkModified2() which will get on with business. - */ - /* - protected void checkModified(int checkModifiedMode) { - this.checkModifiedMode = checkModifiedMode; - - if (!sketch.modified) { - checkModified2(); - return; - } - - String prompt = "Save changes to " + sketch.name + "? "; - - if (checkModifiedMode != HANDLE_QUIT) { - // if the user is not quitting, then use simpler nicer - // dialog that's actually inside the p5 window. - status.prompt(prompt); - - } else { - if (!Base.isMacOS() || PApplet.javaVersion < 1.5f) { - int result = - JOptionPane.showConfirmDialog(this, prompt, "Quit", - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (result == JOptionPane.YES_OPTION) { - handleSave(true); - checkModified2(); - - } else if (result == JOptionPane.NO_OPTION) { - checkModified2(); - } - // cancel is ignored altogether - - } else { - // This code is disabled unless Java 1.5 is being used on Mac OS X - // because of a Java bug that prevents the initial value of the - // dialog from being set properly (at least on my MacBook Pro). - // The bug causes the "Don't Save" option to be the highlighted, - // blinking, default. This sucks. But I'll tell you what doesn't - // suck--workarounds for the Mac and Apple's snobby attitude about it! - - // adapted from the quaqua guide - // http://www.randelshofer.ch/quaqua/guide/joptionpane.html - JOptionPane pane = - new JOptionPane(" " + - "
" + - "Do you want to save changes to this sketchIf you don't save, your changes will be lost.", - JOptionPane.QUESTION_MESSAGE); - - String[] options = new String[] { - "Save", "Cancel", "Don't Save" - }; - pane.setOptions(options); - - // highlight the safest option ala apple hig - pane.setInitialValue(options[0]); - - // on macosx, setting the destructive property places this option - // away from the others at the lefthand side - pane.putClientProperty("Quaqua.OptionPane.destructiveOption", - new Integer(2)); - - JDialog dialog = pane.createDialog(this, null); - dialog.show(); - - Object result = pane.getValue(); - if (result == options[0]) { // save (and quit) - handleSave(true); - checkModified2(); - - } else if (result == options[2]) { // don't save (still quit) - checkModified2(); - } - } - } - } - */ - - - /** - * Called by EditorStatus to complete the job and re-dispatch - * to handleNew, handleOpen, handleQuit. - */ - /* - public void checkModified2() { - switch (checkModifiedMode) { - case HANDLE_NEW: handleNew2(false); break; - case HANDLE_OPEN: handleOpen2(handleOpenPath); break; - case HANDLE_QUIT: handleQuit2(); break; - } - checkModifiedMode = 0; - } - */ - - /** * Open a sketch given the full path to the .pde file. * Pass in 'null' to prompt the user for the name of the sketch. @@ -1452,8 +1358,8 @@ public class Editor extends JFrame { * Open a sketch from a particular path, but don't check to save changes. * Used by Sketch.saveAs() to re-open a sketch after the "Save As" */ - public void handleOpenUnchecked(String path, int codeIndex, - int selStart, int selStop, int scrollPos) { + protected void handleOpenUnchecked(String path, int codeIndex, + int selStart, int selStop, int scrollPos) { doClose(); handleOpen2(path); @@ -1512,8 +1418,8 @@ public class Editor extends JFrame { } else if (!path.endsWith(".pde")) { Base.showWarning("Bad file selected", - "Processing can only open its own sketches\n" + - "and other files ending in .pde", null); + "Processing can only open its own sketches\n" + + "and other files ending in .pde", null); return; } else { @@ -1564,14 +1470,13 @@ public class Editor extends JFrame { } sketch = new Sketch(this, path); - // TODO re-enable this once export application works - //exportAppItem.setEnabled(false); - //exportAppItem.setEnabled(false && !sketch.isLibrary()); - //buttons.disableRun(sketch.isLibrary()); header.rebuild(); + // TODO remove this, it's a moot point for separate windows if (Preferences.getBoolean("console.auto_clear")) { console.clear(); } + // Set the title of the window to "sketch_070752a - Processing 0126" + setTitle(sketch.name + " | " + WINDOW_TITLE); } catch (Exception e) { error(e); @@ -1579,19 +1484,6 @@ public class Editor extends JFrame { } - /* - public boolean handleClose() { - } - */ - - - /* - public void handleClose2() { - base.handleClose(this); - } - */ - - /** * Actually handle the save command. If 'immediately' is set to false, * this will happen in another thread so that the message area diff --git a/app/src/processing/app/EditorHeader.java b/app/src/processing/app/EditorHeader.java index 5092d5674..fe98feef6 100644 --- a/app/src/processing/app/EditorHeader.java +++ b/app/src/processing/app/EditorHeader.java @@ -292,7 +292,8 @@ public class EditorHeader extends JComponent { menu.addSeparator(); */ - item = new JMenuItem("New Tab"); + //item = new JMenuItem("New Tab"); + item = Editor.newJMenuItemAlt("New Tab", 'N'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editor.sketch.newCode(); @@ -300,7 +301,7 @@ public class EditorHeader extends JComponent { }); menu.add(item); - item = new JMenuItem("Rename"); + item = Editor.newJMenuItemAlt("Rename", 'R'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editor.sketch.renameCode(); @@ -357,13 +358,11 @@ public class EditorHeader extends JComponent { // KeyEvent.VK_LEFT and VK_RIGHT will make Windows beep - int ctrlAlt = ActionEvent.ALT_MASK | - Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - //item = Editor.newJMenuItem("Previous Tab", '[', true); item = new JMenuItem("Previous Tab"); //int shortcut = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - KeyStroke ctrlAltLeft = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ctrlAlt); + KeyStroke ctrlAltLeft = + KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Editor.SHORTCUT_ALT_KEY_MASK); item.setAccelerator(ctrlAltLeft); //int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); //KeyStroke tabby = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, modifiers); @@ -380,7 +379,8 @@ public class EditorHeader extends JComponent { //item = Editor.newJMenuItem("Next Tab", ']', true); item = new JMenuItem("Next Tab"); - KeyStroke ctrlAltRight = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ctrlAlt); + KeyStroke ctrlAltRight = + KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Editor.SHORTCUT_ALT_KEY_MASK); item.setAccelerator(ctrlAltRight); /* item.addActionListener(new ActionListener() { diff --git a/app/src/processing/app/EditorStatus.java b/app/src/processing/app/EditorStatus.java index 7d8708fa9..b645f3a1a 100644 --- a/app/src/processing/app/EditorStatus.java +++ b/app/src/processing/app/EditorStatus.java @@ -37,8 +37,9 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { static final int NOTICE = 0; static final int ERR = 1; - static final int PROMPT = 2; - static final int EDIT = 3; + //static final int PROMPT = 2; + //static final int EDIT = 3; + static final int EDIT = 2; static final int YES = 1; static final int NO = 2; @@ -60,8 +61,8 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { int sizeW, sizeH; int imageW, imageH; - JButton yesButton; - JButton noButton; + //JButton yesButton; + //JButton noButton; JButton cancelButton; JButton okButton; JTextField editField; @@ -75,17 +76,17 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { empty(); if (bgcolor == null) { - bgcolor = new Color[4]; + bgcolor = new Color[3]; //4]; bgcolor[0] = Preferences.getColor("status.notice.bgcolor"); bgcolor[1] = Preferences.getColor("status.error.bgcolor"); - bgcolor[2] = Preferences.getColor("status.prompt.bgcolor"); - bgcolor[3] = Preferences.getColor("status.prompt.bgcolor"); + bgcolor[2] = Preferences.getColor("status.edit.bgcolor"); + //bgcolor[3] = Preferences.getColor("status.prompt.bgcolor"); - fgcolor = new Color[4]; + fgcolor = new Color[3]; //4]; fgcolor[0] = Preferences.getColor("status.notice.fgcolor"); fgcolor[1] = Preferences.getColor("status.error.fgcolor"); - fgcolor[2] = Preferences.getColor("status.prompt.fgcolor"); - fgcolor[3] = Preferences.getColor("status.prompt.fgcolor"); + fgcolor[2] = Preferences.getColor("status.edit.fgcolor"); + //fgcolor[3] = Preferences.getColor("status.prompt.fgcolor"); } } @@ -182,7 +183,7 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { public void paintComponent(Graphics screen) { //if (screen == null) return; - if (yesButton == null) setup(); + if (okButton == null) setup(); //System.out.println("status.paintComponent"); @@ -234,9 +235,9 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { protected void setup() { - if (yesButton == null) { - yesButton = new JButton(Preferences.PROMPT_YES); - noButton = new JButton(Preferences.PROMPT_NO); + if (okButton == null) { + //yesButton = new JButton(Preferences.PROMPT_YES); + //noButton = new JButton(Preferences.PROMPT_NO); cancelButton = new JButton(Preferences.PROMPT_CANCEL); okButton = new JButton(Preferences.PROMPT_OK); @@ -263,10 +264,10 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { // !@#(* aqua ui #($*(( that turtle-neck wearing #(** (#$@)( // os9 seems to work if bg of component is set, but x still a bastard if (Base.isMacOS()) { - yesButton.setBackground(bgcolor[PROMPT]); - noButton.setBackground(bgcolor[PROMPT]); - cancelButton.setBackground(bgcolor[PROMPT]); - okButton.setBackground(bgcolor[PROMPT]); + //yesButton.setBackground(bgcolor[EDIT]); + //noButton.setBackground(bgcolor[EDIT]); + cancelButton.setBackground(bgcolor[EDIT]); + okButton.setBackground(bgcolor[EDIT]); } setLayout(null); @@ -277,13 +278,13 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { okButton.addActionListener(this); */ - add(yesButton); - add(noButton); + //add(yesButton); + //add(noButton); add(cancelButton); add(okButton); - yesButton.setVisible(false); - noButton.setVisible(false); + //yesButton.setVisible(false); + //noButton.setVisible(false); cancelButton.setVisible(false); okButton.setVisible(false); @@ -398,13 +399,13 @@ public class EditorStatus extends JPanel /*implements ActionListener*/ { int noLeft = cancelLeft - eachButton; int yesLeft = noLeft - eachButton; - yesButton.setLocation(yesLeft, top); - noButton.setLocation(noLeft, top); + //yesButton.setLocation(yesLeft, top); + //noButton.setLocation(noLeft, top); cancelButton.setLocation(cancelLeft, top); okButton.setLocation(noLeft, top); - yesButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); - noButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); + //yesButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); + //noButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); cancelButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); okButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT); diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 0ea88c999..13829d62e 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -99,11 +99,11 @@ public class Sketch { // get the name of the sketch by chopping .pde or .java // off of the main file name - if (mainFilename.endsWith(".pde")) { - name = mainFilename.substring(0, mainFilename.length() - 4); - } else if (mainFilename.endsWith(".java")) { - name = mainFilename.substring(0, mainFilename.length() - 5); - } + //if (mainFilename.endsWith(".pde")) { + name = mainFilename.substring(0, mainFilename.length() - 4); + //} else if (mainFilename.endsWith(".java")) { + //name = mainFilename.substring(0, mainFilename.length() - 5); + //} // lib/build must exist when the application is started // it is added to the CLASSPATH by default, but if it doesn't diff --git a/build/macosx/make.sh b/build/macosx/make.sh index 38f5fd168..ff16378f6 100755 --- a/build/macosx/make.sh +++ b/build/macosx/make.sh @@ -98,8 +98,6 @@ cd ../app ### -- BUILD PARSER --------------------------------------------- #BUILD_PREPROC=true -echo app is now -ls if $BUILD_PREPROC then @@ -115,9 +113,6 @@ then -glib src/antlr/java/java.g src/processing/app/preproc/pde.g fi -echo app is now -ls - ### -- BUILD PDE ------------------------------------------------ echo Building the PDE... @@ -131,9 +126,6 @@ echo Building the PDE... # version that follows includes jalopy.jar and log4j.jar #../build/macosx/work/jikes -target 1.3 +D -classpath ../build/macosx/work/classes:../build/macosx/work/lib/core.jar:../build/macosx/work/lib/antlr.jar:../build/macosx/work/lib/oro.jar:../build/macosx/work/lib/registry.jar:../build/macosx/work/lib/jalopy.jar:../build/macosx/work/lib/log4j.jar:$CLASSPATH -d ../build/macosx/work/classes tools/*.java preproc/*.java syntax/*.java *.java -echo app is now -ls - cd ../build/macosx/work/classes rm -f ../lib/pde.jar zip -0rq ../lib/pde.jar . diff --git a/build/shared/lib/preferences.txt b/build/shared/lib/preferences.txt index 3c3364a20..6fd789548 100755 --- a/build/shared/lib/preferences.txt +++ b/build/shared/lib/preferences.txt @@ -172,8 +172,10 @@ status.notice.fgcolor = #000000 status.notice.bgcolor = #bbbbaa status.error.fgcolor = #ffffff status.error.bgcolor = #662000 -status.prompt.fgcolor = #000000 -status.prompt.bgcolor = #cc9900 +status.edit.fgcolor = #000000 +status.edit.bgcolor = #cc9900 +#status.prompt.fgcolor = #000000 +#status.prompt.bgcolor = #cc9900 status.font = SansSerif,plain,12 # convert tabs to spaces? how many spaces? diff --git a/todo.txt b/todo.txt index 7baf1b429..fe202e847 100644 --- a/todo.txt +++ b/todo.txt @@ -18,22 +18,24 @@ X if quitting when zero windows are open, mark as such and use untitled X first untitled sketch not being marked as modified X move untitled sketches to the tmp folder X then on save, do a save as that defaults to the sketch folder +X clean up number of new/open/close functions in editor and in base +X make sure drag and drop to open sketch is still working +o make sure double-click pde to open is launching in p5 +X on first save, ask for the name of the project (with default) +X set title of window to the sketch name +X cmd-opt-r for rename, cmd-opt-n for new tab +X save/saveas should use modal dialog +X only use the bottom bar for name, rename, new tab +X remove prompt mode (yes/no/cancel) from EditorStatus _ improve speed of "new", which is calling the rebuild menus _ keep one static list of all pairs of names/files in sketchbook _ tough to do with the multiple directories/submenus _ add methods for "add" and "remove" for sketches _ also a rename method, which could just be a remove and add _ libraries and examples won't be rebuilt during the session +_ test on windows +_ test on linux _ make sure quit being handled properly on windows/linux -_ clean up number of new/open/close functions in editor and in base -_ make sure drag and drop to open sketch is still working -_ make sure double-click pde to open is launching in p5 -_ would also help the opening multiple files thing -_ set title of window to the sketch name -_ on first save, ask for the name of the project (with default) -_ cmd-opt-r for rename? -_ save/saveas should use modal dialog -_ only use the bottom bar for name, rename, new tab _ make editor buttons light up and clear properly _ don't bug the user about new release of p5 when they have it