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 }