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 }