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    }