Changeset 2599 in josm for trunk/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
- Timestamp:
- 2009-12-09T21:25:40+01:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
r2569 r2599 9 9 import java.awt.GridBagLayout; 10 10 import java.awt.Insets; 11 import java.awt.event.ActionEvent; 12 import java.awt.event.ActionListener; 11 13 import java.awt.event.FocusEvent; 12 14 import java.awt.event.FocusListener; 15 import java.awt.event.ItemEvent; 16 import java.awt.event.ItemListener; 13 17 import java.beans.PropertyChangeEvent; 14 18 import java.beans.PropertyChangeListener; … … 23 27 import javax.swing.JTextField; 24 28 import javax.swing.UIManager; 25 import javax.swing.event.ChangeEvent;26 import javax.swing.event.ChangeListener;27 29 import javax.swing.event.DocumentEvent; 28 30 import javax.swing.event.DocumentListener; 29 31 30 32 import org.openstreetmap.josm.Main; 31 32 public class UploadStrategySelectionPanel extends JPanel { 33 import org.openstreetmap.josm.gui.JMultilineLabel; 34 import org.openstreetmap.josm.io.OsmApi; 35 import org.openstreetmap.josm.tools.ImageProvider; 36 37 /** 38 * UploadStrategySelectionPanel is a panel for selecting an upload strategy. 39 * 40 * Clients can listen for property change events for the property 41 * {@see #UPLOAD_STRATEGY_SPECIFICATION_PROP}. 42 */ 43 public class UploadStrategySelectionPanel extends JPanel implements PropertyChangeListener { 44 45 /** 46 * The property for the upload strategy 47 */ 48 public final static String UPLOAD_STRATEGY_SPECIFICATION_PROP = 49 UploadStrategySelectionPanel.class.getName() + ".uploadStrategySpecification"; 50 33 51 private static final Color BG_COLOR_ERROR = new Color(255,224,224); 34 52 35 53 private ButtonGroup bgStrategies; 54 private ButtonGroup bgMultiChangesetPolicies; 36 55 private Map<UploadStrategy, JRadioButton> rbStrategy; 37 56 private Map<UploadStrategy, JLabel> lblNumRequests; 57 private Map<UploadStrategy, JMultilineLabel> lblStrategies; 38 58 private JTextField tfChunkSize; 59 private JPanel pnlMultiChangesetPolicyPanel; 60 private JRadioButton rbFillOneChangeset; 61 private JRadioButton rbUseMultipleChangesets; 62 private JMultilineLabel lblMultiChangesetPoliciesHeader; 39 63 40 64 private long numUploadedObjects = 0; … … 44 68 } 45 69 46 protected void build() { 47 setLayout(new GridBagLayout()); 70 protected JPanel buildUploadStrategyPanel() { 71 JPanel pnl = new JPanel(); 72 pnl.setLayout(new GridBagLayout()); 48 73 bgStrategies = new ButtonGroup(); 49 74 rbStrategy = new HashMap<UploadStrategy, JRadioButton>(); 75 lblStrategies = new HashMap<UploadStrategy, JMultilineLabel>(); 50 76 lblNumRequests = new HashMap<UploadStrategy, JLabel>(); 51 77 for (UploadStrategy strategy: UploadStrategy.values()) { 52 78 rbStrategy.put(strategy, new JRadioButton()); 53 79 lblNumRequests.put(strategy, new JLabel()); 80 lblStrategies.put(strategy, new JMultilineLabel("")); 54 81 bgStrategies.add(rbStrategy.get(strategy)); 55 82 } … … 59 86 gc.gridx = 0; 60 87 gc.gridy = 0; 61 gc.weightx = 0.0; 62 gc.weighty = 0.0; 63 gc.insets = new Insets(0,5,0,5); 88 gc.weightx = 1.0; 89 gc.weighty = 0.0; 90 gc.gridwidth = 4; 91 gc.insets = new Insets(0,0,3,0); 64 92 gc.anchor = GridBagConstraints.FIRST_LINE_START; 65 add(rbStrategy.get(UploadStrategy.SINGLE_REQUEST_STRATEGY), gc); 66 gc.gridx = 1; 67 gc.gridy = 0; 68 gc.weightx = 0.0; 69 gc.weighty = 0.0; 70 gc.gridwidth = 2; 71 add(new JLabel(tr("Upload data in one request")), gc); 72 gc.gridx = 3; 73 gc.gridy = 0; 74 gc.weightx = 1.0; 75 gc.weighty = 0.0; 76 gc.gridwidth = 1; 77 add(lblNumRequests.get(UploadStrategy.SINGLE_REQUEST_STRATEGY), gc); 78 79 // -- chunked dataset strategy 93 pnl.add(new JMultilineLabel(tr("Please select the upload strategy:")), gc); 94 95 // -- single request strategy 80 96 gc.gridx = 0; 81 97 gc.gridy = 1; 82 98 gc.weightx = 0.0; 83 99 gc.weighty = 0.0; 84 add(rbStrategy.get(UploadStrategy.CHUNKED_DATASET_STRATEGY), gc); 100 gc.gridwidth = 1; 101 gc.anchor = GridBagConstraints.FIRST_LINE_START; 102 pnl.add(rbStrategy.get(UploadStrategy.SINGLE_REQUEST_STRATEGY), gc); 85 103 gc.gridx = 1; 86 104 gc.gridy = 1; 87 105 gc.weightx = 0.0; 88 106 gc.weighty = 0.0; 89 gc.gridwidth = 1; 90 add(new JLabel(tr("Upload data in chunks of objects. Chunk size: ")), gc); 91 gc.gridx = 2; 92 gc.gridy = 1; 93 gc.weightx = 0.0; 94 gc.weighty = 0.0; 95 gc.gridwidth = 1; 96 add(tfChunkSize = new JTextField(4), gc); 107 gc.gridwidth = 2; 108 JLabel lbl = lblStrategies.get(UploadStrategy.SINGLE_REQUEST_STRATEGY); 109 lbl.setText(tr("Upload data in one request")); 110 pnl.add(lbl, gc); 97 111 gc.gridx = 3; 98 112 gc.gridy = 1; … … 100 114 gc.weighty = 0.0; 101 115 gc.gridwidth = 1; 102 add(lblNumRequests.get(UploadStrategy.CHUNKED_DATASET_STRATEGY), gc); 116 pnl.add(lblNumRequests.get(UploadStrategy.SINGLE_REQUEST_STRATEGY), gc); 117 118 // -- chunked dataset strategy 119 gc.gridx = 0; 120 gc.gridy = 2; 121 gc.weightx = 0.0; 122 gc.weighty = 0.0; 123 pnl.add(rbStrategy.get(UploadStrategy.CHUNKED_DATASET_STRATEGY), gc); 124 gc.gridx = 1; 125 gc.gridy = 2; 126 gc.weightx = 0.0; 127 gc.weighty = 0.0; 128 gc.gridwidth = 1; 129 lbl = lblStrategies.get(UploadStrategy.CHUNKED_DATASET_STRATEGY); 130 lbl.setText(tr("Upload data in chunks of objects. Chunk size: ")); 131 pnl.add(lbl, gc); 132 gc.gridx = 2; 133 gc.gridy = 2; 134 gc.weightx = 0.0; 135 gc.weighty = 0.0; 136 gc.gridwidth = 1; 137 pnl.add(tfChunkSize = new JTextField(4), gc); 138 gc.gridx = 3; 139 gc.gridy = 2; 140 gc.weightx = 1.0; 141 gc.weighty = 0.0; 142 gc.gridwidth = 1; 143 pnl.add(lblNumRequests.get(UploadStrategy.CHUNKED_DATASET_STRATEGY), gc); 103 144 104 145 // -- single request strategy 105 146 gc.gridx = 0; 106 gc.gridy = 2;107 gc.weightx = 0.0; 108 gc.weighty = 0.0; 109 add(rbStrategy.get(UploadStrategy.INDIVIDUAL_OBJECTS_STRATEGY), gc); 147 gc.gridy = 3; 148 gc.weightx = 0.0; 149 gc.weighty = 0.0; 150 pnl.add(rbStrategy.get(UploadStrategy.INDIVIDUAL_OBJECTS_STRATEGY), gc); 110 151 gc.gridx = 1; 111 gc.gridy = 2;152 gc.gridy = 3; 112 153 gc.weightx = 0.0; 113 154 gc.weighty = 0.0; 114 155 gc.gridwidth = 2; 115 add(new JLabel(tr("Upload each object individually")), gc); 156 lbl = lblStrategies.get(UploadStrategy.INDIVIDUAL_OBJECTS_STRATEGY); 157 lbl.setText(tr("Upload each object individually")); 158 pnl.add(lbl, gc); 116 159 gc.gridx = 3; 117 gc.gridy = 2; 118 gc.weightx = 1.0; 119 gc.weighty = 0.0; 120 gc.gridwidth = 1; 121 add(lblNumRequests.get(UploadStrategy.INDIVIDUAL_OBJECTS_STRATEGY), gc); 122 160 gc.gridy = 3; 161 gc.weightx = 1.0; 162 gc.weighty = 0.0; 163 gc.gridwidth = 1; 164 pnl.add(lblNumRequests.get(UploadStrategy.INDIVIDUAL_OBJECTS_STRATEGY), gc); 123 165 124 166 tfChunkSize.addFocusListener(new TextFieldFocusHandler()); 125 167 tfChunkSize.getDocument().addDocumentListener(new ChunkSizeInputVerifier()); 168 126 169 StrategyChangeListener strategyChangeListener = new StrategyChangeListener(); 170 tfChunkSize.addFocusListener(strategyChangeListener); 171 tfChunkSize.addActionListener(strategyChangeListener); 127 172 for(UploadStrategy strategy: UploadStrategy.values()) { 128 rbStrategy.get(strategy).addChangeListener(strategyChangeListener); 129 } 130 173 rbStrategy.get(strategy).addItemListener(strategyChangeListener); 174 } 175 176 return pnl; 177 } 178 179 protected JPanel buildMultiChangesetPolicyPanel() { 180 pnlMultiChangesetPolicyPanel = new JPanel(); 181 pnlMultiChangesetPolicyPanel.setLayout(new GridBagLayout()); 182 GridBagConstraints gc = new GridBagConstraints(); 183 gc.gridx = 0; 184 gc.gridy = 0; 185 gc.fill = GridBagConstraints.HORIZONTAL; 186 gc.anchor = GridBagConstraints.FIRST_LINE_START; 187 gc.weightx = 1.0; 188 pnlMultiChangesetPolicyPanel.add(lblMultiChangesetPoliciesHeader = new JMultilineLabel(tr("<html>There are <strong>multiple changesets</strong> necessary in order to upload {0} objects. What policy shall be used?</html>", numUploadedObjects)), gc); 189 gc.gridy = 1; 190 pnlMultiChangesetPolicyPanel.add(rbFillOneChangeset = new JRadioButton(tr("Fill up one changeset and return to the Upload Dialog")),gc); 191 gc.gridy = 2; 192 pnlMultiChangesetPolicyPanel.add(rbUseMultipleChangesets = new JRadioButton(tr("Open and use as many new changesets as necessary")),gc); 193 194 bgMultiChangesetPolicies = new ButtonGroup(); 195 bgMultiChangesetPolicies.add(rbFillOneChangeset); 196 bgMultiChangesetPolicies.add(rbUseMultipleChangesets); 197 return pnlMultiChangesetPolicyPanel; 198 } 199 200 protected void build() { 201 setLayout(new GridBagLayout()); 202 GridBagConstraints gc = new GridBagConstraints(); 203 gc.gridx = 0; 204 gc.gridy = 0; 205 gc.fill = GridBagConstraints.HORIZONTAL; 206 gc.weightx = 1.0; 207 gc.weighty = 0.0; 208 gc.anchor = GridBagConstraints.NORTHWEST; 209 gc.insets = new Insets(3,3,3,3); 210 211 add(buildUploadStrategyPanel(), gc); 212 gc.gridy = 1; 213 add(buildMultiChangesetPolicyPanel(), gc); 214 215 // consume remaining space 216 gc.gridy = 2; 217 gc.fill = GridBagConstraints.BOTH; 218 gc.weightx = 1.0; 219 gc.weighty = 1.0; 220 add(new JPanel(), gc); 221 222 int maxChunkSize = OsmApi.getOsmApi().getCapabilities().getMaxChangsetSize(); 223 pnlMultiChangesetPolicyPanel.setVisible( 224 maxChunkSize > 0 && numUploadedObjects > maxChunkSize 225 ); 131 226 } 132 227 … … 139 234 if (strategy == null) return; 140 235 rbStrategy.get(strategy.getStrategy()).setSelected(true); 236 tfChunkSize.setEnabled(strategy.equals(UploadStrategy.CHUNKED_DATASET_STRATEGY)); 141 237 if (strategy.getStrategy().equals(UploadStrategy.CHUNKED_DATASET_STRATEGY)) { 142 tfChunkSize.setEnabled(strategy.equals(UploadStrategy.CHUNKED_DATASET_STRATEGY));143 238 if (strategy.getChunkSize() != UploadStrategySpecification.UNSPECIFIED_CHUNK_SIZE) { 144 239 tfChunkSize.setText(Integer.toString(strategy.getChunkSize())); … … 152 247 UploadStrategy strategy = getUploadStrategy(); 153 248 int chunkSize = getChunkSize(); 249 UploadStrategySpecification spec = new UploadStrategySpecification(); 154 250 switch(strategy) { 155 case INDIVIDUAL_OBJECTS_STRATEGY: return UploadStrategySpecification.createIndividualObjectStrategy(); 156 case SINGLE_REQUEST_STRATEGY: return UploadStrategySpecification.createSingleRequestUploadStrategy(); 157 case CHUNKED_DATASET_STRATEGY: return UploadStrategySpecification.createChunkedUploadStrategy(chunkSize); 158 } 159 // should not happen 160 return null; 251 case INDIVIDUAL_OBJECTS_STRATEGY: 252 spec.setStrategy(strategy); 253 break; 254 case SINGLE_REQUEST_STRATEGY: 255 spec.setStrategy(strategy); 256 break; 257 case CHUNKED_DATASET_STRATEGY: 258 spec.setStrategy(strategy).setChunkSize(chunkSize); 259 break; 260 } 261 if(pnlMultiChangesetPolicyPanel.isVisible()) { 262 if (rbFillOneChangeset.isSelected()) { 263 spec.setPolicy(MaxChangesetSizeExceededPolicy.FILL_ONE_CHANGESET_AND_RETURN_TO_UPLOAD_DIALOG); 264 } else if (rbUseMultipleChangesets.isSelected()) { 265 spec.setPolicy(MaxChangesetSizeExceededPolicy.AUTOMATICALLY_OPEN_NEW_CHANGESETS); 266 } else { 267 spec.setPolicy(null); // unknown policy 268 } 269 } else { 270 spec.setPolicy(null); 271 } 272 return spec; 161 273 } 162 274 … … 171 283 return strategy; 172 284 } 173 174 285 175 286 protected int getChunkSize() { … … 191 302 } 192 303 193 public void saveToPreferences() {304 public void rememberUserInput() { 194 305 UploadStrategy strategy = getUploadStrategy(); 195 306 UploadStrategy.saveToPreferences(strategy); … … 204 315 205 316 protected void updateNumRequestsLabels() { 317 int maxChunkSize = OsmApi.getOsmApi().getCapabilities().getMaxChangsetSize(); 318 if (maxChunkSize > 0 && numUploadedObjects > maxChunkSize) { 319 rbStrategy.get(UploadStrategy.SINGLE_REQUEST_STRATEGY).setEnabled(false); 320 JLabel lbl = lblStrategies.get(UploadStrategy.SINGLE_REQUEST_STRATEGY); 321 lbl.setIcon(ImageProvider.get("warning-small.png")); 322 lbl.setText(tr("Upload in one request not possible (too many objects to upload)")); 323 lbl.setToolTipText(tr("<html>Can''t upload {0} objects in one request because the<br>" 324 + "max. changeset size {1} on server ''{2}'' is exceeded.</html>", 325 numUploadedObjects, 326 maxChunkSize, 327 OsmApi.getOsmApi().getBaseUrl() 328 ) 329 ); 330 rbStrategy.get(UploadStrategy.CHUNKED_DATASET_STRATEGY).setSelected(true); 331 lblNumRequests.get(UploadStrategy.SINGLE_REQUEST_STRATEGY).setVisible(false); 332 333 lblMultiChangesetPoliciesHeader.setText(tr("<html>There are <strong>multiple changesets</strong> necessary in order to upload {0} objects. What policy shall be used?</html>", numUploadedObjects)); 334 if (!rbFillOneChangeset.isSelected() && ! rbUseMultipleChangesets.isSelected()) { 335 rbUseMultipleChangesets.setSelected(true); 336 } 337 pnlMultiChangesetPolicyPanel.setVisible(true); 338 339 } else { 340 rbStrategy.get(UploadStrategy.SINGLE_REQUEST_STRATEGY).setEnabled(true); 341 JLabel lbl = lblStrategies.get(UploadStrategy.SINGLE_REQUEST_STRATEGY); 342 lbl.setText(tr("Upload data in one request")); 343 lbl.setIcon(null); 344 lbl.setToolTipText(""); 345 lblNumRequests.get(UploadStrategy.SINGLE_REQUEST_STRATEGY).setVisible(true); 346 347 pnlMultiChangesetPolicyPanel.setVisible(false); 348 } 349 206 350 lblNumRequests.get(UploadStrategy.SINGLE_REQUEST_STRATEGY).setText(tr("(1 request)")); 207 351 if (numUploadedObjects == 0) { … … 229 373 } 230 374 375 public void propertyChange(PropertyChangeEvent evt) { 376 if (evt.getPropertyName().equals(UploadedObjectsSummaryPanel.NUM_OBJECTS_TO_UPLOAD_PROP)) { 377 setNumUploadedObjects((Integer)evt.getNewValue()); 378 } 379 } 380 231 381 class TextFieldFocusHandler implements FocusListener { 232 382 public void focusGained(FocusEvent e) { … … 241 391 242 392 class ChunkSizeInputVerifier implements DocumentListener, PropertyChangeListener { 243 244 393 protected void setErrorFeedback(JTextField tf, String message) { 245 394 tf.setBorder(BorderFactory.createLineBorder(Color.RED, 1)); … … 257 406 try { 258 407 int chunkSize = Integer.parseInt(tfChunkSize.getText().trim()); 408 int maxChunkSize = OsmApi.getOsmApi().getCapabilities().getMaxChangsetSize(); 259 409 if (chunkSize <= 0) { 260 410 setErrorFeedback(tfChunkSize, tr("Illegal chunk size <= 0. Please enter an integer > 1")); 411 } else if (maxChunkSize > 0 && chunkSize > maxChunkSize) { 412 setErrorFeedback(tfChunkSize, tr("Chunk size {0} exceeds max. changeset size {1} for server ''{2}''", chunkSize, maxChunkSize, OsmApi.getOsmApi().getBaseUrl())); 261 413 } else { 262 414 clearErrorFeedback(tfChunkSize, tr("Please enter an integer > 1")); 415 } 416 417 if (maxChunkSize > 0 && chunkSize > maxChunkSize) { 418 setErrorFeedback(tfChunkSize, tr("Chunk size {0} exceeds max. changeset size {1} for server ''{2}''", chunkSize, maxChunkSize, OsmApi.getOsmApi().getBaseUrl())); 263 419 } 264 420 } catch(NumberFormatException e) { … … 291 447 } 292 448 293 class StrategyChangeListener implements ChangeListener { 294 public void stateChanged(ChangeEvent e) { 449 class StrategyChangeListener implements ItemListener, FocusListener, ActionListener { 450 451 protected void notifyStrategy() { 452 firePropertyChange(UPLOAD_STRATEGY_SPECIFICATION_PROP, null, getUploadStrategySpecification()); 453 } 454 455 public void itemStateChanged(ItemEvent e) { 295 456 UploadStrategy strategy = getUploadStrategy(); 296 457 if (strategy == null) return; … … 303 464 tfChunkSize.setEnabled(false); 304 465 } 466 notifyStrategy(); 467 } 468 469 public void focusGained(FocusEvent arg0) {} 470 471 public void focusLost(FocusEvent arg0) { 472 notifyStrategy(); 473 } 474 475 public void actionPerformed(ActionEvent arg0) { 476 notifyStrategy(); 305 477 } 306 478 }
Note:
See TracChangeset
for help on using the changeset viewer.
