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

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