org.openstreetmap.josm.gui.dialogs.relation
Class MemberTableModel

java.lang.Object
  extended by javax.swing.table.AbstractTableModel
      extended by org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel
All Implemented Interfaces:
java.io.Serializable, java.util.EventListener, javax.swing.event.TableModelListener, javax.swing.table.TableModel, DataSetListener, SelectionChangedListener, OsmPrimitivesTableModel

public class MemberTableModel
extends javax.swing.table.AbstractTableModel
implements javax.swing.event.TableModelListener, SelectionChangedListener, DataSetListener, OsmPrimitivesTableModel

See Also:
Serialized Form

Field Summary
private  java.util.List<WayConnectionType> connectionType
           
(package private)  int firstGroupIdx
           
(package private)  int lastBackwardWay
           
(package private)  int lastForwardWay
           
private  OsmDataLayer layer
           
private  java.util.concurrent.CopyOnWriteArrayList<IMemberModelListener> listeners
           
private  javax.swing.DefaultListSelectionModel listSelectionModel
           
private  java.util.List<RelationMember> members
          data of the table model: The list of members and the cached WayConnectionType of each member.
(package private)  boolean onewayBeginning
           
private  int UNCONNECTED
           
 
Fields inherited from class javax.swing.table.AbstractTableModel
listenerList
 
Constructor Summary
MemberTableModel(OsmDataLayer layer)
          constructor
 
Method Summary
 void addMemberModelListener(IMemberModelListener listener)
           
 void addMembersAfterIdx(java.util.List<? extends OsmPrimitive> primitives, int idx)
           
 void addMembersAtBeginning(java.util.List<? extends OsmPrimitive> primitives)
           
 void addMembersAtEnd(java.util.List<? extends OsmPrimitive> primitives)
           
private  void addMembersAtIndex(java.util.List<? extends OsmPrimitive> primitives, int index)
           
 void addMembersBeforeIdx(java.util.List<? extends OsmPrimitive> primitives, int idx)
           
 void applyToRelation(Relation relation)
           
 boolean canMoveDown(int[] rows)
           
 boolean canMoveUp(int[] rows)
           
 boolean canRemove(int[] rows)
           
 void dataChanged(DataChangedEvent event)
          Called after big changes in dataset.
private  WayConnectionType.Direction determineDirection(int ref_i, WayConnectionType.Direction ref_direction, int k)
           
private  WayConnectionType.Direction determineDirection(int ref_i, WayConnectionType.Direction ref_direction, int k, boolean reversed)
          Determines the direction of way k with respect to the way ref_i.
private  WayConnectionType.Direction determineDirectionOfFirst(int i, RelationMember m)
           
private  WayConnectionType determineOnewayConnectionType(java.util.List<WayConnectionType> con, RelationMember m, int i, WayConnectionType wct)
           
protected  void fireMakeMemberVisible(int index)
           
 java.util.Set<OsmPrimitive> getChildPrimitives(java.util.Collection<? extends OsmPrimitive> referenceSet)
          Replies the set of selected referers.
 int getColumnCount()
           
 java.util.Set<OsmPrimitive> getIncompleteMemberPrimitives()
          Replies the set of incomplete primitives
 OsmDataLayer getLayer()
           
 int getNumMembersWithPrimitive(OsmPrimitive primitive)
          Replies the number of members which refer to a particular primitive
 OsmPrimitive getReferredPrimitive(int idx)
           
 int getRowCount()
           
 java.util.Collection<OsmPrimitive> getSelectedChildPrimitives()
          Replies the set of selected referers.
 java.util.Set<OsmPrimitive> getSelectedIncompleteMemberPrimitives()
          Replies the set of selected incomplete primitives
protected  java.util.List<java.lang.Integer> getSelectedIndices()
           
 java.util.Collection<RelationMember> getSelectedMembers()
          Get the currently selected relation members
 javax.swing.DefaultListSelectionModel getSelectionModel()
           
 java.lang.Object getValueAt(int rowIndex, int columnIndex)
           
