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

Last change on this file since 999 was 999, checked in by stoecker, 17 years ago

close bug #1588, code cleanup by bruce89

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