source: josm/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java@ 201

Last change on this file since 201 was 201, checked in by imi, 17 years ago
  • changed the name of the help page for switching MarkerText on/off
File size: 9.9 KB
Line 
1package org.openstreetmap.josm.gui.dialogs;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.awt.BorderLayout;
6import java.awt.Component;
7import java.awt.GridLayout;
8import java.awt.Point;
9import java.awt.event.ActionEvent;
10import java.awt.event.ActionListener;
11import java.awt.event.KeyEvent;
12import java.awt.event.MouseAdapter;
13import java.awt.event.MouseEvent;
14import java.util.Collection;
15
16import javax.swing.AbstractAction;
17import javax.swing.Action;
18import javax.swing.DefaultListCellRenderer;
19import javax.swing.DefaultListModel;
20import javax.swing.Icon;
21import javax.swing.JButton;
22import javax.swing.JLabel;
23import javax.swing.JList;
24import javax.swing.JPanel;
25import javax.swing.JScrollPane;
26import javax.swing.ListSelectionModel;
27import javax.swing.UIManager;
28import javax.swing.event.ListSelectionEvent;
29import javax.swing.event.ListSelectionListener;
30
31import org.openstreetmap.josm.Main;
32import org.openstreetmap.josm.gui.MapFrame;
33import org.openstreetmap.josm.gui.MapView;
34import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
35import org.openstreetmap.josm.gui.layer.Layer;
36import org.openstreetmap.josm.gui.layer.OsmDataLayer;
37import org.openstreetmap.josm.tools.DontShowAgainInfo;
38import org.openstreetmap.josm.tools.ImageProvider;
39import org.openstreetmap.josm.tools.ImageProvider.OverlayPosition;
40
41/**
42 * A component that manages the list of all layers and react to selection changes
43 * by setting the active layer in the mapview.
44 *
45 * @author imi
46 */
47public class LayerListDialog extends ToggleDialog implements LayerChangeListener {
48
49 /**
50 * The last layerlist created. Used to update the list in the Show/Hide and Delete actions.
51 * TODO: Replace with Listener-Pattern.
52 */
53 static JList instance;
54 private JScrollPane listScrollPane;
55
56 public final static class DeleteLayerAction extends AbstractAction {
57
58 private final Layer layer;
59
60 public DeleteLayerAction(Layer layer) {
61 super(tr("Delete"), ImageProvider.get("dialogs", "delete"));
62 putValue(SHORT_DESCRIPTION, tr("Delete the selected layer."));
63 putValue("help", "Dialog/LayerList/Delete");
64 this.layer = layer;
65 }
66
67 public void actionPerformed(ActionEvent e) {
68 int sel = instance.getSelectedIndex();
69 Layer l = layer != null ? layer : (Layer)instance.getSelectedValue();
70 if (l instanceof OsmDataLayer && !DontShowAgainInfo.show("delete_layer", tr("Do you really want to delete the whole layer?")))
71 return;
72 Main.main.removeLayer(l);
73 if (sel >= instance.getModel().getSize())
74 sel = instance.getModel().getSize()-1;
75 if (instance.getSelectedValue() == null)
76 instance.setSelectedIndex(sel);
77 }
78 }
79
80 public final static class ShowHideLayerAction extends AbstractAction {
81 private final Layer layer;
82
83 public ShowHideLayerAction(Layer layer) {
84 super(tr("Show/Hide"), ImageProvider.get("dialogs", "showhide"));
85 putValue(SHORT_DESCRIPTION, tr("Toggle visible state of the selected layer."));
86 putValue("help", "Dialog/LayerList/ShowHide");
87 this.layer = layer;
88 }
89
90 public void actionPerformed(ActionEvent e) {
91 Layer l = layer == null ? (Layer)instance.getSelectedValue() : layer;
92 l.visible = !l.visible;
93 Main.map.mapView.repaint();
94 instance.repaint();
95 }
96 }
97
98 public final static class ShowHideMarkerText extends AbstractAction {
99 private final Layer layer;
100
101 public ShowHideMarkerText(Layer layer) {
102 super(tr("Show/Hide Text"), ImageProvider.get("dialogs", "showhide"));
103 putValue(SHORT_DESCRIPTION, tr("Toggle visible state of the marker text."));
104 putValue("help", "Dialog/LayerList/ShowHideMarkerText");
105 this.layer = layer;
106 }
107
108 public void actionPerformed(ActionEvent e) {
109 Layer l = layer == null ? (Layer)instance.getSelectedValue() : layer;
110 String current = Main.pref.get("marker.show "+l.name,"show");
111 Main.pref.put("marker.show "+l.name, current.equalsIgnoreCase("show") ? "hide" : "show");
112 Main.map.mapView.repaint();
113 instance.repaint();
114 }
115 }
116
117 /**
118 * The data model for the list component.
119 */
120 DefaultListModel model = new DefaultListModel();
121 /**
122 * The merge action. This is only called, if the current selection and its
123 * item below are editable datasets and the merge button is clicked.
124 */
125 private final JButton mergeButton = new JButton(ImageProvider.get("dialogs", "mergedown"));
126 /**
127 * Button for moving layer up.
128 */
129 private JButton upButton = new JButton(ImageProvider.get("dialogs", "up"));
130 /**
131 * Button for moving layer down.
132 */
133 private JButton downButton = new JButton(ImageProvider.get("dialogs", "down"));
134 /**
135 * Button for delete layer.
136 */
137 private Action deleteAction = new DeleteLayerAction(null);
138
139 /**
140 * Create an layerlist and attach it to the given mapView.
141 */
142 public LayerListDialog(MapFrame mapFrame) {
143 super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."), KeyEvent.VK_L, 100);
144 instance = new JList(model);
145 listScrollPane = new JScrollPane(instance);
146 add(listScrollPane, BorderLayout.CENTER);
147 instance.setBackground(UIManager.getColor("Button.background"));
148 instance.setCellRenderer(new DefaultListCellRenderer(){
149 @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
150 Layer layer = (Layer)value;
151 JLabel label = (JLabel)super.getListCellRendererComponent(list,
152 layer.name, index, isSelected, cellHasFocus);
153 Icon icon = layer.getIcon();
154 if (!layer.visible)
155 icon = ImageProvider.overlay(icon, "overlay/invisible", OverlayPosition.SOUTHEAST);
156 label.setIcon(icon);
157 label.setToolTipText(layer.getToolTipText());
158 return label;
159 }
160 });
161
162 final MapView mapView = mapFrame.mapView;
163
164 Collection<Layer> data = mapView.getAllLayers();
165 for (Layer l : data)
166 model.addElement(l);
167
168 instance.setSelectedValue(mapView.getActiveLayer(), true);
169 instance.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
170 instance.addListSelectionListener(new ListSelectionListener(){
171 public void valueChanged(ListSelectionEvent e) {
172 if (instance.getModel().getSize() == 0)
173 return;
174 if (instance.getSelectedIndex() == -1)
175 instance.setSelectedIndex(e.getFirstIndex());
176 mapView.setActiveLayer((Layer)instance.getSelectedValue());
177 }
178 });
179 mapView.addLayerChangeListener(this);
180
181 instance.addMouseListener(new MouseAdapter(){
182 private void openPopup(MouseEvent e) {
183 int index = instance.locationToIndex(e.getPoint());
184 Layer layer = (Layer)instance.getModel().getElementAt(index);
185 LayerListPopup menu = new LayerListPopup(instance, layer);
186 Point p = listScrollPane.getMousePosition();
187 menu.show(listScrollPane, p.x, p.y-3);
188 }
189 @Override public void mousePressed(MouseEvent e) {
190 if (e.isPopupTrigger())
191 openPopup(e);
192 }
193 @Override public void mouseReleased(MouseEvent e) {
194 if (e.isPopupTrigger())
195 openPopup(e);
196 }
197 });
198
199
200 // Buttons
201 JPanel buttonPanel = new JPanel(new GridLayout(1, 5));
202
203 ActionListener upDown = new ActionListener(){
204 public void actionPerformed(ActionEvent e) {
205 Layer l = (Layer)instance.getSelectedValue();
206 int sel = instance.getSelectedIndex();
207 int selDest = e.getActionCommand().equals("up") ? sel-1 : sel+1;
208 mapView.moveLayer(l, selDest);
209 model.set(sel, model.get(selDest));
210 model.set(selDest, l);
211 instance.setSelectedIndex(selDest);
212 updateButtonEnabled();
213 mapView.repaint();
214 }
215 };
216
217 upButton.setToolTipText(tr("Move the selected layer one row up."));
218 upButton.addActionListener(upDown);
219 upButton.setActionCommand("up");
220 upButton.putClientProperty("help", "Dialog/LayerList/Up");
221 buttonPanel.add(upButton);
222
223 downButton.setToolTipText(tr("Move the selected layer one row down."));
224 downButton.addActionListener(upDown);
225 downButton.setActionCommand("down");
226 downButton.putClientProperty("help", "Dialog/LayerList/Down");
227 buttonPanel.add(downButton);
228
229 JButton showHideButton = new JButton(new ShowHideLayerAction(null));
230 showHideButton.setText("");
231 buttonPanel.add(showHideButton);
232
233 JButton deleteButton = new JButton(deleteAction);
234 deleteButton.setText("");
235 buttonPanel.add(deleteButton);
236
237 mergeButton.setToolTipText(tr("Merge the selected layer into the layer directly below."));
238 mergeButton.addActionListener(new ActionListener(){
239 public void actionPerformed(ActionEvent e) {
240 Layer lFrom = (Layer)instance.getSelectedValue();
241 Layer lTo = (Layer)model.get(instance.getSelectedIndex()+1);
242 lTo.mergeFrom(lFrom);
243 instance.setSelectedValue(lTo, true);
244 mapView.removeLayer(lFrom);
245 }
246 });
247 mergeButton.putClientProperty("help", "Dialog/LayerList/Merge");
248 buttonPanel.add(mergeButton);
249
250 add(buttonPanel, BorderLayout.SOUTH);
251
252 updateButtonEnabled();
253 }
254
255 /**
256 * Updates the state of the Buttons.
257 */
258 void updateButtonEnabled() {
259 int sel = instance.getSelectedIndex();
260 Layer l = (Layer)instance.getSelectedValue();
261 boolean enable = model.getSize() > 1;
262 enable = enable && sel < model.getSize()-1;
263 enable = enable && l.isMergable((Layer)model.get(sel+1));
264 mergeButton.setEnabled(enable);
265 upButton.setEnabled(sel > 0);
266 downButton.setEnabled(sel < model.getSize()-1);
267 deleteAction.setEnabled(!model.isEmpty());
268 }
269
270 /**
271 * Add the new layer to the list.
272 */
273 public void layerAdded(Layer newLayer) {
274 model.add(0, newLayer);
275 updateButtonEnabled();
276 }
277
278 public void layerRemoved(Layer oldLayer) {
279 model.removeElement(oldLayer);
280 if (instance.getSelectedIndex() == -1)
281 instance.setSelectedIndex(0);
282 updateButtonEnabled();
283 }
284
285 /**
286 * If the newLayer is not the actual selection, select it.
287 */
288 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
289 if (newLayer != instance.getSelectedValue())
290 instance.setSelectedValue(newLayer, true);
291 updateButtonEnabled();
292 }
293
294 public void layerMoved(Layer layer, int newPosition) {}
295}
Note: See TracBrowser for help on using the repository browser.