source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java@ 10424

Last change on this file since 10424 was 10424, checked in by stoecker, 8 years ago

see #12994 - don't use SideButton outside side panel

  • Property svn:eol-style set to native
File size: 5.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.relation;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.FlowLayout;
8import java.awt.event.ActionEvent;
9import java.awt.event.MouseAdapter;
10import java.awt.event.MouseEvent;
11
12import javax.swing.AbstractAction;
13import javax.swing.JButton;
14import javax.swing.JCheckBox;
15import javax.swing.JList;
16import javax.swing.JPanel;
17import javax.swing.JScrollPane;
18import javax.swing.ListSelectionModel;
19import javax.swing.event.ListDataEvent;
20import javax.swing.event.ListDataListener;
21import javax.swing.event.ListSelectionEvent;
22import javax.swing.event.ListSelectionListener;
23
24import org.openstreetmap.josm.Main;
25import org.openstreetmap.josm.data.osm.Relation;
26import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
28import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
29import org.openstreetmap.josm.tools.ImageProvider;
30
31/**
32 * This is browser for a list of relations which refer to another relations.
33 * @since 1806
34 */
35public class ReferringRelationsBrowser extends JPanel {
36
37 /** the list of relations */
38 private JList<Relation> referrers;
39 private final ReferringRelationsBrowserModel model;
40 private final transient OsmDataLayer layer;
41 private final JCheckBox cbReadFull = new JCheckBox(tr("including immediate children of parent relations"));
42 private EditAction editAction;
43
44 /**
45 * Constructs a new {@code ReferringRelationsBrowser}.
46 * @param layer OSM data layer
47 * @param model referrinf relations browser model
48 */
49 public ReferringRelationsBrowser(OsmDataLayer layer, ReferringRelationsBrowserModel model) {
50 this.model = model;
51 this.layer = layer;
52 build();
53 }
54
55 /**
56 * build the GUI
57 */
58 protected void build() {
59 setLayout(new BorderLayout());
60 referrers = new JList<>(model);
61 referrers.setCellRenderer(new OsmPrimitivRenderer());
62 add(new JScrollPane(referrers), BorderLayout.CENTER);
63 referrers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
64 referrers.addMouseListener(new DblClickMouseAdapter());
65
66 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
67
68 ReloadAction reloadAction = new ReloadAction();
69 referrers.getModel().addListDataListener(reloadAction);
70 pnl.add(new JButton(reloadAction));
71 pnl.add(cbReadFull);
72
73 editAction = new EditAction();
74 referrers.getSelectionModel().addListSelectionListener(editAction);
75 pnl.add(new JButton(editAction));
76 add(pnl, BorderLayout.SOUTH);
77 }
78
79 public void init() {
80 model.populate(getLayer().data);
81 }
82
83 protected OsmDataLayer getLayer() {
84 return layer;
85 }
86
87 /**
88 * Action for loading the parent relations of a relation
89 *
90 */
91 class ReloadAction extends AbstractAction implements ListDataListener {
92 ReloadAction() {
93 putValue(SHORT_DESCRIPTION, tr("Load parent relations"));
94 new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
95 putValue(NAME, tr("Reload"));
96 refreshEnabled();
97 }
98
99 protected void refreshEnabled() {
100 setEnabled(model.canReload());
101 }
102
103 @Override
104 public void actionPerformed(ActionEvent e) {
105 boolean full = cbReadFull.isSelected();
106 final ParentRelationLoadingTask task = new ParentRelationLoadingTask(
107 model.getRelation(),
108 getLayer(),
109 full,
110 new PleaseWaitProgressMonitor(tr("Loading parent relations"))
111 );
112 task.setContinuation(
113 new Runnable() {
114 @Override
115 public void run() {
116 if (task.isCanceled() || task.hasError())
117 return;
118 model.populate(task.getParents());
119 }
120 }
121 );
122 Main.worker.submit(task);
123 }
124
125 @Override
126 public void contentsChanged(ListDataEvent e) {
127 refreshEnabled();
128 }
129
130 @Override
131 public void intervalAdded(ListDataEvent e) {
132 refreshEnabled();
133 }
134
135 @Override
136 public void intervalRemoved(ListDataEvent e) {
137 refreshEnabled();
138 }
139 }
140
141 /**
142 * Action for editing the currently selected relation
143 *
144 */
145 class EditAction extends AbstractAction implements ListSelectionListener {
146 EditAction() {
147 putValue(SHORT_DESCRIPTION, tr("Edit the currently selected relation"));
148 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
149 putValue(NAME, tr("Edit"));
150 refreshEnabled();
151 }
152
153 protected void refreshEnabled() {
154 setEnabled(referrers.getSelectionModel().getMinSelectionIndex() >= 0);
155 }
156
157 @Override
158 public void actionPerformed(ActionEvent e) {
159 run();
160 }
161
162 public void run() {
163 int idx = referrers.getSelectedIndex();
164 if (idx < 0)
165 return;
166 Relation r = model.getElementAt(idx);
167 if (r == null)
168 return;
169 RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null);
170 editor.setVisible(true);
171 }
172
173 @Override
174 public void valueChanged(ListSelectionEvent e) {
175 refreshEnabled();
176 }
177 }
178
179 class DblClickMouseAdapter extends MouseAdapter {
180 @Override
181 public void mouseClicked(MouseEvent e) {
182 if (e.getClickCount() == 2) {
183 editAction.run();
184 }
185 }
186 }
187}
Note: See TracBrowser for help on using the repository browser.