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

Last change on this file since 3083 was 3083, checked in by bastiK, 14 years ago

added svn:eol-style=native to source files

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