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

Last change on this file since 13564 was 13564, checked in by Don-vip, 6 years ago

introduce PrimitiveRenderer to replace OsmPrimitivRenderer (now deprecated). Change NameFormatter API to support IPrimitive instead of OsmPrimitive. Enhances interfaces in consequence.

  • Property svn:eol-style set to native
File size: 6.0 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.data.osm.Relation;
25import org.openstreetmap.josm.gui.MainApplication;
26import org.openstreetmap.josm.gui.PrimitiveRenderer;
27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
28import org.openstreetmap.josm.gui.progress.swing.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 referring 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 PrimitiveRenderer());
62 add(new JScrollPane(referrers), BorderLayout.CENTER);
63 referrers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
64 referrers.addMouseListener(new MouseAdapter() {
65 @Override
66 public void mouseClicked(MouseEvent e) {
67 if (e.getClickCount() == 2
68 && !e.isAltDown() && !e.isAltGraphDown() && !e.isControlDown() && !e.isMetaDown() && !e.isShiftDown()
69 && referrers.getCellBounds(referrers.getSelectedIndex(), referrers.getSelectedIndex()).contains(e.getPoint())) {
70 editAction.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, null));
71 }
72 }
73 });
74
75 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
76
77 ReloadAction reloadAction = new ReloadAction();
78 referrers.getModel().addListDataListener(reloadAction);
79 pnl.add(new JButton(reloadAction));
80 pnl.add(cbReadFull);
81
82 editAction = new EditAction();
83 referrers.getSelectionModel().addListSelectionListener(editAction);
84 pnl.add(new JButton(editAction));
85 add(pnl, BorderLayout.SOUTH);
86 }
87
88 public void init() {
89 model.populate(getLayer().data);
90 }
91
92 protected OsmDataLayer getLayer() {
93 return layer;
94 }
95
96 /**
97 * Action for loading the parent relations of a relation
98 *
99 */
100 class ReloadAction extends AbstractAction implements ListDataListener {
101 ReloadAction() {
102 putValue(SHORT_DESCRIPTION, tr("Load parent relations"));
103 new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
104 putValue(NAME, tr("Reload"));
105 refreshEnabled();
106 }
107
108 protected void refreshEnabled() {
109 setEnabled(model.canReload());
110 }
111
112 @Override
113 public void actionPerformed(ActionEvent e) {
114 boolean full = cbReadFull.isSelected();
115 final ParentRelationLoadingTask task = new ParentRelationLoadingTask(
116 model.getRelation(),
117 getLayer(),
118 full,
119 new PleaseWaitProgressMonitor(tr("Loading parent relations"))
120 );
121 task.setContinuation(() -> {
122 if (task.isCanceled() || task.hasError())
123 return;
124 model.populate(task.getParents());
125 });
126 MainApplication.worker.submit(task);
127 }
128
129 @Override
130 public void contentsChanged(ListDataEvent e) {
131 refreshEnabled();
132 }
133
134 @Override
135 public void intervalAdded(ListDataEvent e) {
136 refreshEnabled();
137 }
138
139 @Override
140 public void intervalRemoved(ListDataEvent e) {
141 refreshEnabled();
142 }
143 }
144
145 /**
146 * Action for editing the currently selected relation
147 *
148 */
149 class EditAction extends AbstractAction implements ListSelectionListener {
150 EditAction() {
151 putValue(SHORT_DESCRIPTION, tr("Edit the currently selected relation"));
152 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
153 putValue(NAME, tr("Edit"));
154 refreshEnabled();
155 }
156
157 protected void refreshEnabled() {
158 setEnabled(referrers.getSelectionModel().getMinSelectionIndex() >= 0);
159 }
160
161 @Override
162 public void actionPerformed(ActionEvent e) {
163 run();
164 }
165
166 public void run() {
167 int idx = referrers.getSelectedIndex();
168 if (idx < 0)
169 return;
170 Relation r = model.getElementAt(idx);
171 if (r == null)
172 return;
173 RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null);
174 editor.setVisible(true);
175 }
176
177 @Override
178 public void valueChanged(ListSelectionEvent e) {
179 refreshEnabled();
180 }
181 }
182}
Note: See TracBrowser for help on using the repository browser.