(package private)  WayConnectionType getWayConnection(int i)
           
 boolean hasIncompleteMembers()
          Replies true if at least one the relation members is incomplete
 boolean hasIncompleteSelectedMembers()
          Replies true if at least one of the selected members is incomplete
 boolean hasMembersReferringTo(java.util.Collection<OsmPrimitive> primitives)
          Replies true if there is at least one relation member in this model which refers to at least on the primitives in primitives.
static boolean hasMembersReferringTo(java.util.Collection<RelationMember> members, java.util.Collection<OsmPrimitive> primitives)
          Replies true if there is at least one relation member given as members which refers to at least on the primitives in primitives.
 boolean hasSameMembersAs(Relation relation)
           
protected  boolean isActiveLayer()
          Replies true if the layer this model belongs to is equal to the active layer
private static boolean isBackward(RelationMember member)
           
 boolean isCellEditable(int rowIndex, int columnIndex)
           
 boolean isEditableRelation(int index)
          Replies true if the index-th relation members referrs to an editable relation, i.e.
private static boolean isForward(RelationMember member)
           
 boolean isInJosmSelection(OsmPrimitive primitive)
          Replies true if primitive is currently selected in the layer this model is attached to
static boolean isOneway(RelationMember member)
           
private  void makeLoopIfNeeded(java.util.List<WayConnectionType> con, int i)
           
 void moveDown(int[] selectedRows)
           
 void moveUp(int[] selectedRows)
           
 void nodeMoved(NodeMovedEvent event)
          A node's coordinates were modified.
 void otherDatasetChange(AbstractDatasetChangedEvent event)
          Minor dataset change, currently only changeset id changed is supported, but can be extended in future.
 void populate(Relation relation)
           
 void primitivesAdded(PrimitivesAddedEvent event)
          A bunch of primitives were added into the DataSet, or existing deleted/invisible primitives were resurrected.
 void primitivesRemoved(PrimitivesRemovedEvent event)
          A bunch of primitives were removed from the DataSet, or preexisting primitives were marked as deleted.
 void register()
           
 void relationMembersChanged(RelationMembersChangedEvent event)
          A relation's members have changed.
 void remove(int[] selectedRows)
           
 void removeMemberModelListener(IMemberModelListener listener)
           
 void removeMembersReferringTo(java.util.List<? extends OsmPrimitive> primitives)
           
(package private)  void reverse()
          Reverse the relation members.
private static WayConnectionType.Direction reverse(WayConnectionType.Direction dir)
           
private  WayConnectionType.Direction roundaboutType(int i)
          determine, if the way i is a roundabout and if yes, what type of roundabout
(package private) static WayConnectionType.Direction roundaboutType(Way w)
           
 void selectionChanged(java.util.Collection<? extends OsmPrimitive> newSelection)
          Informs the listener that the selection in the dataset has changed.
 void selectMembersReferringTo(java.util.Collection<? extends OsmPrimitive> primitives)
          Selects all mebers which refer to OsmPrimitives in the collections primitmives.
 void setSelectedMembers(java.util.Collection<RelationMember> selectedMembers)
          Selects the members in the collection selectedMembers
 void setSelectedMembersIdx(java.util.Collection<java.lang.Integer> selectedIndices)
          Selects the members in the collection selectedIndices
 void setValueAt(java.lang.Object value, int rowIndex, int columnIndex)
           
(package private)  void sort()
          Sort the selected relation members by the way they are linked.
private  java.util.List<RelationMember> sortMembers(java.util.List<RelationMember> relationMembers)
          get a node we can link against when sorting members
 void tableChanged(javax.swing.event.TableModelEvent e)
           
 void tagsChanged(TagsChangedEvent event)
          There was some change in the tag set of a primitive.
 void unregister()
           
 void updateLinks()
          refresh the cache of member WayConnectionTypes
 void updateRole(int[] idx, java.lang.String role)
          updates the role of the members given by the indices in idx
 void wayNodesChanged(WayNodesChangedEvent event)
          A way's node list was changed.
 
Methods inherited from class javax.swing.table.AbstractTableModel
addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getColumnClass, getColumnName, getListeners, getTableModelListeners, removeTableModelListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface javax.swing.table.TableModel
addTableModelListener, getColumnClass, getColumnName, removeTableModelListener
 

