Ignore:
Timestamp:
2014-01-24T01:30:06+01:00 (10 years ago)
Author:
Don-vip
Message:

fix #7633, see #9264 - fix dynamic side buttons broken in r6727 + many small enhancements

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

Legend:

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

    r6727 r6752  
    3232import javax.swing.AbstractAction;
    3333import javax.swing.BorderFactory;
     34import javax.swing.ButtonGroup;
    3435import javax.swing.JButton;
    3536import javax.swing.JCheckBoxMenuItem;
     
    4849import org.openstreetmap.josm.Main;
    4950import org.openstreetmap.josm.actions.JosmAction;
     51import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
     52import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
     53import org.openstreetmap.josm.data.preferences.BooleanProperty;
    5054import org.openstreetmap.josm.data.preferences.ParametrizedEnumProperty;
    5155import org.openstreetmap.josm.gui.MainMenu;
     
    7175 *
    7276 */
    73 public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener, Destroyable {
     77public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener, Destroyable, PreferenceChangedListener {
    7478
    7579    /**
     
    8488        DYNAMIC
    8589    }
     90   
     91    /**
     92     * Property to enable dyanmic buttons globally.
     93     * @since 6752
     94     */
     95    public static final BooleanProperty PROP_DYNAMIC_BUTTONS = new BooleanProperty("dialog.dynamic.buttons", false);
    8696
    8797    private final ParametrizedEnumProperty<ButtonHidingType> PROP_BUTTON_HIDING = new ParametrizedEnumProperty<ToggleDialog.ButtonHidingType>(
    88             ButtonHidingType.class, ButtonHidingType.ALWAYS_SHOWN) {
     98            ButtonHidingType.class, ButtonHidingType.DYNAMIC) {
    8999        @Override
    90100        protected String getKey(String... params) {
     
    137147    private int preferredHeight;
    138148
    139     /** the label in the title bar which shows whether the toggle dialog is expanded or collapsed */
    140     private JLabel lblMinimized;
    141 
    142     /** the label in the title bar which shows whether buttons are dynamic or not */
    143     private JButton buttonsHide = null;
    144 
    145149    /** the JDialog displaying the toggle dialog as undocked dialog */
    146150    protected JDialog detachedDialog;
     
    172176        this(name, iconName, tooltip, shortcut, preferredHeight, false);
    173177    }
     178
    174179    /**
    175180     * Constructor
     
    185190        this(name, iconName, tooltip, shortcut, preferredHeight, defShow, null);
    186191    }
     192
    187193    /**
    188194     * Constructor
     
    223229
    224230        Main.redirectToMainContentPane(this);
     231        Main.pref.addPreferenceChangeListener(this);
    225232
    226233        windowMenuItem = MainMenu.addWithCheckbox(Main.main.menu.windowMenu,
     
    370377            setMaximumSize(new Dimension(Integer.MAX_VALUE,20));
    371378            setMinimumSize(new Dimension(Integer.MAX_VALUE,20));
    372             lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
     379            titleBar.lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
    373380        }
    374381        else throw new IllegalStateException();
     
    384391            setPreferredSize(new Dimension(0,preferredHeight));
    385392            setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
    386             lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
     393            titleBar.lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
    387394        }
    388395        else throw new IllegalStateException();
     
    409416        Main.main.menu.windowMenu.remove(windowMenuItem);
    410417        Toolkit.getDefaultToolkit().removeAWTEventListener(this);
     418        Main.pref.removePreferenceChangeListener(this);
    411419        destroyComponents(this, false);
    412420    }
     
    457465     */
    458466    protected class TitleBar extends JPanel {
    459         final private JLabel lblTitle;
    460         final private JComponent lblTitle_weak;
     467        /** the label which shows whether the toggle dialog is expanded or collapsed */
     468        private final JLabel lblMinimized;
     469        /** the label which displays the dialog's title **/
     470        private final JLabel lblTitle;
     471        private final JComponent lblTitle_weak;
     472        private final DialogPopupMenu popupMenu = new DialogPopupMenu();
     473        /** the button which shows whether buttons are dynamic or not */
     474        private final JButton buttonsHide;
    461475
    462476        public TitleBar(String toggleDialogName, String iconName) {
     
    486500            add(lblTitle_weak, GBC.std().fill(GBC.HORIZONTAL));
    487501
    488             if(Main.pref.getBoolean("dialog.dynamic.buttons", true)) {
    489                 buttonsHide = new JButton(ImageProvider.get("misc", buttonHiding != ButtonHidingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
    490                 buttonsHide.setToolTipText(tr("Toggle dynamic buttons"));
    491                 buttonsHide.setBorder(BorderFactory.createEmptyBorder());
    492                 buttonsHide.addActionListener(
    493                         new ActionListener(){
    494                             @Override
    495                             public void actionPerformed(ActionEvent e) {
    496                                 setIsButtonHiding(buttonHiding == ButtonHidingType.ALWAYS_SHOWN?ButtonHidingType.DYNAMIC:ButtonHidingType.ALWAYS_SHOWN);
    497                             }
     502            buttonsHide = new JButton(ImageProvider.get("misc", buttonHiding != ButtonHidingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
     503            buttonsHide.setToolTipText(tr("Toggle dynamic buttons"));
     504            buttonsHide.setBorder(BorderFactory.createEmptyBorder());
     505            buttonsHide.addActionListener(
     506                    new ActionListener() {
     507                        @Override
     508                        public void actionPerformed(ActionEvent e) {
     509                            JRadioButtonMenuItem item = (buttonHiding == ButtonHidingType.DYNAMIC) ? popupMenu.alwaysShown : popupMenu.dynamic;
     510                            item.setSelected(true);
     511                            item.getAction().actionPerformed(null);
    498512                        }
    499                         );
    500                 add(buttonsHide);
    501             }
     513                    }
     514                    );
     515            add(buttonsHide);
    502516
    503517            // show the pref button if applicable
     
    568582
    569583        public class DialogPopupMenu extends JPopupMenu {
    570             public final JMenu buttonHidingMenu = new JMenu(tr("Side buttons"));
    571             public final JRadioButtonMenuItem alwaysShown = new JRadioButtonMenuItem(new AbstractAction(tr("Always shown")) {
     584            private final ButtonGroup buttonHidingGroup = new ButtonGroup();
     585            private final JMenu buttonHidingMenu = new JMenu(tr("Side buttons"));
     586
     587            public final JRadioButtonMenuItem alwaysShown  = new JRadioButtonMenuItem(new AbstractAction(tr("Always shown")) {
    572588                @Override public void actionPerformed(ActionEvent e) {
    573589                    setIsButtonHiding(ButtonHidingType.ALWAYS_SHOWN);
    574590                }
    575591            });
    576             public final JRadioButtonMenuItem dynamic = new JRadioButtonMenuItem(new AbstractAction(tr("Dynamic")) {
     592
     593            public final JRadioButtonMenuItem dynamic      = new JRadioButtonMenuItem(new AbstractAction(tr("Dynamic")) {
    577594                @Override public void actionPerformed(ActionEvent e) {
    578595                    setIsButtonHiding(ButtonHidingType.DYNAMIC);
    579596                }
    580597            });
     598
    581599            public final JRadioButtonMenuItem alwaysHidden = new JRadioButtonMenuItem(new AbstractAction(tr("Always hidden")) {
    582600                @Override public void actionPerformed(ActionEvent e) {
     
    584602                }
    585603            });
     604
    586605            public DialogPopupMenu() {
    587606                alwaysShown.setSelected(buttonHiding == ButtonHidingType.ALWAYS_SHOWN);
    588607                dynamic.setSelected(buttonHiding == ButtonHidingType.DYNAMIC);
    589608                alwaysHidden.setSelected(buttonHiding == ButtonHidingType.ALWAYS_HIDDEN);
    590                 buttonHidingMenu.add(alwaysShown);
    591                 buttonHidingMenu.add(dynamic);
    592                 buttonHidingMenu.add(alwaysHidden);
     609                for (JRadioButtonMenuItem rb : new JRadioButtonMenuItem[]{alwaysShown, dynamic, alwaysHidden}) {
     610                    buttonHidingGroup.add(rb);
     611                    buttonHidingMenu.add(rb);
     612                }
    593613                add(buttonHidingMenu);
    594614                for (javax.swing.Action action: buttonActions) {
     
    598618        }
    599619
    600         public void registerMouseListener() {
     620        public final void registerMouseListener() {
    601621            addMouseListener(new MouseEventHandler());
    602622        }
     
    604624        class MouseEventHandler extends PopupMenuLauncher {
    605625            public MouseEventHandler() {
    606                 super(new DialogPopupMenu());
     626                super(popupMenu);
    607627            }
    608628            @Override public void mouseClicked(MouseEvent e) {
     
    624644     *
    625645     */
    626     private class DetachedDialog extends JDialog{
     646    private class DetachedDialog extends JDialog {
    627647        public DetachedDialog() {
    628648            super(JOptionPane.getFrameForComponent(Main.parent));
     
    706726
    707727    /**
    708      * Sets the title
     728     * Sets the title.
     729     * @param title The dialog's title
    709730     */
    710731    public void setTitle(String title) {
     
    722743
    723744    protected void setIsDocked(boolean val) {
    724         if(buttonsPanel != null && buttonsHide != null) {
    725             buttonsPanel.setVisible(val ? buttonHiding == ButtonHidingType.ALWAYS_SHOWN : true);
     745        if (buttonsPanel != null) {
     746            buttonsPanel.setVisible(val ? buttonHiding != ButtonHidingType.ALWAYS_HIDDEN : true);
    726747        }
    727748        isDocked = val;
     
    739760        buttonHiding = val;
    740761        PROP_BUTTON_HIDING.put(val);
    741         if (buttonsHide != null) {
    742             buttonsHide.setIcon(ImageProvider.get("misc", val != ButtonHidingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
    743         }
    744         if (buttonsPanel != null) {
    745             buttonsPanel.setVisible(val != ButtonHidingType.ALWAYS_HIDDEN);
    746         }
    747         stateChanged();
    748     }
    749 
     762        refreshHidingButtons();
     763    }
     764   
    750765    public int getPreferredHeight() {
    751766        return preferredHeight;
     
    864879            }
    865880            add(buttonsPanel, BorderLayout.SOUTH);
    866             if (Main.pref.getBoolean("dialog.dynamic.buttons", true)) {
    867                 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_MOTION_EVENT_MASK);
    868                 buttonsPanel.setVisible(buttonHiding == ButtonHidingType.ALWAYS_SHOWN || !isDocked);
    869             } else if (buttonHiding == ButtonHidingType.ALWAYS_HIDDEN) {
    870                 buttonsPanel.setVisible(false);
    871             }
    872         } else if (buttonsHide != null) {
    873             buttonsHide.setVisible(false);
     881            dynamicButtonsPropertyChanged();
     882        } else {
     883            titleBar.buttonsHide.setVisible(false);
    874884        }
    875885
     
    894904        }
    895905    }
     906   
     907    @Override
     908    public void preferenceChanged(PreferenceChangeEvent e) {
     909        if (e.getKey().equals(PROP_DYNAMIC_BUTTONS.getKey())) {
     910            dynamicButtonsPropertyChanged();
     911        }
     912    }
     913   
     914    private void dynamicButtonsPropertyChanged() {
     915        boolean propEnabled = PROP_DYNAMIC_BUTTONS.get();
     916        if (propEnabled) {
     917            Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_MOTION_EVENT_MASK);
     918        } else {
     919            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
     920        }
     921        titleBar.buttonsHide.setVisible(propEnabled);
     922        refreshHidingButtons();
     923    }
     924
     925    private void refreshHidingButtons() {
     926        titleBar.buttonsHide.setIcon(ImageProvider.get("misc", buttonHiding != ButtonHidingType.ALWAYS_SHOWN ? "buttonhide" : "buttonshow"));
     927        titleBar.buttonsHide.setEnabled(buttonHiding != ButtonHidingType.ALWAYS_HIDDEN);
     928        if (buttonsPanel != null) {
     929            buttonsPanel.setVisible(buttonHiding != ButtonHidingType.ALWAYS_HIDDEN || !isDocked);
     930        }
     931        stateChanged();
     932    }
    896933}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r6746 r6752  
    5353import org.openstreetmap.josm.actions.relation.DownloadMembersAction;
    5454import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
    55 import org.openstreetmap.josm.actions.relation.EditRelationAction;
    5655import org.openstreetmap.josm.actions.relation.SelectInRelationListAction;
    5756import org.openstreetmap.josm.actions.relation.SelectMembersAction;
     
    6362import org.openstreetmap.josm.command.Command;
    6463import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
    65 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
    6664import org.openstreetmap.josm.data.SelectionChangedListener;
    6765import org.openstreetmap.josm.data.osm.IRelation;
     
    118116 * @author imi
    119117 */
    120 public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetListenerAdapter.Listener, PreferenceChangedListener {
     118public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetListenerAdapter.Listener {
    121119
    122120    /**
     
    12531251    @Override
    12541252    public void preferenceChanged(PreferenceChangeEvent e) {
     1253        super.preferenceChanged(e);
    12551254        if ("display.discardable-keys".equals(e.getKey()) && Main.main.getCurrentDataSet() != null) {
    12561255            // Re-load data when display preference change
  • trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java

    r6529 r6752  
    2121import org.openstreetmap.josm.Main;
    2222import org.openstreetmap.josm.actions.ExpertToggleAction;
     23import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
    2324import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    2425import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
     
    110111
    111112        dynamicButtons.setToolTipText(tr("Display buttons in right side menus only when mouse is inside the element"));
    112         dynamicButtons.setSelected(Main.pref.getBoolean("dialog.dynamic.buttons", true));
     113        dynamicButtons.setSelected(ToggleDialog.PROP_DYNAMIC_BUTTONS.get());
    113114        panel.add(dynamicButtons, GBC.eop().insets(20, 0, 0, 0));
    114115
     
    131132        Main.pref.put("osm-primitives.localize-name", showLocalizedName.isSelected());
    132133        Main.pref.put("modeless", modeless.isSelected());
    133         Main.pref.put("dialog.dynamic.buttons", dynamicButtons.isSelected());
     134        Main.pref.put(ToggleDialog.PROP_DYNAMIC_BUTTONS.getKey(), dynamicButtons.isSelected());
    134135        mod |= Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName());
    135136        return mod;
Note: See TracChangeset for help on using the changeset viewer.