source: osm/applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java@ 27540

Last change on this file since 27540 was 27540, checked in by akks, 13 years ago

'ImageryAdjust: adjust single visible layer'

  • Property svn:eol-style set to native
File size: 6.9 KB
Line 
1package imageryadjust;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.awt.Component;
6import java.awt.Cursor;
7import java.awt.GridBagLayout;
8import java.awt.event.MouseEvent;
9import java.awt.event.MouseListener;
10import java.awt.event.MouseMotionListener;
11import java.util.ArrayList;
12import java.util.Iterator;
13import java.util.List;
14
15import javax.swing.DefaultComboBoxModel;
16import javax.swing.DefaultListCellRenderer;
17import javax.swing.Icon;
18import javax.swing.JComboBox;
19import javax.swing.JLabel;
20import javax.swing.JList;
21import javax.swing.JOptionPane;
22import javax.swing.JPanel;
23
24import org.openstreetmap.josm.Main;
25import org.openstreetmap.josm.actions.mapmode.MapMode;
26import org.openstreetmap.josm.data.coor.EastNorth;
27import org.openstreetmap.josm.gui.ExtendedDialog;
28import org.openstreetmap.josm.gui.MapFrame;
29import org.openstreetmap.josm.gui.layer.ImageryLayer;
30import org.openstreetmap.josm.gui.layer.Layer;
31import org.openstreetmap.josm.tools.GBC;
32import org.openstreetmap.josm.tools.ImageProvider;
33
34public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener{
35 boolean mouseDown;
36 EastNorth prevEastNorth;
37 private ImageryLayer adjustingLayer;
38
39 public ImageryAdjustMapMode(MapFrame mapFrame) {
40 super(tr("Adjust imagery"), "adjustimg",
41 tr("Adjust the position of the selected imagery layer"), mapFrame,
42 ImageProvider.getCursor("normal", "move"));
43 }
44
45 private List<? extends Layer> getVisibleLayers() {
46 List<? extends Layer> all = new ArrayList<Layer>(Main.map.mapView.getLayersOfType(ImageryLayer.class));
47 Iterator<? extends Layer> it = all.iterator();
48 while (it.hasNext()) {
49 if (!it.next().isVisible()) it.remove();
50 }
51 return all;
52 }
53
54 @Override public void enterMode() {
55 super.enterMode();
56 if (!hasImageryLayersToAdjust()) {
57 warnNoImageryLayers();
58 return;
59 }
60 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
61 if (layers.size() == 1) {
62 adjustingLayer = layers.get(0);
63 } else {
64 adjustingLayer = (ImageryLayer)askAdjustLayer(getVisibleLayers());
65 }
66 if (adjustingLayer == null)
67 return;
68 if (!adjustingLayer.isVisible()) {
69 adjustingLayer.setVisible(true);
70 }
71 Main.map.mapView.addMouseListener(this);
72 Main.map.mapView.addMouseMotionListener(this);
73 }
74
75 @Override public void exitMode() {
76 super.exitMode();
77 Main.map.mapView.removeMouseListener(this);
78 Main.map.mapView.removeMouseMotionListener(this);
79 adjustingLayer = null;
80 }
81
82 @Override public void mousePressed(MouseEvent e) {
83 if (e.getButton() != MouseEvent.BUTTON1)
84 return;
85
86 if (adjustingLayer.isVisible()) {
87 prevEastNorth=Main.map.mapView.getEastNorth(e.getX(),e.getY());
88 Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
89 }
90 }
91
92 @Override public void mouseDragged(MouseEvent e) {
93 if (adjustingLayer == null || prevEastNorth == null) return;
94 EastNorth eastNorth=
95 Main.map.mapView.getEastNorth(e.getX(),e.getY());
96 adjustingLayer.displace(
97 eastNorth.east()-prevEastNorth.east(),
98 eastNorth.north()-prevEastNorth.north()
99 );
100 prevEastNorth = eastNorth;
101 Main.map.mapView.repaint();
102 }
103
104 @Override public void mouseReleased(MouseEvent e) {
105 Main.map.mapView.repaint();
106 Main.map.mapView.setCursor(Cursor.getDefaultCursor());
107 prevEastNorth = null;
108 }
109
110 @Override public boolean layerIsSupported(Layer l) {
111 return hasImageryLayersToAdjust();
112 }
113
114 /**
115 * the list cell renderer used to render layer list entries
116 *
117 */
118 static public class LayerListCellRenderer extends DefaultListCellRenderer {
119
120 protected boolean isActiveLayer(Layer layer) {
121 if (Main.map == null)
122 return false;
123 if (Main.map.mapView == null)
124 return false;
125 return Main.map.mapView.getActiveLayer() == layer;
126 }
127
128 @Override
129 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
130 boolean cellHasFocus) {
131 Layer layer = (Layer) value;
132 JLabel label = (JLabel) super.getListCellRendererComponent(list, layer.getName(), index, isSelected,
133 cellHasFocus);
134 Icon icon = layer.getIcon();
135 label.setIcon(icon);
136 label.setToolTipText(layer.getToolTipText());
137 return label;
138 }
139 }
140
141 /**
142 * Prompts the user with a list of WMS layers which can be adjusted
143 *
144 * @param adjustableLayers the list of adjustable layers
145 * @return the selected layer; null, if no layer was selected
146 */
147 protected Layer askAdjustLayer(List<? extends Layer> adjustableLayers) {
148 if (adjustableLayers.size()==0) return null;
149 if (adjustableLayers.size()==1) return adjustableLayers.get(0);
150 JComboBox layerList = new JComboBox();
151 layerList.setRenderer(new LayerListCellRenderer());
152 layerList.setModel(new DefaultComboBoxModel(adjustableLayers.toArray()));
153 layerList.setSelectedIndex(0);
154
155 JPanel pnl = new JPanel();
156 pnl.setLayout(new GridBagLayout());
157 pnl.add(new JLabel(tr("Please select the imagery layer to adjust.")), GBC.eol());
158 pnl.add(layerList, GBC.eol());
159
160 ExtendedDialog diag = new ExtendedDialog(
161 Main.parent,
162 tr("Select imagery layer"),
163 new String[] { tr("Start adjusting"),tr("Cancel") }
164 );
165 diag.setContent(pnl);
166 diag.setButtonIcons(new String[] { "mapmode/adjustimg", "cancel" });
167 diag.showDialog();
168 int decision = diag.getValue();
169 if (decision != 1)
170 return null;
171 Layer adjustLayer = (Layer) layerList.getSelectedItem();
172 return adjustLayer;
173 }
174
175 /**
176 * Displays a warning message if there are no imagery layers to adjust
177 *
178 */
179 protected void warnNoImageryLayers() {
180 JOptionPane.showMessageDialog(
181 Main.parent,
182 tr("There are currently no imagery layer to adjust."),
183 tr("No layers to adjust"),
184 JOptionPane.WARNING_MESSAGE
185 );
186 }
187
188 /**
189 * Replies true if there is at least one imagery layer
190 *
191 * @return true if there is at least one imagery layer
192 */
193 protected boolean hasImageryLayersToAdjust() {
194 if (Main.map == null) return false;
195 if (Main.map.mapView == null) return false;
196 return ! Main.map.mapView.getLayersOfType(ImageryLayer.class).isEmpty();
197 }
198
199 @Override
200 protected void updateEnabledState() {
201 setEnabled(hasImageryLayersToAdjust());
202 }
203}
Note: See TracBrowser for help on using the repository browser.