Field Detail

members

private java.util.List<RelationMember> members
data of the table model: The list of members and the cached WayConnectionType of each member.


connectionType

private java.util.List<WayConnectionType> connectionType

listSelectionModel

private javax.swing.DefaultListSelectionModel listSelectionModel

listeners

private java.util.concurrent.CopyOnWriteArrayList<IMemberModelListener> listeners

layer

private OsmDataLayer layer

UNCONNECTED

private final int UNCONNECTED
See Also:
Constant Field Values

firstGroupIdx

int firstGroupIdx

lastForwardWay

int lastForwardWay

lastBackwardWay

int lastBackwardWay

onewayBeginning

boolean onewayBeginning
Constructor Detail

MemberTableModel

public MemberTableModel(OsmDataLayer layer)
constructor

Method Detail

getLayer

public OsmDataLayer getLayer()

register

public void register()

unregister

public void unregister()

selectionChanged

public void selectionChanged(java.util.Collection<? extends OsmPrimitive> newSelection)
Description copied from interface: SelectionChangedListener
Informs the listener that the selection in the dataset has changed.

Specified by:
selectionChanged in interface SelectionChangedListener
Parameters:
newSelection - The new selection.

dataChanged

public void dataChanged(DataChangedEvent event)
Description copied from interface: DataSetListener
Called after big changes in dataset. Usually other events are stopped using Dataset.beginUpdate() and after operation is completed (Dataset.endUpdate()), #dataChanged() is called.

Specified by:
dataChanged in interface DataSetListener

nodeMoved

public void nodeMoved(NodeMovedEvent event)
Description copied from interface: DataSetListener
A node's coordinates were modified.

Specified by:
nodeMoved in interface DataSetListener

primitivesAdded

public void primitivesAdded(PrimitivesAddedEvent event)
Description copied from interface: DataSetListener
A bunch of primitives were added into the DataSet, or existing deleted/invisible primitives were resurrected.

Specified by:
primitivesAdded in interface DataSetListener

primitivesRemoved

public void primitivesRemoved(PrimitivesRemovedEvent event)
Description copied from interface: DataSetListener
A bunch of primitives were removed from the DataSet, or preexisting primitives were marked as deleted.

Specified by:
primitivesRemoved in interface DataSetListener

relationMembersChanged

public void relationMembersChanged(RelationMembersChangedEvent event)
Description copied from interface: DataSetListener
A relation's members have changed.

Specified by:
relationMembersChanged in interface DataSetListener

tagsChanged

public void tagsChanged(TagsChangedEvent event)
Description copied from interface: DataSetListener
There was some change in the tag set of a primitive. It can have been a tag addition, tag removal or change in tag value.

Specified by:
tagsChanged in interface DataSetListener

wayNodesChanged

public void wayNodesChanged(WayNodesChangedEvent event)
Description copied from interface: DataSetListener
A way's node list was changed.

Specified by:
wayNodesChanged in interface DataSetListener

otherDatasetChange

public void otherDatasetChange(AbstractDatasetChangedEvent event)
Description copied from interface: DataSetListener
Minor dataset change, currently only changeset id changed is supported, but can be extended in future.

Specified by:
otherDatasetChange in interface DataSetListener

addMemberModelListener

public void addMemberModelListener(IMemberModelListener listener)

removeMemberModelListener

public void removeMemberModelListener(IMemberModelListener listener)

fireMakeMemberVisible

protected void fireMakeMemberVisible(int index)

populate

public void populate(Relation relation)

getColumnCount

public int getColumnCount()
Specified by:
getColumnCount in interface javax.swing.table.TableModel

getRowCount

public int getRowCount()
Specified by:
getRowCount in interface javax.swing.table.TableModel

getValueAt

public java.lang.Object getValueAt(int rowIndex,
                                   int columnIndex)
Specified by:
getValueAt in interface javax.swing.table.TableModel

isCellEditable

public boolean isCellEditable(int rowIndex,
                              int columnIndex)
Specified by:
isCellEditable in interface javax.swing.table.TableModel
Overrides:
isCellEditable in class javax.swing.table.AbstractTableModel

