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

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

fix #12994 - Old style SideButton usage errors

  • 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.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.JButton;
24import javax.swing.JDialog;
25import javax.swing.JLabel;
26import javax.swing.JList;
27import javax.swing.JPanel;
28import javax.swing.JScrollPane;
29import javax.swing.JSplitPane;
30import javax.swing.ListSelectionModel;
31import javax.swing.event.ListSelectionEvent;
32import javax.swing.event.ListSelectionListener;
33
34import org.openstreetmap.josm.Main;
35import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
36import org.openstreetmap.josm.data.osm.OsmPrimitive;
37import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
38import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
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.gui.util.WindowGeometry;
43import org.openstreetmap.josm.tools.ImageProvider;
44import org.openstreetmap.josm.tools.InputMapUtils;
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 JButton 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 JButton(continueAction);
92 pnl.add(btnContinue);
93 btnContinue.setFocusable(true);
94 lstDeletedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
95 lstSelectedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
96
97 pnl.add(new JButton(new CancelAction()));
98 pnl.add(new JButton(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 /**
148 * See if the user pressed the cancel button
149 * @return <code>true</code> if the user canceled the upload
150 */
151 public boolean isCanceled() {
152 return canceled;
153 }
154
155 protected void setCanceled(boolean canceled) {
156 this.canceled = canceled;
157 }
158
159 /**
160 * Gets the list of primitives the user selected
161 * @return The primitives
162 */
163 public List<OsmPrimitive> getSelectedPrimitives() {
164 List<OsmPrimitive> ret = new ArrayList<>();
165 ret.addAll(lstSelectedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstSelectedPrimitives.getSelectedIndices()));
166 ret.addAll(lstDeletedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstDeletedPrimitives.getSelectedIndices()));
167 return ret;
168 }
169
170 @Override
171 public void setVisible(boolean visible) {
172 if (visible) {
173 new WindowGeometry(
174 getClass().getName() + ".geometry",
175 WindowGeometry.centerInWindow(
176 Main.parent,
177 new Dimension(200, 400)
178 )
179 ).applySafe(this);
180 } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
181 new WindowGeometry(this).remember(getClass().getName() + ".geometry");
182 }
183 super.setVisible(visible);
184 }
185
186 static class OsmPrimitiveList extends JList<OsmPrimitive> {
187 OsmPrimitiveList() {
188 this(new OsmPrimitiveListModel());
189 }
190
191 OsmPrimitiveList(OsmPrimitiveListModel model) {
192 super(model);
193 init();
194 }
195
196 protected void init() {
197 setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
198 setCellRenderer(new OsmPrimitivRenderer());
199 }
200
201 public OsmPrimitiveListModel getOsmPrimitiveListModel() {
202 return (OsmPrimitiveListModel) getModel();
203 }
204 }
205
206 static class OsmPrimitiveListModel extends AbstractListModel<OsmPrimitive> {
207 static final class OsmPrimitiveComparator implements Comparator<OsmPrimitive>, Serializable {
208 @Override
209 public int compare(OsmPrimitive o1, OsmPrimitive o2) {
210 int ret = OsmPrimitiveType.from(o1).compareTo(OsmPrimitiveType.from(o2));
211 if (ret != 0)
212 return ret;
213 DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
214 return o1.getDisplayName(formatter).compareTo(o1.getDisplayName(formatter));
215 }
216 }
217
218 private transient List<OsmPrimitive> data;
219
220 protected void sort() {
221 if (data != null)
222 data.sort(new OsmPrimitiveComparator());
223 }
224
225 public void setPrimitives(List<OsmPrimitive> data) {
226 this.data = data;
227 sort();
228 if (data != null) {
229 fireContentsChanged(this, 0, data.size());
230 } else {
231 fireContentsChanged(this, 0, 0);
232 }
233 }
234
235 @Override
236 public OsmPrimitive getElementAt(int index) {
237 if (data == null)
238 return null;
239 return data.get(index);
240 }
241
242 @Override
243 public int getSize() {
244 if (data == null)
245 return 0;
246 return data.size();
247 }
248
249 public List<OsmPrimitive> getPrimitives(int... indices) {
250 if (indices == null || indices.length == 0)
251 return Collections.emptyList();
252 List<OsmPrimitive> ret = new ArrayList<>(indices.length);
253 for (int i: indices) {
254 if (i < 0) {
255 continue;
256 }
257 ret.add(data.get(i));
258 }
259 return ret;
260 }
261 }
262
263 class CancelAction extends AbstractAction {
264 CancelAction() {
265 putValue(Action.SHORT_DESCRIPTION, tr("Cancel uploading"));
266 putValue(Action.NAME, tr("Cancel"));
267 new ImageProvider("cancel").getResource().attachImageIcon(this);
268 InputMapUtils.addEscapeAction(getRootPane(), this);
269 setEnabled(true);
270 }
271
272 @Override
273 public void actionPerformed(ActionEvent e) {
274 setCanceled(true);
275 setVisible(false);
276 }
277 }
278
279 class ContinueAction extends AbstractAction implements ListSelectionListener {
280 ContinueAction() {
281 putValue(Action.SHORT_DESCRIPTION, tr("Continue uploading"));
282 putValue(Action.NAME, tr("Continue"));
283 new ImageProvider("upload").getResource().attachImageIcon(this);
284 updateEnabledState();
285 }
286
287 @Override
288 public void actionPerformed(ActionEvent e) {
289 setCanceled(false);
290 setVisible(false);
291 }
292
293 protected void updateEnabledState() {
294 setEnabled(lstSelectedPrimitives.getSelectedIndex() >= 0
295 || lstDeletedPrimitives.getSelectedIndex() >= 0);
296 }
297
298 @Override
299 public void valueChanged(ListSelectionEvent e) {
300 updateEnabledState();
301 }
302 }
303}
Note: See TracBrowser for help on using the repository browser.