source: josm/src/org/openstreetmap/josm/actions/GroupAction.java@ 101

Last change on this file since 101 was 101, checked in by imi, 18 years ago
  • added zoom/move around with Ctrl+direction keys / Ctrl +, Ctrl -
  • added progress bar counter of downloaded bytes
  • added support for little-osm (relaxed assumptions about osm/xml input format)
File size: 3.1 KB
Line 
1package org.openstreetmap.josm.actions;
2
3import java.awt.event.ActionEvent;
4import java.awt.event.ActionListener;
5import java.beans.PropertyChangeEvent;
6import java.beans.PropertyChangeListener;
7import java.util.ArrayList;
8import java.util.List;
9
10import javax.swing.Action;
11import javax.swing.Icon;
12import javax.swing.JComponent;
13import javax.swing.JMenuItem;
14import javax.swing.JPopupMenu;
15import javax.swing.KeyStroke;
16
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.gui.IconToggleButton;
19import org.openstreetmap.josm.tools.ImageProvider;
20import org.openstreetmap.josm.tools.ShortCutLabel;
21import org.openstreetmap.josm.tools.ImageProvider.OverlayPosition;
22
23
24public class GroupAction extends JosmAction {
25
26 protected final List<Action> actions = new ArrayList<Action>();
27 private int current = -1;
28 private String shortCutName = "";
29
30 private PropertyChangeListener forwardActiveListener = new PropertyChangeListener(){
31 public void propertyChange(PropertyChangeEvent evt) {
32 if (evt.getPropertyName().equals("active")) {
33 putValue("active", evt.getNewValue());
34 if (evt.getNewValue() == Boolean.FALSE)
35 cycle = false;
36 }
37 }
38 };
39 public boolean cycle;
40
41 protected void setCurrent(int current) {
42 if (this.current != -1)
43 actions.get(this.current).removePropertyChangeListener(forwardActiveListener);
44 actions.get(current).addPropertyChangeListener(forwardActiveListener);
45
46 this.current = current;
47 putValue(SMALL_ICON, ImageProvider.overlay((Icon)actions.get(current).getValue(SMALL_ICON), "overlay/right", OverlayPosition.SOUTHEAST));
48 Object tooltip = actions.get(current).getValue(SHORT_DESCRIPTION);
49 putValue(SHORT_DESCRIPTION, "<html>"+tooltip+" <font size='-2'>"+shortCutName+"</font>&nbsp;</html>");
50 }
51
52 public GroupAction(int shortCut, int modifiers) {
53 String idName = getClass().getName();
54 Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(shortCut, modifiers), idName);
55 Main.contentPane.getActionMap().put(idName, this);
56 shortCutName = ShortCutLabel.name(shortCut, modifiers);
57 addPropertyChangeListener(new PropertyChangeListener(){
58 public void propertyChange(PropertyChangeEvent evt) {
59 if (evt.getPropertyName().equals("active") && evt.getNewValue() == Boolean.FALSE)
60 cycle = false;
61 }
62 });
63 }
64
65 public void actionPerformed(ActionEvent e) {
66 if (e.getSource() instanceof IconToggleButton && ((IconToggleButton)e.getSource()).groupbutton) {
67 IconToggleButton b = (IconToggleButton)e.getSource();
68 b.setSelected(!b.isSelected());
69 openPopup(b);
70 } else {
71 if (cycle)
72 setCurrent((current+1)%actions.size());
73 else
74 cycle = true;
75 actions.get(current).actionPerformed(e);
76 }
77 }
78
79 private void openPopup(IconToggleButton b) {
80 JPopupMenu popup = new JPopupMenu();
81 for (int i = 0; i < actions.size(); ++i) {
82 final int j = i;
83 JMenuItem item = new JMenuItem(actions.get(i));
84 item.addActionListener(new ActionListener(){
85 public void actionPerformed(ActionEvent e) {
86 setCurrent(j);
87 }
88 });
89 popup.add(item);
90 }
91 popup.show(b, b.getWidth(), 0);
92 }
93}
Note: See TracBrowser for help on using the repository browser.