source: josm/src/org/openstreetmap/josm/gui/dialogs/LayerList.java@ 91

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