Changeset 2317 in josm for trunk/src


Ignore:
Timestamp:
2009-10-25T15:13:08+01:00 (13 years ago)
Author:
Gubaer
Message:

applied #3663: patch by singularita: Function to automatically download all missing relations members in all relations
Slightly updated and completed with context sensitive help, see also help

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

Legend:

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

    r2254 r2317  
    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"),
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2303 r2317  
    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    }
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r2309 r2317  
    55import java.util.Arrays;
    66import java.util.Collection;
    7 import java.util.Collections;
    87import java.util.Comparator;
    98import java.util.HashMap;
    10 import java.util.LinkedHashSet;
    119import java.util.HashSet;
    1210import java.util.Iterator;
     11import java.util.LinkedHashSet;
    1312import java.util.LinkedList;
    1413import java.util.List;
     
    1615
    1716import org.openstreetmap.josm.data.SelectionChangedListener;
    18 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1917
    2018/**
     
    135133            relations.add(relation);
    136134            return relation;
    137         } else {
     135        } else
    138136            throw new AssertionError();
    139         }
    140137    }
    141138
     
    170167        for (OsmPrimitive osm : selectedPrimitives) {
    171168            if (osm instanceof Way ||
    172                 osm instanceof Node)
     169                    osm instanceof Node) {
    173170                sel.add(osm);
     171            }
    174172        }
    175173        return sel;
     
    245243
    246244    public boolean toggleSelected(OsmPrimitive osm) {
    247         if (!selectedPrimitives.remove(osm))
     245        if (!selectedPrimitives.remove(osm)) {
    248246            selectedPrimitives.add(osm);
     247        }
    249248        return true;
    250249    }
     
    480479            OsmPrimitive result = null;
    481480            switch (type) {
    482             case NODE: result = new Node(id, true); break;
    483             case WAY: result = new Way(id, true); break;
    484             case RELATION: result = new Relation(id, true); break;
     481                case NODE: result = new Node(id, true); break;
     482                case WAY: result = new Way(id, true); break;
     483                case RELATION: result = new Relation(id, true); break;
    485484            }
    486485            addPrimitive(result);
    487486            return result;
    488         } else {
     487        } else
    489488            return null;
    490         }
    491489    }
    492490
  • trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java

    r2269 r2317  
    271271        if (numPanels == 1 && panels.get(N-1).getComponents().length == 0)
    272272        {
     273            parent.setDividerSize(0);
    273274            this.setVisible(false);
    274275        } else {
     
    277278            }
    278279            this.setVisible(true);
     280            parent.setDividerSize(5);
    279281            parent.resetToPreferredSizes();
    280282        }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    r2301 r2317  
    11package org.openstreetmap.josm.gui.dialogs;
    22
     3import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    34import static org.openstreetmap.josm.tools.I18n.tr;
    45
    56import java.awt.BorderLayout;
    67import java.awt.GridLayout;
     8import java.awt.Point;
    79import java.awt.event.ActionEvent;
    810import java.awt.event.KeyEvent;
     
    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;
     24import javax.swing.DefaultListSelectionModel;
    2025import javax.swing.JList;
    2126import javax.swing.JPanel;
     27import javax.swing.JPopupMenu;
    2228import javax.swing.JScrollPane;
    2329import javax.swing.KeyStroke;
     
    3642import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
    3743import org.openstreetmap.josm.gui.SideButton;
     44import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
    3845import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
    3946import org.openstreetmap.josm.gui.layer.DataChangeListener;
     
    6471    /** the delete action */
    6572    private DeleteAction deleteAction;
     73    /** the popup menu */
     74    private RelationDialogPopupMenu popupMenu;
    6675
    6776
     
    7584        // create the list of relations
    7685        //
    77         model = new RelationListModel();
     86        DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
     87        model = new RelationListModel(selectionModel);
    7888        displaylist = new JList(model);
     89        displaylist.setSelectionModel(selectionModel);
    7990        displaylist.setCellRenderer(new OsmPrimitivRenderer());
    8091        displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    81         displaylist.addMouseListener(new DoubleClickAdapter());
     92        displaylist.addMouseListener(new MouseEventHandler());
    8293        add(new JScrollPane(displaylist), BorderLayout.CENTER);
    8394
     
    119130        displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0), "deleteRelation");
    120131        displaylist.getActionMap().put("deleteRelation", deleteAction);
     132
     133        popupMenu = new RelationDialogPopupMenu();
    121134
    122135        // register as layer listener
     
    170183            return;
    171184        }
    172         Relation selected = getSelected();
     185        Relation[] selected = getAllSelected();
    173186
    174187        model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet()));
     
    178191            setTitle(tr("Relations"));
    179192        }
    180         selectRelation(selected);
     193        selectRelations(selected);
    181194    }
    182195
     
    240253
    241254    /**
     255     * @return All selected relations in the list, possibly empty List
     256     */
     257    private Relation[] getAllSelected() {
     258        return Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]);
     259    }
     260
     261    /**
    242262     * Selects the relation <code>relation</code> in the list of relations.
    243263     *
     
    245265     */
    246266    public void selectRelation(Relation relation) {
    247         if (relation == null){
     267        selectRelations(new Relation[] {relation});
     268    }
     269
     270    /**
     271     * Selects the relations <code>relations</code> in the list of relations.
     272     *
     273     * @param relations  the relations (may be empty)
     274     */
     275    public void selectRelations(Relation[] relations) {
     276        List<Integer> sel = new ArrayList<Integer>();
     277        for (Relation r : relations) {
     278            if (r == null) {
     279                continue;
     280            }
     281            int idx = model.getIndexOfRelation(r);
     282            if (idx != -1) {
     283                sel.add(idx);
     284            }
     285        }
     286        if (sel.isEmpty()) {
    248287            displaylist.clearSelection();
    249288            return;
    250         }
    251         int idx = model.getIndexOfRelation(relation);
    252         if (idx == -1) {
    253             displaylist.clearSelection();
    254289        } else {
    255             displaylist.setSelectedIndex(idx);
    256             displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx));
    257         }
    258     }
    259 
    260     class DoubleClickAdapter extends MouseAdapter {
     290            int fst = Collections.min(sel);
     291            displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst));
     292        }
     293
     294        int[] aSel = new int[sel.size()];       //FIXME: how to cast Integer[] -> int[] ?
     295        for (int i=0; i<sel.size(); ++i) {
     296            aSel[i] = sel.get(i);
     297        }
     298
     299        displaylist.setSelectedIndices(aSel);
     300    }
     301
     302    class MouseEventHandler extends MouseAdapter {
    261303        protected void setCurrentRelationAsSelection() {
    262304            Main.main.getCurrentDataSet().setSelected((Relation)displaylist.getSelectedValue());
     
    274316                    setCurrentRelationAsSelection();
    275317                }
     318            }
     319        }
     320        private void openPopup(MouseEvent e) {
     321            Point p = e.getPoint();
     322            int index = displaylist.locationToIndex(p);
     323            if (index < 0) return;
     324            if (!displaylist.getCellBounds(index, index).contains(e.getPoint()))
     325                return;
     326            if (! displaylist.isSelectedIndex(index)) {
     327                displaylist.setSelectedIndex(index);
     328            }
     329            popupMenu.show(RelationListDialog.this, p.x, p.y-3);
     330        }
     331        @Override public void mousePressed(MouseEvent e) {
     332            if (e.isPopupTrigger()) {
     333                openPopup(e);
     334            }
     335        }
     336        @Override public void mouseReleased(MouseEvent e) {
     337            if (e.isPopupTrigger()) {
     338                openPopup(e);
    276339            }
    277340        }
     
    441504        public SelectAction() {
    442505            putValue(SHORT_DESCRIPTION,tr("Set the current selection to the list of selected relations"));
    443             //putValue(NAME, tr("Select"));
    444506            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
    445507            setEnabled(false);
     
    463525    }
    464526
     527    /**
     528     * Sets the current selection to the list of relations selected in this dialog
     529     *
     530     */
     531    class SelectMembersAction extends AbstractAction implements ListSelectionListener{
     532        public SelectMembersAction() {
     533            putValue(SHORT_DESCRIPTION,tr("Select the members of all selected relations"));
     534            putValue(SMALL_ICON, ImageProvider.get("selectall"));
     535            putValue(NAME, tr("Select members"));
     536            updateEnabledState();
     537        }
     538
     539        public void actionPerformed(ActionEvent e) {
     540            if (!isEnabled()) return;
     541            List<Relation> relations = model.getSelectedRelations();
     542            HashSet<OsmPrimitive> members = new HashSet<OsmPrimitive>();
     543            for(Relation r: relations) {
     544                members.addAll(r.getMemberPrimitives());
     545            }
     546            Main.map.mapView.getEditLayer().data.setSelected(members);
     547            DataSet.fireSelectionChanged(members);
     548        }
     549
     550        protected void updateEnabledState() {
     551            setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
     552        }
     553
     554        public void valueChanged(ListSelectionEvent e) {
     555            updateEnabledState();
     556        }
     557    }
     558
     559
     560    class DownloadMembersAction extends AbstractAction implements ListSelectionListener{
     561
     562        public DownloadMembersAction() {
     563            putValue(SHORT_DESCRIPTION,tr("Download all members of the selected relations"));
     564            putValue(NAME, tr("Download members"));
     565            putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete"));
     566            putValue("help", ht("/Dialog/RelationList#DownloadMembers"));
     567            updateEnabledState();
     568        }
     569
     570        protected void updateEnabledState() {
     571            setEnabled(! model.getSelectedNonNewRelations().isEmpty());
     572        }
     573
     574        public void valueChanged(ListSelectionEvent e) {
     575            updateEnabledState();
     576        }
     577
     578        public void actionPerformed(ActionEvent e) {
     579            List<Relation> relations = model.getSelectedNonNewRelations();
     580            if (relations.isEmpty())
     581                return;
     582            Main.worker.submit(new GenericRelationEditor.DownloadTask(
     583                    model.getSelectedNonNewRelations(),
     584                    Main.map.mapView.getEditLayer(), null));
     585        }
     586    }
     587
    465588    private static  class RelationListModel extends AbstractListModel {
    466589        private ArrayList<Relation> relations;
     590        private DefaultListSelectionModel selectionModel;
     591
     592        public RelationListModel(DefaultListSelectionModel selectionModel) {
     593            this.selectionModel = selectionModel;
     594        }
    467595
    468596        public ArrayList<Relation> getRelations() {
     
    493621            return relations.indexOf(relation);
    494622        }
     623
     624        /**
     625         * Replies the list of selected, non-new relations. Empty list,
     626         * if there are no selected, non-new relations.
     627         *
     628         * @return the list of selected, non-new relations.
     629         */
     630        public List<Relation> getSelectedNonNewRelations() {
     631            ArrayList<Relation> ret = new ArrayList<Relation>();
     632            for (int i=0; i<getSize();i++) {
     633                if (!selectionModel.isSelectedIndex(i)) {
     634                    continue;
     635                }
     636                if (relations.get(i).isNew()) {
     637                    continue;
     638                }
     639                ret.add(relations.get(i));
     640            }
     641            return ret;
     642        }
     643
     644        /**
     645         * Replies the list of selected relations. Empty list,
     646         * if there are no selected relations.
     647         *
     648         * @return the list of selected, non-new relations.
     649         */
     650        public List<Relation> getSelectedRelations() {
     651            ArrayList<Relation> ret = new ArrayList<Relation>();
     652            for (int i=0; i<getSize();i++) {
     653                if (!selectionModel.isSelectedIndex(i)) {
     654                    continue;
     655                }
     656                ret.add(relations.get(i));
     657            }
     658            return ret;
     659        }
     660    }
     661
     662    class RelationDialogPopupMenu extends JPopupMenu {
     663
     664        protected void build() {
     665            // -- download members action
     666            //
     667            DownloadMembersAction downloadMembersAction = new DownloadMembersAction();
     668            displaylist.addListSelectionListener(downloadMembersAction);
     669            add(downloadMembersAction);
     670
     671            // -- select members action
     672            //
     673            SelectMembersAction selectMembersAction = new SelectMembersAction();
     674            displaylist.addListSelectionListener(selectMembersAction);
     675            add(selectMembersAction);
     676        }
     677
     678        public RelationDialogPopupMenu() {
     679            build();
     680        }
    495681    }
    496682}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r2301 r2317  
    12031203            if (!isEnabled())
    12041204                return;
    1205             Main.worker.submit(new DownloadTask(GenericRelationEditor.this));
     1205            Main.worker.submit(new DownloadTask(
     1206                    Collections.singletonList(getRelation()),
     1207                    getLayer(),
     1208                    memberTableModel,
     1209                    GenericRelationEditor.this)
     1210            );
    12061211        }
    12071212
     
    13691374     *
    13701375     */
    1371     class DownloadTask extends PleaseWaitRunnable {
     1376    public static class DownloadTask extends PleaseWaitRunnable {
    13721377        private boolean cancelled;
    13731378        private int conflictsCount;
    13741379        private Exception lastException;
    1375 
    1376         public DownloadTask(Dialog parent) {
     1380        private List<Relation> relations;
     1381        private OsmDataLayer curLayer;
     1382        private MemberTableModel memberTableModel;
     1383
     1384        public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {
    13771385            super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /*
    13781386             * don't
     
    13801388             * exception
    13811389             */);
     1390            this.relations = relations;
     1391            this.curLayer = curLayer;
     1392            this.memberTableModel = memberTableModel;
     1393        }
     1394
     1395        public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) {
     1396            super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /*
     1397             * don't
     1398             * ignore
     1399             * exception
     1400             */);
     1401            this.relations = relations;
     1402            this.curLayer = curLayer;
     1403            this.memberTableModel = memberTableModel;
    13821404        }
    13831405
     
    13901412        @Override
    13911413        protected void finish() {
     1414            Main.map.repaint();
    13921415            if (cancelled)
    13931416                return;
    1394             memberTableModel.updateMemberReferences(getLayer().data);
     1417            if (memberTableModel != null) {
     1418                memberTableModel.fireTableDataChanged();
     1419            }
    13951420            if (lastException != null) {
    13961421                ExceptionDialogUtil.explainException(lastException);
     
    14101435        protected void realRun() throws SAXException, IOException, OsmTransferException {
    14111436            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);
     1437                boolean changed = false;
     1438                for (Relation relation : relations) {
     1439                    progressMonitor.indeterminateSubTask("");
     1440                    OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION,
     1441                            true);
     1442                    DataSet dataSet = reader.parseOsm(progressMonitor
     1443                            .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
     1444                    if (dataSet != null) {
     1445                        changed = true;
     1446                        final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet);
     1447                        visitor.merge();
     1448
     1449                        // copy the merged layer's data source info
     1450                        for (DataSource src : dataSet.dataSources) {
     1451                            curLayer.data.dataSources.add(src);
     1452                        }
     1453                        if (!visitor.getConflicts().isEmpty()) {
     1454                            curLayer.getConflicts().add(visitor.getConflicts());
     1455                            conflictsCount = visitor.getConflicts().size();
     1456                        }
    14241457                    }
    1425                     // FIXME: this is necessary because there are dialogs listening
    1426                     // for DataChangeEvents which manipulate Swing components on this
    1427                     // thread.
    1428                     //
     1458                }
     1459                // FIXME: this is necessary because there are dialogs listening
     1460                // for DataChangeEvents which manipulate Swing components on this
     1461                // thread.
     1462                //
     1463                if (changed) {
    14291464                    SwingUtilities.invokeLater(new Runnable() {
    14301465                        public void run() {
    1431                             getLayer().fireDataChange();
     1466                            curLayer.fireDataChange();
    14321467                        }
    14331468                    });
    1434                     if (!visitor.getConflicts().isEmpty()) {
    1435                         getLayer().getConflicts().add(visitor.getConflicts());
    1436                         conflictsCount = visitor.getConflicts().size();
    1437                     }
    14381469                }
    14391470            } catch (Exception e) {
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java

    r2156 r2317  
    4141        String role = (String)value;
    4242        editor.setText(role);
    43         System.out.println(role + " - initializing autocompletion list ...");
    4443        AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(autoCompletionList);
    4544        autoCompletionList.dump();
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r2311 r2317  
    1818
    1919import org.openstreetmap.josm.Main;
    20 import org.openstreetmap.josm.data.osm.DataSet;
    2120import org.openstreetmap.josm.data.osm.Node;
    2221import org.openstreetmap.josm.data.osm.OsmPrimitive;
    23 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2422import org.openstreetmap.josm.data.osm.Relation;
    2523import org.openstreetmap.josm.data.osm.RelationMember;
     
    8785    public Object getValueAt(int rowIndex, int columnIndex) {
    8886        switch (columnIndex) {
    89         case 0:
    90             return members.get(rowIndex).getRole();
    91         case 1:
    92             return members.get(rowIndex).getMember();
    93         case 2:
    94             return wayConnection(rowIndex);
     87            case 0:
     88                return members.get(rowIndex).getRole();
     89            case 1:
     90                return members.get(rowIndex).getMember();
     91            case 2:
     92                return wayConnection(rowIndex);
    9593        }
    9694        // should not happen
     
    197195        }
    198196        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();
    215197    }
    216198
     
    724706    private WayConnectionType wayConnection(int i) {
    725707        RelationMember m = members.get(i);
    726         if (! m.isWay()) {
     708        if (! m.isWay())
    727709            return new WayConnectionType();
    728         }
    729710        Way w = m.getWay();
    730         if (w == null || w.incomplete) {
     711        if (w == null || w.incomplete)
    731712            return new WayConnectionType();
    732         }
    733        
     713
    734714        int ip = (i - 1 + members.size()) % members.size();
    735715        Integer link_p = linked(ip);
  • trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java

    r2308 r2317  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.help;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
    35
    46import java.io.BufferedReader;
    57import java.io.IOException;
    68import java.io.InputStreamReader;
    7 import java.util.logging.Level;
    89import java.util.logging.Logger;
    910
    1011import javax.swing.SwingUtilities;
    11 
    12 import static org.openstreetmap.josm.tools.I18n.tr;
    1312
    1413/**
     
    7170            try {
    7271                cmd = reader.readLine();
    73                 logger.info("got command: " + cmd);
    7472            } catch(IOException e) {
    75                 logger.log(Level.SEVERE,e.toString());
    7673                System.out.println(tr("Failed to read command. Exiting help browser. Exception was:" + e.toString()));
    7774                System.exit(1);
Note: See TracChangeset for help on using the changeset viewer.