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

Last change on this file since 5704 was 5664, checked in by Don-vip, 11 years ago

Scrollable menus: update MenuScroller to last version + add mouse wheel scroll support + reset scroller when imagery menu is refreshed

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.Toolkit;
9import java.awt.event.ActionEvent;
10import java.util.List;
11
12import javax.swing.Action;
13import javax.swing.JComponent;
14import javax.swing.JMenu;
15import javax.swing.JMenuItem;
16import javax.swing.JPopupMenu;
17import javax.swing.MenuElement;
18
19import org.openstreetmap.josm.Main;
20import org.openstreetmap.josm.actions.AddImageryLayerAction;
21import org.openstreetmap.josm.actions.JosmAction;
22import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
23import org.openstreetmap.josm.data.imagery.ImageryInfo;
24import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
25import org.openstreetmap.josm.gui.layer.ImageryLayer;
26import org.openstreetmap.josm.gui.layer.Layer;
27import org.openstreetmap.josm.tools.ImageProvider;
28
29public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
30 private 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 private JMenuItem singleOffset = new JMenuItem(offsetAction);
69 private JMenuItem offsetMenuItem = singleOffset;
70 private Map_Rectifier_WMSmenuAction rectaction = new Map_Rectifier_WMSmenuAction();
71 private int offsPos;
72 private MenuScroller menuScroller;
73
74 public ImageryMenu() {
75 super(tr("Imagery"));
76 setupMenuScroller();
77 MapView.addLayerChangeListener(this);
78 }
79
80 private final void setupMenuScroller() {
81 int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
82 int menuItemHeight = singleOffset.getPreferredSize().height;
83 menuScroller = MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
84 }
85
86 public void refreshImageryMenu() {
87 if (menuScroller != null) {
88 menuScroller.dispose();
89 menuScroller = null;
90 }
91 setupMenuScroller();
92 removeAll();
93
94 // for each configured ImageryInfo, add a menu entry.
95 for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
96 add(new AddImageryLayerAction(u));
97 }
98 addSeparator();
99 add(new JMenuItem(rectaction));
100
101 addSeparator();
102 offsPos = getMenuComponentCount();
103 add(offsetMenuItem);
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.