setValueAt

public void setValueAt(java.lang.Object value,
                       int rowIndex,
                       int columnIndex)
Specified by:
setValueAt in interface javax.swing.table.TableModel
Overrides:
setValueAt in class javax.swing.table.AbstractTableModel

getReferredPrimitive

public OsmPrimitive getReferredPrimitive(int idx)
Specified by:
getReferredPrimitive in interface OsmPrimitivesTableModel

moveUp

public void moveUp(int[] selectedRows)

moveDown

public void moveDown(int[] selectedRows)

remove

public void remove(int[] selectedRows)

canMoveUp

public boolean canMoveUp(int[] rows)

canMoveDown

public boolean canMoveDown(int[] rows)

canRemove

public boolean canRemove(int[] rows)

getSelectionModel

public javax.swing.DefaultListSelectionModel getSelectionModel()

removeMembersReferringTo

public void removeMembersReferringTo(java.util.List<? extends OsmPrimitive> primitives)

applyToRelation

public void applyToRelation(Relation relation)

hasSameMembersAs

public boolean hasSameMembersAs(Relation relation)

getIncompleteMemberPrimitives

public java.util.Set<OsmPrimitive> getIncompleteMemberPrimitives()
Replies the set of incomplete primitives

Returns:
the set of incomplete primitives

getSelectedIncompleteMemberPrimitives

public java.util.Set<OsmPrimitive> getSelectedIncompleteMemberPrimitives()
Replies the set of selected incomplete primitives

Returns:
the set of selected incomplete primitives

hasIncompleteMembers

public boolean hasIncompleteMembers()
Replies true if at least one the relation members is incomplete

Returns:
true if at least one the relation members is incomplete

hasIncompleteSelectedMembers

public boolean hasIncompleteSelectedMembers()
Replies true if at least one of the selected members is incomplete

Returns:
true if at least one of the selected members is incomplete

getSelectedIndices

protected java.util.List<java.lang.Integer> getSelectedIndices()

addMembersAtIndex

private void addMembersAtIndex(java.util.List<? extends OsmPrimitive> primitives,
                               int index)

addMembersAtBeginning

public void addMembersAtBeginning(java.util.List<? extends OsmPrimitive> primitives)

addMembersAtEnd

public void addMembersAtEnd(java.util.List<? extends OsmPrimitive> primitives)

addMembersBeforeIdx

public void addMembersBeforeIdx(java.util.List<? extends OsmPrimitive> primitives,
                                int idx)

addMembersAfterIdx

public void addMembersAfterIdx(java.util.List<? extends OsmPrimitive> primitives,
                               int idx)

getNumMembersWithPrimitive

public int getNumMembersWithPrimitive(OsmPrimitive primitive)
Replies the number of members which refer to a particular primitive

Parameters:
primitive - the primitive
Returns:
the number of members which refer to a particular primitive

updateRole

public void updateRole(int[] idx,
                       java.lang.String role)
updates the role of the members given by the indices in idx

Parameters:
idx - the array of indices
role - the new role

getSelectedMembers

public java.util.Collection<RelationMember> getSelectedMembers()
Get the currently selected relation members

Returns:
a collection with the currently selected relation members

getSelectedChildPrimitives

public java.util.Collection<OsmPrimitive> getSelectedChildPrimitives()
Replies the set of selected referers. Never null, but may be empty.

Returns:
the set of selected referers

getChildPrimitives

public java.util.Set<OsmPrimitive> getChildPrimitives(java.util.Collection<? extends OsmPrimitive> referenceSet)
Replies the set of selected referers. Never null, but may be empty.

Returns:
the set of selected referers

setSelectedMembers

public void setSelectedMembers(java.util.Collection<RelationMember> selectedMembers)
Selects the members in the collection selectedMembers

Parameters:
selectedMembers - the collection of selected members

setSelectedMembersIdx

public void setSelectedMembersIdx(java.util.Collection<java.lang.Integer> selectedIndices)
Selects the members in the collection selectedIndices

Parameters:
selectedIndices - the collection of selected member indices

isEditableRelation

