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

Last change on this file since 5517 was 5463, checked in by jttt, 12 years ago

Fix some memory leaks (see #7980)

File size: 5.3 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.tools.ImageProvider;
27
28public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
29 private Action offsetAction = new JosmAction(
30 tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
31 {
32 putValue("toolbar", "imagery-offset");
33 Main.toolbar.register(this);
34 }
35 @Override
36 public void actionPerformed(ActionEvent e) {
37 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
38 if (layers.isEmpty()) {
39 setEnabled(false);
40 return;
41 }
42 Component source = null;
43 if (e.getSource() instanceof Component) {
44 source = (Component)e.getSource();
45 }
46 JPopupMenu popup = new JPopupMenu();
47 if (layers.size() == 1) {
48 JComponent c = layers.get(0).getOffsetMenuItem(popup);
49 if (c instanceof JMenuItem) {
50 ((JMenuItem) c).getAction().actionPerformed(e);
51 } else {
52 if (source == null) return;
53 popup.show(source, source.getWidth()/2, source.getHeight()/2);
54 }
55 return;
56 }
57 if (source == null) return;
58 for (ImageryLayer layer : layers) {
59 JMenuItem layerMenu = layer.getOffsetMenuItem();
60 layerMenu.setText(layer.getName());
61 layerMenu.setIcon(layer.getIcon());
62 popup.add(layerMenu);
63 }
64 popup.show(source, source.getWidth()/2, source.getHeight()/2);
65 }
66 };
67 private JMenuItem singleOffset = new JMenuItem(offsetAction);
68 private JMenuItem offsetMenuItem = singleOffset;
69 private Map_Rectifier_WMSmenuAction rectaction = new Map_Rectifier_WMSmenuAction();
70 private 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 ImageryInfo, add a menu entry.
81 for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
82 add(new AddImageryLayerAction(u));
83 }
84 addSeparator();
85 add(new JMenuItem(rectaction));
86
87 addSeparator();
88 offsPos = getMenuComponentCount();
89 add(offsetMenuItem);
90 }
91
92 private JMenuItem getNewOffsetMenu(){
93 if (Main.map == null || Main.map.mapView == null) {
94 offsetAction.setEnabled(false);
95 return singleOffset;
96 }
97 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
98 if (layers.isEmpty()) {
99 offsetAction.setEnabled(false);
100 return singleOffset;
101 }
102 offsetAction.setEnabled(true);
103 JMenu newMenu = new JMenu(trc("layer","Offset")) {
104 // Hack to prevent ToolbarPreference from tracing this menu
105 // TODO: Modify ToolbarPreference to not to trace such dynamic submenus?
106 @Override
107 public MenuElement[] getSubElements() {
108 return new MenuElement[0];
109 }
110 };
111 newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
112 newMenu.setAction(offsetAction);
113 if (layers.size() == 1)
114 return (JMenuItem)layers.get(0).getOffsetMenuItem(newMenu);
115 for (ImageryLayer layer : layers) {
116 JMenuItem layerMenu = layer.getOffsetMenuItem();
117 layerMenu.setText(layer.getName());
118 layerMenu.setIcon(layer.getIcon());
119 newMenu.add(layerMenu);
120 }
121 return newMenu;
122 }
123
124 public void refreshOffsetMenu() {
125 JMenuItem newItem = getNewOffsetMenu();
126 remove(offsetMenuItem);
127 add(newItem, offsPos);
128 offsetMenuItem = newItem;
129 }
130
131 @Override
132 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
133 }
134
135 @Override
136 public void layerAdded(Layer newLayer) {
137 if (newLayer instanceof ImageryLayer) {
138 refreshOffsetMenu();
139 }
140 }
141
142 @Override
143 public void layerRemoved(Layer oldLayer) {
144 if (oldLayer instanceof ImageryLayer) {
145 refreshOffsetMenu();
146 }
147 }
148}
Note: See TracBrowser for help on using the repository browser.