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

Last change on this file since 17206 was 17206, checked in by GerdP, 4 years ago

fix #19939 Replace ParentRelationLoadingTask by DownloadReferrersTask

  • remove class ParentRelationLoadingTask
  • adapt code to use DownloadReferrersTask instead
  • Property svn:eol-style set to native
File size: 7.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.Rectangle;
9import java.awt.event.ActionEvent;
10import java.awt.event.MouseAdapter;
11import java.awt.event.MouseEvent;
12import java.util.Collections;
13import java.util.List;
14import java.util.stream.Collectors;
15
16import javax.swing.AbstractAction;
17import javax.swing.JButton;
18import javax.swing.JCheckBox;
19import javax.swing.JList;
20import javax.swing.JPanel;
21import javax.swing.JScrollPane;
22import javax.swing.ListSelectionModel;
23import javax.swing.event.ListDataEvent;
24import javax.swing.event.ListDataListener;
25import javax.swing.event.ListSelectionEvent;
26import javax.swing.event.ListSelectionListener;
27
28import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
29import org.openstreetmap.josm.data.osm.OsmPrimitive;
30import org.openstreetmap.josm.data.osm.PrimitiveId;
31import org.openstreetmap.josm.data.osm.Relation;
32import org.openstreetmap.josm.gui.MainApplication;
33import org.openstreetmap.josm.gui.PrimitiveRenderer;
34import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
35import org.openstreetmap.josm.gui.layer.OsmDataLayer;
36import org.openstreetmap.josm.gui.util.GuiHelper;
37import org.openstreetmap.josm.tools.ImageProvider;
38
39/**
40 * This is browser for a list of relations which refer to another relations.
41 * @since 1806
42 */
43public class ReferringRelationsBrowser extends JPanel {
44
45 /** the list of relations */
46 private JList<Relation> referrers;
47 private final ReferringRelationsBrowserModel model;
48 private final transient OsmDataLayer layer;
49 private final JCheckBox cbReadFull = new JCheckBox(tr("including immediate children of parent relations"));
50 private EditAction editAction;
51
52 /**
53 * Constructs a new {@code ReferringRelationsBrowser}.
54 * @param layer OSM data layer
55 * @param model referring relations browser model
56 */
57 public ReferringRelationsBrowser(OsmDataLayer layer, ReferringRelationsBrowserModel model) {
58 this.model = model;
59 this.layer = layer;
60 build();
61 }
62
63 /**
64 * build the GUI
65 */
66 protected void build() {
67 setLayout(new BorderLayout());
68 referrers = new JList<>(model);
69 referrers.setCellRenderer(new PrimitiveRenderer());
70 add(new JScrollPane(referrers), BorderLayout.CENTER);
71 referrers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
72 referrers.addMouseListener(new MouseAdapter() {
73 @Override
74 public void mouseClicked(MouseEvent e) {
75 if (e.getClickCount() == 2
76 && !e.isAltDown() && !e.isAltGraphDown() && !e.isControlDown() && !e.isMetaDown() && !e.isShiftDown()) {
77 Rectangle cellBounds = referrers.getCellBounds(referrers.getSelectedIndex(), referrers.getSelectedIndex());
78 if (cellBounds != null && cellBounds.contains(e.getPoint())) {
79 editAction.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, null));
80 }
81 }
82 }
83 });
84
85 JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
86
87 ReloadAction reloadAction = new ReloadAction();
88 referrers.getModel().addListDataListener(reloadAction);
89 pnl.add(new JButton(reloadAction));
90 pnl.add(cbReadFull);
91
92 editAction = new EditAction();
93 referrers.getSelectionModel().addListSelectionListener(editAction);
94 pnl.add(new JButton(editAction));
95 add(pnl, BorderLayout.SOUTH);
96 }
97
98 /**
99 * Initializes the model with layer data.
100 */
101 public void init() {
102 model.populate(getLayer().data);
103 }
104
105 protected OsmDataLayer getLayer() {
106 return layer;
107 }
108
109 /**
110 * Action for loading the parent relations of a relation
111 *
112 */
113 class ReloadAction extends AbstractAction implements ListDataListener {
114 ReloadAction() {
115 putValue(SHORT_DESCRIPTION, tr("Load parent relations"));
116 new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
117 putValue(NAME, tr("Reload"));
118 refreshEnabled();
119 }
120
121 protected void refreshEnabled() {
122 setEnabled(model.canReload());
123 }
124
125 @Override
126 public void actionPerformed(ActionEvent e) {
127 DownloadReferrersTask task = new DownloadReferrersTask(getLayer(), Collections.singleton(model.getRelation()));
128 MainApplication.worker.submit(task);
129 MainApplication.worker.submit(() -> {
130 if (cbReadFull.isSelected() && !task.getProgressMonitor().isCanceled()) {
131 // download all members of parents
132 List<PrimitiveId> parentsChildren = model.getRelation().referrers(Relation.class)
133 .collect(Collectors.toSet()).stream().flatMap(r -> r.getMemberPrimitives().stream())
134 .distinct().map(OsmPrimitive::getPrimitiveId).distinct().collect(Collectors.toList());
135 new DownloadPrimitivesTask(getLayer(), parentsChildren, false).run();
136 }
137 });
138 GuiHelper.executeByMainWorkerInEDT(() ->
139 model.populate(model.getRelation().getReferrers().stream()
140 .filter(Relation.class::isInstance)
141 .map(Relation.class::cast)
142 .collect(Collectors.toList()))
143 );
144 }
145
146 @Override
147 public void contentsChanged(ListDataEvent e) {
148 refreshEnabled();
149 }
150
151 @Override
152 public void intervalAdded(ListDataEvent e) {
153 refreshEnabled();
154 }
155
156 @Override
157 public void intervalRemoved(ListDataEvent e) {
158 refreshEnabled();
159 }
160 }
161
162 /**
163 * Action for editing the currently selected relation
164 *
165 */
166 class EditAction extends AbstractAction implements ListSelectionListener {
167 EditAction() {
168 putValue(SHORT_DESCRIPTION, tr("Edit the currently selected relation"));
169 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
170 putValue(NAME, tr("Edit"));
171 refreshEnabled();
172 }
173
174 protected void refreshEnabled() {
175 setEnabled(referrers.getSelectionModel().getMinSelectionIndex() >= 0);
176 }
177
178 @Override
179 public void actionPerformed(ActionEvent e) {
180 run();
181 }
182
183 public void run() {
184 int idx = referrers.getSelectedIndex();
185 if (idx < 0)
186 return;
187 Relation r = model.getElementAt(idx);
188 if (r == null)
189 return;
190 RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null);
191 editor.setVisible(true);
192 }
193
194 @Override
195 public void valueChanged(ListSelectionEvent e) {
196 refreshEnabled();
197 }
198 }
199}
Note: See TracBrowser for help on using the repository browser.