Ignore:
Timestamp:
2009-09-03T14:13:22+02:00 (15 years ago)
Author:
Gubaer
Message:

Improved cancellation of upload tasks
Refactored upload dialog
fixed #2597: Size of upload dialog - now restores dialog size from preferences
fixed #2913: Upload dialog enters scrolling-mode when JOSM isn't maximized - no scroling anymore in ExtendeDialog for UploadDialog
fixed #2518: focus & select comment editing field

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2035 r2037  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.BorderLayout;
     7import java.awt.Dimension;
    68import java.awt.FlowLayout;
    79import java.awt.GridBagConstraints;
     
    4446import org.openstreetmap.josm.tools.GBC;
    4547import org.openstreetmap.josm.tools.Shortcut;
     48import org.openstreetmap.josm.tools.WindowGeometry;
    4649import org.xml.sax.SAXException;
    4750
     
    438441    class UploadConfirmationHook implements UploadHook {
    439442
    440         private JCheckBox cbUseAtomicUpload;
    441 
    442         protected JPanel buildChangesetControlPanel() {
    443             JPanel pnl = new JPanel();
    444             pnl.setLayout(new FlowLayout(FlowLayout.LEFT));
    445             pnl.add(cbUseAtomicUpload = new JCheckBox(tr("upload all changes in one request")));
    446             cbUseAtomicUpload.setToolTipText(tr("Enable to upload all changes in one request, disable to use one request per changed primitive"));
    447             boolean useAtomicUpload = Main.pref.getBoolean("osm-server.atomic-upload", true);
    448             cbUseAtomicUpload.setSelected(useAtomicUpload);
    449             cbUseAtomicUpload.setEnabled(OsmApi.getOsmApi().hasChangesetSupport());
    450             return pnl;
    451         }
    452443
    453444        public boolean checkUpload(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
    454 
    455             JPanel p = new JPanel(new GridBagLayout());
    456 
    457             OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
    458 
    459             if (!add.isEmpty()) {
    460                 p.add(new JLabel(tr("Objects to add:")), GBC.eol());
    461                 JList l = new JList(add.toArray());
    462                 l.setCellRenderer(renderer);
    463                 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
    464                 p.add(new JScrollPane(l), GBC.eol().fill());
    465             }
    466 
    467             if (!update.isEmpty()) {
    468                 p.add(new JLabel(tr("Objects to modify:")), GBC.eol());
    469                 JList l = new JList(update.toArray());
    470                 l.setCellRenderer(renderer);
    471                 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
    472                 p.add(new JScrollPane(l), GBC.eol().fill());
    473             }
    474 
    475             if (!delete.isEmpty()) {
    476                 p.add(new JLabel(tr("Objects to delete:")), GBC.eol());
    477                 JList l = new JList(delete.toArray());
    478                 l.setCellRenderer(renderer);
    479                 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
    480                 p.add(new JScrollPane(l), GBC.eol().fill());
    481             }
    482 
    483             p.add(new JLabel(tr("Provide a brief comment for the changes you are uploading:")), GBC.eol().insets(0, 5, 10, 3));
    484             SuggestingJHistoryComboBox cmt = new SuggestingJHistoryComboBox();
    485             List<String> cmtHistory = new LinkedList<String>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
    486             cmt.setHistory(cmtHistory);
    487             p.add(cmt, GBC.eol().fill(GBC.HORIZONTAL));
    488             //final JTextField cmt = new JTextField(lastCommitComment);
    489 
    490             // configuration options for atomic upload
    491             p.add(buildChangesetControlPanel(), GBC.eol().fill(GridBagConstraints.HORIZONTAL));
    492 
     445            final UploadDialogPanel panel = new UploadDialogPanel(add, update, delete);
     446
     447            ExtendedDialog dialog = new ExtendedDialog(
     448                    Main.parent,
     449                    tr("Upload these changes?"),
     450                    new String[] {tr("Upload Changes"), tr("Cancel")}
     451            ) {
     452                @Override
     453                public void setVisible(boolean visible) {
     454                    if (visible) {
     455                        new WindowGeometry(
     456                                panel.getClass().getName(),
     457                                WindowGeometry.centerInWindow(JOptionPane.getFrameForComponent(Main.parent), new Dimension(400,400))
     458                        ).apply(this);
     459                        panel.startUserInput();
     460                    } else {
     461                        new WindowGeometry(this).remember(panel.getClass().getName());
     462                    }
     463                    super.setVisible(visible);
     464                }
     465            };
     466
     467            dialog.setButtonIcons(new String[] {"upload.png", "cancel.png"});
     468            dialog.setContent(panel, false /* no scroll pane */);
    493469            while(true) {
    494                 ExtendedDialog dialog = new ExtendedDialog(
    495                         Main.parent,
    496                         tr("Upload these changes?"),
    497                         new String[] {tr("Upload Changes"), tr("Cancel")}
    498                 );
    499                 dialog.setButtonIcons(new String[] {"upload.png", "cancel.png"});
    500                 dialog.setContent(p, false /* no scroll pane */);
    501470                dialog.showDialog();
    502471                int result = dialog.getValue();
    503 
    504 
    505472                // cancel pressed
    506473                if (result != 1) return false;
    507 
    508474                // don't allow empty commit message
    509                 if (cmt.getText().trim().length() < 3) {
     475                if (! panel.hasChangesetComment()) {
    510476                    continue;
    511477                }
    512 
    513                 // store the history of comments
    514                 cmt.addCurrentItemToHistory();
    515                 Main.pref.putCollection(HISTORY_KEY, cmt.getHistory());
    516                 Main.pref.put("osm-server.atomic-upload", cbUseAtomicUpload.isSelected());
    517 
     478                panel.rememberUserInput();
    518479                break;
    519480            }
     
    573534            uploadCancelled = true;
    574535            if (writer != null) {
    575                 writer.disconnectActiveConnection();
     536                writer.cancel();
    576537            }
    577538        }
     
    589550        }
    590551    }
     552
     553    /**
     554     * The panel displaying information about primitives to upload and providing
     555     * UI widgets for entering the changeset comment and other configuration
     556     * setttings.
     557     *
     558     */
     559    static private class UploadDialogPanel extends JPanel {
     560
     561        private JList lstAdd;
     562        private JList lstUpdate;
     563        private JList lstDelete;
     564        private JCheckBox cbUseAtomicUpload;
     565        private SuggestingJHistoryComboBox cmt;
     566
     567        protected int getNumLists() {
     568            int ret = 0;
     569            if (lstAdd.getModel().getSize() > 0) {
     570                ret++;
     571            }
     572            if (lstUpdate.getModel().getSize() > 0) {
     573                ret++;
     574            }
     575            if (lstDelete.getModel().getSize() > 0) {
     576                ret++;
     577            }
     578            return ret;
     579        }
     580
     581        protected JPanel buildListsPanel() {
     582            JPanel pnl = new JPanel();
     583            pnl.setLayout(new GridBagLayout());
     584
     585            GridBagConstraints gcLabel = new GridBagConstraints();
     586            gcLabel.fill = GridBagConstraints.HORIZONTAL;
     587            gcLabel.weightx = 1.0;
     588            gcLabel.weighty = 0.0;
     589            gcLabel.anchor = GridBagConstraints.FIRST_LINE_START;
     590
     591            GridBagConstraints gcList = new GridBagConstraints();
     592            gcList.fill = GridBagConstraints.BOTH;
     593            gcList.weightx = 1.0;
     594            gcList.weighty = 1.0 / getNumLists();
     595            gcList.anchor = GridBagConstraints.CENTER;
     596
     597            int y = -1;
     598
     599            if (lstAdd.getModel().getSize() >0) {
     600                y++;
     601                gcLabel.gridy = y;
     602                pnl.add(new JLabel(tr("Objects to add:")), gcLabel);
     603                y++;
     604                gcList.gridy = y;
     605                pnl.add(new JScrollPane(lstAdd), gcList);
     606            }
     607            if (lstUpdate.getModel().getSize() >0) {
     608                y++;
     609                gcLabel.gridy = y;
     610                pnl.add(new JLabel(tr("Objects to modify:")), gcLabel);
     611                y++;
     612                gcList.gridy = y;
     613                pnl.add(new JScrollPane(lstUpdate), gcList);
     614            }
     615            if (lstDelete.getModel().getSize() >0) {
     616                y++;
     617                gcLabel.gridy = y;
     618                pnl.add(new JLabel(tr("Objects to delete:")), gcLabel);
     619                y++;
     620                gcList.gridy = y;
     621                pnl.add(new JScrollPane(lstDelete), gcList);
     622            }
     623            return pnl;
     624        }
     625
     626        protected JPanel buildChangesetControlPanel() {
     627            JPanel pnl = new JPanel();
     628            pnl.setLayout(new FlowLayout(FlowLayout.LEFT));
     629            pnl.add(cbUseAtomicUpload = new JCheckBox(tr("upload all changes in one request")));
     630            cbUseAtomicUpload.setToolTipText(tr("Enable to upload all changes in one request, disable to use one request per changed primitive"));
     631            boolean useAtomicUpload = Main.pref.getBoolean("osm-server.atomic-upload", true);
     632            cbUseAtomicUpload.setSelected(useAtomicUpload);
     633            cbUseAtomicUpload.setEnabled(OsmApi.getOsmApi().hasChangesetSupport());
     634            return pnl;
     635        }
     636
     637        protected JPanel buildUploadControlPanel() {
     638            JPanel pnl = new JPanel();
     639            pnl.setLayout(new GridBagLayout());
     640            pnl.add(new JLabel(tr("Provide a brief comment for the changes you are uploading:")), GBC.eol().insets(0, 5, 10, 3));
     641            cmt = new SuggestingJHistoryComboBox();
     642            List<String> cmtHistory = new LinkedList<String>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
     643            cmt.setHistory(cmtHistory);
     644            pnl.add(cmt, GBC.eol().fill(GBC.HORIZONTAL));
     645
     646            // configuration options for atomic upload
     647            //
     648            pnl.add(buildChangesetControlPanel(), GBC.eol().fill(GridBagConstraints.HORIZONTAL));
     649            return pnl;
     650        }
     651
     652        protected void build() {
     653            setLayout(new BorderLayout());
     654            add(buildListsPanel(), BorderLayout.CENTER);
     655            add(buildUploadControlPanel(), BorderLayout.SOUTH);
     656        }
     657
     658        public UploadDialogPanel(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
     659            OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
     660
     661            lstAdd = new JList(add.toArray());
     662            lstAdd.setCellRenderer(renderer);
     663            lstAdd.setVisibleRowCount(Math.min(lstAdd.getModel().getSize(), 10));
     664
     665            lstUpdate = new JList(update.toArray());
     666            lstUpdate.setCellRenderer(renderer);
     667            lstUpdate.setVisibleRowCount(Math.min(lstUpdate.getModel().getSize(), 10));
     668
     669            lstDelete = new JList(update.toArray());
     670            lstDelete.setCellRenderer(renderer);
     671            lstDelete.setVisibleRowCount(Math.min(lstDelete.getModel().getSize(), 10));
     672            build();
     673        }
     674
     675        public boolean hasChangesetComment() {
     676            return cmt.getText().trim().length() >= 3;
     677        }
     678
     679        public void rememberUserInput() {
     680            // store the history of comments
     681            cmt.addCurrentItemToHistory();
     682            Main.pref.putCollection(HISTORY_KEY, cmt.getHistory());
     683            Main.pref.put("osm-server.atomic-upload", cbUseAtomicUpload.isSelected());
     684        }
     685
     686        public void startUserInput() {
     687            cmt.getEditor().selectAll();
     688            cmt.requestFocus();
     689        }
     690    }
    591691}
Note: See TracChangeset for help on using the changeset viewer.