public boolean isEditableRelation(int index)
Replies true if the index-th relation members referrs to an editable relation, i.e. a relation which is not incomplete.

Parameters:
index - the index
Returns:
true, if the index-th relation members referrs to an editable relation, i.e. a relation which is not incomplete

hasMembersReferringTo

public static boolean hasMembersReferringTo(java.util.Collection<RelationMember> members,
                                            java.util.Collection<OsmPrimitive> primitives)
Replies true if there is at least one relation member given as members which refers to at least on the primitives in primitives.

Parameters:
members - the members
primitives - the collection of primitives
Returns:
true if there is at least one relation member in this model which refers to at least on the primitives in primitives; false otherwise

hasMembersReferringTo

public boolean hasMembersReferringTo(java.util.Collection<OsmPrimitive> primitives)
Replies true if there is at least one relation member in this model which refers to at least on the primitives in primitives.

Parameters:
primitives - the collection of primitives
Returns:
true if there is at least one relation member in this model which refers to at least on the primitives in primitives; false otherwise

selectMembersReferringTo

public void selectMembersReferringTo(java.util.Collection<? extends OsmPrimitive> primitives)
Selects all mebers which refer to OsmPrimitives in the collections primitmives. Does nothing is primitives is null.

Parameters:
primitives - the collection of primitives

isInJosmSelection

public boolean isInJosmSelection(OsmPrimitive primitive)
Replies true if primitive is currently selected in the layer this model is attached to

Parameters:
primitive - the primitive
Returns:
true if primitive is currently selected in the layer this model is attached to, false otherwise

isActiveLayer

protected boolean isActiveLayer()
Replies true if the layer this model belongs to is equal to the active layer

Returns:
true if the layer this model belongs to is equal to the active layer

sortMembers

private java.util.List<RelationMember> sortMembers(java.util.List<RelationMember> relationMembers)
get a node we can link against when sorting members

Parameters:
element - the element we want to link against
linked_element - already linked against element
Returns:
the unlinked node if element is a way, the node itself if element is a node, null otherwise

sort

void sort()
Sort the selected relation members by the way they are linked.


determineDirection

private WayConnectionType.Direction determineDirection(int ref_i,
                                                       WayConnectionType.Direction ref_direction,
                                                       int k)

determineDirection

private WayConnectionType.Direction determineDirection(int ref_i,
                                                       WayConnectionType.Direction ref_direction,
                                                       int k,
                                                       boolean reversed)
Determines the direction of way k with respect to the way ref_i. The way ref_i is assumed to have the direction ref_direction and to be the predecessor of k. If both ways are not linked in any way, NONE is returned. Else the direction is given as follows: Let the relation be a route of oneway streets, and someone travels them in the given order. Direction is FORWARD if it is legal and BACKWARD if it is illegal to do so for the given way.


roundaboutType

private WayConnectionType.Direction roundaboutType(int i)
determine, if the way i is a roundabout and if yes, what type of roundabout


roundaboutType

static WayConnectionType.Direction roundaboutType(Way w)

getWayConnection

WayConnectionType getWayConnection(int i)

tableChanged

public void tableChanged(javax.swing.event.TableModelEvent e)
Specified by:
tableChanged in interface javax.swing.event.TableModelListener

reverse

void reverse()
Reverse the relation members.


updateLinks

public void updateLinks()
refresh the cache of member WayConnectionTypes


reverse

private static WayConnectionType.Direction reverse(WayConnectionType.Direction dir)

isBackward

private static boolean isBackward(RelationMember member)

isForward

private static boolean isForward(RelationMember member)

isOneway

public static boolean isOneway(RelationMember member)

makeLoopIfNeeded

private void makeLoopIfNeeded(java.util.List<WayConnectionType> con,
                              int i)

determineDirectionOfFirst

private WayConnectionType.Direction determineDirectionOfFirst(int i,
                                                              RelationMember m)

determineOnewayConnectionType

private WayConnectionType determineOnewayConnectionType(java.util.List<WayConnectionType> con,
                                                        RelationMember m,
                                                        int i,
                                                        WayConnectionType wct)


JOSM