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.util.ArrayList;
010 import java.util.List;
011
012 import javax.swing.ButtonModel;
013
014 import org.openstreetmap.josm.Main;
015 import org.openstreetmap.josm.tools.Shortcut;
016
017 public class ViewportFollowToggleAction extends JosmAction {
018 private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
019 private boolean selected;
020 public ViewportFollowToggleAction() {
021 super(
022 tr("Viewport Following"),
023 "viewport-follow",
024 tr("Enable/disable automatic moving of the map view to last placed node"),
025 Shortcut.registerShortcut("menu:view:viewportfollow", tr("Toggle Viewport Following"),
026 KeyEvent.VK_F, Shortcut.CTRL_SHIFT),
027 true /* register shortcut */
028 );
029 putValue("help", ht("/Action/ViewportFollowing"));
030 selected = false;
031 notifySelectedState();
032 }
033
034 public void addButtonModel(ButtonModel model) {
035 if (model != null && !buttonModels.contains(model)) {
036 buttonModels.add(model);
037 model.setSelected(selected);
038 }
039 }
040
041 public void removeButtonModel(ButtonModel model) {
042 if (model != null && buttonModels.contains(model)) {
043 buttonModels.remove(model);
044 }
045 }
046
047 protected void notifySelectedState() {
048 for (ButtonModel model: buttonModels) {
049 if (model.isSelected() != selected) {
050 model.setSelected(selected);
051 }
052 }
053 }
054
055 protected void toggleSelectedState() {
056 selected = !selected;
057 Main.map.mapView.viewportFollowing = selected;
058 notifySelectedState();
059 }
060 public void actionPerformed(ActionEvent e) {
061 toggleSelectedState();
062 }
063
064 @Override
065 protected void updateEnabledState() {
066 setEnabled(Main.isDisplayingMapView() && Main.main.getEditLayer() != null);
067 }
068 }