[6380] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
[1023] | 2 | package org.openstreetmap.josm.tools;
|
---|
| 3 |
|
---|
[4998] | 4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
| 5 |
|
---|
[10178] | 6 | import java.awt.Desktop;
|
---|
[7485] | 7 | import java.awt.Image;
|
---|
[7482] | 8 | import java.awt.Window;
|
---|
[1023] | 9 | import java.awt.event.KeyEvent;
|
---|
[7253] | 10 | import java.io.File;
|
---|
[1023] | 11 | import java.io.IOException;
|
---|
[1634] | 12 | import java.lang.reflect.InvocationHandler;
|
---|
[10178] | 13 | import java.lang.reflect.InvocationTargetException;
|
---|
[1634] | 14 | import java.lang.reflect.Method;
|
---|
| 15 | import java.lang.reflect.Proxy;
|
---|
[7287] | 16 | import java.util.Arrays;
|
---|
[11642] | 17 | import java.util.Collections;
|
---|
[7253] | 18 | import java.util.List;
|
---|
[1634] | 19 |
|
---|
[1023] | 20 | import javax.swing.UIManager;
|
---|
| 21 |
|
---|
[1634] | 22 | import org.openstreetmap.josm.Main;
|
---|
[7287] | 23 | import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
|
---|
| 24 | import org.openstreetmap.josm.io.OsmTransferException;
|
---|
| 25 | import org.xml.sax.SAXException;
|
---|
[1634] | 26 |
|
---|
[1023] | 27 | /**
|
---|
[6443] | 28 | * {@code PlatformHook} implementation for Apple Mac OS X systems.
|
---|
| 29 | * @since 1023
|
---|
[1842] | 30 | */
|
---|
[11156] | 31 | public class PlatformHookOsx implements PlatformHook, InvocationHandler {
|
---|
[6851] | 32 |
|
---|
[11156] | 33 | private static final PlatformHookOsx ivhandler = new PlatformHookOsx();
|
---|
[6851] | 34 |
|
---|
[1842] | 35 | @Override
|
---|
[6443] | 36 | public void preStartupHook() {
|
---|
[1169] | 37 | // This will merge our MenuBar into the system menu.
|
---|
| 38 | // MUST be set before Swing is initialized!
|
---|
[6443] | 39 | // And will not work when one of the system independent LAFs is used.
|
---|
[1169] | 40 | // They just insist on painting themselves...
|
---|
[7894] | 41 | Utils.updateSystemProperty("apple.laf.useScreenMenuBar", "true");
|
---|
[1169] | 42 | }
|
---|
[6851] | 43 |
|
---|
[1842] | 44 | @Override
|
---|
[1169] | 45 | public void startupHook() {
|
---|
[7287] | 46 | // Here we register callbacks for the menu entries in the system menu and file opening through double-click
|
---|
[10178] | 47 | // http://openjdk.java.net/jeps/272
|
---|
| 48 | // https://bugs.openjdk.java.net/browse/JDK-8048731
|
---|
| 49 | // http://cr.openjdk.java.net/~azvegint/jdk/9/8143227/10/jdk/
|
---|
| 50 | // This method must be cleaned up after we switch to Java 9
|
---|
[1169] | 51 | try {
|
---|
[7482] | 52 | Class<?> eawtApplication = Class.forName("com.apple.eawt.Application");
|
---|
[10178] | 53 | Class<?> quitHandler = findHandlerClass("QuitHandler");
|
---|
| 54 | Class<?> aboutHandler = findHandlerClass("AboutHandler");
|
---|
| 55 | Class<?> openFilesHandler = findHandlerClass("OpenFilesHandler");
|
---|
| 56 | Class<?> preferencesHandler = findHandlerClass("PreferencesHandler");
|
---|
[7482] | 57 | Object proxy = Proxy.newProxyInstance(PlatformHookOsx.class.getClassLoader(), new Class<?>[] {
|
---|
[10178] | 58 | quitHandler, aboutHandler, openFilesHandler, preferencesHandler}, ivhandler);
|
---|
| 59 | try {
|
---|
| 60 | Object appli = eawtApplication.getConstructor((Class[]) null).newInstance((Object[]) null);
|
---|
| 61 | setHandlers(eawtApplication, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, appli);
|
---|
| 62 | // this method has been deprecated, but without replacement ATM
|
---|
| 63 | eawtApplication.getDeclaredMethod("setEnabledPreferencesMenu", boolean.class).invoke(appli, Boolean.TRUE);
|
---|
| 64 | // setup the dock icon. It is automatically set with application bundle and Web start but we need
|
---|
| 65 | // to do it manually if run with `java -jar``
|
---|
| 66 | eawtApplication.getDeclaredMethod("setDockIconImage", Image.class).invoke(appli, ImageProvider.get("logo").getImage());
|
---|
| 67 | // enable full screen
|
---|
| 68 | enableOSXFullscreen((Window) Main.parent);
|
---|
| 69 | } catch (IllegalAccessException e) {
|
---|
[10627] | 70 | Main.debug(e);
|
---|
[10178] | 71 | // with Java 9, module java.desktop does not export com.apple.eawt, use new Desktop API instead
|
---|
| 72 | setHandlers(Desktop.class, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, Desktop.getDesktop());
|
---|
| 73 | }
|
---|
[7253] | 74 | } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
|
---|
[6248] | 75 | // We'll just ignore this for now. The user will still be able to close JOSM by closing all its windows.
|
---|
| 76 | Main.warn("Failed to register with OSX: " + ex);
|
---|
[1169] | 77 | }
|
---|
| 78 | }
|
---|
[6851] | 79 |
|
---|
[10178] | 80 | protected void setHandlers(Class<?> appClass, Class<?> quitHandler, Class<?> aboutHandler,
|
---|
| 81 | Class<?> openFilesHandler, Class<?> preferencesHandler, Object proxy, Object appInstance)
|
---|
| 82 | throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
|
---|
| 83 | appClass.getDeclaredMethod("setQuitHandler", quitHandler).invoke(appInstance, proxy);
|
---|
| 84 | appClass.getDeclaredMethod("setAboutHandler", aboutHandler).invoke(appInstance, proxy);
|
---|
| 85 | appClass.getDeclaredMethod("setOpenFileHandler", openFilesHandler).invoke(appInstance, proxy);
|
---|
| 86 | appClass.getDeclaredMethod("setPreferencesHandler", preferencesHandler).invoke(appInstance, proxy);
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | protected Class<?> findHandlerClass(String className) throws ClassNotFoundException {
|
---|
| 90 | try {
|
---|
| 91 | return Class.forName("com.apple.eawt."+className);
|
---|
| 92 | } catch (ClassNotFoundException e) {
|
---|
[10627] | 93 | Main.trace(e);
|
---|
[10178] | 94 | return Class.forName("java.awt.desktop."+className);
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 |
|
---|
[7482] | 98 | /**
|
---|
| 99 | * Enables fullscreen support for the given window.
|
---|
| 100 | * @param window The window for which full screen will be available
|
---|
| 101 | * @since 7482
|
---|
| 102 | */
|
---|
| 103 | public static void enableOSXFullscreen(Window window) {
|
---|
| 104 | CheckParameterUtil.ensureParameterNotNull(window, "window");
|
---|
| 105 | try {
|
---|
| 106 | // http://stackoverflow.com/a/8693890/2257172
|
---|
| 107 | Class<?> eawtFullScreenUtilities = Class.forName("com.apple.eawt.FullScreenUtilities");
|
---|
| 108 | eawtFullScreenUtilities.getDeclaredMethod("setWindowCanFullScreen",
|
---|
[8377] | 109 | new Class[]{Window.class, boolean.class}).invoke(eawtFullScreenUtilities, window, Boolean.TRUE);
|
---|
[7482] | 110 | } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException e) {
|
---|
| 111 | Main.warn("Failed to register with OSX: " + e);
|
---|
| 112 | }
|
---|
| 113 | }
|
---|
| 114 |
|
---|
[7253] | 115 | @SuppressWarnings("unchecked")
|
---|
[6084] | 116 | @Override
|
---|
[7253] | 117 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
---|
[7283] | 118 | if (Main.isDebugEnabled()) {
|
---|
[7287] | 119 | Main.debug("OSX handler: "+method.getName()+" - "+Arrays.toString(args));
|
---|
[7283] | 120 | }
|
---|
[7012] | 121 | switch (method.getName()) {
|
---|
[7253] | 122 | case "openFiles":
|
---|
| 123 | if (args[0] != null) {
|
---|
| 124 | try {
|
---|
[7287] | 125 | Object oFiles = args[0].getClass().getMethod("getFiles").invoke(args[0]);
|
---|
[7253] | 126 | if (oFiles instanceof List) {
|
---|
[8510] | 127 | Main.worker.submit(new OpenFileTask((List<File>) oFiles, null) {
|
---|
[7287] | 128 | @Override
|
---|
| 129 | protected void realRun() throws SAXException, IOException, OsmTransferException {
|
---|
| 130 | // Wait for JOSM startup is advanced enough to load a file
|
---|
| 131 | while (Main.parent == null || !Main.parent.isVisible()) {
|
---|
| 132 | try {
|
---|
| 133 | Thread.sleep(25);
|
---|
| 134 | } catch (InterruptedException e) {
|
---|
| 135 | Main.warn(e);
|
---|
[11535] | 136 | Thread.currentThread().interrupt();
|
---|
[7287] | 137 | }
|
---|
| 138 | }
|
---|
| 139 | super.realRun();
|
---|
| 140 | }
|
---|
| 141 | });
|
---|
[7253] | 142 | }
|
---|
| 143 | } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
|
---|
| 144 | Main.warn("Failed to access open files event: " + ex);
|
---|
| 145 | }
|
---|
| 146 | }
|
---|
[7012] | 147 | break;
|
---|
[7287] | 148 | case "handleQuitRequestWith":
|
---|
[11093] | 149 | boolean closed = Main.exitJosm(false, 0, null);
|
---|
[7287] | 150 | if (args[1] != null) {
|
---|
[10178] | 151 | try {
|
---|
| 152 | args[1].getClass().getDeclaredMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
|
---|
| 153 | } catch (IllegalAccessException e) {
|
---|
[10627] | 154 | Main.debug(e);
|
---|
[10178] | 155 | // with Java 9, module java.desktop does not export com.apple.eawt, use new Desktop API instead
|
---|
| 156 | Class.forName("java.awt.desktop.QuitResponse").getMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
|
---|
| 157 | }
|
---|
[7287] | 158 | }
|
---|
| 159 | break;
|
---|
[7012] | 160 | case "handleAbout":
|
---|
[1169] | 161 | Main.main.menu.about.actionPerformed(null);
|
---|
[7012] | 162 | break;
|
---|
| 163 | case "handlePreferences":
|
---|
[1169] | 164 | Main.main.menu.preferences.actionPerformed(null);
|
---|
[7012] | 165 | break;
|
---|
| 166 | default:
|
---|
[7287] | 167 | Main.warn("OSX unsupported method: "+method.getName());
|
---|
[7012] | 168 | }
|
---|
[1169] | 169 | return null;
|
---|
| 170 | }
|
---|
[6851] | 171 |
|
---|
[1842] | 172 | @Override
|
---|
[1169] | 173 | public void openUrl(String url) throws IOException {
|
---|
| 174 | Runtime.getRuntime().exec("open " + url);
|
---|
| 175 | }
|
---|
[4897] | 176 |
|
---|
[1842] | 177 | @Override
|
---|
[1169] | 178 | public void initSystemShortcuts() {
|
---|
[8510] | 179 | // CHECKSTYLE.OFF: LineLength
|
---|
[10339] | 180 | auto(Shortcut.registerSystemShortcut("apple-reserved-01", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK)); // Show or hide the Spotlight search field (when multiple languages are installed, may rotate through enabled script systems).
|
---|
| 181 | auto(Shortcut.registerSystemShortcut("apple-reserved-02", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Apple reserved.
|
---|
| 182 | auto(Shortcut.registerSystemShortcut("apple-reserved-03", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show the Spotlight search results window (when multiple languages are installed, may rotate through keyboard layouts and input methods within a script).
|
---|
| 183 | auto(Shortcut.registerSystemShortcut("apple-reserved-04", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // | Apple reserved.
|
---|
| 184 | auto(Shortcut.registerSystemShortcut("apple-reserved-05", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK)); // Navigate through controls in a reverse direction. See "Keyboard Focus and Navigation."
|
---|
| 185 | auto(Shortcut.registerSystemShortcut("apple-reserved-06", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK)); // Move forward to the next most recently used application in a list of open applications.
|
---|
| 186 | auto(Shortcut.registerSystemShortcut("apple-reserved-07", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move backward through a list of open applications (sorted by recent use).
|
---|
| 187 | auto(Shortcut.registerSystemShortcut("apple-reserved-08", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the next grouping of controls in a dialog or the next table (when Tab moves to the next cell). See Accessibility Overview.
|
---|
| 188 | auto(Shortcut.registerSystemShortcut("apple-reserved-09", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous grouping of controls. See Accessibility Overview.
|
---|
| 189 | auto(Shortcut.registerSystemShortcut("apple-reserved-10", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK)); // Open Front Row.
|
---|
| 190 | auto(Shortcut.registerSystemShortcut("apple-reserved-11", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Open the Force Quit dialog.
|
---|
| 191 | auto(Shortcut.registerSystemShortcut("apple-reserved-12", tr("reserved"), KeyEvent.VK_F1, KeyEvent.CTRL_DOWN_MASK)); // Toggle full keyboard access on or off. See Accessibility Overview.
|
---|
| 192 | auto(Shortcut.registerSystemShortcut("apple-reserved-13", tr("reserved"), KeyEvent.VK_F2, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the menu bar. See Accessibility Overview.
|
---|
| 193 | auto(Shortcut.registerSystemShortcut("apple-reserved-14", tr("reserved"), KeyEvent.VK_F3, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the Dock. See Accessibility Overview.
|
---|
| 194 | auto(Shortcut.registerSystemShortcut("apple-reserved-15", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the active (or next) window. See Accessibility Overview.
|
---|
| 195 | auto(Shortcut.registerSystemShortcut("apple-reserved-16", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previously active window. See Accessibility Overview.
|
---|
| 196 | auto(Shortcut.registerSystemShortcut("apple-reserved-17", tr("reserved"), KeyEvent.VK_F5, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the toolbar. See Accessibility Overview.
|
---|
| 197 | auto(Shortcut.registerSystemShortcut("apple-reserved-18", tr("reserved"), KeyEvent.VK_F5, KeyEvent.META_DOWN_MASK)); // Turn VoiceOver on or off. See Accessibility Overview.
|
---|
| 198 | auto(Shortcut.registerSystemShortcut("apple-reserved-19", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the first (or next) panel. See Accessibility Overview.
|
---|
| 199 | auto(Shortcut.registerSystemShortcut("apple-reserved-20", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous panel. See Accessibility Overview.
|
---|
| 200 | auto(Shortcut.registerSystemShortcut("apple-reserved-21", tr("reserved"), KeyEvent.VK_F7, KeyEvent.CTRL_DOWN_MASK)); // Temporarily override the current keyboard access mode in windows and dialogs. See Accessibility Overview.
|
---|
| 201 | //auto(Shortcut.registerSystemShortcut("apple-reserved-22", tr("reserved"), KeyEvent.VK_F9, 0)); // Tile or untile all open windows.
|
---|
| 202 | //auto(Shortcut.registerSystemShortcut("apple-reserved-23", tr("reserved"), KeyEvent.VK_F10, 0)); // Tile or untile all open windows in the currently active application.
|
---|
| 203 | //auto(Shortcut.registerSystemShortcut("apple-reserved-24", tr("reserved"), KeyEvent.VK_F11, 0)); // Hide or show all open windows.
|
---|
| 204 | //auto(Shortcut.registerSystemShortcut("apple-reserved-25", tr("reserved"), KeyEvent.VK_F12, 0)); // Hide or display Dashboard.
|
---|
| 205 | auto(Shortcut.registerSystemShortcut("apple-reserved-26", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK)); // Activate the next open window in the frontmost application. See "Window Layering."
|
---|
| 206 | auto(Shortcut.registerSystemShortcut("apple-reserved-27", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Activate the previous open window in the frontmost application. See "Window Layering."
|
---|
| 207 | auto(Shortcut.registerSystemShortcut("apple-reserved-28", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Move focus to the window drawer.
|
---|
| 208 | //auto(Shortcut.registerSystemShortcut("apple-reserved-29", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK)); // Decrease the size of the selected item (equivalent to the Smaller command). See "The Format Menu."
|
---|
| 209 | auto(Shortcut.registerSystemShortcut("apple-reserved-30", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom out when screen zooming is on. See Accessibility Overview.
|
---|
[1023] | 210 |
|
---|
[7605] | 211 | //Shortcut.registerSystemShortcut("system:align-left", tr("reserved"), KeyEvent.VK_OPEN_BRACKET, KeyEvent.META_DOWN_MASK); // Left-align a selection (equivalent to the Align Left command). See "The Format Menu."
|
---|
| 212 | //Shortcut.registerSystemShortcut("system:align-right",tr("reserved"), KeyEvent.VK_CLOSE_BRACKET, KeyEvent.META_DOWN_MASK); // Right-align a selection (equivalent to the Align Right command). See "The Format Menu."
|
---|
[1169] | 213 | // I found no KeyEvent for |
|
---|
[4995] | 214 | //Shortcut.registerSystemCut("system:align-center", tr("reserved"), '|', KeyEvent.META_DOWN_MASK); // Center-align a selection (equivalent to the Align Center command). See "The Format Menu."
|
---|
[7605] | 215 | //Shortcut.registerSystemShortcut("system:spelling", tr("reserved"), KeyEvent.VK_COLON, KeyEvent.META_DOWN_MASK); // Display the Spelling window (equivalent to the Spelling command). See "The Edit Menu."
|
---|
| 216 | //Shortcut.registerSystemShortcut("system:spellcheck", tr("reserved"), KeyEvent.VK_SEMICOLON, KeyEvent.META_DOWN_MASK); // Find misspelled words in the document (equivalent to the Check Spelling command). See "The Edit Menu."
|
---|
[10339] | 217 | auto(Shortcut.registerSystemShortcut("system:preferences", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK)); // Open the application's preferences window (equivalent to the Preferences command). See "The Application Menu."
|
---|
[1023] | 218 |
|
---|
[10339] | 219 | auto(Shortcut.registerSystemShortcut("apple-reserved-31", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Decrease screen contrast. See Accessibility Overview.
|
---|
| 220 | auto(Shortcut.registerSystemShortcut("apple-reserved-32", tr("reserved"), KeyEvent.VK_PERIOD, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Increase screen contrast. See Accessibility Overview.
|
---|
[1023] | 221 |
|
---|
[1169] | 222 | // I found no KeyEvent for ?
|
---|
[10339] | 223 | //auto(Shortcut.registerSystemCut("system:help", tr("reserved"), '?', KeyEvent.META_DOWN_MASK)); // Open the application's help in Help Viewer. See "The Help Menu."
|
---|
[1023] | 224 |
|
---|
[10339] | 225 | auto(Shortcut.registerSystemShortcut("apple-reserved-33", tr("reserved"), KeyEvent.VK_SLASH, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn font smoothing on or off.
|
---|
| 226 | auto(Shortcut.registerSystemShortcut("apple-reserved-34", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Increase the size of the selected item (equivalent to the Bigger command). See "The Format Menu."
|
---|
| 227 | auto(Shortcut.registerSystemShortcut("apple-reserved-35", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom in when screen zooming is on. See Accessibility Overview.
|
---|
| 228 | auto(Shortcut.registerSystemShortcut("apple-reserved-36", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture the screen to a file.
|
---|
| 229 | auto(Shortcut.registerSystemShortcut("apple-reserved-37", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture the screen to the Clipboard.
|
---|
| 230 | auto(Shortcut.registerSystemShortcut("apple-reserved-38", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture a selection to a file.
|
---|
| 231 | auto(Shortcut.registerSystemShortcut("apple-reserved-39", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture a selection to the Clipboard.
|
---|
| 232 | auto(Shortcut.registerSystemShortcut("apple-reserved-40", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn screen zooming on or off. See Accessibility Overview.
|
---|
| 233 | auto(Shortcut.registerSystemShortcut("apple-reserved-41", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Invert the screen colors. See Accessibility Overview.
|
---|
[1023] | 234 |
|
---|
[4995] | 235 | Shortcut.registerSystemShortcut("system:selectall", tr("reserved"), KeyEvent.VK_A, KeyEvent.META_DOWN_MASK); // Highlight every item in a document or window, or all characters in a text field (equivalent to the Select All command). See "The Edit Menu."
|
---|
[7605] | 236 | //Shortcut.registerSystemShortcut("system:bold", tr("reserved"), KeyEvent.VK_B, KeyEvent.META_DOWN_MASK); // Boldface the selected text or toggle boldfaced text on and off (equivalent to the Bold command). See "The Edit Menu."
|
---|
[4995] | 237 | Shortcut.registerSystemShortcut("system:copy", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK); // Duplicate the selected data and store on the Clipboard (equivalent to the Copy command). See "The Edit Menu."
|
---|
[7605] | 238 | //Shortcut.registerSystemShortcut("system:colors", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Colors window (equivalent to the Show Colors command). See "The Format Menu."
|
---|
| 239 | //Shortcut.registerSystemShortcut("system:copystyle", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Copy the style of the selected text (equivalent to the Copy Style command). See "The Format Menu."
|
---|
[10339] | 240 | //Shortcut.registerSystemShortcut("system:copyformat", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Copy the formatting settings of the selected item and store on the Clipboard (equivalent to the Copy Ruler command). See "The Format Menu."
|
---|
[1023] | 241 |
|
---|
[10339] | 242 | auto(Shortcut.registerSystemShortcut("apple-reserved-42", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show or hide the Dock. See "The Dock."
|
---|
[1023] | 243 |
|
---|
[4995] | 244 | Shortcut.registerSystemShortcut("system:dictionarylookup", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Display the definition of the selected word in the Dictionary application.
|
---|
[7605] | 245 | //Shortcut.registerSystemShortcut("system:findselected", tr("reserved"), KeyEvent.VK_E, KeyEvent.META_DOWN_MASK); // Use the selection for a find operation. See "Find Windows."
|
---|
[4995] | 246 | Shortcut.registerSystemShortcut("system:find", tr("reserved"), KeyEvent.VK_F, KeyEvent.META_DOWN_MASK); // Open a Find window (equivalent to the Find command). See "The Edit Menu."
|
---|
| 247 | Shortcut.registerSystemShortcut("system:search", tr("reserved"), KeyEvent.VK_F, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Jump to the search field control. See "Search Fields."
|
---|
[7605] | 248 | //Shortcut.registerSystemShortcut("system:findnext", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK); // Find the next occurrence of the selection (equivalent to the Find Next command). See "The Edit Menu."
|
---|
| 249 | //Shortcut.registerSystemShortcut("system:findprev", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Find the previous occurrence of the selection (equivalent to the Find Previous command). See "The Edit Menu."
|
---|
[10339] | 250 | auto(Shortcut.registerSystemShortcut("system:hide", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK)); // Hide the windows of the currently running application (equivalent to the Hide ApplicationName command). See "The Application Menu."
|
---|
| 251 | auto(Shortcut.registerSystemShortcut("system:hideothers", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Hide the windows of all other running applications (equivalent to the Hide Others command). See "The Application Menu."
|
---|
[1169] | 252 | // What about applications that have italic text AND info windows?
|
---|
[4995] | 253 | //Shortcut.registerSystemCut("system:italic", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Italicize the selected text or toggle italic text on or off (equivalent to the Italic command). See "The Format Menu."
|
---|
[7605] | 254 | //Shortcut.registerSystemShortcut("system:info", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Display an Info window. See "Inspector Windows."
|
---|
| 255 | //Shortcut.registerSystemShortcut("system:inspector", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Display an inspector window. See "Inspector Windows."
|
---|
| 256 | //Shortcut.registerSystemShortcut("system:toselection", tr("reserved"), KeyEvent.VK_J, KeyEvent.META_DOWN_MASK); // Scroll to a selection.
|
---|
| 257 | //Shortcut.registerSystemShortcut("system:minimize", tr("reserved"), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK); // Minimize the active window to the Dock (equivalent to the Minimize command). See "The Window Menu."
|
---|
| 258 | //Shortcut.registerSystemShortcut("system:minimizeall", tr("reserved"), KeyEvent.VK_M, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Minimize all windows of the active application to the Dock (equivalent to the Minimize All command). See "The Window Menu."
|
---|
[4995] | 259 | Shortcut.registerSystemShortcut("system:new", tr("reserved"), KeyEvent.VK_N, KeyEvent.META_DOWN_MASK); // Open a new document (equivalent to the New command). See "The File Menu."
|
---|
| 260 | Shortcut.registerSystemShortcut("system:open", tr("reserved"), KeyEvent.VK_O, KeyEvent.META_DOWN_MASK); // Display a dialog for choosing a document to open (equivalent to the Open command). See "The File Menu."
|
---|
| 261 | Shortcut.registerSystemShortcut("system:print", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK); // Display the Print dialog (equivalent to the Print command). See "The File Menu."
|
---|
[7605] | 262 | //Shortcut.registerSystemShortcut("system:printsetup", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display a dialog for specifying printing parameters (equivalent to the Page Setup command). See "The File Menu."
|
---|
[10339] | 263 | auto(Shortcut.registerSystemShortcut("system:menuexit", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK)); // Quit the application (equivalent to the Quit command). See "The Application Menu."
|
---|
[1023] | 264 |
|
---|
[10339] | 265 | auto(Shortcut.registerSystemShortcut("apple-reserved-43", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Log out the current user (equivalent to the Log Out command).
|
---|
| 266 | auto(Shortcut.registerSystemShortcut("apple-reserved-44", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Log out the current user without confirmation.
|
---|
[1023] | 267 |
|
---|
[4995] | 268 | Shortcut.registerSystemShortcut("system:save", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK); // Save the active document (equivalent to the Save command). See "The File Menu."
|
---|
| 269 | Shortcut.registerSystemShortcut("system:saveas", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Save dialog (equivalent to the Save As command). See "The File Menu."
|
---|
[7605] | 270 | //Shortcut.registerSystemShortcut("system:fonts", tr("reserved"), KeyEvent.VK_T, KeyEvent.META_DOWN_MASK); // Display the Fonts window (equivalent to the Show Fonts command). See "The Format Menu."
|
---|
[4995] | 271 | Shortcut.registerSystemShortcut("system:toggletoolbar", tr("reserved"), KeyEvent.VK_T, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Show or hide a toolbar (equivalent to the Show/Hide Toolbar command). See "The View Menu" and "Toolbars."
|
---|
[7605] | 272 | //Shortcut.registerSystemShortcut("system:underline", tr("reserved"), KeyEvent.VK_U, KeyEvent.META_DOWN_MASK); // Underline the selected text or turn underlining on or off (equivalent to the Underline command). See "The Format Menu."
|
---|
[4995] | 273 | Shortcut.registerSystemShortcut("system:paste", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK); // Insert the Clipboard contents at the insertion point (equivalent to the Paste command). See "The File Menu."
|
---|
[7605] | 274 | //Shortcut.registerSystemShortcut("system:pastestyle", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of one object to the selected object (equivalent to the Paste Style command). See "The Format Menu."
|
---|
| 275 | //Shortcut.registerSystemShortcut("system:pastemwithoutstyle", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Apply the style of the surrounding text to the inserted object (equivalent to the Paste and Match Style command). See "The Edit Menu."
|
---|
| 276 | //Shortcut.registerSystemShortcut("system:pasteformatting", tr("reserved"), KeyEvent.VK_V, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Apply formatting settings to the selected object (equivalent to the Paste Ruler command). See "The Format Menu."
|
---|
| 277 | //Shortcut.registerSystemShortcut("system:closewindow", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK); // Close the active window (equivalent to the Close command). See "The File Menu."
|
---|
[4995] | 278 | Shortcut.registerSystemShortcut("system:closefile", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Close a file and its associated windows (equivalent to the Close File command). See "The File Menu."
|
---|
| 279 | Shortcut.registerSystemShortcut("system:closeallwindows", tr("reserved"), KeyEvent.VK_W, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Close all windows in the application (equivalent to the Close All command). See "The File Menu."
|
---|
| 280 | Shortcut.registerSystemShortcut("system:cut", tr("reserved"), KeyEvent.VK_X, KeyEvent.META_DOWN_MASK); // Remove the selection and store on the Clipboard (equivalent to the Cut command). See "The Edit Menu."
|
---|
| 281 | Shortcut.registerSystemShortcut("system:undo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK); // Reverse the effect of the user's previous operation (equivalent to the Undo command). See "The Edit Menu."
|
---|
| 282 | Shortcut.registerSystemShortcut("system:redo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Reverse the effect of the last Undo command (equivalent to the Redo command). See "The Edit Menu."
|
---|
[1023] | 283 |
|
---|
[10339] | 284 | auto(Shortcut.registerSystemShortcut("apple-reserved-45", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of Roman script.
|
---|
| 285 | //auto(Shortcut.registerSystemCut("apple-reserved-46", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the next semantic unit, typically the end of the current line.
|
---|
| 286 | //auto(Shortcut.registerSystemCut("apple-reserved-47", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the right.
|
---|
| 287 | //auto(Shortcut.registerSystemCut("apple-reserved-48", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current word, then to the end of the next word.
|
---|
[1023] | 288 |
|
---|
[4995] | 289 | Shortcut.registerSystemShortcut("system:movefocusright", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
|
---|
[1023] | 290 |
|
---|
[10339] | 291 | auto(Shortcut.registerSystemShortcut("apple-reserved-49", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of system script.
|
---|
| 292 | //auto(Shortcut.registerSystemCut("apple-reserved-50", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the previous semantic unit, typically the beginning of the current line.
|
---|
| 293 | //auto(Shortcut.registerSystemCut("apple-reserved-51", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the left.
|
---|
| 294 | //auto(Shortcut.registerSystemCut("apple-reserved-52", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current word, then to the beginning of the previous word.
|
---|
[1023] | 295 |
|
---|
[4995] | 296 | Shortcut.registerSystemShortcut("system:movefocusleft", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
|
---|
[1023] | 297 |
|
---|
[10339] | 298 | //auto(Shortcut.registerSystemCut("apple-reserved-53", tr("reserved"), KeyEvent.VK_UP, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection upward in the next semantic unit, typically the beginning of the document.
|
---|
| 299 | //auto(Shortcut.registerSystemCut("apple-reserved-54", tr("reserved"), KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line above, to the nearest character boundary at the same horizontal location.
|
---|
| 300 | //auto(Shortcut.registerSystemCut("apple-reserved-55", tr("reserved"), KeyEvent.VK_UP, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current paragraph, then to the beginning of the next paragraph.
|
---|
[1023] | 301 |
|
---|
[4995] | 302 | Shortcut.registerSystemShortcut("system:movefocusup", tr("reserved"), KeyEvent.VK_UP, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
|
---|
[1023] | 303 |
|
---|
[10339] | 304 | //auto(Shortcut.registerSystemCut("apple-reserved-56", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection downward in the next semantic unit, typically the end of the document.
|
---|
| 305 | //auto(Shortcut.registerSystemCut("apple-reserved-57", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line below, to the nearest character boundary at the same horizontal location.
|
---|
| 306 | //auto(Shortcut.registerSystemCut("apple-reserved-58", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current paragraph, then to the end of the next paragraph (include the blank line between paragraphs in cut, copy, and paste operations).
|
---|
[1023] | 307 |
|
---|
[4995] | 308 | Shortcut.registerSystemShortcut("system:movefocusdown", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
|
---|
[1023] | 309 |
|
---|
[10339] | 310 | auto(Shortcut.registerSystemShortcut("system:about", tr("reserved"), 0, -1)); // About
|
---|
[1643] | 311 |
|
---|
[4995] | 312 | Shortcut.registerSystemShortcut("view:zoomin", tr("reserved"), KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK); // Zoom in
|
---|
| 313 | Shortcut.registerSystemShortcut("view:zoomout", tr("reserved"), KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK); // Zoom out
|
---|
[8510] | 314 | // CHECKSTYLE.ON: LineLength
|
---|
[1169] | 315 | }
|
---|
[6851] | 316 |
|
---|
[10339] | 317 | private static void auto(Shortcut sc) {
|
---|
| 318 | if (sc != null) {
|
---|
| 319 | sc.setAutomatic();
|
---|
| 320 | }
|
---|
| 321 | }
|
---|
| 322 |
|
---|
[1842] | 323 | @Override
|
---|
[1169] | 324 | public String makeTooltip(String name, Shortcut sc) {
|
---|
| 325 | String lafid = UIManager.getLookAndFeel().getID();
|
---|
| 326 | boolean canHtml = true;
|
---|
| 327 | // "Mac" is the native LAF, "Aqua" is Quaqua. Both use native menus with native tooltips.
|
---|
| 328 | if (lafid.contains("Mac") || lafid.contains("Aqua")) {
|
---|
| 329 | canHtml = false;
|
---|
| 330 | }
|
---|
[10242] | 331 | StringBuilder result = new StringBuilder(48);
|
---|
[1842] | 332 | if (canHtml) {
|
---|
[8848] | 333 | result.append("<html>");
|
---|
[1842] | 334 | }
|
---|
[8848] | 335 | result.append(name);
|
---|
[8461] | 336 | if (sc != null && !sc.getKeyText().isEmpty()) {
|
---|
[8848] | 337 | result.append(' ');
|
---|
[1842] | 338 | if (canHtml) {
|
---|
[8848] | 339 | result.append("<font size='-2'>");
|
---|
[1842] | 340 | }
|
---|
[8848] | 341 | result.append('(').append(sc.getKeyText()).append(')');
|
---|
[1842] | 342 | if (canHtml) {
|
---|
[8848] | 343 | result.append("</font>");
|
---|
[1842] | 344 | }
|
---|
[1169] | 345 | }
|
---|
[1842] | 346 | if (canHtml) {
|
---|
[8848] | 347 | result.append(" </html>");
|
---|
[1842] | 348 | }
|
---|
[8848] | 349 | return result.toString();
|
---|
[1169] | 350 | }
|
---|
[2371] | 351 |
|
---|
| 352 | @Override
|
---|
[6443] | 353 | public String getDefaultStyle() {
|
---|
[7480] | 354 | return "com.apple.laf.AquaLookAndFeel";
|
---|
[2371] | 355 | }
|
---|
[4153] | 356 |
|
---|
| 357 | @Override
|
---|
[6443] | 358 | public boolean canFullscreen() {
|
---|
[7482] | 359 | // OS X provides native full screen support registered at initialization, no need for custom action
|
---|
[4203] | 360 | return false;
|
---|
| 361 | }
|
---|
[6070] | 362 |
|
---|
[5850] | 363 | @Override
|
---|
| 364 | public String getOSDescription() {
|
---|
[8846] | 365 | return System.getProperty("os.name") + ' ' + System.getProperty("os.version");
|
---|
[5850] | 366 | }
|
---|
[7829] | 367 |
|
---|
| 368 | @Override
|
---|
| 369 | public File getDefaultCacheDirectory() {
|
---|
[11162] | 370 | return new File(System.getProperty("user.home")+"/Library/Caches",
|
---|
| 371 | Main.pref.getJOSMDirectoryBaseName());
|
---|
[7829] | 372 | }
|
---|
[7831] | 373 |
|
---|
| 374 | @Override
|
---|
| 375 | public File getDefaultPrefDirectory() {
|
---|
[11162] | 376 | return new File(System.getProperty("user.home")+"/Library/Preferences",
|
---|
| 377 | Main.pref.getJOSMDirectoryBaseName());
|
---|
[7831] | 378 | }
|
---|
[7834] | 379 |
|
---|
[7846] | 380 | @Override
|
---|
[7834] | 381 | public File getDefaultUserDataDirectory() {
|
---|
[11162] | 382 | return new File(System.getProperty("user.home")+"/Library",
|
---|
| 383 | Main.pref.getJOSMDirectoryBaseName());
|
---|
[7834] | 384 | }
|
---|
[11642] | 385 |
|
---|
| 386 | @Override
|
---|
| 387 | public List<File> getDefaultProj4NadshiftDirectories() {
|
---|
| 388 | return Collections.emptyList();
|
---|
| 389 | }
|
---|
[2371] | 390 | }
|
---|