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

Last change on this file since 18 was 18, checked in by imi, 19 years ago

added Server connection to osm server.

File size: 7.4 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
92 DataSet ds = layer.getDataSet();
93 if (ds != null) {
94 label.setToolTipText(ds.nodes.size()+" nodes, "+
95 ds.tracks().size()+" tracks");
96 }
97 return label;
98 }
99 });
100
101 final MapView mapView = mapFrame.mapView;
102
103 Collection<Layer> data = mapView.getAllLayers();
104 for (Layer l : data)
105 model.addElement(l);
106
107 layers.setSelectedValue(mapView.getActiveLayer(), true);
108 layers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
109 layers.addListSelectionListener(new ListSelectionListener(){
110 public void valueChanged(ListSelectionEvent e) {
111 if (layers.getSelectedIndex() == -1)
112 layers.setSelectedIndex(e.getFirstIndex());
113 mapView.setActiveLayer((Layer)layers.getSelectedValue());
114 }
115 });
116 mapView.addLayerChangeListener(this);
117
118 // Buttons
119 JPanel buttonPanel = new JPanel(new GridLayout(1, 5));
120
121 ActionListener upDown = new ActionListener(){
122 public void actionPerformed(ActionEvent e) {
123 Layer l = (Layer)layers.getSelectedValue();
124 int sel = layers.getSelectedIndex();
125 int selDest = e.getActionCommand().equals("up") ? sel-1 : sel+1;
126 mapView.moveLayer(l, selDest);
127 model.set(sel, model.get(selDest));
128 model.set(selDest, l);
129 layers.setSelectedIndex(selDest);
130 updateButtonEnabled();
131 mapView.repaint();
132 }
133 };
134
135 upButton.setToolTipText("Move the selected layer one row up.");
136 upButton.addActionListener(upDown);
137 upButton.setActionCommand("up");
138 buttonPanel.add(upButton);
139
140 downButton.setToolTipText("Move the selected layer one row down.");
141 downButton.addActionListener(upDown);
142 downButton.setActionCommand("down");
143 buttonPanel.add(downButton);
144
145 JButton visible = new JButton(ImageProvider.get("dialogs", "showhide"));
146 visible.setToolTipText("Toggle visible state of the selected layer.");
147 visible.addActionListener(new ActionListener(){
148 public void actionPerformed(ActionEvent e) {
149 Layer l = (Layer)layers.getSelectedValue();
150 l.setVisible(!l.isVisible());
151 mapView.repaint();
152 layers.repaint();
153 }
154 });
155 buttonPanel.add(visible);
156
157 deleteButton.setToolTipText("Delete the selected layer.");
158 deleteButton.addActionListener(new ActionListener(){
159 public void actionPerformed(ActionEvent e) {
160 if (model.size() == 1) {
161 Main.main.setMapFrame(null, null);
162 } else {
163 int sel = layers.getSelectedIndex();
164 mapView.removeLayer((Layer)layers.getSelectedValue());
165 if (sel >= model.getSize())
166 sel = model.getSize()-1;
167 layers.setSelectedIndex(sel);
168 }
169 }
170 });
171 buttonPanel.add(deleteButton);
172
173 mergeButton.setToolTipText("Merge the selected layer into the layer directly below.");
174 mergeButton.addActionListener(new ActionListener(){
175 public void actionPerformed(ActionEvent e) {
176 Layer lFrom = (Layer)layers.getSelectedValue();
177 DataSet dsFrom = lFrom.getDataSet();
178 Layer lTo = (Layer)model.get(layers.getSelectedIndex()+1);
179 DataSet dsTo = lTo.getDataSet();
180 dsTo.mergeFrom(dsFrom, Main.pref.mergeNodes);
181 layers.setSelectedValue(lTo, true);
182 mapView.removeLayer(lFrom);
183 }
184 });
185 buttonPanel.add(mergeButton);
186
187 add(buttonPanel, BorderLayout.SOUTH);
188
189 updateButtonEnabled();
190 }
191
192 /**
193 * Updates the state of the Buttons.
194 */
195 private void updateButtonEnabled() {
196 int sel = layers.getSelectedIndex();
197 Layer l = (Layer)layers.getSelectedValue();
198 boolean enable = model.getSize() > 1;
199 enable = enable && sel < model.getSize()-1;
200 enable = enable && l.getDataSet() != null;
201 enable = enable && ((Layer)model.get(sel+1)).getDataSet() != null;
202 enable = enable && l.isEditable() == ((Layer)model.get(sel+1)).isEditable();
203 mergeButton.setEnabled(enable);
204 upButton.setEnabled(sel > 0);
205 downButton.setEnabled(sel < model.getSize()-1);
206 deleteButton.setEnabled(!model.isEmpty());
207 }
208
209 /**
210 * Add the new layer to the list.
211 */
212 public void layerAdded(Layer newLayer) {
213 model.add(0, newLayer);
214 updateButtonEnabled();
215 }
216
217 public void layerRemoved(Layer oldLayer) {
218 model.removeElement(oldLayer);
219 if (layers.getSelectedIndex() == -1)
220 layers.setSelectedIndex(0);
221 updateButtonEnabled();
222 }
223
224 /**
225 * If the newLayer is not the actual selection, select it.
226 */
227 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
228 if (newLayer != layers.getSelectedValue())
229 layers.setSelectedValue(newLayer, true);
230 updateButtonEnabled();
231 }
232}
Note: See TracBrowser for help on using the repository browser.