Ignore:
Timestamp:
2009-10-25T15:13:08+01:00 (17 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/gui
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • 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.