source: josm/trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java@ 3930

Last change on this file since 3930 was 3737, checked in by Upliner, 13 years ago

make possible to place imagery offset action to the top toolbar and place it there by default; completely fixes #5726

File size: 5.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trc;
6
7import java.awt.Component;
8import java.awt.event.ActionEvent;
9import java.util.List;
10
11import javax.swing.Action;
12import javax.swing.JComponent;
13import javax.swing.JMenu;
14import javax.swing.JMenuItem;
15import javax.swing.JPopupMenu;
16import javax.swing.MenuElement;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.actions.AddImageryLayerAction;
20import org.openstreetmap.josm.actions.JosmAction;
21import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
22import org.openstreetmap.josm.data.imagery.ImageryInfo;
23import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
24import org.openstreetmap.josm.gui.layer.ImageryLayer;
25import org.openstreetmap.josm.gui.layer.Layer;
26import org.openstreetmap.josm.gui.layer.WMSLayer;
27import org.openstreetmap.josm.tools.ImageProvider;
28
29public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
30 Action offsetAction = new JosmAction(
31 tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
32 {
33 putValue("toolbar", "imagery-offset");
34 Main.toolbar.register(this);
35 }
36 @Override
37 public void actionPerformed(ActionEvent e) {
38 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
39 if (layers.isEmpty()) {
40 setEnabled(false);
41 return;
42 }
43 Component source = null;
44 if (e.getSource() instanceof Component) {
45 source = (Component)e.getSource();
46 }
47 JPopupMenu popup = new JPopupMenu();
48 if (layers.size() == 1) {
49 JComponent c = layers.get(0).getOffsetMenuItem(popup);
50 if (c instanceof JMenuItem) {
51 ((JMenuItem) c).getAction().actionPerformed(e);
52 } else {
53 if (source == null) return;
54 popup.show(source, source.getWidth()/2, source.getHeight()/2);
55 }
56 return;
57 }
58 if (source == null) return;
59 for (ImageryLayer layer : layers) {
60 JMenuItem layerMenu = layer.getOffsetMenuItem();
61 layerMenu.setText(layer.getName());
62 layerMenu.setIcon(layer.getIcon());
63 popup.add(layerMenu);
64 }
65 popup.show(source, source.getWidth()/2, source.getHeight()/2);
66 }
67 };
68 JMenuItem singleOffset = new JMenuItem(offsetAction);
69 JMenuItem offsetMenuItem = singleOffset;
70 int offsPos;
71
72 public ImageryMenu() {
73 super(tr("Imagery"));
74 MapView.addLayerChangeListener(this);
75 }
76
77 public void refreshImageryMenu() {
78 removeAll();
79
80 // for each configured WMSInfo, add a menu entry.
81 for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
82 add(new AddImageryLayerAction(u));
83 }
84 addSeparator();
85 add(new JMenuItem(new Map_Rectifier_WMSmenuAction()));
86
87 addSeparator();
88 offsPos = getMenuComponentCount();
89 add(offsetMenuItem);
90 addSeparator();
91 add(new JMenuItem(new JosmAction(
92 tr("Blank Layer"), "blankmenu", tr("Open a blank WMS layer to load data from a file"), null, false) {
93 @Override
94 public void actionPerformed(ActionEvent ev) {
95 if (!isEnabled()) return;
96 Main.main.addLayer(new WMSLayer());
97 }
98
99 @Override
100 protected void updateEnabledState() {
101 setEnabled(Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty());
102 }
103 }));
104 }
105
106 private JMenuItem getNewOffsetMenu(){
107 if (Main.map == null || Main.map.mapView == null) {
108 offsetAction.setEnabled(false);
109 return singleOffset;
110 }
111 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
112 if (layers.isEmpty()) {
113 offsetAction.setEnabled(false);
114 return singleOffset;
115 }
116 offsetAction.setEnabled(true);
117 JMenu newMenu = new JMenu(trc("layer","Offset")) {
118 // Hack to prevent ToolbarPreference from tracing this menu
119 // TODO: Modify ToolbarPreference to not to trace such dynamic submenus?
120 @Override
121 public MenuElement[] getSubElements() {
122 return new MenuElement[0];
123 }
124 };
125 newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
126 newMenu.setAction(offsetAction);
127 if (layers.size() == 1)
128 return (JMenuItem)layers.get(0).getOffsetMenuItem(newMenu);
129 for (ImageryLayer layer : layers) {
130 JMenuItem layerMenu = layer.getOffsetMenuItem();
131 layerMenu.setText(layer.getName());
132 layerMenu.setIcon(layer.getIcon());
133 newMenu.add(layerMenu);
134 }
135 return newMenu;
136 }
137
138 public void refreshOffsetMenu() {
139 JMenuItem newItem = getNewOffsetMenu();
140 remove(offsetMenuItem);
141 add(newItem, offsPos);
142 offsetMenuItem = newItem;
143 }
144
145 @Override
146 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
147 }
148
149 @Override
150 public void layerAdded(Layer newLayer) {
151 if (newLayer instanceof ImageryLayer) {
152 refreshOffsetMenu();
153 }
154 }
155
156 @Override
157 public void layerRemoved(Layer oldLayer) {
158 if (oldLayer instanceof ImageryLayer) {
159 refreshOffsetMenu();
160 }
161 }
162}
Note: See TracBrowser for help on using the repository browser.