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

Last change on this file since 2729 was 2512, checked in by stoecker, 14 years ago

i18n updated, fixed files to reduce problems when applying patches, fix #4017

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