Ticket #8652: ToggleDialogsPatch_v2.patch
File ToggleDialogsPatch_v2.patch, 20.6 KB (added by , 11 years ago) |
---|
-
src/org/openstreetmap/josm/actions/DialogsToggleAction.java
1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.actions; 3 4 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 5 import static org.openstreetmap.josm.tools.I18n.tr; 6 7 import java.awt.event.ActionEvent; 8 import java.awt.event.KeyEvent; 9 import java.util.ArrayList; 10 import java.util.List; 11 12 import javax.swing.ButtonModel; 13 14 import org.openstreetmap.josm.Main; 15 import org.openstreetmap.josm.gui.MainMenu; 16 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences; 17 import org.openstreetmap.josm.tools.Shortcut; 18 19 public class DialogsToggleAction extends JosmAction { 20 private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>(); 21 private boolean selected; 22 23 public DialogsToggleAction() { 24 super( 25 tr("Toggle dialogs panel"), 26 null, /* no icon */ 27 tr("Toggle dialogs panel, maximize mapview"), 28 Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"),KeyEvent.VK_TAB, Shortcut.DIRECT), 29 false /* register */ 30 ); 31 putValue("help", ht("/Action/ToggleDialogsPanel")); 32 putValue("toolbar", "dialogspanel"); 33 Main.toolbar.register(this); 34 selected = Main.pref.getBoolean("draw.dialogspanel", true); 35 notifySelectedState(); 36 } 37 38 public void addButtonModel(ButtonModel model) { 39 if (model != null && !buttonModels.contains(model)) { 40 buttonModels.add(model); 41 } 42 } 43 44 public void removeButtonModel(ButtonModel model) { 45 if (model != null && buttonModels.contains(model)) { 46 buttonModels.remove(model); 47 } 48 } 49 50 protected void notifySelectedState() { 51 for (ButtonModel model: buttonModels) { 52 if (model.isSelected() != selected) { 53 model.setSelected(selected); 54 } 55 } 56 } 57 58 protected void toggleSelectedState() { 59 selected = !selected; 60 Main.pref.put("draw.dialogspanel", selected); 61 notifySelectedState(); 62 setMode(); 63 } 64 65 public void initial() { 66 if(selected) { 67 setMode(); 68 } 69 } 70 71 protected void setMode() { 72 if (Main.isDisplayingMapView()) { 73 Main.map.setDialogsPanelVisible(selected); 74 Main.toolbar.control.setVisible(selected || Main.pref.getBoolean("toolbar.always-visible", true)); 75 Main.main.menu.setVisible(selected || Main.pref.getBoolean("menu.always-visible", true)); 76 } 77 } 78 79 @Override 80 public void actionPerformed(ActionEvent e) { 81 toggleSelectedState(); 82 } 83 } -
src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
127 127 mapFrame, ImageProvider.getCursor("crosshair", null)); 128 128 129 129 snappingShortcut = Shortcut.registerShortcut("mapmode:drawanglesnapping", 130 tr("Mode: Draw Angle snapping"), KeyEvent. VK_TAB, Shortcut.DIRECT);130 tr("Mode: Draw Angle snapping"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE); 131 131 snapChangeAction = new SnapChangeAction(); 132 132 snapCheckboxMenuItem = addMenuItem(); 133 133 snapHelper.setMenuCheckBox(snapCheckboxMenuItem); -
src/org/openstreetmap/josm/gui/MainMenu.java
33 33 import org.openstreetmap.josm.actions.CreateCircleAction; 34 34 import org.openstreetmap.josm.actions.CreateMultipolygonAction; 35 35 import org.openstreetmap.josm.actions.DeleteAction; 36 import org.openstreetmap.josm.actions.DialogsToggleAction; 36 37 import org.openstreetmap.josm.actions.DistributeAction; 37 38 import org.openstreetmap.josm.actions.DownloadAction; 38 39 import org.openstreetmap.josm.actions.DownloadPrimitiveAction; … … 62 63 import org.openstreetmap.josm.actions.OpenFileAction; 63 64 import org.openstreetmap.josm.actions.OpenLocationAction; 64 65 import org.openstreetmap.josm.actions.OrthogonalizeAction; 66 import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo; 65 67 import org.openstreetmap.josm.actions.PasteAction; 66 68 import org.openstreetmap.josm.actions.PasteTagsAction; 69 import org.openstreetmap.josm.actions.PreferenceToggleAction; 67 70 import org.openstreetmap.josm.actions.PreferencesAction; 68 71 import org.openstreetmap.josm.actions.PurgeAction; 69 72 import org.openstreetmap.josm.actions.RedoAction; … … 90 93 import org.openstreetmap.josm.actions.WireframeToggleAction; 91 94 import org.openstreetmap.josm.actions.ZoomInAction; 92 95 import org.openstreetmap.josm.actions.ZoomOutAction; 93 import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;94 import org.openstreetmap.josm.actions.PreferenceToggleAction;95 96 import org.openstreetmap.josm.actions.audio.AudioBackAction; 96 97 import org.openstreetmap.josm.actions.audio.AudioFasterAction; 97 98 import org.openstreetmap.josm.actions.audio.AudioFwdAction; … … 229 230 public final JumpToAction jumpToAct = new JumpToAction(); 230 231 231 232 public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction(); 233 public final DialogsToggleAction dialogsToggleAction = new DialogsToggleAction(); 232 234 public FullscreenToggleAction fullscreenToggleAction = null; 233 235 234 236 /** this menu listener hides unnecessary JSeparators in a menu list but does not remove them. … … 514 516 fullscreen.setAccelerator(fullscreenToggleAction.getShortcut().getKeyStroke()); 515 517 fullscreenToggleAction.addButtonModel(fullscreen.getModel()); 516 518 } 519 520 // -- dialogs panel toggle action 521 final JCheckBoxMenuItem dialogspanel = new JCheckBoxMenuItem(dialogsToggleAction); 522 dialogspanel.setAccelerator(dialogsToggleAction.getShortcut().getKeyStroke()); 523 dialogsToggleAction.addButtonModel(dialogspanel.getModel()); 524 viewMenu.add(dialogspanel); 525 517 526 viewMenu.addSeparator(); 518 527 add(viewMenu, info); 519 528 add(viewMenu, infoweb); -
src/org/openstreetmap/josm/gui/MapFrame.java
9 9 import java.awt.Dimension; 10 10 import java.awt.Font; 11 11 import java.awt.GridBagLayout; 12 import java.awt.KeyboardFocusManager; 12 13 import java.awt.Rectangle; 13 14 import java.awt.event.ActionEvent; 14 15 import java.awt.event.KeyEvent; … … 17 18 import java.util.ArrayList; 18 19 import java.util.Collection; 19 20 import java.util.HashMap; 21 import java.util.HashSet; 20 22 import java.util.List; 21 23 import java.util.Map; 22 24 import java.util.concurrent.CopyOnWriteArrayList; … … 72 74 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 73 75 import org.openstreetmap.josm.tools.Destroyable; 74 76 import org.openstreetmap.josm.tools.GBC; 77 import org.openstreetmap.josm.tools.Shortcut; 75 78 76 79 /** 77 80 * One Map frame with one dataset behind. This is the container gui class whose … … 120 123 * instead of adding directly to this list. 121 124 */ 122 125 private List<ToggleDialog> allDialogs = new ArrayList<ToggleDialog>(); 126 private final JSplitPane splitPane; 123 127 private final JPanel leftPanel; 124 128 private final DialogsPanel dialogsPanel; 125 129 … … 177 181 178 182 toolGroup.setSelected(((AbstractButton)toolBarActions.getComponent(0)).getModel(), true); 179 183 180 JSplitPanesplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);184 splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true); 181 185 dialogsPanel = new DialogsPanel(splitPane); 182 186 splitPane.setLeftComponent(leftPanel); 183 187 splitPane.setRightComponent(dialogsPanel); … … 233 237 // status line below the map 234 238 statusLine = new MapStatus(this); 235 239 MapView.addLayerChangeListener(this); 240 // unregister TAB key if needed 241 if (Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null) { 242 unregisterTabKey(); 243 } 236 244 } 237 245 238 246 public boolean selectSelectTool(boolean onlyIfModeless) { … … 255 263 256 264 return selectMapMode(mapModeZoom); 257 265 } 266 267 /** 268 * Free tabulator key (call if someone else needs it) 269 */ 270 public final void unregisterTabKey() { 271 System.out.println("Tab key unregistered"); 272 HashSet<KeyStroke> ks = new HashSet<KeyStroke>(1); 273 ks.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK)); 274 KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 275 kfm.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, ks); 276 splitPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, ks); 277 } 258 278 259 279 /** 260 280 * Called as some kind of destructor when the last layer has been removed. 261 281 * Delegates the call to all Destroyables within this component (e.g. MapModes) 262 282 */ 283 @Override 263 284 public void destroy() { 264 285 MapView.removeLayerChangeListener(this); 265 286 dialogsPanel.destroy(); … … 416 437 toToggle = svp; 417 438 panel.add(svp, BorderLayout.WEST); 418 439 jb.addMouseWheelListener(new MouseWheelListener() { 419 440 @Override 420 441 public void mouseWheelMoved(MouseWheelEvent e) { 421 442 svp.scroll(0, e.getUnitsToScroll() * 5); 422 443 } … … 543 564 return dialogsPanel.getToggleDialog(type); 544 565 } 545 566 567 public void setDialogsPanelVisible(boolean visible) { 568 rememberToggleDialogWidth(); 569 dialogsPanel.setVisible(visible); 570 splitPane.setDividerLocation(visible?splitPane.getWidth()-Main.pref.getInteger("toggleDialogs.width",DEF_TOGGLE_DLG_WIDTH):0); 571 splitPane.setDividerSize(visible?5:0); 572 } 573 546 574 /** 547 575 * Remember the current width of the (possibly resized) toggle dialog area 548 576 */ 549 577 public void rememberToggleDialogWidth() { 550 Main.pref.putInteger("toggleDialogs.width", dialogsPanel.getWidth()); 578 if (dialogsPanel.isVisible()) { 579 Main.pref.putInteger("toggleDialogs.width", splitPane.getWidth()-splitPane.getDividerLocation()); 551 580 } 581 } 552 582 553 583 /* 554 * Remove panel from top of MapView by class 555 */ 584 * Remove panel from top of MapView by class */ 556 585 public void removeTopPanel(Class<?> type) { 557 586 int n = leftPanel.getComponentCount(); 558 587 for (int i=0; i<n; i++) { … … 652 681 // After all listeners notice new layer, some buttons will be disabled/enabled 653 682 // and possibly need to be hidden/shown. 654 683 SwingUtilities.invokeLater(new Runnable() { 655 public void run() {684 @Override public void run() { 656 685 validateToolBarsVisibility(); 657 686 } 658 687 }); -
src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
17 17 import java.awt.event.ActionListener; 18 18 import java.awt.event.InputEvent; 19 19 import java.awt.event.KeyEvent; 20 import java.awt.event.MouseEvent; 20 21 import java.beans.PropertyChangeEvent; 21 22 import java.beans.PropertyChangeListener; 22 23 import java.io.IOException; … … 28 29 import java.util.LinkedList; 29 30 import java.util.List; 30 31 import java.util.Map; 32 import javax.swing.AbstractAction; 31 33 32 34 import javax.swing.Action; 33 35 import javax.swing.DefaultListCellRenderer; … … 35 37 import javax.swing.Icon; 36 38 import javax.swing.ImageIcon; 37 39 import javax.swing.JButton; 40 import javax.swing.JCheckBoxMenuItem; 38 41 import javax.swing.JComponent; 39 42 import javax.swing.JLabel; 40 43 import javax.swing.JList; … … 64 67 import org.openstreetmap.josm.actions.JosmAction; 65 68 import org.openstreetmap.josm.actions.ParameterizedAction; 66 69 import org.openstreetmap.josm.actions.ParameterizedActionDecorator; 70 67 71 import org.openstreetmap.josm.gui.tagging.TaggingPreset; 68 72 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 69 73 import org.openstreetmap.josm.tools.GBC; … … 72 76 73 77 public class ToolbarPreferences implements PreferenceSettingFactory { 74 78 75 76 79 private static final String EMPTY_TOOLBAR_MARKER = "<!-empty-!>"; 77 80 78 81 public static class ActionDefinition { … … 382 385 383 386 } 384 387 385 private static class ToolbarPopupMenu extends JPopupMenu { 386 public ToolbarPopupMenu(final ActionDefinition action) { 388 private class ToolbarPopupMenu extends JPopupMenu { 389 ActionDefinition act; 390 391 public void setActionAndAdapt(ActionDefinition action) { 392 this.act = action; 393 doNotHide.setSelected(Main.pref.getBoolean("toolbar.always-visible", true)); 394 remove.setVisible(act!=null); 395 shortcutEdit.setVisible(act!=null); 396 } 397 398 JMenuItem remove = new JMenuItem(new AbstractAction(tr("Remove from toolbar")) { 399 @Override 400 public void actionPerformed(ActionEvent e) { 401 Collection<String> t = new LinkedList<String>(getToolString()); 402 ActionParser parser = new ActionParser(null); 403 // get text definition of current action 404 String res = parser.saveAction(act); 405 // remove the button from toolbar preferences 406 t.remove(res); 407 Main.pref.putCollection("toolbar", t); 408 Main.toolbar.refreshToolbarControl(); 409 }; 410 }); 387 411 388 if(action != null) { 389 add(tr("Remove from toolbar",action.getDisplayName())) 390 .addActionListener(new ActionListener() { 391 @Override public void actionPerformed(ActionEvent e) { 392 Collection<String> t = new LinkedList<String>(getToolString()); 393 ActionParser parser = new ActionParser(null); 394 // get text definition of current action 395 String res = parser.saveAction(action); 396 // remove the button from toolbar preferences 397 t.remove( res ); 398 Main.pref.putCollection("toolbar", t); 399 Main.toolbar.refreshToolbarControl(); 400 } 401 }); 412 JMenuItem configure = new JMenuItem(new AbstractAction(tr("Configure toolbar")) { 413 @Override 414 public void actionPerformed(ActionEvent e) { 415 final PreferenceDialog p = new PreferenceDialog(Main.parent); 416 p.selectPreferencesTabByName("toolbar"); 417 p.setVisible(true); 402 418 } 419 }); 420 421 JMenuItem shortcutEdit = new JMenuItem(new AbstractAction(tr("Edit shortcut")) { 422 @Override 423 public void actionPerformed(ActionEvent e) { 424 final PreferenceDialog p = new PreferenceDialog(Main.parent); 425 p.getTabbedPane().getShortcutPreference().setDefaultFilter(act.getDisplayName()); 426 p.selectPreferencesTabByName("shortcuts"); 427 p.setVisible(true); 428 // refresh toolbar to try using changed shortcuts without restart 429 Main.toolbar.refreshToolbarControl(); 430 } 431 }); 403 432 404 add(tr("Configure toolbar")).addActionListener(new ActionListener() { 405 @Override public void actionPerformed(ActionEvent e) { 406 final PreferenceDialog p =new PreferenceDialog(Main.parent); 407 p.selectPreferencesTabByName("toolbar"); 408 p.setVisible(true); 409 } 410 }); 411 412 add(tr("Edit shortcut")).addActionListener(new ActionListener() { 413 @Override public void actionPerformed(ActionEvent e) { 414 final PreferenceDialog p =new PreferenceDialog(Main.parent); 415 p.getTabbedPane().getShortcutPreference().setDefaultFilter(action.getDisplayName()); 416 p.selectPreferencesTabByName("shortcuts"); 417 p.setVisible(true); 418 // refresh toolbar to accept changes of shortcuts without restart 419 Main.toolbar.refreshToolbarControl(); 420 } 421 }); 433 JCheckBoxMenuItem doNotHide = new JCheckBoxMenuItem(new AbstractAction(tr("Do not hide toolbar and menu")) { 434 @Override 435 public void actionPerformed(ActionEvent e) { 436 boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState(); 437 Main.pref.put("toolbar.always-visible", sel); 438 Main.pref.put("menu.always-visible", sel); 439 } 440 }); 441 { 442 add(remove); 443 add(configure); 444 add(shortcutEdit); 445 add(doNotHide); 422 446 } 423 } 447 }; 448 449 450 private ToolbarPopupMenu popupMenu = new ToolbarPopupMenu(); 451 private PopupMenuLauncher menuLauncher = new PopupMenuLauncher(popupMenu) { 452 @Override 453 public void launch(MouseEvent evt) { 454 popupMenu.setActionAndAdapt(buttonActions.get(evt.getSource())); 455 super.launch(evt); //To change body of generated methods, choose Tools | Templates. 456 } 457 }; 424 458 425 459 /** 426 460 * Key: Registered name (property "toolbar" of action). … … 432 466 private DefaultMutableTreeNode rootActionsNode = new DefaultMutableTreeNode(tr("Actions")); 433 467 434 468 public JToolBar control = new JToolBar(); 435 469 private HashMap<Object, ActionDefinition> buttonActions = new HashMap<Object, ActionDefinition>(30); 470 436 471 @Override 437 472 public PreferenceSetting createPreferenceSetting() { 438 473 return new Settings(rootActionsNode); … … 841 876 842 877 public ToolbarPreferences() { 843 878 control.setFloatable(false); 844 control.addMouseListener( new PopupMenuLauncher(new ToolbarPopupMenu(null)));879 control.addMouseListener(menuLauncher); 845 880 } 846 881 847 882 private void loadAction(DefaultMutableTreeNode node, MenuElement menu) { … … 978 1013 */ 979 1014 public void refreshToolbarControl() { 980 1015 control.removeAll(); 1016 buttonActions.clear(); 981 1017 982 1018 for (ActionDefinition action : getDefinedActions()) { 983 1019 if (action.isSeparator()) { 984 1020 control.addSeparator(); 985 1021 } else { 986 1022 final JButton b = addButtonAndShortcut(action); 1023 buttonActions.put(b, action); 987 1024 988 1025 Icon i = action.getDisplayIcon(); 989 1026 if (i != null) { … … 1000 1037 } 1001 1038 }); 1002 1039 } 1003 b.addMouseListener( new PopupMenuLauncher( new ToolbarPopupMenu(action)));1040 b.addMouseListener(menuLauncher); 1004 1041 } 1005 1042 } 1006 1043 control.setVisible(control.getComponentCount() != 0); -
src/org/openstreetmap/josm/tools/Shortcut.java
244 244 // and here our modifier groups 245 245 private static Map<Integer, Integer> groups= new HashMap<Integer, Integer>(); 246 246 247 // check if something collides with an existing shortcut 248 private static Shortcut findShortcut(int requestedKey, int modifier) { 247 /* 248 * Check if something collides with an existing shortcut and return Shortcut object 249 */ 250 public static Shortcut findShortcut(int requestedKey, int modifier) { 249 251 if (modifier == getGroupModifier(NONE)) 250 252 return null; 251 253 for (Shortcut sc : shortcuts.values()) { … … 268 270 } 269 271 return l; 270 272 } 271 273 272 274 public static final int NONE = 5000; 273 275 public static final int MNEMONIC = 5001; 274 276 public static final int RESERVED = 5002;