1. Overview
1.1 Connects a connector to a shape boundary
A straight line and polyline can be a connector which connects two shape objects.
If an endpoint of a connector is moved toward a shape's boundary by the mouse drag,
then then a red/blue mark will be displayed on the shape's boundary (Figure 1.1).
And if the mouse button is released while the red/blue mark is displayed,
then the connector will be connected to the shape's boundary very accurately.
The connection point (the red/blue mark) is represented by the Connection object
which consists of the fields specifying the connector and the target shapes,
and the two curve parameters representing the connection point.
If the target shape is moved/resized or modified in the MoveResizeShapeLS
or ModifyShapeLS object,
then the connector manager (ConnectionUtil) moves the endpoints (connection points)
of the connectors by referring the data of the Connection object
and maintains the connections with the target shapes .
=>
Connecting a connector in MoveResizeShapeLS,
ConnectionLS Overview,
User's guide Connector
One of the features of this application is that the connector can be connected
to an arbitrary point on the a shape's boundary, and any number of connectors can be connected to the shape's boundary
as shown in the Figure 1.1.
Figure 1.1 Sample drawing
1.2 Maintaining the connection
If a shape connected with connectors is moved or resized, then the connector manager
(ConnectionUtil) moves the endpoints of the connectors
to maintain the connections with the target shape (Figure 1.2,
1.3).
Figure 1.2 Maintaining the connection with the target shape.
The selected arrow-like-polygon was moved to the upper left from the initial
position in Figure 1.1.
The small red marks represent the connection points.
Figure_(a) |
Figure_(b) |
Figure_(c) |
Figure (d) |
Figure 1.3 Maintaining the connection with the shape.
When the "keyboard" box is moved in Figure_(a), the connections (red marks)
with the two solid lines are maitained and also the connections (pink marks)
between the solid lines and the dotted lines are maintained (Figure_(b))
The set of Figure_(c) and (d) show an extreme case. The color marks
represent the depth from the root node (the shape being moved) in graph.
:
Connectors and target shapes have no information about their connection,
even if they are connected. There is no particular reason for it. An simple
reason is that the processing is possible without such information.
1.3 Auto tracking option of connectors
When the connector manager (the ConnectionUtil object) moves the endpoints of connectors, the directions and positions
of the connectors are constrained by the option (auto tracking option).
∙ free direction and free position: no constrain.
∙ keep x/y direction and position: preserves the direction of a
connector, if the connector's direction is x or y.
Figure 1.4 shows the example how the connectors' endpoints and direction
will be changed, if the rectangle is moved downward by the mouse drag (the
red marks represent connection points).
Figure 1.5 and Figure 1.6 show typical examples such as bolck diagrams, flow charts etc. The "auto
tracking option" may be very useful in these applications.
original
Moves the rectangle downward |
(a)option: free direction and free position
The connectors change their directions freely.
|
(b) option: keep x/y direction and position
The connectors don't change their directions.
|
(b) option: keep x/y direction and position
If the target shapes is moved largly, then some x/y connectors change to
polyline connectors.
|
Figure 1.4 Auto tracking option of connectors
Original
|
If the top rectangle is moved upward, then the line connector changes it direction.
(a)option: free direction and free position
|
|
If the top rectangle is moved upward largely ,the line connector
changes to a polyline connector.
(b) option: keep x/y direction and position
|
If the vertical line is moved upward, then the line connectors connecting to the line
changes their directions.
(a)option: free direction and free position
|
|
Although the vertical line is moved upward, then the line connectors connecting to the line
doesn't changes their directions.
(b) option: keep x/y direction and position
|
Figure 1.5 Typical example of the auto tracking optionof connectors -1
Original
|
If the right rectangle is moved downward, then the line connectors change their directions.
(a)option: free direction and free position
|
|
If the right rectangle is moved downward largely,
then some line connectors change to polyline connectors.
(b) option: keep x/y direction and position
|
Figure 1.6 Typical example of the auto tracking optionof connectors - 2
1.4 Moving a connector along guide lines (curves)
This function is used to move lines in a table. The way of the processing
is similar to 1.2 with "keep x/y direction and position" option.
Moves the vertical line to the right with holding down the Ctrl key. |
The connections (red marks) can be preserved. |
|
|
Figure 1.7 The effect of the Ctrl key
2.Class Connection
return=>page top
The Connection class represents the connection information between two
shape objects (a connector shape and a target shape). The connection information
includes the link to two shape objects and the connection point between
them. The connection point is represented by the curve parameter on the
connector and the curve parameter on the target shape boundary (see=>
Parametric curve). When the target shape is moved or resized by the mouse drag, the connection
point should change its (x,y) coordinates to maintain its connection, but
the curve parameters of the connection points doesn't change in the most
simple case (auto tracking option: direction free). It is very convenient
for connector processing to represent a connection point by a curve parameter.
Field
|
Description
|
target
|
public ShapeContainer target
The target shape object
|
connector
|
public ShapeContainer connector
The connector shape object
|
targetParameter
|
public double targetParameter
The curve parameter of the connection point on the target shape boundary.
|
connectorParameter
|
public double connectorParameter
The curve parameter of the connection point on the connector.
|
Method
|
Description
|
Constructor |
public Connection(ShapeContainer connector, ShapeContainer target, double
connectorParameter, double targetParameter)
Sets the parameters to the corresponding field.
|
getTarget
|
public ShapeContainer getTarget()
Returns the target field.
|
getConnector
|
public ShapeContainer getConnector()
Returns the connector field.
|
getTargetParameter
|
public double getTargetParameter()
Returns the targetParameter field.
|
getConnectorParameter
|
public double getConnectorParameter()
Returns the connectorParameter field.
|
getTargetPT
|
public Point2D getTargetPT()
Returns the connection point on the target shape boundary.
|
getConnectorPT
|
public Point2D getConnectorPT()
Returns the connection point on the connector.
|
equalsInNormalData |
public boolean equalsInNormalData(Connection connection)
Parameters:
connection - The Connection object to be compared.
Processing:
Returns true if each field of this this object equals that of the connection parameter. |
equalsInReversedData |
public boolean equalsInReversedData(Connection connection)
Parameters:
connection - The Connection object to be compared.
Processing:
Returns true if each field of this object equals each opposite field of
the connection.
In other words, compares the connector field of this object with the target field of the connection, compares the target field of this object with the connector field of the connection, compares the connectorParameter field of this object with the targetParameter field of the connection, and finally compares the targetParameter field of this object with the connectorParameter field of the connection. |
getErrorDistance |
public double getErrorDistance()
Returns the numerical error between the connection point on the target
shape and that on the connector. |
closeToMouseHitShape |
private boolean closeToMouseHitShape(MouseHitShape mouseHitShape)
Parameters:
mouseHitShape - The MouseHitShape object
containing the mouse position and an ShapeContainer.
Returns:
Returns true, if the target shape of this object equals
the shape in the mouseHitShape and the endpoint of the connector of this object is close
to the mouse position of the mouseHitShape.
=>
The problem of connector
|
resizeConnector
|
private void resizeConnector(Point2D oldPoint, Point2D newPoint)
Parameters:
oldPoint - The current endpoint the connector.
newPoint - The new endpoint the connector.
Processing:
This method updates the endpoint of the connector from oldPoint to newPoint.
To do this, the method calls the ShapeElement.moveEndpoint method.
|
resizeTarget |
private void resizeTarget(Point2D oldPoint, Point2D newPoint)
Parameters:
oldPoint - The current endpoint the target.
newPoint - The new endpoint the target.
Processing:
This method updates the endpoint of the target (line/open polyline)
from oldPoint to newPoint. To do this, the method calls the
ShapeElement.moveEndpoint method.
|
toString
|
public String toString()
Returns the string representing this object.
|
isConnectorType
(static)
|
private static boolean isConnectorType(ShapeContainer connector)
Returns true if the shape denoted by connector has the qualification of the connector.
|
isTargetType
(static)
|
private static boolean isTargetType(ShapeContainer target)
Returns true if the shape denoted by target allows to be connected with a connector.
|
3. Class ConnectionUtil
return=>page top
This class provides the easy and macro level methods for the operation
of resizing or transforming the connectors which are connecting to the
target shape. Only the three methods - setTargets,
resizeConnectors and
end - are called when the target shape is moved or resized.
Field
|
Description
|
mousePositionInfo
|
MousePositionInfo mousePositionInfo
Sets the MousePositionInfo passed from MoveResizeShapeLS
|
selectedContainers
|
ShapeContainer[] selectedContainers
Sets the selectedContainers passed from MoveResizeShapeLS
|
auto_tracking_option |
int auto_tracking_option
Sets DrawParameters.CONNECTOR_AUTO_TRACKING_OPTION to this field. |
connected |
public boolean connected
This field becomes true if a connector is moved and succeeded to connect a shape boundary
(Moving/Resizing shape Fig. 2.1, 2.2).
|
guided |
public boolean guided
This field becomes true if a connector is moved along guide lines
(Moving/Resizing shape Fig 1.6).
|
targets |
ShapeContainer[] targets
This array is specified by the parameter of the setTargets method and stored with the target shapes to be moved/resized.
The targets[i] can be a group of shapes.
|
TargetList
|
Vector TargetList
Stores TargetContainer objects referring the
targets.
If the target[i] is a group of shapes, then decomposes it into single shapes
and sets them to new TargetContainer objects ,
otherwise sets the target[i] to a new TargetContainer object.
|
ConnectionList
|
Vector ConnectionList
Stores ConnectionContainer objects.
|
mouseHitShape |
MouseHitShape mouseHitShape
The MouseHitShape object
representing the target shape on which the mouse button is pressed. |
vector
|
Vector vector:Vector object for work.
|
Method
|
Description
|
start |
public void start(int mode, MousePositionInfo mousePositionInfo, ShapeContainer[] selectedContainers)
• Sets the arguments to the corresponding fields.
• Call the setTargets method of this class.
:
This method is implemented in order to avaid that the
MoveResizeShapeLS.init
method becomes too complicated and called from the
MoveResizeShapeLS.init method.
|
end |
public void end()
|
mouseDragged |
public void mouseDragged(MouseEvent e)
• Moves the end point of a connector(line/polyline).
Checks that the end point of a connector can be connected other shape boundary.
If it can be connected, sets the connected field true
(Moving/Resizing shape Fig. 2.1, 2.2).
• When a shape is moved, the connectors connecting to the moving shape
are transformed to keep their connections by calling the
resizeConnectors method of this class.
:
This method is implemented in order to avaid that the
MoveResizeShapeLS.mouseDragged method
becomes too complicated and called from the
MoveResizeShapeLS.mouseDragged method.
|
mouseReleased |
public void mouseReleased(MouseEvent e)
• mode=Command.MOVING_ENDPT_MODE
If the connected
field is not true, calls the
resizeConnectors method of this class.
• mode=Command.MOVE__MODE/RESIZE__MODEの
Calls the resizeConnectors method of this class unconditionally.
:
This method is implemented in order to avaid that the
MoveResizeShapeLS.mouseReleased
method becomes too complicated and called from the
MoveResizeShapeLS.mouseReleased method.
|
setTargets
|
public void setTargets(ShapeContainer[] targets)
Parameters:
targets - The target shapes to be moved or resized. The targets[i] can be a group of shapes.
Processing:
This method decomposes each of the targets to single shape
ShapeContainer objects (ShapeElement Figure 11.1 )
by the ShapeContainer.getGroupedSingleShapeContainers method
and stores them to to the targetElements.
Next, this method calls the setConnectors method
to list up the connectors which connect to the listed target shapes and registers their
ConnectionContainer objects to the
ConnectionList.
:
If the listed connectors are connected with other connectors, calls the
setConnectors method repeatedly
until the listed connectors are not connected with any other connector
(Depth, TargetList, ConnectionList)
|
setConnectors
|
private ShapeContainer[] setConnectors(int depth, ShapeContainer[] targetElements)
Parameters:
depth - The depth of targetElements from the root nodes (the target shapes of depth-0) in tree structure (Depth, TargetList, ConnectionList).
targetElements - The shape (ShapeContainer) objects to
which all the existing connectors are tested to connect or not.
Returns:
The connector (ShapeContainer) objects which connect to the targetElements.
Processing:
∙ First, this method creates a new TargetContainer object
with the parameters of the targetElements[i] and depth,
and add the TargetContainer object to the
TargetList.
∙ Next, this method calls the findConnectors method
to search connectors which connect to the targetElements .
The findConnectors method returns the Connection objects representing the connections with the targetElements. Each of the returned Connection objects is set to a new
ConnectionContainer object, and the new ConnectionContainer object is registered to the ConnectionList, if the connector in the Connection object doesn't match to the connector
in the mouseHitShape. Here the id of the new ConnectionContainer is "connector".
This matching test is done by the closeToMouseHitShape method.
∙ Finally, this method collects the connectors from the
Connection objects returned from the
findConnectors, and returns the connector.
|
findConnectors
|
private Connection[] findConnectors(ShapeContainer target)
Parameters:
target - The target shape object.
Returns:
Returns the Connection objects which represent the connections between
the target and connectors connecting to the target.
Processing:
This method is called by the setConnectors method.
This method tests for all the existing connectors whether or not the endpoints
of the each connector is lying on the boundary of the target shape within
the given error margin (1e-2 pixel).
To do this test, this method uses the Curve2DUtil.getShortestLine method. |
setGuideLines |
private void setGuideLines()
This method is called from the setTragets method.
This method finds a guide line (Figure 1.7) for each of the targets with depth-0 which are registered in the
TargetList. To find a guide line, this method calculates the shortest distance from
an endpoint of each of the targets to an existing connector by the Curve2DUtil.getShortestLine method. If the shortest distance is lower than the predefined margin,
then the guide line is found. If the guide line is found, then creates
a Connection object representing the connection between one of the targets and the
guide line. And sets Connection object to a new
ConnectionContainer object,
and registers the new ConnectionContainer object
to the ConnectionList.
Here the id of the new ConnectionContainer is "guide_line".
|
printTargerList |
private void printTargerList(String message)
Prints the TargetList. |
printConnectionList |
private void printConnectionList(String message)
Prints the ConnectionList. |
getTargets
|
private ShapeContainer[] getTargets(int depth)
Parameters:
depth - The depth of from the root nodes (the target shapes to be moved/resized)
in tree structure (Figure 3.1).
Returns:
The ShapeContainer objects which are stored in the
TargetList as
TargetContainer objects and whose depth equals the parameter depth.
|
getTargetIndex |
private int getTargetIndex(ShapeContainer target, int depth)
Parameters:
target - The target shapes (ShapeContainer objects) to be moved/resized.
depth - The depth of from the root nodes (the target shapes to be moved/resized)
in tree structure (Figure 3.1).
Returns:
Returns the index of the target of the depth in the TargetList.
|
getConnection
Containers |
private ConnectionContainer[] getConnectionContainers(String id, int depth,
ShapeContainer target, ShapeContainer connector)
Parameters:
id - The string id which is set to the ConnectionContainer. Currently, "connector" and "guide_line" are used
for id.
depth - The depth of from the root nodes (the target shapes to be moved/resized)
in tree structure.
if depth<0, then ConnectionContainer objects in any depth must be checked.
target - The ShapeContainer object which is compared with Connection.target in ConnectionContainer objects.
connector - The ShapeContainer object
which is compared with Connection.connector in
ConnectionContainer objects.
:The target or the connector can be null.
Returns:
The Connection object of the
ConnectionContainer whose target
equals target, whose connector equals connector
and the id of the ConnectionContainer equals id.
|
getConnection
Containers |
private ConnectionContainer[] getConnectionContainers(String id, ShapeContainer
target, ShapeContainer connector)
Processing:
Calls the above method as follow.
return getConnectionContainers(id, -1, target, connector);
|
getSameConnection
Container |
private int getSameConnectionContainer(ConnectionContainer connectionContainer)
paremeters:
connectionContainer - The ConnectionContainer object.
Returns:
The index of the connectionContainer in the ConnectionList.
Returns -1, if the ConnectionList
does not contain the connectionContainer.
The matching test of the connectionContainer with a ConnectionContainer object in the
ConnectionList is done by the
equalsInNormalData and
equalsInReversedData methods of the
Connection.
|
getConnectors |
public ShapeContainer[] getConnectors(String id)
Retrieves the ConnectionContainer
objects specified by id from the the ConnectionList,
gets connectors from the the ConnectionContainer objects
and returns the connectors as an array.
|
getTargetsAnd
Connectors |
public ShapeContainer[] getTargetsAndConnectors()
Returns the connectors and the target shape objects.
|
resizeConnectors
|
public void resizeConnectors(int option)
Parameters:
option - Command.FREE_DIRECTION,
KEEP_XY_DIRECTION,
KEEP_DIRECTION or
TO_NEAREST_PT
Processing:
∙ Resizes the connectors of depth n (n=1,2,...)
Gets the connectors of depth-n by the getTargets method
and resizes them by the resizeConnectors method.
: This method is called by the following methods.
∙ The mouseDragged and
mouseReleased methods of the
MoveResizeShapeLS.
∙ The mouseDragged method of the
ModifyShapeLS
|
resizeConnectors
|
private void resizeConnectors(int option, int depth, ShapeContainer[] connectors)
Parameters:
option - Command.FREE_DIRECTION, KEEP_XY_DIRECTION, KEEP_DIRECTION or TO_NEAREST_PT
depth - The depth of from the root nodes (the target shapes to be moved/resized)
in tree structure.
connectors - The connectors (ShapeContainer objects) to be resized.
Processing:
This method calls the resizeConnectorByCurveParameter,
resizeConnectorKeepingDirection or
resizeConnectorToNearestPT method of the
Connection according to the option parameter.
|
resizeConnectorBy
CurveParameterr
|
public void resizeConnectorByCurveParameter()
This method is called by the resizeConnectors method of the class.
This method is used for moving the endpoint of the connector to maintain
the connection with the target shape when the target shape is moved or
resized. The endpoint of the connector is moved under the condition that
the curve parameter (targetParameter) of the connection point shouldn't change. To move the end point of the
connector, this method calls the resizeConnector method of this class.
|
resizeConnectorTo
NearestPT
|
public void resizeConnectorToNearestPT()
This method is called by the resizeConnectors method of the class. When the target shape is largely changed, for example,
a node point of a polyline/a cubic curve is deleted, this method moves
the endpoint of the connector to the nearest point on the boundary of the
target shape. Here, the nearest point is calculated by the ShapeElement.getSamplingCurvePTs
method.
To move the end point of the connector, this method calls the resizeConnector method of this class.
:
In this method, the target shape itself is changed, so the
targetParameter must be changed
to represent a new connection point.
|
resizeConnector
KeepingDirection |
public boolean resizeConnectorKeepingDirection (ConnectionContainer connectionContainer)
Parameters:
connectionContainer - The ConnectionContainer object
that represents a connection with a target shape and a connector.
Return:
True if resizing of the connector succeeds.
If the projection point doesn't exist on the the boundary the target shape,
then resizing of the connector will fail (see the figure below). In this
care this method returns false.
Processing:
This method is called by the resizeConnectors method of the class.
This method is used to move the end point of the connector with keeping the connector's direction.
The end point of the connector is moved to lie on the extension of the
connector. So the new end point of the connector will be one of the
intersection points between the extension of the connector and the boundary
of the target shape. The intersection points are calculated by the
projectionPT method of this class using the
Curve2DUtil.getProjectionLines method.
:
In this method, the target shape itself is changed, so the
targetParameter must be changed to represent a new connection point..
|
projectionPT |
private CurvePT[] projectionPT(Point2D p, Vector2D vec, Curve2D targetCurve)
Parameters:
p - The point.
vec - The projection vector.
targetCurve - The boundary curve of the target shape.
Returns:
The CurvePT objects
which represent the projection points of the p on the targetCurve.
Processing:
Calculates the projection points by the
Curve2DUtil.getProjectionLines method.
|
selectCurvePT |
private CurvePT selectCurvePT(ConnectionContainer connectionContainer,
CurvePT[] curvePTs)
Parameters:
connectionContainer - The ConnectionContainer object of a connection with a target shape and a connector.
curvePTs - The returned values of the projectionPT method.
Returns::
The selected CurvePT object.
Processing:
Returns the nearest curvePT object to the p along vec direction in the above figure.
|
isChangable |
private boolean isChangable(ShapeContainer connector)
<Parameters:
connector - The connector.
Returns::
Returns true if the line connector (connector) can be changed to a polyline conenctor,
or if the polyline connector (connector) can be changed to a line conenctor.
<Processing:
Judges tru/false as follows.
∙ The connector that is originally a polyline can't be changed to a line
connector.
∙ A x/y line connector can be changed to a polyline connector.
∙ The polyline connector that was changed from a line connector can be
changed to a line connector.
(a) Original
Moves the ellipse downward. |
(b) The line connector is changed to a polyline connector. |
(c) Moves the ellipse upward, then the polyline connector returns to a
line connector. |
(c) Moves the ellipse upward largely, then the line connector is changed
to a polyline connector again.
|
|
changeToPolyline
Connector |
private void changeToPolylineConnector(ConnectionContainer connectionContainer)
Parameters:
connectionContainer - The ConnectionContainer object.
Processing:
Changes the line connector in the connectionContainer to a polyline connector.
|
changeToLineConnector |
private void changeToLineConnector(ConnectionContainer connectionContainer,
CurvePT curvePT)
Parameters:
connectionContainer - The ConnectionContainer object.
curvePT - See the figure below.
Processing:
Changes the polyline connector in the connectionContainer to a line connector.
Draws the dotted line from the polyline segment and calculates the intersection (projection)
point (curvePT) by the projectionPT and selectCurvePT methods. |
Changes the polyline connector to the line connector that connects the
round rectangle and the curvePT on the ellipse. |
|
resizeTargetsBy
GuideLines |
public boolean resizeTargetsByGuideLines()
Return:
Returns true if the targets were moved and resized along guide lines.
Processing:
Move and resize the targets of depth-0 in the TargetList along guide lines
by the Connection.resizeTargetKeepingDirection method.
|
resizeTarget
KeepingDirection |
public boolean resizeTargetKeepingDirection(ConnectionContainer connectionContainer)
Parameters:
connectionContainer - The ConnectionContainer object
that represents a connection with a target shape and a connector.
Return:
True if resizing of the target succeeds.
If the projection point doesn't exist on the the boundary the connector,
then resizing of the target will fail. In this care, this method returns false.
Processing:
Performs the same processing as the above method
for the target shape. To resize the target shape, calls the resizeTarget method. |
selectCurvePT |
private CurvePT selectCurvePT(Point2D p, Vector2D vec, CurvePT[] curvePTs)
Parameters:
p - The reference point to be used to select a CurvePT object.
vec - The direction vector which shows the direction of a line connector or
a polyline connector.
curvePTs - The points on the target curve.
Returns:
The selected CurvePT object.
Processing:
Calculates the distances from p to curvePTs(projection points) in the direction specified by the
vec and selects the minimum distance and the curvePT which achieves the minimum
distance.
This method is slightly different from the selectCurvePT method mentioned above.
=> The figure in projectionPT. |
end
|
public void end()
Terminates resizing or transforming connectors.
|
isXOrYvector |
private int isXOrYvector(Vector2D vec)
Returns:
If the vec is a x/y direction vector, then returns 1/2 respectively, otherwise returns 0.
|
drawMark |
private void drawMark(String id, String message, int depth, Connection connection)
This method draws a color mark at the point specified by the parameter.
Drawing is done by the DrawShapeUtil.drawTempShape.
|
drawMarks
|
private void drawMarks(String id, String message)
This method draws color marks at the points specified by the Connection
objects in the ConnectionList.
Drawing is done by the DrawShapeUtil.drawTempShape.
|
clearMark
|
private void clearMark()
Clears the all marks. |
moveResize
(static)
|
public void resizeContainer(ShapeContainer container, Rectangle2D oldBox,
Rectangle2D newBox, boolean keepConnection, boolean undoSetup)
Parameters:
container - The ShapeContainer object to be resized.
oldBox - The rectangle object before resized.
newBox - The rectangle object after resized.
keepConnection - If true, then keeps the connection with connectors.
undoSetup - If true, then sets the undo setup for the container and the connector.
Processing:
Resizes the container so that the oldBox is transformed to the newBox.
This method calls the ShapeElement.moveResize method.
If the size of the oldBox is equal to the size of the newBox,
then resize means move.
:
This method is used to resize the ShapeContainer
without using the mouse drag.
|
moveEndPoint
(static)
|
public static void moveEndPoint(ShapeContainer container, int movePtIndex,
Point2D oldPoint, Point2D currentPoint, boolean keepConnection, boolean
undoSetting)
Parameters:
container - The ShapeContainer object which endpoint is moved
movingPtIndex - If the movingPtIndexequals 0, move the start point, otherwise move the end point.
oldPoint - The old point of the moving point.
currentPoint - The current point of the moving point.
keepConnection - If true, then keeps the connection with connectors.
undoSetup - If true, then sets the undo setup for the container and the connector.
Processing:
Move the end point of a line or a polyline. This method calls
the ShapeElement.moveEndPoint.
:
This method is used to move a endpoint without using the mouse drag.
|
:
Depth, TargetList, ConnectionList
The figure below shows the case when the NW(North West) resize handle of
the Round rectangle-1 is moved to upper right for resizing. The color marks
shows the connection points which will be affected by resizing the
Round rectangle-1 and their colors show the depths from the Round rectangle-1
in graph (tree structure). The depths are also defined on the connectors
which will be affected by the resizing operation (see the list below).
Initial state |
Moving the NW resize mark to upper right direction. |
図3.1 Depth, TargetList, ConnectionList |
TargetListとConnectionList
* TargetList
-- target=Round_Rectangle(No-1), depth=0
-- target=Line(No-2), depth=1
-- target=Line(No-3), depth=1
-- target=Line(No-4), depth=1
-- target=Line(No-5), depth=1
-- target=Line(No-6), depth=1
-- target=Line(No-5), depth=2
-- target=Line(No-6), depth=2
-- target=Line(No-7), depth=2
-- target=Line(No-8), depth=2
-- target=Line(No-9), depth=3
-- target=Line(No-10), depth=3
-- target=Line(No-11), depth=4
* ConnectiontList
-- connection[0]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-2),
targetP=0.069, connectorP=0.0
-- connection[1]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-2),
targetP=4.931, connectorP=1.0
-- connection[2]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-3),
targetP=0.265, connectorP=0.0
-- connection[3]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-3),
targetP=4.735, connectorP=1.0
-- connection[4]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-4),
targetP=0.998, connectorP=0.0
-- connection[5]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-4),
targetP=4.002, connectorP=1.0
-- connection[6]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-5),
targetP=6.711, connectorP=0.0
-- connection[7]: depth=0, target=Round_Rectangle(No-1), connector=Line(No-6),
targetP=6.262, connectorP=0.0
-- connection[8]: depth=1, target=Line(No-2), connector=Line(No-5), targetP=0.342,
connectorP=1.0
-- connection[9]: depth=1, target=Line(No-2), connector=Line(No-6), targetP=0.679,
connectorP=1.0
-- connection[10]: depth=1, target=Line(No-3), connector=Line(No-7), targetP=0.289,
connectorP=0.0
-- connection[11]: depth=1, target=Line(No-3), connector=Line(No-8), targetP=0.727,
connectorP=0.0
-- connection[12]: depth=2, target=Line(No-7), connector=Line(No-9), targetP=0.275,
connectorP=0.0
-- connection[13]: depth=2, target=Line(No-7), connector=Line(No-10), targetP=0.784,
connectorP=0.0
-- connection[14]: depth=2, target=Line(No-8), connector=Line(No-9), targetP=0.275,
connectorP=1.0
-- connection[15]: depth=2, target=Line(No-8), connector=Line(No-10), targetP=0.784,
connectorP=1.0
*) The targetP and connectorP represent the line/curve parameters on target and connector of the connection point. |
:
Problem of connector
We make a polygon with four straight lines connecting their endpoints (Figure(a)).
When we select one of the lines and move a end point of the selected line,
we can't disconnect the selected line from others because the other line
tries to maintain its connection as a connector (Figure_(b)). While in
the case of Figure_(c), we can easily disconnect the selected line from
others (Figure (d)).
On the other hand, if a line is connected to a closed shape, it is easy
to disconnect the line from the closed shape by moving the endpoint of
the line. From the point of view of operation, it is natural that the selected
line can be disconnected from other shape by moving its endpoint.
Figure_(a)
Four lines connecting the endpoints.
|
Figure_(b)
Select the lower line and move its left side endpoint to upper,
then the left side line automatically move its endpoint as a connector.
Consequently the selected line can't be disconnect from others.
|
Figure_(c)
Two lines connected to other lines at the endpoints.
|
Figure (d)
Select the left side line and move its upper side endpoint to lower left,
then the selected line can be disconnected from the upper line.
|
4. Class TargetContainer
return=>page top
This object stores the ShapeContainer object with the depth.
Field
|
Description
|
depth
|
int depth
The depth of from the root nodes (the target shapes to be moved/resized) in tree structure.
|
container |
ShapeContainer container
The ShapeContainer object. |
Method
|
Description
|
Constructor |
public TargetContainer(int depth, ShapeContainer container)
Sets the parameters to the corresponding field.
|
getDepth
|
public int getDepth()
Returns the depth.
|
getContainer
|
public ShapeContainer getContainer()
Returns the container.
|
5. Class ConnectionContainer
return=>page top
This object stores the Connection object with its auxiliary information.
The field variable of the connection will be changed, because a Line connector
may be changed into a polyline connector or the polyline connector
may be changed into the Line connector in the resizing process (see=>
changeToPolylineConnector, changeToLineConnector methods). On the other hand the field variable of the initConnection
stores the initial state of the connector and won't be changed.
Field
|
Description
|
id |
String id
The string identifier. currently, "connector" and "guide_line" are assigned.
|
depth
|
int depth
The depth of from the root nodes (the target shapes to be moved/resized) in tree structure.
|
connection |
Connection connection
The Connectionn object |
initConnection |
Connection initConnection
The Connection object which represents the connection at the start of moving/resizing target
shapes. |
Method
|
Description
|
Constructor |
public ConnectionContainer(String id, int depth, Connection connection)
Set the parameters to the corresponding fiels.
Set the clone of the connection to the initConnection. |
getId |
public String getId()
Returns the id. |
getDepth |
public int getDepth()
Returns the depth. |
getConnection |
public Connection getConnection()
Returns the connection. |
getInitConnection |
public Connection getInitConnection()
Returns the initialConnection. |
toString |
public String toString()
Return the string reperesenting this object.
|
|