source: josm/trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java@ 12636

Last change on this file since 12636 was 12636, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.getLayerManager(). Replacement: gui.MainApplication.getLayerManager()

  • Property svn:eol-style set to native
File size: 6.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions.relation;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.Rectangle;
8import java.awt.event.ActionEvent;
9import java.awt.event.ActionListener;
10import java.awt.event.KeyEvent;
11import java.util.Collections;
12import java.util.List;
13
14import javax.swing.AbstractAction;
15import javax.swing.JMenuItem;
16import javax.swing.JPopupMenu;
17import javax.swing.KeyStroke;
18import javax.swing.plaf.basic.BasicArrowButton;
19
20import org.openstreetmap.josm.Main;
21import org.openstreetmap.josm.actions.JosmAction;
22import org.openstreetmap.josm.data.osm.Relation;
23import org.openstreetmap.josm.gui.DefaultNameFormatter;
24import org.openstreetmap.josm.gui.MainApplication;
25import org.openstreetmap.josm.gui.SideButton;
26import org.openstreetmap.josm.gui.layer.Layer;
27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
28import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
29import org.openstreetmap.josm.tools.ImageProvider;
30import org.openstreetmap.josm.tools.Shortcut;
31
32/**
33 * Action for accessing recent relations.
34 * @since 9668
35 */
36public class RecentRelationsAction extends JosmAction implements CommandQueueListener {
37
38 private final SideButton editButton;
39 private final BasicArrowButton arrow;
40 private final Shortcut shortcut;
41 private final LaunchEditorAction launchAction;
42
43 /**
44 * Constructs a new <code>RecentRelationsAction</code>.
45 * @param editButton edit button
46 */
47 public RecentRelationsAction(SideButton editButton) {
48 super(RecentRelationsAction.class.getName(), null, null, null, false, true);
49 this.editButton = editButton;
50 arrow = editButton.createArrow(this);
51 arrow.setToolTipText(tr("List of recent relations"));
52 Main.main.undoRedo.addCommandQueueListener(this);
53 enableArrow();
54 shortcut = Shortcut.registerShortcut(
55 "relationeditor:editrecentrelation",
56 tr("Relation Editor: {0}", tr("Open recent relation")),
57 KeyEvent.VK_ESCAPE,
58 Shortcut.SHIFT
59 );
60 launchAction = new LaunchEditorAction();
61 Main.registerActionShortcut(launchAction, shortcut);
62 }
63
64 /**
65 * Enables arrow button.
66 */
67 public void enableArrow() {
68 if (arrow != null) {
69 arrow.setVisible(getLastRelation() != null);
70 }
71 }
72
73 /**
74 * Returns the last relation.
75 * @return the last relation
76 */
77 public static Relation getLastRelation() {
78 List<Relation> recentRelations = getRecentRelationsOnActiveLayer();
79 if (recentRelations == null || recentRelations.isEmpty())
80 return null;
81 for (Relation relation: recentRelations) {
82 if (!isRelationListable(relation))
83 continue;
84 return relation;
85 }
86 return null;
87 }
88
89 /**
90 * Determines if the given relation is listable in last relations.
91 * @param relation relation
92 * @return {@code true} if relation is non null, not deleted, and in current dataset
93 */
94 public static boolean isRelationListable(Relation relation) {
95 return relation != null &&
96 !relation.isDeleted() &&
97 MainApplication.getLayerManager().getEditDataSet().containsRelation(relation);
98 }
99
100 @Override
101 public void actionPerformed(ActionEvent e) {
102 RecentRelationsPopupMenu.launch(editButton, shortcut.getKeyStroke());
103 }
104
105 @Override
106 public void commandChanged(int queueSize, int redoSize) {
107 enableArrow();
108 }
109
110 @Override
111 protected void updateEnabledState() {
112 enableArrow();
113 }
114
115 @Override
116 public void destroy() {
117 Main.unregisterActionShortcut(launchAction, shortcut);
118 super.destroy();
119 }
120
121 /**
122 * Returns the list of recent relations on active layer.
123 * @return the list of recent relations on active layer
124 */
125 public static List<Relation> getRecentRelationsOnActiveLayer() {
126 if (!MainApplication.isDisplayingMapView())
127 return Collections.emptyList();
128 Layer activeLayer = MainApplication.getLayerManager().getActiveLayer();
129 if (!(activeLayer instanceof OsmDataLayer)) {
130 return Collections.emptyList();
131 } else {
132 return ((OsmDataLayer) activeLayer).getRecentRelations();
133 }
134 }
135
136 static class LaunchEditorAction extends AbstractAction {
137 @Override
138 public void actionPerformed(ActionEvent e) {
139 EditRelationAction.launchEditor(getLastRelation());
140 }
141 }
142
143 static class RecentRelationsPopupMenu extends JPopupMenu {
144 /**
145 * Constructs a new {@code RecentRelationsPopupMenu}.
146 * @param recentRelations list of recent relations
147 * @param keystroke key stroke for the first menu item
148 */
149 RecentRelationsPopupMenu(List<Relation> recentRelations, KeyStroke keystroke) {
150 boolean first = true;
151 for (Relation relation: recentRelations) {
152 if (!isRelationListable(relation))
153 continue;
154 JMenuItem menuItem = new RecentRelationsMenuItem(relation);
155 if (first) {
156 menuItem.setAccelerator(keystroke);
157 first = false;
158 }
159 menuItem.setIcon(ImageProvider.getPadded(relation, ImageProvider.ImageSizes.MENU.getImageDimension()));
160 add(menuItem);
161 }
162 }
163
164 static void launch(Component parent, KeyStroke keystroke) {
165 Rectangle r = parent.getBounds();
166 new RecentRelationsPopupMenu(getRecentRelationsOnActiveLayer(), keystroke).show(parent, r.x, r.y + r.height);
167 }
168 }
169
170 /**
171 * A specialized {@link JMenuItem} for presenting one entry of the relation history
172 */
173 static class RecentRelationsMenuItem extends JMenuItem implements ActionListener {
174 private final transient Relation relation;
175
176 RecentRelationsMenuItem(Relation relation) {
177 super(relation.getDisplayName(DefaultNameFormatter.getInstance()));
178 this.relation = relation;
179 addActionListener(this);
180 }
181
182 @Override
183 public void actionPerformed(ActionEvent e) {
184 EditRelationAction.launchEditor(relation);
185 }
186 }
187}
Note: See TracBrowser for help on using the repository browser.