mirror of
https://github.com/processing/processing4.git
synced 2026-02-14 10:55:38 +01:00
start working on modes, half give-up; also make it possible to have no windows open on macosx
This commit is contained in:
@@ -96,6 +96,8 @@ public class Base {
|
||||
java.util.List<Editor> editors =
|
||||
Collections.synchronizedList(new ArrayList<Editor>());
|
||||
Editor activeEditor;
|
||||
// a lone file menu to be used when all sketch windows are closed
|
||||
static public JMenu defaultFileMenu;
|
||||
|
||||
|
||||
static public void main(final String[] args) {
|
||||
@@ -201,14 +203,16 @@ public class Base {
|
||||
|
||||
|
||||
public Base(String[] args) {
|
||||
platform.init(this);
|
||||
|
||||
// Get paths for the libraries and examples in the Processing folder
|
||||
//String workingDirectory = System.getProperty("user.dir");
|
||||
examplesFolder = getContentFile("examples");
|
||||
librariesFolder = getContentFile("libraries");
|
||||
toolsFolder = getContentFile("tools");
|
||||
|
||||
// Put this after loading the examples, so that building the default file
|
||||
// menu works on Mac OS X (since it needs examplesFolder to be set).
|
||||
platform.init(this);
|
||||
|
||||
// Get the sketchbook path, and make sure it's set properly
|
||||
String sketchbookPath = Preferences.get("sketchbook.path");
|
||||
|
||||
@@ -395,6 +399,214 @@ public class Base {
|
||||
*/
|
||||
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
|
||||
/** 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 final KeyStroke WINDOW_CLOSE_KEYSTROKE =
|
||||
KeyStroke.getKeyStroke('W', SHORTCUT_KEY_MASK);
|
||||
/** Command-Option on Mac OS X, Ctrl-Alt on Windows and Linux */
|
||||
static final int SHORTCUT_ALT_KEY_MASK = ActionEvent.ALT_MASK |
|
||||
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
|
||||
|
||||
/**
|
||||
* A software engineer, somewhere, needs to have his abstraction
|
||||
* taken away. In some countries they jail or beat people for crafting
|
||||
* the sort of API that would require a five line helper function
|
||||
* just to set the shortcut key for a menu item.
|
||||
*/
|
||||
static public JMenuItem newJMenuItem(String title, int what) {
|
||||
JMenuItem menuItem = new JMenuItem(title);
|
||||
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers));
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Like newJMenuItem() but adds shift as a modifier for the shortcut.
|
||||
*/
|
||||
static public JMenuItem newJMenuItemShift(String title, int what) {
|
||||
JMenuItem menuItem = new JMenuItem(title);
|
||||
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
modifiers |= ActionEvent.SHIFT_MASK;
|
||||
menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers));
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Same as newJMenuItem(), but adds the ALT (on Linux and Windows)
|
||||
* or OPTION (on Mac OS X) key as a modifier.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
|
||||
static JMenu sketchbookMenu;
|
||||
static JMenu examplesMenu;
|
||||
static JMenu importMenu;
|
||||
|
||||
|
||||
public JMenu buildFileMenu(final Editor editor) {
|
||||
JMenuItem item;
|
||||
JMenu fileMenu = new JMenu("File");
|
||||
|
||||
item = newJMenuItem("New", 'N');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleNew();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItem("Open...", 'O');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleOpenPrompt();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
if (sketchbookMenu == null) {
|
||||
sketchbookMenu = new JMenu("Sketchbook");
|
||||
rebuildSketchbookMenu(sketchbookMenu);
|
||||
}
|
||||
fileMenu.add(sketchbookMenu);
|
||||
|
||||
if (examplesMenu == null) {
|
||||
examplesMenu = new JMenu("Examples");
|
||||
rebuildExamplesMenu(examplesMenu);
|
||||
}
|
||||
fileMenu.add(examplesMenu);
|
||||
|
||||
item = newJMenuItem("Close", 'W');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleClose(editor);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItem("Save", 'S');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleSave(false);
|
||||
}
|
||||
});
|
||||
editor.setSaveItem(item);
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItemShift("Save As...", 'S');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleSaveAs();
|
||||
}
|
||||
});
|
||||
editor.setSaveAsItem(item);
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItem("Export", 'E');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleExport();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItemShift("Export Application", 'E');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleExportApplication();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItemShift("Page Setup", 'P');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handlePageSetup();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItem("Print", 'P');
|
||||
if (editor != null) {
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handlePrint();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item.setEnabled(false);
|
||||
}
|
||||
fileMenu.add(item);
|
||||
|
||||
// Mac OS X already has its own preferences and quit menu.
|
||||
// That's right! Think different, b*tches!
|
||||
if (!Base.isMacOS()) {
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Preferences", ',');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handlePrefs();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Quit", 'Q');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleQuit();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
}
|
||||
return fileMenu;
|
||||
}
|
||||
|
||||
|
||||
// .................................................................
|
||||
|
||||
|
||||
@@ -721,27 +933,29 @@ public class Base {
|
||||
// if (Preferences.getBoolean("sketchbook.closing_last_window_quits") ||
|
||||
// (editor.untitled && !editor.getSketch().isModified())) {
|
||||
if (Base.isMacOS()) {
|
||||
Object[] options = { "OK", "Cancel" };
|
||||
String prompt =
|
||||
"<html> " +
|
||||
"<head> <style type=\"text/css\">"+
|
||||
"b { font: 13pt \"Lucida Grande\" }"+
|
||||
"p { font: 11pt \"Lucida Grande\"; margin-top: 8px }"+
|
||||
"</style> </head>" +
|
||||
"<b>Are you sure you want to Quit?</b>" +
|
||||
"<p>Closing the last open sketch will quit Processing.";
|
||||
if (defaultFileMenu == null) {
|
||||
Object[] options = { "OK", "Cancel" };
|
||||
String prompt =
|
||||
"<html> " +
|
||||
"<head> <style type=\"text/css\">"+
|
||||
"b { font: 13pt \"Lucida Grande\" }"+
|
||||
"p { font: 11pt \"Lucida Grande\"; margin-top: 8px }"+
|
||||
"</style> </head>" +
|
||||
"<b>Are you sure you want to Quit?</b>" +
|
||||
"<p>Closing the last open sketch will quit Processing.";
|
||||
|
||||
int result = JOptionPane.showOptionDialog(editor,
|
||||
prompt,
|
||||
"Quit",
|
||||
JOptionPane.YES_NO_OPTION,
|
||||
JOptionPane.QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
if (result == JOptionPane.NO_OPTION ||
|
||||
result == JOptionPane.CLOSED_OPTION) {
|
||||
return false;
|
||||
int result = JOptionPane.showOptionDialog(editor,
|
||||
prompt,
|
||||
"Quit",
|
||||
JOptionPane.YES_NO_OPTION,
|
||||
JOptionPane.QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
if (result == JOptionPane.NO_OPTION ||
|
||||
result == JOptionPane.CLOSED_OPTION) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -752,8 +966,17 @@ public class Base {
|
||||
// Save out the current prefs state
|
||||
Preferences.save();
|
||||
|
||||
// Since this wasn't an actual Quit event, call System.exit()
|
||||
System.exit(0);
|
||||
if (defaultFileMenu == null) {
|
||||
// Since this wasn't an actual Quit event, call System.exit()
|
||||
System.exit(0);
|
||||
|
||||
} else {
|
||||
editor.setVisible(false);
|
||||
editor.dispose();
|
||||
defaultFileMenu.insert(Base.sketchbookMenu, 2);
|
||||
defaultFileMenu.insert(Base.examplesMenu, 3);
|
||||
activeEditor = null;
|
||||
}
|
||||
|
||||
} else {
|
||||
// More than one editor window open,
|
||||
@@ -837,7 +1060,7 @@ public class Base {
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
//System.out.println("starting rebuild");
|
||||
rebuildSketchbookMenu(Editor.sketchbookMenu);
|
||||
rebuildSketchbookMenu(sketchbookMenu);
|
||||
rebuildToolbarMenu(Editor.toolbarMenu);
|
||||
//System.out.println("done with rebuild");
|
||||
}
|
||||
@@ -852,7 +1075,7 @@ public class Base {
|
||||
|
||||
//System.out.println("rebuilding toolbar menu");
|
||||
// Add the single "Open" item
|
||||
item = Editor.newJMenuItem("Open...", 'O');
|
||||
item = newJMenuItem("Open...", 'O');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleOpenPrompt();
|
||||
@@ -863,8 +1086,8 @@ public class Base {
|
||||
|
||||
// Add a list of all sketches and subfolders
|
||||
try {
|
||||
//boolean sketches = addSketches(menu, getSketchbookFolder(), true);
|
||||
boolean sketches = addSketches(menu, getSketchbookFolder());
|
||||
boolean sketches = addSketches(menu, getSketchbookFolder(), true);
|
||||
//boolean sketches = addSketches(menu, getSketchbookFolder());
|
||||
if (sketches) menu.addSeparator();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -873,8 +1096,8 @@ public class Base {
|
||||
//System.out.println("rebuilding examples menu");
|
||||
// Add each of the subfolders of examples directly to the menu
|
||||
try {
|
||||
//addSketches(menu, examplesFolder, true);
|
||||
addSketches(menu, examplesFolder);
|
||||
addSketches(menu, examplesFolder, true);
|
||||
//addSketches(menu, examplesFolder);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -886,15 +1109,15 @@ public class Base {
|
||||
//new Exception().printStackTrace();
|
||||
try {
|
||||
menu.removeAll();
|
||||
//addSketches(menu, getSketchbookFolder(), false);
|
||||
addSketches(menu, getSketchbookFolder());
|
||||
addSketches(menu, getSketchbookFolder(), false);
|
||||
//addSketches(menu, getSketchbookFolder());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void rebuildImportMenu(JMenu importMenu) {
|
||||
public void rebuildImportMenu() { //JMenu importMenu) {
|
||||
//System.out.println("rebuilding import menu");
|
||||
importMenu.removeAll();
|
||||
|
||||
@@ -928,8 +1151,8 @@ public class Base {
|
||||
//System.out.println("rebuilding examples menu");
|
||||
try {
|
||||
menu.removeAll();
|
||||
//addSketches(menu, examplesFolder, false);
|
||||
addSketches(menu, examplesFolder);
|
||||
addSketches(menu, examplesFolder, false);
|
||||
//addSketches(menu, examplesFolder);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -942,7 +1165,8 @@ public class Base {
|
||||
* should replace the sketch in the current window, or false when the
|
||||
* sketch should open in a new window.
|
||||
*/
|
||||
protected boolean addSketches(JMenu menu, File folder) throws IOException {
|
||||
protected boolean addSketches(JMenu menu, File folder,
|
||||
final boolean replaceExisting) throws IOException {
|
||||
// skip .DS_Store files, etc (this shouldn't actually be necessary)
|
||||
if (!folder.isDirectory()) return false;
|
||||
|
||||
@@ -959,8 +1183,11 @@ public class Base {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String path = e.getActionCommand();
|
||||
if (new File(path).exists()) {
|
||||
// if (openReplaces) {
|
||||
if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 0) {
|
||||
boolean replace = replaceExisting;
|
||||
if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) {
|
||||
replace = !replace;
|
||||
}
|
||||
if (replace) {
|
||||
handleOpenReplace(path);
|
||||
} else {
|
||||
handleOpen(path);
|
||||
@@ -1016,7 +1243,7 @@ public class Base {
|
||||
// needs to be separate var
|
||||
// otherwise would set ifound to false
|
||||
//boolean found = addSketches(submenu, subfolder, openReplaces); //, false);
|
||||
boolean found = addSketches(submenu, subfolder); //, false);
|
||||
boolean found = addSketches(submenu, subfolder, false);
|
||||
if (found) {
|
||||
menu.add(submenu);
|
||||
ifound = true;
|
||||
|
||||
@@ -56,16 +56,6 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
" " +
|
||||
" ";
|
||||
|
||||
/** 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 final KeyStroke WINDOW_CLOSE_KEYSTROKE =
|
||||
KeyStroke.getKeyStroke('W', SHORTCUT_KEY_MASK);
|
||||
/** Command-Option on Mac OS X, Ctrl-Alt on Windows and Linux */
|
||||
static final int SHORTCUT_ALT_KEY_MASK = ActionEvent.ALT_MASK |
|
||||
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
|
||||
/**
|
||||
* true if this file has not yet been given a name by the user
|
||||
*/
|
||||
@@ -82,9 +72,6 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
// these menus are shared so that they needn't be rebuilt for all windows
|
||||
// each time a sketch is created, renamed, or moved.
|
||||
static JMenu toolbarMenu;
|
||||
static JMenu sketchbookMenu;
|
||||
static JMenu examplesMenu;
|
||||
static JMenu importMenu;
|
||||
|
||||
EditorHeader header;
|
||||
EditorStatus status;
|
||||
@@ -105,7 +92,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
private Point sketchWindowLocation;
|
||||
private Runner runtime;
|
||||
|
||||
private JMenuItem exportAppItem;
|
||||
// private JMenuItem exportAppItem;
|
||||
private JMenuItem saveMenuItem;
|
||||
private JMenuItem saveAsMenuItem;
|
||||
|
||||
@@ -153,19 +140,19 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
public void windowActivated(WindowEvent e) {
|
||||
// EditorConsole.systemOut.println("editor window activated");
|
||||
base.handleActivated(Editor.this);
|
||||
// re-add the sub-menus that are shared by all windows
|
||||
fileMenu.insert(sketchbookMenu, 2);
|
||||
fileMenu.insert(examplesMenu, 3);
|
||||
sketchMenu.insert(importMenu, 4);
|
||||
// // re-add the sub-menus that are shared by all windows
|
||||
fileMenu.insert(Base.sketchbookMenu, 2);
|
||||
fileMenu.insert(Base.examplesMenu, 3);
|
||||
sketchMenu.insert(Base.importMenu, 4);
|
||||
}
|
||||
|
||||
// added for 1.0.5
|
||||
// http://dev.processing.org/bugs/show_bug.cgi?id=1260
|
||||
public void windowDeactivated(WindowEvent e) {
|
||||
// EditorConsole.systemErr.println("editor window deactivated");
|
||||
fileMenu.remove(sketchbookMenu);
|
||||
fileMenu.remove(examplesMenu);
|
||||
sketchMenu.remove(importMenu);
|
||||
fileMenu.remove(Base.sketchbookMenu);
|
||||
fileMenu.remove(Base.examplesMenu);
|
||||
sketchMenu.remove(Base.importMenu);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -430,7 +417,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
protected void buildMenuBar() {
|
||||
JMenuBar menubar = new JMenuBar();
|
||||
menubar = new JMenuBar();
|
||||
menubar.add(buildFileMenu());
|
||||
menubar.add(fileMenu = base.buildFileMenu(this));
|
||||
menubar.add(buildEditMenu());
|
||||
menubar.add(buildSketchMenu());
|
||||
menubar.add(buildToolsMenu());
|
||||
@@ -439,131 +426,21 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
}
|
||||
|
||||
|
||||
protected JMenu buildFileMenu() {
|
||||
JMenuItem item;
|
||||
fileMenu = new JMenu("File");
|
||||
public void setSaveItem(JMenuItem item) {
|
||||
saveMenuItem = item;
|
||||
}
|
||||
|
||||
|
||||
item = newJMenuItem("New", 'N');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handleNew();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
item = Editor.newJMenuItem("Open...", 'O');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handleOpenPrompt();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
if (sketchbookMenu == null) {
|
||||
sketchbookMenu = new JMenu("Sketchbook");
|
||||
base.rebuildSketchbookMenu(sketchbookMenu);
|
||||
}
|
||||
fileMenu.add(sketchbookMenu);
|
||||
|
||||
if (examplesMenu == null) {
|
||||
examplesMenu = new JMenu("Examples");
|
||||
base.rebuildExamplesMenu(examplesMenu);
|
||||
}
|
||||
fileMenu.add(examplesMenu);
|
||||
|
||||
item = Editor.newJMenuItem("Close", 'W');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handleClose(Editor.this);
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
saveMenuItem = newJMenuItem("Save", 'S');
|
||||
saveMenuItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleSave(false);
|
||||
}
|
||||
});
|
||||
fileMenu.add(saveMenuItem);
|
||||
|
||||
saveAsMenuItem = newJMenuItemShift("Save As...", 'S');
|
||||
saveAsMenuItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleSaveAs();
|
||||
}
|
||||
});
|
||||
fileMenu.add(saveAsMenuItem);
|
||||
|
||||
item = newJMenuItem("Export", 'E');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleExport();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
exportAppItem = newJMenuItemShift("Export Application", 'E');
|
||||
exportAppItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
//buttons.activate(EditorButtons.EXPORT);
|
||||
//SwingUtilities.invokeLater(new Runnable() {
|
||||
//public void run() {
|
||||
handleExportApplication();
|
||||
//}});
|
||||
}
|
||||
});
|
||||
fileMenu.add(exportAppItem);
|
||||
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItemShift("Page Setup", 'P');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handlePageSetup();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
item = newJMenuItem("Print", 'P');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handlePrint();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
// macosx already has its own preferences and quit menu
|
||||
if (!Base.isMacOS()) {
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Preferences", ',');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handlePrefs();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
|
||||
fileMenu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Quit", 'Q');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handleQuit();
|
||||
}
|
||||
});
|
||||
fileMenu.add(item);
|
||||
}
|
||||
return fileMenu;
|
||||
public void setSaveAsItem(JMenuItem item) {
|
||||
saveAsMenuItem = item;
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected JMenu buildSketchMenu() {
|
||||
JMenuItem item;
|
||||
sketchMenu = new JMenu("Sketch");
|
||||
|
||||
item = newJMenuItem("Run", 'R');
|
||||
item = Base.newJMenuItem("Run", 'R');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleRun(false);
|
||||
@@ -571,7 +448,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
sketchMenu.add(item);
|
||||
|
||||
item = newJMenuItemShift("Present", 'R');
|
||||
item = Base.newJMenuItemShift("Present", 'R');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleRun(true);
|
||||
@@ -589,13 +466,14 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
|
||||
sketchMenu.addSeparator();
|
||||
|
||||
if (importMenu == null) {
|
||||
importMenu = new JMenu("Import Library...");
|
||||
base.rebuildImportMenu(importMenu);
|
||||
if (Base.importMenu == null) {
|
||||
Base.importMenu = new JMenu("Import Library...");
|
||||
//base.rebuildImportMenu(importMenu);
|
||||
base.rebuildImportMenu();
|
||||
}
|
||||
sketchMenu.add(importMenu);
|
||||
sketchMenu.add(Base.importMenu);
|
||||
|
||||
item = newJMenuItem("Show Sketch Folder", 'K');
|
||||
item = Base.newJMenuItem("Show Sketch Folder", 'K');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Base.openFolder(sketch.getFolder());
|
||||
@@ -883,7 +761,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItemShift("Find in Reference", 'F');
|
||||
item = Base.newJMenuItemShift("Find in Reference", 'F');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (textarea.isSelectionActive()) {
|
||||
@@ -901,7 +779,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Visit Processing.org", '5');
|
||||
item = Base.newJMenuItem("Visit Processing.org", '5');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Base.openURL("http://processing.org/");
|
||||
@@ -929,11 +807,11 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
JMenu menu = new JMenu("Edit");
|
||||
JMenuItem item;
|
||||
|
||||
undoItem = newJMenuItem("Undo", 'Z');
|
||||
undoItem = Base.newJMenuItem("Undo", 'Z');
|
||||
undoItem.addActionListener(undoAction = new UndoAction());
|
||||
menu.add(undoItem);
|
||||
|
||||
redoItem = newJMenuItem("Redo", 'Y');
|
||||
redoItem = Base.newJMenuItem("Redo", 'Y');
|
||||
redoItem.addActionListener(redoAction = new RedoAction());
|
||||
menu.add(redoItem);
|
||||
|
||||
@@ -941,7 +819,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
|
||||
// TODO "cut" and "copy" should really only be enabled
|
||||
// if some text is currently selected
|
||||
item = newJMenuItem("Cut", 'X');
|
||||
item = Base.newJMenuItem("Cut", 'X');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleCut();
|
||||
@@ -949,7 +827,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Copy", 'C');
|
||||
item = Base.newJMenuItem("Copy", 'C');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
textarea.copy();
|
||||
@@ -957,7 +835,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItemShift("Copy as HTML", 'C');
|
||||
item = Base.newJMenuItemShift("Copy as HTML", 'C');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// SwingUtilities.invokeLater(new Runnable() {
|
||||
@@ -969,7 +847,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Paste", 'V');
|
||||
item = Base.newJMenuItem("Paste", 'V');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
textarea.paste();
|
||||
@@ -978,7 +856,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Select All", 'A');
|
||||
item = Base.newJMenuItem("Select All", 'A');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
textarea.selectAll();
|
||||
@@ -988,7 +866,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Comment/Uncomment", '/');
|
||||
item = Base.newJMenuItem("Comment/Uncomment", '/');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleCommentUncomment();
|
||||
@@ -996,7 +874,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Increase Indent", ']');
|
||||
item = Base.newJMenuItem("Increase Indent", ']');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleIndentOutdent(true);
|
||||
@@ -1004,7 +882,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = newJMenuItem("Decrease Indent", '[');
|
||||
item = Base.newJMenuItem("Decrease Indent", '[');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
handleIndentOutdent(false);
|
||||
@@ -1014,7 +892,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
item = newJMenuItem("Find...", 'F');
|
||||
item = Base.newJMenuItem("Find...", 'F');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (find == null) {
|
||||
@@ -1028,7 +906,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
|
||||
// TODO find next should only be enabled after a
|
||||
// search has actually taken place
|
||||
item = newJMenuItem("Find Next", 'G');
|
||||
item = Base.newJMenuItem("Find Next", 'G');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (find != null) {
|
||||
@@ -1044,45 +922,6 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* A software engineer, somewhere, needs to have his abstraction
|
||||
* taken away. In some countries they jail or beat people for writing
|
||||
* the sort of API that would require a five line helper function
|
||||
* just to set the command key for a menu item.
|
||||
*/
|
||||
static public JMenuItem newJMenuItem(String title, int what) {
|
||||
JMenuItem menuItem = new JMenuItem(title);
|
||||
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers));
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Like newJMenuItem() but adds shift as a modifier for the key command.
|
||||
*/
|
||||
static public JMenuItem newJMenuItemShift(String title, int what) {
|
||||
JMenuItem menuItem = new JMenuItem(title);
|
||||
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
modifiers |= ActionEvent.SHIFT_MASK;
|
||||
menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers));
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Same as newJMenuItem(), but adds the ALT (on Linux and Windows)
|
||||
* or OPTION (on Mac OS X) key as a modifier.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
|
||||
|
||||
@@ -288,7 +288,7 @@ public class EditorHeader extends JComponent {
|
||||
*/
|
||||
|
||||
//item = new JMenuItem("New Tab");
|
||||
item = Editor.newJMenuItemShift("New Tab", 'N');
|
||||
item = Base.newJMenuItemShift("New Tab", 'N');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.getSketch().handleNewCode();
|
||||
@@ -324,7 +324,7 @@ public class EditorHeader extends JComponent {
|
||||
|
||||
item = new JMenuItem("Previous Tab");
|
||||
KeyStroke ctrlAltLeft =
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Editor.SHORTCUT_ALT_KEY_MASK);
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Base.SHORTCUT_ALT_KEY_MASK);
|
||||
item.setAccelerator(ctrlAltLeft);
|
||||
// this didn't want to work consistently
|
||||
/*
|
||||
@@ -338,7 +338,7 @@ public class EditorHeader extends JComponent {
|
||||
|
||||
item = new JMenuItem("Next Tab");
|
||||
KeyStroke ctrlAltRight =
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Editor.SHORTCUT_ALT_KEY_MASK);
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Base.SHORTCUT_ALT_KEY_MASK);
|
||||
item.setAccelerator(ctrlAltRight);
|
||||
/*
|
||||
item.addActionListener(new ActionListener() {
|
||||
|
||||
@@ -3,13 +3,12 @@
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-09 Ben Fry and Casey Reas
|
||||
Copyright (c) 2004-10 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation, version 2.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -93,6 +92,15 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
|
||||
Color statusColor;
|
||||
|
||||
boolean shiftPressed;
|
||||
|
||||
// Color modeButtonColor;
|
||||
// Font modeTextFont;
|
||||
// Color modeTextColor;
|
||||
// String modeTitle = "JAVA"; //"Java";
|
||||
// String modeTitle = "ANDROID"; //"Java";
|
||||
// int modeX1, modeY1;
|
||||
// int modeX2, modeY2;
|
||||
|
||||
|
||||
public EditorToolbar(Editor editor, JMenu menu) {
|
||||
this.editor = editor;
|
||||
@@ -115,10 +123,15 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
|
||||
statusFont = Theme.getFont("buttons.status.font");
|
||||
statusColor = Theme.getColor("buttons.status.color");
|
||||
|
||||
// modeButtonColor = Theme.getColor("mode.button.bgcolor");
|
||||
// modeTextFont = Theme.getFont("mode.button.font");
|
||||
// modeTextColor = Theme.getColor("mode.button.color");
|
||||
|
||||
addMouseListener(this);
|
||||
addMouseMotionListener(this);
|
||||
}
|
||||
|
||||
|
||||
protected void loadButtons() {
|
||||
Image allButtons = Base.getThemeImage("buttons.gif", this);
|
||||
buttonImages = new Image[BUTTON_COUNT][3];
|
||||
@@ -134,7 +147,8 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics screen) {
|
||||
// this data is shared by all EditorToolbar instances
|
||||
@@ -181,22 +195,39 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
|
||||
g.setColor(statusColor);
|
||||
g.setFont(statusFont);
|
||||
|
||||
/*
|
||||
// if i ever find the guy who wrote the java2d api, i will hurt him.
|
||||
*
|
||||
* whereas I love the Java2D API. --jdf. lol.
|
||||
*
|
||||
Graphics2D g2 = (Graphics2D) g;
|
||||
FontRenderContext frc = g2.getFontRenderContext();
|
||||
float statusW = (float) statusFont.getStringBounds(status, frc).getWidth();
|
||||
float statusX = (getSize().width - statusW) / 2;
|
||||
g2.drawString(status, statusX, statusY);
|
||||
*/
|
||||
// If I ever find the guy who wrote the Java2D API, I will hurt him.
|
||||
// Graphics2D g2 = (Graphics2D) g;
|
||||
// FontRenderContext frc = g2.getFontRenderContext();
|
||||
// float statusW = (float) statusFont.getStringBounds(status, frc).getWidth();
|
||||
// float statusX = (getSize().width - statusW) / 2;
|
||||
// g2.drawString(status, statusX, statusY);
|
||||
|
||||
if (currentRollover != -1) {
|
||||
int statusY = (BUTTON_HEIGHT + g.getFontMetrics().getAscent()) / 2;
|
||||
String status = shiftPressed ? titleShift[currentRollover] : title[currentRollover];
|
||||
g.drawString(status, buttonCount * BUTTON_WIDTH + 3 * BUTTON_GAP, statusY);
|
||||
}
|
||||
|
||||
//// Color modeButtonColor;
|
||||
//// Font modeTextFont;
|
||||
//// Color modeTextColor;
|
||||
// g.setFont(modeTextFont);
|
||||
// FontMetrics metrics = g.getFontMetrics();
|
||||
// int modeH = metrics.getAscent();
|
||||
// int modeW = metrics.stringWidth(modeTitle);
|
||||
// final int modeGapH = 6;
|
||||
// final int modeGapV = 3;
|
||||
// modeX2 = getWidth() - 16;
|
||||
// modeX1 = modeX2 - (modeGapH + modeW + modeGapH);
|
||||
// modeY1 = (getHeight() - modeH)/2 - modeGapV;
|
||||
// modeY2 = modeY1 + modeH + modeGapV*2;
|
||||
//// g.setColor(modeButtonColor);
|
||||
//// g.fillRect(modeX1, modeY1, modeX2 - modeX1, modeY2 - modeY1);
|
||||
//// g.setColor(modeTextColor);
|
||||
//// g.drawString(modeTitle, modeX1 + modeGapH, modeY2 - modeGapV);
|
||||
// g.setColor(modeButtonColor);
|
||||
// g.drawRect(modeX1, modeY1, modeX2 - modeX1, modeY2 - modeY1);
|
||||
// g.drawString(modeTitle, modeX1 + modeGapH, modeY2 - modeGapV);
|
||||
|
||||
screen.drawImage(offscreen, 0, 0, null);
|
||||
|
||||
|
||||
@@ -456,7 +456,7 @@ public class Preferences {
|
||||
pain.addKeyListener(new KeyAdapter() {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
//System.out.println(e);
|
||||
KeyStroke wc = Editor.WINDOW_CLOSE_KEYSTROKE;
|
||||
KeyStroke wc = Base.WINDOW_CLOSE_KEYSTROKE;
|
||||
if ((e.getKeyCode() == KeyEvent.VK_ESCAPE) ||
|
||||
(KeyStroke.getKeyStrokeForEvent(e).equals(wc))) {
|
||||
disposeFrame();
|
||||
|
||||
@@ -3,12 +3,11 @@
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2007 Ben Fry and Casey Reas
|
||||
Copyright (c) 2007-2010 Ben Fry and Casey Reas
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation, version 2.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -22,13 +21,16 @@
|
||||
|
||||
package processing.app.macosx;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JMenuBar;
|
||||
import processing.app.Base;
|
||||
|
||||
import com.apple.eawt.*;
|
||||
|
||||
|
||||
/**
|
||||
* Deal with issues related to thinking different. This handles the basic
|
||||
* Deal with issues related to thinking differently. This handles the basic
|
||||
* Mac OS X menu commands (and apple events) for open, about, prefs, etc.
|
||||
*
|
||||
* Based on OSXAdapter.java from Apple DTS.
|
||||
@@ -51,7 +53,7 @@ public class ThinkDifferent implements ApplicationListener {
|
||||
static protected void init(Base base) {
|
||||
if (application == null) {
|
||||
//application = new com.apple.eawt.Application();
|
||||
application = com.apple.eawt.Application.getApplication();
|
||||
application = Application.getApplication();
|
||||
}
|
||||
if (adapter == null) {
|
||||
adapter = new ThinkDifferent(base);
|
||||
@@ -59,6 +61,28 @@ public class ThinkDifferent implements ApplicationListener {
|
||||
application.addApplicationListener(adapter);
|
||||
application.setEnabledAboutMenu(true);
|
||||
application.setEnabledPreferencesMenu(true);
|
||||
|
||||
// Set the menubar to be used when nothing else is open. http://j.mp/dkZmka
|
||||
// http://developer.apple.com/mac/library/documentation/Java/Reference/
|
||||
// JavaSE6_AppleExtensionsRef/api/com/apple/eawt/Application.html
|
||||
// Only available since Java for Mac OS X 10.6 Update 1, and
|
||||
// Java for Mac OS X 10.5 Update 6, so need to load this dynamically
|
||||
try {
|
||||
// com.apple.eawt.Application.setDefaultMenuBar(JMenuBar)
|
||||
Class<?> appClass = Application.class;
|
||||
Method method =
|
||||
appClass.getMethod("setDefaultMenuBar", new Class[] { JMenuBar.class });
|
||||
if (method != null) {
|
||||
JMenuBar defaultMenuBar = new JMenuBar();
|
||||
JMenu fileMenu = base.buildFileMenu(null);
|
||||
defaultMenuBar.add(fileMenu);
|
||||
method.invoke(application, new Object[] { defaultMenuBar });
|
||||
// This is kind of a gross way to do this, but the alternatives? Hrm.
|
||||
Base.defaultFileMenu = fileMenu;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace(); // oh well nevermind
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user