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

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

remove extra whitespaces

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