Ticket #3663: relation_download_members-2315.patch

File relation_download_members-2315.patch, 15.9 KB (added by bastiK, 15 years ago)
  • src/org/openstreetmap/josm/actions/UpdateDataAction.java

     
    1818    public UpdateDataAction() {
    1919        super(tr("Update data"),
    2020                "updatedata",
    21                 tr("Updates the objects in the current data layer from the server."),
     21                tr("Updates the objects in the active data layer from the server."),
    2222                Shortcut.registerShortcut("file:updatedata",
    2323                        tr("Update data"),
    2424                        KeyEvent.VK_U,
  • src/org/openstreetmap/josm/actions/UploadAction.java

     
    116116    }
    117117
    118118    public UploadAction() {
    119         super(tr("Upload data"), "upload", tr("Upload all changes in the current data layer to the OSM server"),
     119        super(tr("Upload data"), "upload", tr("Upload all changes in the active data layer to the OSM server"),
    120120                Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_U, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY), true);
    121121    }
    122122
  • src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java

     
    270270         */
    271271        if (numPanels == 1 && panels.get(N-1).getComponents().length == 0)
    272272        {
     273            parent.setDividerSize(0);
    273274            this.setVisible(false);
    274275        } else {
    275276            if (this.getWidth() != 0) { // only if josm started with hidden panel
    276277                this.setPreferredSize(new Dimension(this.getWidth(), 0));
    277278            }
    278279            this.setVisible(true);
     280            parent.setDividerSize(5);
    279281            parent.resetToPreferredSizes();
    280282        }
    281283    }
  • src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

     
    44
    55import java.awt.BorderLayout;
    66import java.awt.GridLayout;
     7import java.awt.Point;
    78import java.awt.event.ActionEvent;
     9import java.awt.event.ActionListener;
    810import java.awt.event.KeyEvent;
    911import java.awt.event.MouseAdapter;
    1012import java.awt.event.MouseEvent;
    1113import java.util.ArrayList;
     14import java.util.Arrays;
    1215import java.util.Collection;
    1316import java.util.Collections;
    1417import java.util.Comparator;
    1518import java.util.HashSet;
     19import java.util.List;
    1620import java.util.logging.Logger;
    1721
    1822import javax.swing.AbstractAction;
    1923import javax.swing.AbstractListModel;
    2024import javax.swing.JList;
     25import javax.swing.JMenuItem;
    2126import javax.swing.JPanel;
     27import javax.swing.JPopupMenu;
    2228import javax.swing.JScrollPane;
    2329import javax.swing.KeyStroke;
    2430import javax.swing.ListSelectionModel;
     
    3642import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
    3743import org.openstreetmap.josm.gui.SideButton;
    3844import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
     45import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
    3946import org.openstreetmap.josm.gui.layer.DataChangeListener;
    4047import org.openstreetmap.josm.gui.layer.Layer;
    4148import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    169176            model.setRelations(null);
    170177            return;
    171178        }
    172         Relation selected = getSelected();
     179        Relation[] selected = getAllSelected();
    173180
    174181        model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet()));
    175182        if(model.getSize() > 0) {
     
    177184        } else {
    178185            setTitle(tr("Relations"));
    179186        }
    180         selectRelation(selected);
     187        selectRelations(selected);
    181188    }
    182189
    183190    public void activeLayerChange(Layer a, Layer b) {
     
    239246    }
    240247
    241248    /**
     249     * @return All selected relations in the list, possibly empty List
     250     */
     251    private Relation[] getAllSelected() {
     252        return (Relation[]) Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]);
     253    }
     254
     255    /**
    242256     * Selects the relation <code>relation</code> in the list of relations.
    243257     *
    244258     * @param relation  the relation
    245259     */
    246260    public void selectRelation(Relation relation) {
    247         if (relation == null){
    248             displaylist.clearSelection();
    249             return;
     261        selectRelations(new Relation[] {relation});
     262    }
     263
     264    /**
     265     * Selects the relations <code>relations</code> in the list of relations.
     266     *
     267     * @param relations  the relations (may be empty)
     268     */
     269    public void selectRelations(Relation[] relations) {
     270        List<Integer> sel = new ArrayList<Integer>();
     271        for (Relation r : relations) {
     272            if (r == null) continue;
     273            int idx = model.getIndexOfRelation(r);
     274            if (idx != -1) {
     275                sel.add(idx);
     276            }
    250277        }
    251         int idx = model.getIndexOfRelation(relation);
    252         if (idx == -1) {
     278        if (sel.isEmpty()) {
    253279            displaylist.clearSelection();
     280            return;
    254281        } else {
    255             displaylist.setSelectedIndex(idx);
    256             displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx));
     282            int fst = Collections.min(sel);
     283            displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst));
     284        }
     285
     286        int[] aSel = new int[sel.size()];       //FIXME: how to cast Integer[] -> int[] ?
     287        for (int i=0; i<sel.size(); ++i) {
     288            aSel[i] = sel.get(i);
    257289        }
     290
     291        displaylist.setSelectedIndices(aSel);
    258292    }
    259293
    260294    class DoubleClickAdapter extends MouseAdapter {
     
    275309                }
    276310            }
    277311        }
     312        private void openPopup(MouseEvent e) {
     313            Point p = e.getPoint();
     314            int index = displaylist.locationToIndex(p);
     315            if (index < 0) return;
     316            if (!displaylist.getCellBounds(index, index).contains(e.getPoint()))
     317                return;
     318            Object obj = model.getElementAt(index);
     319            if (! displaylist.isSelectedIndex(index)) {
     320                displaylist.setSelectedIndex(index);
     321            }
     322            JPopupMenu menu = new JPopupMenu();
     323            JMenuItem down = new JMenuItem(tr("Download members"), ImageProvider.get("dialogs", "downloadincomplete"));
     324
     325            final Object[] os = displaylist.getSelectedValues();
     326            final List<Relation> rs = new ArrayList<Relation>();
     327            for (Object o : os) {
     328                Relation r = (Relation) o;
     329                if (r != null && !r.isNew()) {
     330                    rs.add(r);
     331                }
     332            }
     333            down.setEnabled(!rs.isEmpty());
     334            down.addActionListener(new ActionListener () {
     335                public void actionPerformed(ActionEvent e) {
     336                    Main.worker.submit(new GenericRelationEditor.DownloadTask(
     337                                                    (Relation[]) rs.toArray(new Relation[0]),
     338                                                    Main.map.mapView.getEditLayer(), null));
     339                }
     340            });
     341            JMenuItem select = new JMenuItem(tr("Select members"), ImageProvider.get("selectall"));
     342            select.addActionListener(new ActionListener () {
     343                public void actionPerformed(ActionEvent e) {
     344                    Object[] rs = displaylist.getSelectedValues();
     345                    HashSet<OsmPrimitive> ms = new HashSet<OsmPrimitive>();
     346                    for (Object r : rs) {
     347                        for (RelationMember m : ((Relation) r).getMembers()) {
     348                            ms.add(m.getMember());
     349                        }
     350                    }
     351                    final OsmDataLayer l = Main.map.mapView.getEditLayer();
     352                    l.data.setSelected(ms);
     353                    DataSet.fireSelectionChanged(l.data.getSelected());
     354                }
     355            });
     356            menu.add(down);
     357            menu.add(select);
     358
     359            menu.show(RelationListDialog.this, p.x, p.y-3);
     360        }
     361        @Override public void mousePressed(MouseEvent e) {
     362            if (e.isPopupTrigger()) {
     363                openPopup(e);
     364            }
     365        }
     366        @Override public void mouseReleased(MouseEvent e) {
     367            if (e.isPopupTrigger()) {
     368                openPopup(e);
     369            }
     370        }
    278371    }
    279372
    280     /**
     373   /**
    281374     * The edit action
    282375     *
    283376     */
  • src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

     
    196196            listSelectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    197197        }
    198198        return listSelectionModel;
    199     }
    200 
    201     public void updateMemberReferences(DataSet ds) {
    202         for (int i=0; i< members.size();i++) {
    203             RelationMember member = members.get(i);
    204             if (member.getMember().isNew()) {
    205                 continue;
    206             }
    207             OsmPrimitive primitive = ds.getPrimitiveById(member.getMember().getId(), OsmPrimitiveType.from(member.getMember()));
    208             if (primitive != null) {
    209                 RelationMember newMember = new RelationMember(member.getRole(), primitive);
    210                 members.remove(i);
    211                 members.add(i, newMember);
    212             }
    213         }
    214         fireTableDataChanged();
    215     }
    216 
     199    }
    217200
    218201    public void removeMembersReferringTo(List<? extends OsmPrimitive> primitives) {
    219202        if (primitives == null)
  • src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

                 return;
     
    12021202        public void actionPerformed(ActionEvent e) {
    12031203            if (!isEnabled())
    12041204                return;
    1205             Main.worker.submit(new DownloadTask(GenericRelationEditor.this));
     1205            Main.worker.submit(new DownloadTask(new Relation[] {getRelation()}, getLayer(), memberTableModel, GenericRelationEditor.this));
    12061206        }
    12071207
    12081208        protected void updateEnabledState() {
     
    13681368     * The asynchronous task for downloading relation members.
    13691369     *
    13701370     */
    1371     class DownloadTask extends PleaseWaitRunnable {
     1371    public static class DownloadTask extends PleaseWaitRunnable {
    13721372        private boolean cancelled;
    13731373        private int conflictsCount;
    13741374        private Exception lastException;
     1375        private Relation[] relations;
     1376        private OsmDataLayer curLayer;
     1377        private MemberTableModel memberTableModel;
    13751378
    1376         public DownloadTask(Dialog parent) {
     1379        public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {
    13771380            super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /*
    13781381             * don't
    13791382             * ignore
    13801383             * exception
    13811384             */);
     1385             this.relations = relations;
     1386             this.curLayer = curLayer;
     1387             this.memberTableModel = memberTableModel;
     1388        }
     1389        public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) {
     1390            super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /*
     1391             * don't
     1392             * ignore
     1393             * exception
     1394             */);
     1395             this.relations = relations;
     1396             this.curLayer = curLayer;       
     1397             this.memberTableModel = memberTableModel;
    13821398        }
    13831399
    13841400        @Override
     
    13891405
    13901406        @Override
    13911407        protected void finish() {
     1408            Main.map.repaint();
    13921409            if (cancelled)
    13931410                return;
    1394             memberTableModel.updateMemberReferences(getLayer().data);
     1411            if (memberTableModel != null) {
     1412                memberTableModel.fireTableDataChanged();
     1413            }
    13951414            if (lastException != null) {
    13961415                ExceptionDialogUtil.explainException(lastException);
    13971416            }
     
    14091428        @Override
    14101429        protected void realRun() throws SAXException, IOException, OsmTransferException {
    14111430            try {
    1412                 progressMonitor.indeterminateSubTask("");
    1413                 OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().getId(), OsmPrimitiveType.RELATION,
    1414                         true);
    1415                 DataSet dataSet = reader.parseOsm(progressMonitor
    1416                         .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    1417                 if (dataSet != null) {
    1418                     final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet);
    1419                     visitor.merge();
    1420 
    1421                     // copy the merged layer's data source info
    1422                     for (DataSource src : dataSet.dataSources) {
    1423                         getLayer().data.dataSources.add(src);
     1431                boolean changed = false;
     1432                for (Relation relation : relations) {
     1433                    progressMonitor.indeterminateSubTask("");
     1434                    OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION,
     1435                            true);
     1436                    DataSet dataSet = reader.parseOsm(progressMonitor
     1437                            .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
     1438                    if (dataSet != null) {
     1439                        changed = true;
     1440                        final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet);
     1441                        visitor.merge();
     1442
     1443                        // copy the merged layer's data source info
     1444                        for (DataSource src : dataSet.dataSources) {
     1445                            curLayer.data.dataSources.add(src);
     1446                        }
     1447                        if (!visitor.getConflicts().isEmpty()) {
     1448                            curLayer.getConflicts().add(visitor.getConflicts());
     1449                            conflictsCount = visitor.getConflicts().size();
     1450                        }
    14241451                    }
    1425                     // FIXME: this is necessary because there are dialogs listening
    1426                     // for DataChangeEvents which manipulate Swing components on this
    1427                     // thread.
    1428                     //
     1452                }
     1453                // FIXME: this is necessary because there are dialogs listening
     1454                // for DataChangeEvents which manipulate Swing components on this
     1455                // thread.
     1456                //
     1457                if (changed) {
    14291458                    SwingUtilities.invokeLater(new Runnable() {
    14301459                        public void run() {
    1431                             getLayer().fireDataChange();
     1460                            curLayer.fireDataChange();
    14321461                        }
    14331462                    });
    1434                     if (!visitor.getConflicts().isEmpty()) {
    1435                         getLayer().getConflicts().add(visitor.getConflicts());
    1436                         conflictsCount = visitor.getConflicts().size();
    1437                     }
    14381463                }
    14391464            } catch (Exception e) {
    14401465                if (cancelled) {