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

Last change on this file since 17 was 17, checked in by imi, 19 years ago
  • added Layer support
  • added support for raw GPS data
  • fixed tooltips
  • added options for loading gpx files
File size: 7.2 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.data.osm.DataSet;
26import org.openstreetmap.josm.gui.ImageProvider;
27import org.openstreetmap.josm.gui.Main;
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 private DefaultListModel model = new DefaultListModel();
45 /**
46 * The list component holding all layers.
47 */
48 private JList layers = new JList(model);
49 /**
50 * The invisible icon blended over invisible layers.
51 */
52 private 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(mapFrame, "Layers", "List of all layers", "layerlist", KeyEvent.VK_L, "Open a list of all loaded layers.");
77 setSize(250,256);
78 setMinimumSize(new Dimension(70,70));
79 add(new JScrollPane(layers), BorderLayout.CENTER);
80 layers.setBackground(UIManager.getColor("Button.background"));
81 layers.setCellRenderer(new DefaultListCellRenderer(){
82 @Override
83 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
84 Layer layer = (Layer)value;
85 JLabel label = (JLabel)super.getListCellRendererComponent(list,
86 layer.getName(), index, isSelected, cellHasFocus);
87 Icon icon = layer.getIcon();
88 if (!layer.isVisible())
89 icon = ImageProvider.overlay(icon, invisible, ImageProvider.OverlayPosition.SOUTHEAST);
90 label.setIcon(icon);
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.setVisible(!l.isVisible());
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, null);
156 } else {
157 int sel = layers.getSelectedIndex();
158 mapView.removeLayer((Layer)layers.getSelectedValue());
159 if (sel >= model.getSize())
160 sel = model.getSize()-1;
161 layers.setSelectedIndex(sel);
162 }
163 }
164 });
165 buttonPanel.add(deleteButton);
166
167 mergeButton.setToolTipText("Merge the selected layer into the layer directly below.");
168 mergeButton.addActionListener(new ActionListener(){
169 public void actionPerformed(ActionEvent e) {
170 Layer lFrom = (Layer)layers.getSelectedValue();
171 DataSet dsFrom = lFrom.getDataSet();
172 Layer lTo = (Layer)model.get(layers.getSelectedIndex()+1);
173 DataSet dsTo = lTo.getDataSet();
174 dsTo.mergeFrom(dsFrom, Main.pref.mergeNodes);
175 layers.setSelectedValue(lTo, true);
176 mapView.removeLayer(lFrom);
177 }
178 });
179 buttonPanel.add(mergeButton);
180
181 add(buttonPanel, BorderLayout.SOUTH);
182
183 updateButtonEnabled();
184 }
185
186 /**
187 * Updates the state of the Buttons.
188 */
189 private void updateButtonEnabled() {
190 int sel = layers.getSelectedIndex();
191 Layer l = (Layer)layers.getSelectedValue();
192 boolean enable = model.getSize() > 1;
193 enable = enable && sel < model.getSize()-1;
194 enable = enable && l.getDataSet() != null;
195 enable = enable && ((Layer)model.get(sel+1)).getDataSet() != null;
196 enable = enable && l.isEditable() == ((Layer)model.get(sel+1)).isEditable();
197 mergeButton.setEnabled(enable);
198 upButton.setEnabled(sel > 0);
199 downButton.setEnabled(sel < model.getSize()-1);
200 deleteButton.setEnabled(!model.isEmpty());
201 }
202
203 /**
204 * Add the new layer to the list.
205 */
206 public void layerAdded(Layer newLayer) {
207 model.add(0, newLayer);
208 updateButtonEnabled();
209 }
210
211 public void layerRemoved(Layer oldLayer) {
212 model.removeElement(oldLayer);
213 if (layers.getSelectedIndex() == -1)
214 layers.setSelectedIndex(0);
215 updateButtonEnabled();
216 }
217
218 /**
219 * If the newLayer is not the actual selection, select it.
220 */
221 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
222 if (newLayer != layers.getSelectedValue())
223 layers.setSelectedValue(newLayer, true);
224 updateButtonEnabled();
225 }
226}
Note: See TracBrowser for help on using the repository browser.