source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java@ 1084

Last change on this file since 1084 was 1084, checked in by framm, 15 years ago
  • cosmetics: rename ShortCut to Shortcut, and shortCut to shortcut
  • Property svn:eol-style set to native
File size: 5.6 KB
Line 
1package org.openstreetmap.josm.gui.dialogs;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4import static org.openstreetmap.josm.tools.I18n.marktr;
5
6import java.awt.BorderLayout;
7import java.awt.GridLayout;
8import java.awt.event.ActionEvent;
9import java.awt.event.ActionListener;
10import java.awt.event.KeyEvent;
11import java.awt.event.MouseAdapter;
12import java.awt.event.MouseEvent;
13import java.util.Collections;
14
15import javax.swing.DefaultListModel;
16import javax.swing.JList;
17import javax.swing.JPanel;
18import javax.swing.JScrollPane;
19import javax.swing.ListSelectionModel;
20import javax.swing.event.ListSelectionListener;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.command.DeleteCommand;
24import org.openstreetmap.josm.data.osm.DataSet;
25import org.openstreetmap.josm.data.osm.OsmPrimitive;
26import org.openstreetmap.josm.data.osm.Relation;
27import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
28import org.openstreetmap.josm.gui.SideButton;
29import org.openstreetmap.josm.gui.layer.DataChangeListener;
30import org.openstreetmap.josm.gui.layer.Layer;
31import org.openstreetmap.josm.gui.layer.OsmDataLayer;
32import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
33import org.openstreetmap.josm.tools.GBC;
34import org.openstreetmap.josm.tools.Shortcut;
35
36/**
37 * A dialog showing all known relations, with buttons to add, edit, and
38 * delete them.
39 *
40 * We don't have such dialogs for nodes, segments, and ways, becaus those
41 * objects are visible on the map and can be selected there. Relations are not.
42 *
43 * @author Frederik Ramm <frederik@remote.org>
44 */
45public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataChangeListener {
46
47 /**
48 * The selection's list data.
49 */
50 private final DefaultListModel list = new DefaultListModel();
51
52 /**
53 * The display list.
54 */
55 private JList displaylist = new JList(list);
56
57 public RelationListDialog() {
58 super(tr("Relations"), "relationlist", tr("Open a list of all relations."),
59 Shortcut.registerShortcut("subwindow:relations", tr("Toggle: {0}", tr("Relations")), KeyEvent.VK_R, Shortcut.GROUP_LAYER), 150);
60 displaylist.setCellRenderer(new OsmPrimitivRenderer());
61 displaylist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
62 displaylist.addMouseListener(new MouseAdapter(){
63 @Override public void mouseClicked(MouseEvent e) {
64 if (e.getClickCount() < 2)
65 return;
66 Relation toEdit = (Relation) displaylist.getSelectedValue();
67 if (toEdit != null)
68 new RelationEditor(toEdit).setVisible(true);
69 }
70 });
71
72 add(new JScrollPane(displaylist), BorderLayout.CENTER);
73
74 JPanel buttonPanel = new JPanel(new GridLayout(1,4));
75
76 buttonPanel.add(new SideButton(marktr("New"), "addrelation", "Selection", tr("Create a new relation"), new ActionListener() {
77 public void actionPerformed(ActionEvent e) {
78 // call relation editor with null argument to create new relation
79 new RelationEditor(null).setVisible(true);
80 }
81 }), GBC.std());
82
83 buttonPanel.add(new SideButton(marktr("Select"), "select", "Selection", tr("Select this relation"), new ActionListener() {
84 public void actionPerformed(ActionEvent e) {
85 // replace selection with the relation from the list
86 Main.ds.setSelected((Relation)displaylist.getSelectedValue());
87 }
88 }), GBC.std());
89
90 buttonPanel.add(new SideButton(marktr("Edit"), "edit", "Selection", tr( "Open an editor for the selected relation"), new ActionListener() {
91 public void actionPerformed(ActionEvent e) {
92 Relation toEdit = (Relation) displaylist.getSelectedValue();
93 if (toEdit != null)
94 new RelationEditor(toEdit).setVisible(true);
95 }
96 }), GBC.std());
97
98 buttonPanel.add(new SideButton(marktr("Delete"), "delete", "Selection", tr("Delete the selected relation"), new ActionListener() {
99 public void actionPerformed(ActionEvent e) {
100 Relation toDelete = (Relation) displaylist.getSelectedValue();
101 if (toDelete != null) {
102 Main.main.undoRedo.add(
103 new DeleteCommand(Collections.singleton(toDelete)));
104 }
105 }
106 }), GBC.eol());
107 Layer.listeners.add(this);
108 add(buttonPanel, BorderLayout.SOUTH);
109 }
110
111 @Override public void setVisible(boolean b) {
112 super.setVisible(b);
113 if (b) updateList();
114 }
115
116 public void updateList() {
117 list.setSize(Main.ds.relations.size());
118 int i = 0;
119 for (OsmPrimitive e : DataSet.sort(Main.ds.relations)) {
120 if (!e.deleted && !e.incomplete)
121 list.setElementAt(e, i++);
122 }
123 list.setSize(i);
124 }
125
126 public void activeLayerChange(Layer a, Layer b) {
127 if ((a == null || a instanceof OsmDataLayer) && b instanceof OsmDataLayer) {
128 if (a != null) ((OsmDataLayer)a).listenerDataChanged.remove(this);
129 ((OsmDataLayer)b).listenerDataChanged.add(this);
130 updateList();
131 repaint();
132 }
133 }
134
135 public void layerRemoved(Layer a) {
136 if (a instanceof OsmDataLayer) {
137 ((OsmDataLayer)a).listenerDataChanged.remove(this);
138 }
139 }
140 public void layerAdded(Layer a) {
141 if (a instanceof OsmDataLayer) {
142 ((OsmDataLayer)a).listenerDataChanged.add(this);
143 }
144 }
145 public void dataChanged(OsmDataLayer l) {
146 updateList();
147 repaint();
148 }
149
150 /**
151 * Returns the currently selected relation, or null.
152 *
153 * @return the currently selected relation, or null
154 */
155 public Relation getCurrentRelation() {
156 return (Relation) displaylist.getSelectedValue();
157 }
158
159 /**
160 * Adds a selection listener to the relation list.
161 *
162 * @param listener the listener to add
163 */
164 public void addListSelectionListener(ListSelectionListener listener) {
165 displaylist.addListSelectionListener(listener);
166 }
167
168 /**
169 * Removes a selection listener from the relation list.
170 *
171 * @param listener the listener to remove
172 */
173 public void removeListSelectionListener(ListSelectionListener listener) {
174 displaylist.removeListSelectionListener(listener);
175 }
176}
Note: See TracBrowser for help on using the repository browser.