Changeset 2061 in josm


Ignore:
Timestamp:
2009-09-05T11:00:10+02:00 (15 years ago)
Author:
Gubaer
Message:

fixed #3398: Changeset tags should be editable in subsequent uploads

Location:
trunk/src/org/openstreetmap/josm
Files:
5 edited

Legend:

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

    r2058 r2061  
    2828                        "system:closechangeset",
    2929                        tr("File: {0}", tr("Close the current changeset ...")),
    30                         KeyEvent.VK_O,
    31                         Shortcut.GROUP_MENU
     30                        KeyEvent.VK_Q,
     31                        Shortcut.GROUP_HOTKEY + Shortcut.GROUPS_ALT2
    3232                ),
    3333                true
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2058 r2061  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
     5import static org.openstreetmap.josm.tools.I18n.trn;
    56
    67import java.awt.BorderLayout;
     
    245246        );
    246247        switch(ret) {
    247             case JOptionPane.CLOSED_OPTION: return;
    248             case JOptionPane.CANCEL_OPTION: return;
    249             case 0: synchronizePrimitive(id); break;
    250             case 1: synchronizeDataSet(); break;
    251             default:
    252                 // should not happen
    253                 throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     248        case JOptionPane.CLOSED_OPTION: return;
     249        case JOptionPane.CANCEL_OPTION: return;
     250        case 0: synchronizePrimitive(id); break;
     251        case 1: synchronizeDataSet(); break;
     252        default:
     253            // should not happen
     254            throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    254255        }
    255256    }
     
    285286        );
    286287        switch(ret) {
    287             case JOptionPane.CLOSED_OPTION: return;
    288             case 1: return;
    289             case 0: synchronizeDataSet(); break;
    290             default:
    291                 // should not happen
    292                 throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     288        case JOptionPane.CLOSED_OPTION: return;
     289        case 1: return;
     290        case 0: synchronizeDataSet(); break;
     291        default:
     292            // should not happen
     293            throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    293294        }
    294295    }
     
    587588    static public class UploadDialogPanel extends JPanel {
    588589
     590        /** the list with the added primitives */
    589591        private JList lstAdd;
     592        private JLabel lblAdd;
     593        private JScrollPane spAdd;
     594        /** the list with the updated primitives */
    590595        private JList lstUpdate;
     596        private JLabel lblUpdate;
     597        private JScrollPane spUpdate;
     598        /** the list with the deleted primitives */
    591599        private JList lstDelete;
    592         private JLabel lblAdd;
    593         private JLabel lblUpdate;
    594600        private JLabel lblDelete;
     601        private JScrollPane spDelete;
     602        /** the panel containing the widgets for the lists of primitives */
    595603        private JPanel pnlLists;
     604        /** checkbox for selecting whether an atomic upload is to be used  */
    596605        private JCheckBox cbUseAtomicUpload;
     606        /** input field for changeset comment */
    597607        private SuggestingJHistoryComboBox cmt;
     608        /** ui component for editing changeset tags */
    598609        private TagEditorPanel tagEditorPanel;
     610        /** the tabbed pane used below of the list of primitives  */
    599611        private JTabbedPane southTabbedPane;
     612        /** the button group with the changeset processing types */
    600613        private ButtonGroup bgChangesetHandlingOptions;
     614        /** radio buttons for selecting a changeset processing type */
    601615        private Map<ChangesetProcessingType, JRadioButton> rbChangesetHandlingOptions;
    602616
     617        /**
     618         * builds the panel with the lists of primitives
     619         *
     620         * @return the panel with the lists of primitives
     621         */
    603622        protected JPanel buildListsPanel() {
    604623            pnlLists = new JPanel();
    605624            pnlLists.setLayout(new GridBagLayout());
    606 
     625            // we don't add the lists yet, see setUploadPrimivies()
     626            //
    607627            return pnlLists;
    608628        }
    609629
     630        /**
     631         * builds the panel with the ui components for controlling how the changeset
     632         * should be processed (opening/closing a changeset)
     633         *
     634         * @return the panel with the ui components for controlling how the changeset
     635         * should be processed
     636         */
    610637        protected JPanel buildChangesetHandlingControlPanel() {
    611638            JPanel pnl = new JPanel();
     
    639666        }
    640667
     668        /**
     669         * build the panel with the widgets for controlling how the changeset should be processed
     670         * (atomic upload or not, comment, opening/closing changeset)
     671         *
     672         * @return
     673         */
    641674        protected JPanel buildChangesetControlPanel() {
    642675            JPanel pnl = new JPanel();
     
    652685        }
    653686
     687        /**
     688         * builds the upload control panel
     689         *
     690         * @return
     691         */
    654692        protected JPanel buildUploadControlPanel() {
    655693            JPanel pnl = new JPanel();
     
    667705        }
    668706
     707        /**
     708         * builds the gui
     709         */
    669710        protected void build() {
    670711            setLayout(new GridBagLayout());
    671712            GridBagConstraints gc = new GridBagConstraints();
     713
     714            // first the panel with the list in the upper half
     715            //
    672716            gc.fill = GridBagConstraints.BOTH;
    673717            gc.weightx = 1.0;
     
    675719            add(buildListsPanel(), gc);
    676720
     721            // a tabbed pane with two configuration panels in the
     722            // lower half
     723            //
    677724            southTabbedPane = new JTabbedPane();
    678725            southTabbedPane.add(buildUploadControlPanel());
     
    691738        }
    692739
    693 
     740        /**
     741         * constructor
     742         */
    694743        protected UploadDialogPanel() {
    695744            OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
    696745
     746            // initialize the three lists for primitives
     747            //
    697748            lstAdd = new JList();
    698749            lstAdd.setCellRenderer(renderer);
    699750            lstAdd.setVisibleRowCount(Math.min(lstAdd.getModel().getSize(), 10));
     751            spAdd = new JScrollPane(lstAdd);
     752            lblAdd = new JLabel(tr("Objects to add:"));
    700753
    701754            lstUpdate = new JList();
    702755            lstUpdate.setCellRenderer(renderer);
    703756            lstUpdate.setVisibleRowCount(Math.min(lstUpdate.getModel().getSize(), 10));
     757            spUpdate = new JScrollPane(lstUpdate);
     758            lblUpdate = new JLabel(tr("Objects to modify:"));
    704759
    705760            lstDelete = new JList();
    706761            lstDelete.setCellRenderer(renderer);
    707762            lstDelete.setVisibleRowCount(Math.min(lstDelete.getModel().getSize(), 10));
     763            spDelete = new JScrollPane(lstDelete);
     764            lblDelete = new JLabel(tr("Objects to delete:"));
     765
     766            // build the GUI
     767            //
    708768            build();
    709769        }
    710770
     771        /**
     772         * sets the collection of primitives which will be uploaded
     773         *
     774         * @param add  the collection of primitives to add
     775         * @param update the collection of primitives to update
     776         * @param delete the collection of primitives to delete
     777         */
    711778        public void setUploadedPrimitives(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
    712779            lstAdd.setListData(add.toArray());
     
    731798                y++;
    732799                gcLabel.gridy = y;
    733                 pnlLists.add(lblAdd = new JLabel(tr("Objects to add:")), gcLabel);
     800                lblAdd.setText(trn("{0} object to add:", "{0} objects to add:", add.size(),add.size()));
     801                pnlLists.add(lblAdd, gcLabel);
    734802                y++;
    735803                gcList.gridy = y;
    736                 pnlLists.add(new JScrollPane(lstAdd), gcList);
     804                pnlLists.add(spAdd, gcList);
    737805            }
    738806            if (!update.isEmpty()) {
    739807                y++;
    740808                gcLabel.gridy = y;
    741                 pnlLists.add(lblUpdate = new JLabel(tr("Objects to modify:")), gcLabel);
     809                lblUpdate.setText(trn("{0} object to modifiy:", "{0} objects to modify:", update.size(),update.size()));
     810                pnlLists.add(lblUpdate, gcLabel);
    742811                y++;
    743812                gcList.gridy = y;
    744                 pnlLists.add(new JScrollPane(lstUpdate), gcList);
     813                pnlLists.add(spUpdate, gcList);
    745814            }
    746815            if (!delete.isEmpty()) {
    747816                y++;
    748817                gcLabel.gridy = y;
    749                 pnlLists.add(lblDelete = new JLabel(tr("Objects to delete:")), gcLabel);
     818                lblDelete.setText(trn("{0} object to delete:", "{0} objects to delete:", delete.size(),delete.size()));
     819                pnlLists.add(lblDelete, gcLabel);
    750820                y++;
    751821                gcList.gridy = y;
    752                 pnlLists.add(new JScrollPane(lstDelete), gcList);
    753             }
    754         }
    755 
     822                pnlLists.add(spDelete, gcList);
     823            }
     824        }
     825
     826        /**
     827         * Replies true if a valid changeset comment has been entered in this dialog
     828         *
     829         * @return true if a valid changeset comment has been entered in this dialog
     830         */
    756831        public boolean hasChangesetComment() {
    757832            if (!getChangesetProcessingType().isUseNew())
     
    760835        }
    761836
     837        /**
     838         * Remembers the user input in the preference settings
     839         */
    762840        public void rememberUserInput() {
    763841            // store the history of comments
     
    767845        }
    768846
     847        /**
     848         * Initializes the panel for user input
     849         */
    769850        public void startUserInput() {
    770851            tagEditorPanel.initAutoCompletion(Main.main.getEditLayer());
     
    774855        }
    775856
     857        /**
     858         * Replies the current changeset processing type
     859         *
     860         * @return the current changeset processing type
     861         */
    776862        public ChangesetProcessingType getChangesetProcessingType() {
    777863            ChangesetProcessingType changesetProcessingType = null;
     
    787873        }
    788874
     875        /**
     876         * Replies the current changeset
     877         *
     878         * @return the current changeset
     879         */
    789880        public Changeset getChangeset() {
    790881            Changeset changeset = new Changeset();
     
    794885        }
    795886
     887        /**
     888         * initializes the panel depending on the possible changeset processing
     889         * types
     890         */
    796891        protected void initChangesetProcessingType() {
    797892            for (ChangesetProcessingType type: ChangesetProcessingType.values()) {
     
    826921                rbChangesetHandlingOptions.get(type).setSelected(true);
    827922            }
     923            refreshChangesetProcessingType(getChangesetProcessingType());
     924        }
     925
     926        /**
     927         * refreshes  the panel depending on a changeset processing type
     928         *
     929         * @param type the changeset processing type
     930         */
     931        protected void refreshChangesetProcessingType(ChangesetProcessingType type) {
     932            if (type.isUseNew()) {
     933                southTabbedPane.setTitleAt(1, tr("Tags of new changeset"));
     934                Changeset cs = new Changeset();
     935                tagEditorPanel.getModel().initFromPrimitive(cs);
     936            } else {
     937                Changeset cs = OsmApi.getOsmApi().getCurrentChangeset();
     938                if (cs != null) {
     939                    southTabbedPane.setTitleAt(1, tr("Tags of changeset {0}", cs.getId()));
     940                    if (cs.get("comment") != null) {
     941                        cmt.setText(cs.get("comment"));
     942                        cs.remove("comment");
     943                    }
     944                    tagEditorPanel.getModel().initFromPrimitive(cs);
     945                }
     946            }
    828947        }
    829948
     
    831950            public void actionPerformed(ActionEvent e) {
    832951                ChangesetProcessingType type = getChangesetProcessingType();
    833                 if (type.isUseNew()) {
    834                     tagEditorPanel.setEnabled(true);
    835                     southTabbedPane.setTitleAt(1, tr("Tags of new changeset"));
    836                     cmt.setEnabled(true);
    837                 } else {
    838                     tagEditorPanel.setEnabled(false);
    839                     cmt.setEnabled(false);
    840                     Changeset cs = OsmApi.getOsmApi().getCurrentChangeset();
    841                     if (cs != null) {
    842                         tagEditorPanel.getModel().initFromPrimitive(cs);
    843                         southTabbedPane.setTitleAt(1, tr("Tags of changeset {0} (read-only)", cs.getId()));
    844                         cmt.setText(cs.get("comment" == null ? "" : cs.get("comment")));
    845                     }
    846                 }
     952                refreshChangesetProcessingType(type);
    847953            }
    848954        }
  • trunk/src/org/openstreetmap/josm/gui/MainMenu.java

    r1890 r2061  
    5858import org.openstreetmap.josm.actions.ShowStatusReportAction;
    5959import org.openstreetmap.josm.actions.SplitWayAction;
     60import org.openstreetmap.josm.actions.StopChangesetAction;
    6061import org.openstreetmap.josm.actions.ToggleGPXLinesAction;
    6162import org.openstreetmap.josm.actions.UnGlueAction;
     
    99100    public final DownloadAction download = new DownloadAction();
    100101    public final DownloadReferrersAction downloadReferrers = new DownloadReferrersAction();
     102    public final StopChangesetAction stopChangesetAction = new StopChangesetAction();
    101103    public final JosmAction update = new UpdateDataAction();
    102104    public final JosmAction updateSelection = new UpdateSelectionAction();
     
    206208        add(fileMenu, update);
    207209        add(fileMenu, updateSelection);
     210        add(fileMenu, stopChangesetAction);
    208211        fileMenu.addSeparator();
    209212        add(fileMenu, exit);
  • trunk/src/org/openstreetmap/josm/io/OsmApi.java

    r2040 r2061  
    325325
    326326    /**
     327     * Update a changeset on the server.
     328     *
     329     * @param changeset the changeset to update
     330     * @param progressMonitor the progress monitor
     331     *
     332     * @throws OsmTransferException if something goes wrong.
     333     */
     334    public void updateChangeset(Changeset changeset, ProgressMonitor progressMonitor) throws OsmTransferException {
     335        try {
     336            progressMonitor.beginTask(tr("Updating changeset..."));
     337            initialize(progressMonitor);
     338            if (this.changeset != null && this.changeset.getId() > 0) {
     339                if (this.changeset.hasEqualSemanticAttributes(changeset)) {
     340                    progressMonitor.setCustomText(tr("Changeset {0} is unchanged. Skipping update.", changeset.getId()));
     341                    return;
     342                }
     343                changeset.id = this.changeset.getId();
     344                this.changeset.cloneFrom(changeset);
     345                progressMonitor.setCustomText(tr("Updating changeset {0}...", changeset.getId()));
     346                sendRequest(
     347                        "PUT",
     348                        OsmPrimitiveType.from(changeset).getAPIName() + "/" + changeset.getId(),
     349                        toXml(changeset, true),
     350                        progressMonitor
     351                );
     352                this.changeset = changeset;
     353            } else
     354                throw new OsmTransferException(tr("Failed to update changeset. Either there is no current changeset or the id of the current changeset is 0"));
     355        } finally {
     356            progressMonitor.finishTask();
     357        }
     358    }
     359
     360    /**
    327361     * Closes a changeset on the server.
    328362     *
  • trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java

    r2040 r2061  
    9191        try {
    9292            progressMonitor.setTicksCount(primitives.size());
    93             api.createChangeset(changeset, changesetProcessingType,progressMonitor.createSubTaskMonitor(0, false));
     93            if (changesetProcessingType.isUseNew()) {
     94                api.createChangeset(changeset, changesetProcessingType,progressMonitor.createSubTaskMonitor(0, false));
     95            } else {
     96                api.updateChangeset(changeset,progressMonitor.createSubTaskMonitor(0, false));
     97            }
    9498            uploadStartTime = System.currentTimeMillis();
    9599            for (OsmPrimitive osm : primitives) {
     
    98102                String msg = "";
    99103                switch(OsmPrimitiveType.from(osm)) {
    100                     case NODE: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"); break;
    101                     case WAY: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"); break;
    102                     case RELATION: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"); break;
     104                case NODE: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"); break;
     105                case WAY: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"); break;
     106                case RELATION: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"); break;
    103107                }
    104108                progressMonitor.subTask(
     
    146150        //
    147151        try {
    148             api.createChangeset(changeset, changesetProcessingType, progressMonitor.createSubTaskMonitor(0, false));
     152            if (changesetProcessingType.isUseNew()) {
     153                api.createChangeset(changeset, changesetProcessingType,progressMonitor.createSubTaskMonitor(0, false));
     154            } else {
     155                api.updateChangeset(changeset,progressMonitor.createSubTaskMonitor(0, false));
     156            }
    149157            processed.addAll(api.uploadDiff(primitives, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
    150158        } catch(OsmTransferException e) {
     
    173181
    174182        api.initialize(progressMonitor);
    175 
    176183        try {
    177184            // check whether we can use diff upload
Note: See TracChangeset for help on using the changeset viewer.