source: josm/trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java@ 11848

Last change on this file since 11848 was 11747, checked in by Don-vip, 7 years ago

checkstyle - NoWhiteSpaceBefore ...

  • Property svn:eol-style set to native
File size: 10.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Dimension;
8import java.awt.FlowLayout;
9import java.awt.event.ActionEvent;
10import java.awt.event.WindowAdapter;
11import java.awt.event.WindowEvent;
12import java.io.Serializable;
13import java.util.ArrayList;
14import java.util.Collection;
15import java.util.Collections;
16import java.util.Comparator;
17import java.util.List;
18
19import javax.swing.AbstractAction;
20import javax.swing.AbstractListModel;
21import javax.swing.Action;
22import javax.swing.BorderFactory;
23import javax.swing.JDialog;
24import javax.swing.JLabel;
25import javax.swing.JList;
26import javax.swing.JPanel;
27import javax.swing.JScrollPane;
28import javax.swing.JSplitPane;
29import javax.swing.ListSelectionModel;
30import javax.swing.event.ListSelectionEvent;
31import javax.swing.event.ListSelectionListener;
32
33import org.openstreetmap.josm.Main;
34import org.openstreetmap.josm.data.osm.OsmPrimitive;
35import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
36import org.openstreetmap.josm.gui.DefaultNameFormatter;
37import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
38import org.openstreetmap.josm.gui.SideButton;
39import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
40import org.openstreetmap.josm.gui.help.HelpUtil;
41import org.openstreetmap.josm.gui.util.GuiHelper;
42import org.openstreetmap.josm.tools.ImageProvider;
43import org.openstreetmap.josm.tools.InputMapUtils;
44import org.openstreetmap.josm.tools.WindowGeometry;
45
46/**
47 * This dialog can be used to select individual object for uploading.
48 *
49 * @since 2250
50 */
51public class UploadSelectionDialog extends JDialog {
52
53 private final OsmPrimitiveList lstSelectedPrimitives = new OsmPrimitiveList();
54 private final OsmPrimitiveList lstDeletedPrimitives = new OsmPrimitiveList();
55 private JSplitPane spLists;
56 private boolean canceled;
57 private SideButton btnContinue;
58
59 /**
60 * Constructs a new {@code UploadSelectionDialog}.
61 */
62 public UploadSelectionDialog() {
63 super(GuiHelper.getFrameForComponent(Main.parent), ModalityType.DOCUMENT_MODAL);
64 build();
65 }
66
67 protected JPanel buildSelectedPrimitivesPanel() {
68 JPanel pnl = new JPanel(new BorderLayout());
69 JLabel lbl = new JLabel(
70 tr("<html>Mark modified objects <strong>from the current selection</strong> to be uploaded to the server.</html>"));
71 lbl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
72 pnl.add(lbl, BorderLayout.NORTH);
73 pnl.add(new JScrollPane(lstSelectedPrimitives), BorderLayout.CENTER);
74 lbl.setLabelFor(lstSelectedPrimitives);
75 return pnl;
76 }
77
78 protected JPanel buildDeletedPrimitivesPanel() {
79 JPanel pnl = new JPanel(new BorderLayout());
80 JLabel lbl = new JLabel(tr("<html>Mark <strong>locally deleted objects</strong> to be deleted on the server.</html>"));
81 lbl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
82 pnl.add(lbl, BorderLayout.NORTH);
83 pnl.add(new JScrollPane(lstDeletedPrimitives), BorderLayout.CENTER);
84 lbl.setLabelFor(lstDeletedPrimitives);
85 return pnl;
86 }
87
88 protected JPanel buildButtonPanel() {
89 JPanel pnl = new JPanel(new FlowLayout());
90 ContinueAction continueAction = new ContinueAction();
91 btnContinue = new SideButton(continueAction);
92 pnl.add(btnContinue);
93 btnContinue.setFocusable(true);
94 lstDeletedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
95 lstSelectedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
96
97 pnl.add(new SideButton(new CancelAction()));
98 pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/UploadSelection"))));
99 return pnl;
100 }
101
102 protected void build() {
103 setLayout(new BorderLayout());
104 spLists = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
105 spLists.setTopComponent(buildSelectedPrimitivesPanel());
106 spLists.setBottomComponent(buildDeletedPrimitivesPanel());
107 add(spLists, BorderLayout.CENTER);
108 add(buildButtonPanel(), BorderLayout.SOUTH);
109 addWindowListener(
110 new WindowAdapter() {
111 @Override
112 public void windowOpened(WindowEvent e) {
113 spLists.setDividerLocation(0.5);
114 btnContinue.requestFocusInWindow();
115 }
116
117 @Override
118 public void windowClosing(WindowEvent e) {
119 setCanceled(true);
120 }
121 }
122 );
123 setTitle(tr("Select objects to upload"));
124 HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Dialog/UploadSelection"));
125 }
126
127 public void populate(Collection<OsmPrimitive> selected, Collection<OsmPrimitive> deleted) {
128 if (selected != null) {
129 lstSelectedPrimitives.getOsmPrimitiveListModel().setPrimitives(new ArrayList<>(selected));
130 if (!selected.isEmpty()) {
131 lstSelectedPrimitives.getSelectionModel().setSelectionInterval(0, selected.size()-1);
132 } else {
133 lstSelectedPrimitives.getSelectionModel().clearSelection();
134 }
135 } else {
136 lstSelectedPrimitives.getOsmPrimitiveListModel().setPrimitives(null);
137 lstSelectedPrimitives.getSelectionModel().clearSelection();
138 }
139
140 if (deleted != null) {
141 lstDeletedPrimitives.getOsmPrimitiveListModel().setPrimitives(new ArrayList<>(deleted));
142 } else {
143 lstDeletedPrimitives.getOsmPrimitiveListModel().setPrimitives(null);
144 }
145 }
146
147 public boolean isCanceled() {
148 return canceled;
149 }
150
151 protected void setCanceled(boolean canceled) {
152 this.canceled = canceled;
153 }
154
155 public List<OsmPrimitive> getSelectedPrimitives() {
156 List<OsmPrimitive> ret = new ArrayList<>();
157 ret.addAll(lstSelectedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstSelectedPrimitives.getSelectedIndices()));
158 ret.addAll(lstDeletedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstDeletedPrimitives.getSelectedIndices()));
159 return ret;
160 }
161
162 @Override
163 public void setVisible(boolean visible) {
164 if (visible) {
165 new WindowGeometry(
166 getClass().getName() + ".geometry",
167 WindowGeometry.centerInWindow(
168 Main.parent,
169 new Dimension(200, 400)
170 )
171 ).applySafe(this);
172 } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
173 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
174 }
175 super.setVisible(visible);
176 }
177
178 static class OsmPrimitiveList extends JList<OsmPrimitive> {
179 OsmPrimitiveList() {
180 this(new OsmPrimitiveListModel());
181 }
182
183 OsmPrimitiveList(OsmPrimitiveListModel model) {
184 super(model);
185 init();
186 }
187
188 protected void init() {
189 setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
190 setCellRenderer(new OsmPrimitivRenderer());
191 }
192
193 public OsmPrimitiveListModel getOsmPrimitiveListModel() {
194 return (OsmPrimitiveListModel) getModel();
195 }
196 }
197
198 static class OsmPrimitiveListModel extends AbstractListModel<OsmPrimitive> {
199 static final class OsmPrimitiveComparator implements Comparator<OsmPrimitive>, Serializable {
200 @Override
201 public int compare(OsmPrimitive o1, OsmPrimitive o2) {
202 int ret = OsmPrimitiveType.from(o1).compareTo(OsmPrimitiveType.from(o2));
203 if (ret != 0)
204 return ret;
205 DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
206 return o1.getDisplayName(formatter).compareTo(o1.getDisplayName(formatter));
207 }
208 }
209
210 private transient List<OsmPrimitive> data;
211
212 protected void sort() {
213 if (data != null)
214 data.sort(new OsmPrimitiveComparator());
215 }
216
217 public void setPrimitives(List<OsmPrimitive> data) {
218 this.data = data;
219 sort();
220 if (data != null) {
221 fireContentsChanged(this, 0, data.size());
222 } else {
223 fireContentsChanged(this, 0, 0);
224 }
225 }
226
227 @Override
228 public OsmPrimitive getElementAt(int index) {
229 if (data == null)
230 return null;
231 return data.get(index);
232 }
233
234 @Override
235 public int getSize() {
236 if (data == null)
237 return 0;
238 return data.size();
239 }
240
241 public List<OsmPrimitive> getPrimitives(int... indices) {
242 if (indices == null || indices.length == 0)
243 return Collections.emptyList();
244 List<OsmPrimitive> ret = new ArrayList<>(indices.length);
245 for (int i: indices) {
246 if (i < 0) {
247 continue;
248 }
249 ret.add(data.get(i));
250 }
251 return ret;
252 }
253 }
254
255 class CancelAction extends AbstractAction {
256 CancelAction() {
257 putValue(Action.SHORT_DESCRIPTION, tr("Cancel uploading"));
258 putValue(Action.NAME, tr("Cancel"));
259 new ImageProvider("cancel").getResource().attachImageIcon(this);
260 InputMapUtils.addEscapeAction(getRootPane(), this);
261 setEnabled(true);
262 }
263
264 @Override
265 public void actionPerformed(ActionEvent e) {
266 setCanceled(true);
267 setVisible(false);
268 }
269 }
270
271 class ContinueAction extends AbstractAction implements ListSelectionListener {
272 ContinueAction() {
273 putValue(Action.SHORT_DESCRIPTION, tr("Continue uploading"));
274 putValue(Action.NAME, tr("Continue"));
275 new ImageProvider("upload").getResource().attachImageIcon(this);
276 updateEnabledState();
277 }
278
279 @Override
280 public void actionPerformed(ActionEvent e) {
281 setCanceled(false);
282 setVisible(false);
283 }
284
285 protected void updateEnabledState() {
286 setEnabled(lstSelectedPrimitives.getSelectedIndex() >= 0
287 || lstDeletedPrimitives.getSelectedIndex() >= 0);
288 }
289
290 @Override
291 public void valueChanged(ListSelectionEvent e) {
292 updateEnabledState();
293 }
294 }
295}
Note: See TracBrowser for help on using the repository browser.