source: josm/trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java@ 2783

Last change on this file since 2783 was 2783, checked in by mjulius, 14 years ago

fix typo

File size: 11.8 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.Dimension;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10import java.awt.event.ActionEvent;
11import java.awt.event.ItemEvent;
12import java.awt.event.ItemListener;
13import java.util.Collections;
14
15import javax.swing.AbstractAction;
16import javax.swing.BorderFactory;
17import javax.swing.ButtonGroup;
18import javax.swing.JButton;
19import javax.swing.JCheckBox;
20import javax.swing.JComboBox;
21import javax.swing.JPanel;
22import javax.swing.JRadioButton;
23import javax.swing.event.ListDataEvent;
24import javax.swing.event.ListDataListener;
25
26import org.openstreetmap.josm.Main;
27import org.openstreetmap.josm.data.osm.Changeset;
28import org.openstreetmap.josm.data.osm.ChangesetCache;
29import org.openstreetmap.josm.gui.JMultilineLabel;
30import org.openstreetmap.josm.tools.ImageProvider;
31
32/**
33 * ChangesetManagementPanel allows to configure changeset to be used in the next
34 * upload.
35 *
36 * It is displayed as one of the configuration panels in the {@see UploadDialog}.
37 *
38 * ChangesetManagementPanel is a source for {@see PropertyChangeEvent}s. Clients can listen
39 * to
40 * <ul>
41 * <li>{@see #SELECTED_CHANGESET_PROP} - the new value in the property change event is
42 * the changeset selected by the user. The value is null if the user didn't select a
43 * a changeset or if he chosed to use a new changeset.</li>
44 * <li> {@see #CLOSE_CHANGESET_AFTER_UPLOAD} - the new value is a boolean value indicating
45 * whether the changeset should be closed after the next upload</li>
46 * </ul>
47 */
48public class ChangesetManagementPanel extends JPanel implements ListDataListener {
49 public final static String SELECTED_CHANGESET_PROP = ChangesetManagementPanel.class.getName() + ".selectedChangeset";
50 public final static String CLOSE_CHANGESET_AFTER_UPLOAD = ChangesetManagementPanel.class.getName() + ".closeChangesetAfterUpload";
51
52 private ButtonGroup bgUseNewOrExisting;
53 private JRadioButton rbUseNew;
54 private JRadioButton rbExisting;
55 private JComboBox cbOpenChangesets;
56 private JButton btnRefresh;
57 private JButton btnClose;
58 private JCheckBox cbCloseAfterUpload;
59 private OpenChangesetComboBoxModel model;
60
61 /**
62 * builds the GUI
63 */
64 protected void build() {
65 setLayout(new GridBagLayout());
66 GridBagConstraints gc = new GridBagConstraints();
67 setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
68
69 bgUseNewOrExisting = new ButtonGroup();
70
71 gc.gridwidth = 4;
72 gc.gridx = 0;
73 gc.gridy = 0;
74 gc.fill = GridBagConstraints.HORIZONTAL;
75 gc.weightx = 1.0;
76 gc.weighty = 0.0;
77 gc.insets = new Insets(0, 0, 5, 0);
78 add(new JMultilineLabel(tr("Please decide what changeset the data is uploaded to and whether to close the changeset after the next upload.")), gc);
79
80 gc.gridwidth = 4;
81 gc.gridy = 1;
82 gc.fill = GridBagConstraints.HORIZONTAL;
83 gc.weightx = 1.0;
84 gc.weighty = 0.0;
85 gc.insets = new Insets(0,0,0,0);
86 gc.anchor = GridBagConstraints.FIRST_LINE_START;
87 rbUseNew = new JRadioButton(tr("Upload to a new changeset"));
88 rbUseNew.setToolTipText(tr("Open a new changeset and use it in the next upload"));
89 bgUseNewOrExisting.add(rbUseNew);
90 add(rbUseNew, gc);
91
92 gc.gridx = 0;
93 gc.gridy = 2;
94 gc.gridwidth = 1;
95 gc.weightx = 0.0;
96 gc.fill = GridBagConstraints.HORIZONTAL;
97 rbExisting = new JRadioButton(tr("Upload to an existing changeset"));
98 rbExisting.setToolTipText(tr("Upload data to an already existing and open changeset"));
99 bgUseNewOrExisting.add(rbExisting);
100 add(rbExisting, gc);
101
102 gc.gridx = 1;
103 gc.gridy = 2;
104 gc.gridwidth = 1;
105 gc.weightx = 1.0;
106 model = new OpenChangesetComboBoxModel();
107 ChangesetCache.getInstance().addChangesetCacheListener(model);
108 cbOpenChangesets = new JComboBox(model);
109 cbOpenChangesets.setToolTipText("Select an open changeset");
110 cbOpenChangesets.setRenderer(new ChangesetCellRenderer());
111 cbOpenChangesets.addItemListener(new ChangesetListItemStateListener());
112 Dimension d = cbOpenChangesets.getPreferredSize();
113 d.width = 200;
114 cbOpenChangesets.setPreferredSize(d);
115 d.width = 100;
116 cbOpenChangesets.setMinimumSize(d);
117 model.addListDataListener(this);
118 add(cbOpenChangesets, gc);
119
120 gc.gridx = 2;
121 gc.gridy = 2;
122 gc.weightx = 0.0;
123 gc.gridwidth = 1;
124 gc.weightx = 0.0;
125 btnRefresh = new JButton(new RefreshAction());
126 btnRefresh.setMargin(new Insets(0,0,0,0));
127 add(btnRefresh, gc);
128
129 gc.gridx = 3;
130 gc.gridy = 2;
131 gc.gridwidth = 1;
132 CloseChangesetAction closeChangesetAction = new CloseChangesetAction();
133 btnClose = new JButton(closeChangesetAction);
134 btnClose.setMargin(new Insets(0,0,0,0));
135 cbOpenChangesets.addItemListener(closeChangesetAction);
136 rbExisting.addItemListener(closeChangesetAction);
137 add(btnClose, gc);
138
139 gc.gridx = 0;
140 gc.gridy = 3;
141 gc.gridwidth = 4;
142 gc.weightx = 1.0;
143 cbCloseAfterUpload = new JCheckBox(tr("Close changeset after upload"));
144 cbCloseAfterUpload.setToolTipText(tr("Select to close the changeset after the next upload"));
145 add(cbCloseAfterUpload, gc);
146 cbCloseAfterUpload.setSelected(Main.pref.getBoolean("upload.changeset.close", true));
147 cbCloseAfterUpload.addItemListener(new CloseAfterUploadItemStateListener());
148
149 gc.gridx = 0;
150 gc.gridy = 5;
151 gc.gridwidth = 4;
152 gc.weightx = 1.0;
153 gc.weighty = 1.0;
154 gc.fill = GridBagConstraints.BOTH;
155 add(new JPanel(), gc);
156
157 rbUseNew.getModel().addItemListener(new RadioButtonHandler());
158 rbExisting.getModel().addItemListener(new RadioButtonHandler());
159 }
160
161 public ChangesetManagementPanel() {
162 build();
163 refreshGUI();
164 }
165
166 protected void refreshGUI() {
167 rbExisting.setEnabled(model.getSize() > 0);
168 if (model.getSize() == 0) {
169 if (!rbUseNew.isSelected()) {
170 rbUseNew.setSelected(true);
171 }
172 }
173 cbOpenChangesets.setEnabled(model.getSize() > 0 && rbExisting.isSelected());
174 }
175
176 public void setSelectedChangesetForNextUpload(Changeset cs) {
177 int idx = model.getIndexOf(cs);
178 if (idx >=0) {
179 rbExisting.setSelected(true);
180 model.setSelectedItem(cs);
181 }
182 }
183
184 /**
185 * Replies the currently selected changeset. null, if no changeset is
186 * selected or if the user has chosen to use a new changeset.
187 *
188 * @return the currently selected changeset. null, if no changeset is
189 * selected.
190 */
191 public Changeset getSelectedChangeset() {
192 if (rbUseNew.isSelected())
193 return null;
194 return (Changeset)cbOpenChangesets.getSelectedItem();
195 }
196
197 /**
198 * Replies true if the user has chosen to close the changeset after the
199 * next upload
200 *
201 */
202 public boolean isCloseChangesetAfterUpload() {
203 return cbCloseAfterUpload.isSelected();
204 }
205
206 /**
207 * Replies the default value for "created_by"
208 *
209 * @return the default value for "created_by"
210 */
211 protected String getDefaultCreatedBy() {
212 Object ua = System.getProperties().get("http.agent");
213 return(ua == null) ? "JOSM" : ua.toString();
214 }
215
216 /* ---------------------------------------------------------------------------- */
217 /* Interface ListDataListener */
218 /* ---------------------------------------------------------------------------- */
219 public void contentsChanged(ListDataEvent e) {
220 refreshGUI();
221 }
222
223 public void intervalAdded(ListDataEvent e) {
224 refreshGUI();
225 }
226
227 public void intervalRemoved(ListDataEvent e) {
228 refreshGUI();
229 }
230
231 /**
232 * Listens to changes in the selected changeset and accordingly fires property
233 * change events.
234 *
235 */
236 class ChangesetListItemStateListener implements ItemListener {
237 public void itemStateChanged(ItemEvent e) {
238 Changeset cs = (Changeset)cbOpenChangesets.getSelectedItem();
239 if (rbExisting.isSelected()) {
240 firePropertyChange(SELECTED_CHANGESET_PROP, null, cs);
241 if (cs == null) {
242 rbUseNew.setSelected(true);
243 }
244 }
245 }
246 }
247
248 /**
249 * Listens to changes in "close after upload" flag and fires
250 * property change events.
251 *
252 */
253 class CloseAfterUploadItemStateListener implements ItemListener {
254 public void itemStateChanged(ItemEvent e) {
255 if (e.getItemSelectable() != cbCloseAfterUpload)
256 return;
257 switch(e.getStateChange()) {
258 case ItemEvent.SELECTED:
259 firePropertyChange(CLOSE_CHANGESET_AFTER_UPLOAD, false, true);
260 Main.pref.put("upload.changeset.close", true);
261 break;
262 case ItemEvent.DESELECTED:
263 firePropertyChange(CLOSE_CHANGESET_AFTER_UPLOAD, true, false);
264 Main.pref.put("upload.changeset.close", false);
265 break;
266 }
267 }
268 }
269
270 /**
271 * Listens to changes in the two radio buttons rbUseNew and rbUseExisting.
272 *
273 */
274 class RadioButtonHandler implements ItemListener {
275 public void itemStateChanged(ItemEvent e) {
276 if (rbUseNew.isSelected()) {
277 cbOpenChangesets.setEnabled(false);
278 firePropertyChange(SELECTED_CHANGESET_PROP, null, null);
279 } else {
280 cbOpenChangesets.setEnabled(true);
281 if (cbOpenChangesets.getSelectedItem() == null) {
282 model.selectFirstChangeset();
283 }
284 Changeset cs = (Changeset)cbOpenChangesets.getSelectedItem();
285 firePropertyChange(SELECTED_CHANGESET_PROP, null, cs);
286 }
287 }
288 }
289
290 /**
291 * Refreshes the list of open changesets
292 *
293 */
294 class RefreshAction extends AbstractAction {
295 public RefreshAction() {
296 //putValue(NAME, tr("Reload"));
297 putValue(SHORT_DESCRIPTION, tr("Load the list of your open changesets from the server"));
298 putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
299 }
300
301 public void actionPerformed(ActionEvent e) {
302 DownloadOpenChangesetsTask task = new DownloadOpenChangesetsTask(ChangesetManagementPanel.this);
303 Main.worker.submit(task);
304 }
305 }
306
307 /**
308 * Closes the currently selected changeset
309 *
310 */
311 class CloseChangesetAction extends AbstractAction implements ItemListener{
312 public CloseChangesetAction() {
313 //putValue(NAME, tr("Close"));
314 putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
315 putValue(SHORT_DESCRIPTION, tr("Close the currently selected open changeset"));
316 refreshEnabledState();
317 }
318
319 public void actionPerformed(ActionEvent e) {
320 Changeset cs = (Changeset)cbOpenChangesets.getSelectedItem();
321 if (cs == null) return;
322 CloseChangesetTask task = new CloseChangesetTask(Collections.singletonList(cs));
323 Main.worker.submit(task);
324 }
325
326 protected void refreshEnabledState() {
327 setEnabled(
328 cbOpenChangesets.getModel().getSize() > 0
329 && cbOpenChangesets.getSelectedItem() != null
330 && rbExisting.isSelected()
331 );
332 }
333
334 public void itemStateChanged(ItemEvent e) {
335 refreshEnabledState();
336 }
337 }
338}
Note: See TracBrowser for help on using the repository browser.