Changeset 4609 in josm


Ignore:
Timestamp:
26.11.2011 16:52:05 (6 months ago)
Author:
stoecker
Message:

fix #6953 - patch by akks - improve hide handling for left toolbar

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java

    r3451 r4609  
    77import java.beans.PropertyChangeListener; 
    88 
     9import javax.swing.AbstractAction; 
    910import javax.swing.Action; 
     11import javax.swing.Icon; 
    1012import javax.swing.JToggleButton; 
    1113 
     14import org.openstreetmap.josm.Main; 
    1215import org.openstreetmap.josm.tools.Destroyable; 
    1316 
     
    1518 * Just a toggle button, with smaller border and icon only to display in 
    1619 * MapFrame toolbars. 
    17  * 
    18  * @author imi 
     20 * Also provides methods for storing hidden state in preferences 
     21 * @author imi, akks 
    1922 */ 
    20 public class IconToggleButton extends JToggleButton implements PropertyChangeListener, Destroyable { 
     23public class IconToggleButton extends JToggleButton implements HideableButton, PropertyChangeListener, Destroyable { 
    2124 
    2225    public boolean groupbutton; 
     26    private ShowHideButtonListener listener; 
    2327 
    2428    /** 
     
    5963        action.removePropertyChangeListener(this); 
    6064    } 
     65     
     66    @Override 
     67    public void applyButtonHiddenPreferences() { 
     68            String actionName = (String) getAction().getValue(AbstractAction.NAME); 
     69            boolean hiddenFlag = 
     70                    Main.pref.getBoolean(actionName + ".itbutton_hidden", false); 
     71            setVisible(!hiddenFlag);    
     72    } 
     73 
     74    @Override 
     75    public void setButtonHidden(boolean b) { 
     76            String actionName = (String) getAction().getValue(AbstractAction.NAME); 
     77            setVisible(!b); 
     78            if (listener!=null) { // if someone wants to know about changes of visibility 
     79                if (!b) listener.buttonShown(); else listener.buttonHidden(); 
     80            } 
     81            Main.pref.put(actionName + ".itbutton_hidden", b); 
     82             
     83    } 
     84    @Override 
     85    public void showButton() { 
     86        setButtonHidden(false); 
     87    } 
     88    @Override 
     89    public void hideButton() { 
     90        setButtonHidden(true); 
     91    } 
     92 
     93    @Override 
     94    public String getActionName() { 
     95        return (String) getAction().getValue(Action.NAME); 
     96    } 
     97 
     98    @Override 
     99    public Icon getIcon() { 
     100        return (Icon) getAction().getValue(Action.SMALL_ICON); 
     101    } 
     102 
     103    @Override 
     104    public boolean isButtonVisible() { 
     105        return isVisible(); 
     106    } 
     107 
     108    @Override 
     109    public void setShowHideButtonListener(ShowHideButtonListener l) { 
     110        listener = l; 
     111    } 
     112 
     113  
    61114} 
  • trunk/src/org/openstreetmap/josm/gui/MapFrame.java

    r4590 r4609  
    1414import java.awt.event.MouseWheelListener; 
    1515import java.util.ArrayList; 
     16import java.util.Collection; 
    1617import java.util.HashMap; 
    1718import java.util.List; 
     
    107108 
    108109    public final ButtonGroup toolGroup = new ButtonGroup(); 
    109  
    110     public final JButton otherButton = new JButton(new OtherButtonsAction()); 
     110     
     111    private List<IconToggleButton> allDialogButtons = new ArrayList<IconToggleButton>(); 
     112    private List<IconToggleButton> allMapModeButtons = new ArrayList<IconToggleButton>(); 
     113     
     114    private final ListAllButtonsAction listAllDialogsAction = new ListAllButtonsAction(allDialogButtons); 
     115    private final ListAllButtonsAction listAllMapModesAction = new ListAllButtonsAction(allMapModeButtons); 
     116    private final JButton listAllToggleDialogsButton = new JButton(listAllDialogsAction); 
     117    private final JButton listAllMapModesButton = new JButton(listAllMapModesAction); 
     118    { 
     119        listAllDialogsAction.setButton(listAllToggleDialogsButton); 
     120        listAllMapModesAction.setButton(listAllMapModesButton); 
     121    } 
    111122 
    112123    /** 
     
    262273    public IconToggleButton addToggleDialog(final ToggleDialog dlg) { 
    263274        final IconToggleButton button = new IconToggleButton(dlg.getToggleAction()); 
    264         button.addMouseListener(new PopupMenuLauncher(new JPopupMenu() { 
    265             { 
    266                 add(new AbstractAction() { 
    267                     { 
    268                         putValue(NAME, tr("Hide this button")); 
    269                         putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again.")); 
    270                     } 
    271  
    272                     @Override 
    273                     public void actionPerformed(ActionEvent e) { 
    274                         dlg.hideButton(); 
    275                         validateToolBarToggle(); 
    276                     } 
    277                 }); 
    278             } 
    279         })); 
     275        button.setShowHideButtonListener(dlg); 
     276        addHideContextMenu(button); 
    280277        dlg.setButton(button); 
    281         if (button.isVisible()) { 
    282             toolBarToggle.add(button); 
    283         } 
     278        toolBarToggle.add(button); 
    284279        allDialogs.add(dlg); 
     280        allDialogButtons.add(button); 
     281        button.applyButtonHiddenPreferences(); 
    285282        if (dialogsPanel.initialized) { 
    286283            dialogsPanel.add(dlg); 
     
    289286    } 
    290287 
    291     public void validateToolBarToggle() { 
    292         toolBarToggle.removeAll(); 
    293         for (ToggleDialog dlg : allDialogs) { 
    294             if (dlg.getButton().isVisible()) { 
    295                 toolBarToggle.add(dlg.getButton()); 
    296             } 
    297         } 
    298     } 
     288 
    299289 
    300290    public void addMapMode(IconToggleButton b) { 
    301291        toolBarActions.add(b); 
    302292        toolGroup.add(b); 
     293        allMapModeButtons.add(b); 
    303294        if (b.getAction() instanceof MapMode) { 
    304295            mapModes.add((MapMode) b.getAction()); 
    305296        } else 
    306297            throw new IllegalArgumentException("MapMode action must be subclass of MapMode"); 
     298        addHideContextMenu(b); 
     299        b.applyButtonHiddenPreferences(); 
    307300    } 
    308301 
     
    363356        toolBarActions.setAlignmentX(0.5f); 
    364357        jb.add(toolBarActions); 
    365  
     358        listAllMapModesButton.setAlignmentX(0.5f); 
     359        listAllMapModesButton.setBorder(null); 
     360        listAllMapModesButton.setFont(listAllMapModesButton.getFont().deriveFont(Font.PLAIN)); 
     361        jb.add(listAllMapModesButton); 
     362         
    366363        if(Main.pref.getBoolean("sidetoolbar.togglevisible", true)) { 
    367364            jb.addSeparator(new Dimension(0,18)); 
    368365            toolBarToggle.setAlignmentX(0.5f); 
    369366            jb.add(toolBarToggle); 
    370             otherButton.setAlignmentX(0.5f); 
    371             otherButton.setBorder(null); 
    372             otherButton.setFont(otherButton.getFont().deriveFont(Font.PLAIN)); 
    373             jb.add(otherButton); 
     367            listAllToggleDialogsButton.setAlignmentX(0.5f); 
     368            listAllToggleDialogsButton.setBorder(null); 
     369            listAllToggleDialogsButton.setFont(listAllToggleDialogsButton.getFont().deriveFont(Font.PLAIN)); 
     370            jb.add(listAllToggleDialogsButton); 
    374371        } 
    375372 
     
    393390    } 
    394391 
    395     class OtherButtonsAction extends AbstractAction { 
    396  
    397         public OtherButtonsAction() { 
     392    private void addHideContextMenu(final IconToggleButton b) { 
     393        //context menu 
     394        b.addMouseListener(new PopupMenuLauncher(new JPopupMenu() { 
     395            { 
     396                add(new AbstractAction() { 
     397                    { 
     398                        putValue(NAME, tr("Hide this button")); 
     399                        putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again.")); 
     400                    } 
     401                    @Override 
     402                    public void actionPerformed(ActionEvent e) { 
     403                        b.setButtonHidden(true); 
     404                        validateToolBarsVisibility(); 
     405                    } 
     406                }); 
     407            } 
     408        })); 
     409    } 
     410    
     411        class ListAllButtonsAction extends AbstractAction { 
     412 
     413        private JButton button; 
     414        private Collection<? extends HideableButton> buttons; 
     415         
     416                 
     417        public ListAllButtonsAction(Collection<? extends HideableButton> buttons) { 
     418            this.buttons = buttons; 
    398419            putValue(NAME, ">>"); 
     420        } 
     421 
     422        public void setButton(JButton button) { 
     423            this.button =  button; 
    399424        } 
    400425 
     
    402427        public void actionPerformed(ActionEvent e) { 
    403428            JPopupMenu menu = new JPopupMenu(); 
    404             for (final ToggleDialog t : allDialogs) { 
     429            for (HideableButton b : buttons) { 
     430                final HideableButton t = b; 
    405431                menu.add(new JCheckBoxMenuItem(new AbstractAction() { 
    406432                    { 
    407                         putValue(NAME, t.getToggleAction().getValue(NAME)); 
    408                         putValue(SMALL_ICON, t.getToggleAction().getValue(SMALL_ICON)); 
    409                         putValue(SELECTED_KEY, !t.isButtonHidden()); 
     433                        putValue(NAME, t.getActionName()); 
     434                        putValue(SMALL_ICON, t.getIcon()); 
     435                        putValue(SELECTED_KEY, t.isButtonVisible()); 
    410436                        putValue(SHORT_DESCRIPTION, tr("Hide or show this toggle button")); 
    411437                    } 
    412438                    @Override 
    413439                    public void actionPerformed(ActionEvent e) { 
    414                         if ((Boolean) getValue(SELECTED_KEY)) { 
    415                             t.showButton(); 
    416                             validateToolBarToggle(); 
    417                         } else { 
    418                             t.hideButton(); 
    419                             validateToolBarToggle(); 
    420                         } 
     440                        if ((Boolean) getValue(SELECTED_KEY)) t.showButton(); else t.hideButton(); 
     441                        validateToolBarsVisibility(); 
    421442                    } 
    422443                })); 
    423444            } 
    424             Rectangle bounds = otherButton.getBounds(); 
    425             menu.show(otherButton, bounds.x+bounds.width, 0); 
    426         } 
     445            Rectangle bounds = button.getBounds(); 
     446            menu.show(button, bounds.x + bounds.width, 0); 
     447        } 
     448    } 
     449 
     450    public void validateToolBarsVisibility() { 
     451        for (IconToggleButton b : allDialogButtons) { 
     452            b.applyButtonHiddenPreferences(); 
     453        } 
     454        toolBarToggle.repaint(); 
     455        for (IconToggleButton b : allMapModeButtons) { 
     456            b.applyButtonHiddenPreferences(); 
     457        } 
     458        toolBarActions.repaint(); 
    427459    } 
    428460 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java

    r4590 r4609  
    1313import java.awt.GridLayout; 
    1414import java.awt.Image; 
    15 import java.awt.Point; 
    1615import java.awt.Rectangle; 
    1716import java.awt.Toolkit; 
     
    4746import org.openstreetmap.josm.gui.help.HelpUtil; 
    4847import org.openstreetmap.josm.gui.help.Helpful; 
     48import org.openstreetmap.josm.gui.ShowHideButtonListener; 
    4949import org.openstreetmap.josm.gui.util.RedirectInputMap; 
    5050import org.openstreetmap.josm.gui.SideButton; 
     
    5757 * 
    5858 */ 
    59 public class ToggleDialog extends JPanel implements Helpful, AWTEventListener { 
     59public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener { 
    6060 
    6161    /** The action to toggle this dialog */ 
     
    9494 
    9595    protected JToggleButton button; 
    96     protected boolean buttonHidden; 
    9796    private JPanel buttonsPanel; 
    9897 
     
    143142        isDocked = Main.pref.getBoolean(preferencePrefix+".docked", true); 
    144143        isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false); 
    145  
    146         buttonHidden = Main.pref.getBoolean(preferencePrefix+".button_hidden", false); 
    147144 
    148145        RedirectInputMap.redirectToMainContentPane(this); 
     
    225222            dialogsPanel.reconstruct(Action.COLLAPSED_TO_DEFAULT, this); 
    226223        } else if (!isDialogShowing()) { 
    227             if (isButtonHidden()) { 
    228                 showButtonImpl(); 
    229             } 
     224//            if (isButtonHidden()) { 
     225//                showButtonImpl(); 
     226//            } 
    230227            showDialog(); 
    231228            if (isDocked && isCollapsed) { 
     
    239236    } 
    240237 
    241     public void hideButton() { 
    242         if (!button.isVisible()) 
    243             throw new AssertionError(); 
     238    @Override 
     239    public void buttonHidden() { 
    244240        if ((Boolean) toggleAction.getValue("selected")) { 
    245241            toggleAction.actionPerformed(null); 
    246242        } 
    247         button.setVisible(false); 
    248         setButtonHidden(true); 
    249     } 
    250  
    251     public void showButton() { 
    252         showButtonImpl(); 
     243    } 
     244 
     245    public void buttonShown() { 
    253246        unfurlDialog(); 
    254247    } 
    255248 
    256     protected void showButtonImpl() { 
    257         if (button.isVisible()) 
    258             throw new AssertionError(); 
    259         button.setVisible(true); 
    260         setButtonHidden(false); 
    261     } 
    262249 
    263250    /** 
     
    623610    } 
    624611 
    625     public boolean isButtonHidden() { 
    626         return buttonHidden; 
    627     } 
    628  
    629     protected void setButtonHidden(boolean buttonHidden) { 
    630         this.buttonHidden = buttonHidden; 
    631         Main.pref.put(preferencePrefix+".button_hidden", buttonHidden); 
    632     } 
    633  
    634  
    635612    public void setButton(JToggleButton button) { 
    636613        this.button = button; 
    637         button.setVisible(!buttonHidden); 
    638614    } 
    639615 
     
    641617        return button; 
    642618    } 
    643  
     619     
    644620    /*** 
    645621     * The following methods are intended to be overridden, in order to customize 
Note: See TracChangeset for help on using the changeset viewer.