001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.actions;
003    
004    import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005    import static org.openstreetmap.josm.tools.I18n.tr;
006    
007    import java.awt.event.ActionEvent;
008    import java.awt.event.KeyEvent;
009    import java.awt.event.WindowAdapter;
010    import java.awt.event.WindowEvent;
011    import java.awt.event.WindowListener;
012    import java.util.ArrayList;
013    import java.util.List;
014    
015    import javax.swing.ButtonModel;
016    
017    import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
018    import org.openstreetmap.josm.tools.Shortcut;
019    /**
020     * This action toggles the visibility of the {@link ChangesetCacheManager} dialog.
021     *
022     */
023    public class ChangesetManagerToggleAction extends JosmAction {
024        private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
025        //FIXME: replace with property Action.SELECTED_KEY when migrating to
026        // Java 6
027        private boolean selected;
028        private WindowListener changesetCacheManagerClosedHandler;
029    
030        public ChangesetManagerToggleAction() {
031            super(
032                    tr("Changeset Manager"),
033                    "dialogs/changeset/changesetmanager",
034                    tr("Toggle visibility of Changeset Manager window"),
035                    Shortcut.registerShortcut("menu:windows:changesetdialog",
036                            tr("Toggle visibility of Changeset Manager window"),
037                            KeyEvent.VK_C, Shortcut.ALT_CTRL),
038                    true /* register shortcut */
039            );
040            notifySelectedState();
041            changesetCacheManagerClosedHandler = new ChangesetCacheManagerClosedHandler();
042            putValue("help", ht("/Dialog/ChangesetManager"));
043        }
044    
045        public void addButtonModel(ButtonModel model) {
046            if (model != null && !buttonModels.contains(model)) {
047                buttonModels.add(model);
048            }
049        }
050    
051        public void removeButtonModel(ButtonModel model) {
052            if (model != null && buttonModels.contains(model)) {
053                buttonModels.remove(model);
054            }
055        }
056    
057        protected void notifySelectedState() {
058            for (ButtonModel model: buttonModels) {
059                if (model.isSelected() != selected) {
060                    model.setSelected(selected);
061                }
062            }
063        }
064    
065        protected void toggleSelectedState() {
066            selected = !selected;
067            notifySelectedState();
068            if (selected) {
069                ChangesetCacheManager.getInstance().addWindowListener(changesetCacheManagerClosedHandler);
070                ChangesetCacheManager.getInstance().setVisible(true);
071            } else {
072                ChangesetCacheManager.getInstance().removeWindowListener(changesetCacheManagerClosedHandler);
073                ChangesetCacheManager.destroyInstance();
074            }
075        }
076    
077        public void actionPerformed(ActionEvent e) {
078            toggleSelectedState();
079        }
080    
081        private class ChangesetCacheManagerClosedHandler extends WindowAdapter {
082            @Override
083            public void windowClosed(WindowEvent e) {
084                selected = false;
085                notifySelectedState();
086                ChangesetCacheManager.getInstance().removeWindowListener(changesetCacheManagerClosedHandler);
087            }
088        }
089    }