Changeset 1927 in josm


Ignore:
Timestamp:
Aug 8, 2009 10:53:46 AM (4 years ago)
Author:
Gubaer
Message:

fixed #3213: Adding objects to a relation breaks selecting multiple objects

Location:
trunk
Files:
7 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r1925 r1927  
    334334        editor.setAutoCompletionList(acList); 
    335335 
    336         SelectionSynchronizer synchronizer = new SelectionSynchronizer(); 
    337         memberTable.getSelectionModel().addListSelectionListener(synchronizer); 
    338         DataSet.selListeners.add(synchronizer); 
    339336        memberTable.addMouseListener(new MemberTableDblClickAdapter()); 
    340337        memberTableModel.addMemberModelListener(memberTable); 
     
    489486        gc.weightx = 0.0; 
    490487        gc.weighty = 0.0; 
     488 
     489        // ----- 
     490        gc.gridy = 0; 
    491491        MoveUpAction moveUpAction = new MoveUpAction(); 
    492492        memberTableModel.getSelectionModel().addListSelectionListener(moveUpAction); 
     
    511511        pnl.add(new JButton(removeSelectedAction), gc); 
    512512 
     513 
    513514        // ------ 
    514515        gc.gridy = 4; 
     516        SelectPrimitivesForSelectedMembersAction selectAction = new SelectPrimitivesForSelectedMembersAction(); 
     517        memberTable.getSelectionModel().addListSelectionListener(selectAction); 
     518        pnl.add(new JButton(selectAction), gc); 
     519 
     520        // ------ 
     521        gc.gridy = 5; 
    515522        SortAction sortAction = new SortAction(); 
    516523        pnl.add(new JButton(sortAction), gc); 
     
    518525        // ------ 
    519526        // just grab the remaining space 
    520         gc.gridy = 5; 
     527        gc.gridy = 6; 
    521528        gc.weighty = 1.0; 
    522529        gc.fill = GridBagConstraints.BOTH; 
     
    550557        // ----- 
    551558        gc.gridy = 1; 
     559        SelectedMembersForSelectionAction selectMembersForSelectionAction = new SelectedMembersForSelectionAction(); 
     560        selectionTableModel.addTableModelListener(selectMembersForSelectionAction); 
     561        memberTableModel.addTableModelListener(selectMembersForSelectionAction); 
     562        pnl.add(new JButton(selectMembersForSelectionAction), gc); 
     563 
     564        // ----- 
     565        gc.gridy = 2; 
    552566        RemoveSelectedAction removeSelectedAction = new RemoveSelectedAction(); 
    553567        selectionTableModel.addTableModelListener(removeSelectedAction); 
     
    556570        // ------ 
    557571        // just grab the remaining space 
    558         gc.gridy = 2; 
     572        gc.gridy = 3; 
    559573        gc.weighty = 1.0; 
    560574        gc.fill = GridBagConstraints.BOTH; 
     
    562576 
    563577        // ----- 
    564         gc.gridy = 3; 
     578        gc.gridy = 4; 
    565579        gc.weighty = 0.0; 
    566580        AddSelectedAtStartAction addSelectionAction = new AddSelectedAtStartAction(); 
     
    569583 
    570584        // ----- 
    571         gc.gridy = 4; 
     585        gc.gridy = 5; 
    572586        AddSelectedBeforeSelection addSelectedBeforeSelectionAction = new AddSelectedBeforeSelection(); 
    573587        selectionTableModel.addTableModelListener(addSelectedBeforeSelectionAction); 
     
    576590 
    577591        // ----- 
    578         gc.gridy = 5; 
     592        gc.gridy = 6; 
    579593        AddSelectedAfterSelection addSelectedAfterSelectionAction = new AddSelectedAfterSelection(); 
    580594        selectionTableModel.addTableModelListener(addSelectedAfterSelectionAction); 
     
    887901        public RemoveSelectedAction() { 
    888902            putValue(SHORT_DESCRIPTION, tr("Remove all members referring to one of the selected primitives")); 
    889             putValue(SMALL_ICON, ImageProvider.get("dialogs", "removeselected")); 
     903            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "deletemembers")); 
    890904            // putValue(NAME, tr("Remove Selected")); 
    891905            Shortcut.registerShortcut("relationeditor:removeselected", tr("Relation Editor: Remove Selected"), 
     
    912926 
    913927        public void tableChanged(TableModelEvent e) { 
     928            updateEnabledState(); 
     929        } 
     930    } 
     931 
     932    /** 
     933     * Selects  members in the relation editor which refer to primitives in the current 
     934     * selection of the context layer. 
     935     *  
     936     */ 
     937    class SelectedMembersForSelectionAction extends AbstractAction implements TableModelListener { 
     938        public SelectedMembersForSelectionAction() { 
     939            putValue(SHORT_DESCRIPTION, tr("Select relation members which refer to primitives in the current selection")); 
     940            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "selectmembers")); 
     941            updateEnabledState(); 
     942        } 
     943 
     944        protected void updateEnabledState() { 
     945            boolean enabled = selectionTableModel.getRowCount() > 0 
     946            &&  !memberTableModel.getChildPrimitives(getLayer().data.getSelected()).isEmpty(); 
     947 
     948            if (enabled) { 
     949                putValue(SHORT_DESCRIPTION, tr("Select relation members which refer to {0} primitives in the current selection",memberTableModel.getChildPrimitives(getLayer().data.getSelected()).size())); 
     950            } else { 
     951                putValue(SHORT_DESCRIPTION, tr("Select relation members which refer to primitives in the current selection")); 
     952            } 
     953            setEnabled(enabled); 
     954        } 
     955 
     956        public void actionPerformed(ActionEvent e) { 
     957            memberTableModel.selectMembersReferringTo(getLayer().data.getSelected()); 
     958        } 
     959 
     960        public void tableChanged(TableModelEvent e) { 
     961            updateEnabledState(); 
     962 
     963        } 
     964    } 
     965 
     966    /** 
     967     * Selects primitives in the layer this editor belongs to. The selected primitives are 
     968     * equal to the set of primitives the currently selected relation members refer to. 
     969     *  
     970     */ 
     971    class SelectPrimitivesForSelectedMembersAction extends AbstractAction implements ListSelectionListener { 
     972        public SelectPrimitivesForSelectedMembersAction() { 
     973            putValue(SHORT_DESCRIPTION, tr("Select primitives for selected relation members")); 
     974            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "selectprimitives")); 
     975            updateEnabledState(); 
     976        } 
     977 
     978        protected void updateEnabledState() { 
     979            setEnabled(memberTable.getSelectedRowCount() > 0); 
     980        } 
     981 
     982        public void actionPerformed(ActionEvent e) { 
     983            getLayer().data.setSelected(memberTableModel.getSelectedChildPrimitives()); 
     984            DataSet.fireSelectionChanged(getLayer().data.getSelected()); 
     985        } 
     986 
     987        public void valueChanged(ListSelectionEvent e) { 
    914988            updateEnabledState(); 
    915989        } 
     
    14441518            if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { 
    14451519                new EditAction().run(); 
    1446             } 
    1447         } 
    1448     } 
    1449  
    1450     /** 
    1451      * Updates the selection in the current data set with the selected referers in 
    1452      * in the member table. 
    1453      */ 
    1454     class SelectionSynchronizer implements ListSelectionListener, SelectionChangedListener{ 
    1455         public void valueChanged(ListSelectionEvent e) { 
    1456             // as long as the model is computing the final selection it emits selection 
    1457             // change events with getValueIsAdjusting() true. Ignore these events, only 
    1458             // handle the final selection update. Otherwise, infinite loops of property 
    1459             // change events occur. 
    1460             // 
    1461             if (e.getValueIsAdjusting()) 
    1462                 return; 
    1463  
    1464             // Avoid infinite loop.  Only update the selection if it is not in sync with what 
    1465             // is already selected. Avoids infinite loops of property change events. 
    1466             // 
    1467             if (!memberTableModel.selectionsAreInSync()) { 
    1468                 getLayer().data.setSelected(memberTableModel.getSelectedReferers()); 
    1469             } 
    1470         } 
    1471  
    1472         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 
    1473             // ignore selection change events if they happen for a dataset in another 
    1474             // layer 
    1475             if (!memberTableModel.isActiveLayer()) return; 
    1476             if (!memberTableModel.selectionsAreInSync()) { 
    1477                 memberTableModel.selectMembersReferringTo(newSelection); 
    14781520            } 
    14791521        } 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r1926 r1927  
    376376     * @return the set of selected referers 
    377377     */ 
    378     public Set<OsmPrimitive> getSelectedReferers() { 
     378    public Set<OsmPrimitive> getSelectedChildPrimitives() { 
    379379        HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>(); 
    380380        for (RelationMember m: getSelectedMembers()) { 
     
    385385 
    386386    /** 
     387     * Replies the set of selected referers. Never null, but may be empty. 
     388     *  
     389     * @return the set of selected referers 
     390     */ 
     391    public Set<OsmPrimitive> getChildPrimitives(Collection<? extends OsmPrimitive> referenceSet) { 
     392        HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>(); 
     393        if (referenceSet == null) return null; 
     394        for (RelationMember m: members) { 
     395            if (referenceSet.contains(m.member)) { 
     396                ret.add(m.member); 
     397            } 
     398        } 
     399        return ret; 
     400    } 
     401 
     402 
     403    /** 
    387404     * Replies true, if the selected {@see OsmPrimitive}s in the layer belonging 
    388405     * to this model are in sync with the selected referers in this model. 
     
    391408     */ 
    392409    public boolean selectionsAreInSync() { 
    393         HashSet<OsmPrimitive> s1 = new HashSet<OsmPrimitive>(getSelectedReferers()); 
     410        HashSet<OsmPrimitive> s1 = new HashSet<OsmPrimitive>(getSelectedChildPrimitives()); 
    394411        if (s1.size() != layer.data.getSelected().size()) return false; 
    395412        s1.removeAll(layer.data.getSelected()); 
Note: See TracChangeset for help on using the changeset viewer.