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 }