Ignore:
Timestamp:
03.12.2009 19:02:25 (2 years ago)
Author:
Gubaer
Message:

fixed #3400: relation editor: improvement to highlight an element
fixed #3873: Feature request: download selected elements in relation editor
New: Dbl-Click in member table to set the map selection to this member
New: Ctrl-Dbl-Clik in member table to add the member to the the map selection
New: Download selected incomplete members only

File:
1 edited

Legend:

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

    r2512 r2563  
    2626 
    2727import org.openstreetmap.josm.Main; 
     28import org.openstreetmap.josm.data.SelectionChangedListener; 
    2829import org.openstreetmap.josm.data.coor.EastNorth; 
     30import org.openstreetmap.josm.data.osm.DataSetListener; 
    2931import org.openstreetmap.josm.data.osm.Node; 
    3032import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     
    3335import org.openstreetmap.josm.data.osm.Way; 
    3436import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction; 
     37import org.openstreetmap.josm.gui.layer.DataChangeListener; 
    3538import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
    3639 
    37 public class MemberTableModel extends AbstractTableModel implements TableModelListener { 
     40public class MemberTableModel extends AbstractTableModel implements TableModelListener, SelectionChangedListener, DataChangeListener, DataSetListener{ 
    3841 
    3942    /** 
     
    5659        addTableModelListener(this); 
    5760    } 
     61 
     62    public OsmDataLayer getLayer() { 
     63        return layer; 
     64    } 
     65 
     66    /* --------------------------------------------------------------------------- */ 
     67    /* Interface SelectionChangedListener                                          */ 
     68    /* --------------------------------------------------------------------------- */ 
     69    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 
     70        if (Main.main.getEditLayer() != this.layer) return; 
     71        // just trigger a repaint 
     72        Collection<RelationMember> sel = getSelectedMembers(); 
     73        fireTableDataChanged(); 
     74        setSelectedMembers(sel); 
     75    } 
     76 
     77    /* --------------------------------------------------------------------------- */ 
     78    /* Interface DataChangeListener                                                */ 
     79    /* --------------------------------------------------------------------------- */ 
     80    public void dataChanged(OsmDataLayer l) { 
     81        if (l != this.layer) return; 
     82        // just trigger a repaint 
     83        Collection<RelationMember> sel = getSelectedMembers(); 
     84        fireTableDataChanged(); 
     85        setSelectedMembers(sel); 
     86    } 
     87    /* --------------------------------------------------------------------------- */ 
     88    /* Interface DataSetListener                                                   */ 
     89    /* --------------------------------------------------------------------------- */ 
     90    public void dataChanged() { 
     91        // just trigger a repaint - the display name of the relation members may 
     92        // have changed 
     93        Collection<RelationMember> sel = getSelectedMembers(); 
     94        fireTableDataChanged(); 
     95        setSelectedMembers(sel); 
     96    } 
     97 
     98    public void nodeMoved(Node node) {/* ignore */} 
     99    public void primtivesAdded(Collection<? extends OsmPrimitive> added) {/* ignore */} 
     100 
     101    public void primtivesRemoved(Collection<? extends OsmPrimitive> removed) { 
     102        // ignore - the relation in the editor might become out of sync with the relation 
     103        // in the dataset. We will deal with it when the relation editor is closed or 
     104        // when the changes in the editor are applied. 
     105    } 
     106 
     107    public void relationMembersChanged(Relation r) { 
     108        // ignore - the relation in the editor might become out of sync with the relation 
     109        // in the dataset. We will deal with it when the relation editor is closed or 
     110        // when the changes in the editor are applied. 
     111    } 
     112 
     113    public void tagsChanged(OsmPrimitive prim) { 
     114        // just refresh the respective table cells 
     115        // 
     116        Collection<RelationMember> sel = getSelectedMembers(); 
     117        for (int i=0; i < members.size();i++) { 
     118            if (members.get(i).getMember() == prim) { 
     119                fireTableCellUpdated(i, 1 /* the column with the primitive name */); 
     120            } 
     121        } 
     122        setSelectedMembers(sel); 
     123    } 
     124 
     125    public void wayNodesChanged(Way way) {/* ignore */} 
     126    /* --------------------------------------------------------------------------- */ 
    58127 
    59128    public void addMemberModelListener(IMemberModelListener listener) { 
     
    242311    } 
    243312 
     313    /** 
     314     * Replies the set of incomplete primitives 
     315     *  
     316     * @return the set of incomplete primitives 
     317     */ 
     318    public Set<OsmPrimitive> getIncompleteMemberPrimitives() { 
     319        Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>(); 
     320        for (RelationMember member : members) { 
     321            if (member.getMember().incomplete) { 
     322                ret.add(member.getMember()); 
     323            } 
     324        } 
     325        return ret; 
     326    } 
     327 
     328    /** 
     329     * Replies the set of selected incomplete primitives 
     330     *  
     331     * @return the set of selected incomplete primitives 
     332     */ 
     333    public Set<OsmPrimitive> getSelectedIncompleteMemberPrimitives() { 
     334        Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>(); 
     335        for (RelationMember member : getSelectedMembers()) { 
     336            if (member.getMember().incomplete) { 
     337                ret.add(member.getMember()); 
     338            } 
     339        } 
     340        return ret; 
     341    } 
     342 
     343    /** 
     344     * Replies true if at least one the relation members is incomplete 
     345     *  
     346     * @return true if at least one the relation members is incomplete 
     347     */ 
    244348    public boolean hasIncompleteMembers() { 
    245349        for (RelationMember member : members) { 
     350            if (member.getMember().incomplete) 
     351                return true; 
     352        } 
     353        return false; 
     354    } 
     355 
     356    /** 
     357     * Replies true if at least one of the selected members is incomplete 
     358     *  
     359     * @return true if at least one of the selected members is incomplete 
     360     */ 
     361    public boolean hasIncompleteSelectedMembers() { 
     362        for (RelationMember member : getSelectedMembers()) { 
    246363            if (member.getMember().incomplete) 
    247364                return true; 
     
    408525 
    409526    /** 
    410      * Replies true, if the selected {@see OsmPrimitive}s in the layer belonging 
    411      * to this model are in sync with the selected referers in this model. 
    412      * 
    413      * @return 
    414      */ 
    415     public boolean selectionsAreInSync() { 
    416         HashSet<OsmPrimitive> s1 = new HashSet<OsmPrimitive>(getSelectedChildPrimitives()); 
    417         if (s1.size() != layer.data.getSelected().size()) return false; 
    418         s1.removeAll(layer.data.getSelected()); 
    419         return s1.isEmpty(); 
    420     } 
    421     /** 
    422527     * Selects the members in the collection selectedMembers 
    423528     * 
     
    425530     */ 
    426531    public void setSelectedMembers(Collection<RelationMember> selectedMembers) { 
    427         if (selectedMembers == null || selectedMembers.isEmpty()) 
     532        if (selectedMembers == null || selectedMembers.isEmpty()) { 
     533            getSelectionModel().clearSelection(); 
    428534            return; 
     535        } 
    429536 
    430537        // lookup the indices for the respective members 
    431538        // 
    432         ArrayList<Integer> selectedIndices = new ArrayList<Integer>(); 
     539        Set<Integer> selectedIndices = new HashSet<Integer>(); 
    433540        for (RelationMember member : selectedMembers) { 
    434             for (int idx = 0; idx < members.size(); idx ++) { 
    435                 if (members.get(idx).equals(member)) { 
    436                     if (!selectedIndices.contains(idx)) { 
    437                         selectedIndices.add(idx); 
    438                     } 
    439                 } 
     541            int idx = members.indexOf(member); 
     542            if ( idx >= 0) { 
     543                selectedIndices.add(idx); 
    440544            } 
    441545        } 
     
    443547        // select the members 
    444548        // 
    445         Collections.sort(selectedIndices); 
    446549        getSelectionModel().setValueIsAdjusting(true); 
    447550        getSelectionModel().clearSelection(); 
     
    450553        } 
    451554        getSelectionModel().setValueIsAdjusting(false); 
    452  
    453555        // make the first selected member visible 
    454556        // 
    455557        if (selectedIndices.size() > 0) { 
    456             fireMakeMemberVisible(selectedIndices.get(0)); 
     558            fireMakeMemberVisible(Collections.min(selectedIndices)); 
    457559        } 
    458560    } 
     
    523625            fireMakeMemberVisible(getSelectedIndices().get(0)); 
    524626        } 
     627    } 
     628 
     629    /** 
     630     * Replies true if <code>primitive</code> is currently selected in the layer this 
     631     * model is attached to 
     632     *  
     633     * @param primitive the primitive 
     634     * @return true if <code>primitive</code> is currently selected in the layer this 
     635     * model is attached to, false otherwise 
     636     */ 
     637    public boolean isInJosmSelection(OsmPrimitive primitive) { 
     638        return layer.data.isSelected(primitive); 
    525639    } 
    526640 
Note: See TracChangeset for help on using the changeset viewer.