1. Overview 
1.1 The cursor marks 
Figure 1.1 shows the cursor marks. When the mouse pointer is located on
a resize handle or a selection box, then the corresponding cursor mark
is displayed. The point to notice here is that the crosshair cursor is
displayed on the endpoints of a line or polyline (Figure_(b), (c)). The
endpoint of the line or polyline can be moved by dragging it with the crosshair
cursor (Figure 1.2(a), Figure 1.2(b)). 
 
  
    
        
      Figure_(a) | 
     
    
      Cursor marks:  
				  | 
     
    
         
      Figure_(b) | 
         
      Figure_(c) | 
     
    
      |  Figure 1.1. Selection box, resize handles, and cursor marks. | 
     
  
 
  
1.2 Moving/resizing shapes 
⋅ A straight line 
A selection box is not displayed for a selected straight line
(Figure 1.2(a)). To move the line in parallel, drag a point on the line with the move cursor 
( ). To resize the line or move the endpoint, drag the end point with the crosshair cursor
( , 
Figure 1.2(a)). 
 
⋅ A polyline 
To move a polyline, drag the selection box or a point on the polyline (Figure 1.2(b)). In addition, to move a endpoint of a polyline, move the endpoint
with the crosshair cursor (Figure 1.2(b)).
The Figure 1.2(c) shows various cases of moving the end point of a polyline.  
The point to notice here is that if a line segment of the polyline
is horizontal or vertical, then  it will stay horizontal
or vertical after the endpoint is moved (Figure 1.2(c)). 
This feature is important for a connector, because a connector is normally
composed by horizontal and vertical lines. 
 
⋅ A closed shape 
To move a closed, drag the selection box or a point on the boundary of a closed shape.
To resize a close shape, darg the resize handle (Figure 1.2(d)) 
  
    
         
      (a) Move in parallel with the move cursor | 
         
      (b) Move the endpoint with the crosshair cursor | 
     
  
 
  Figure 1.2(a) Moving a straight line. 
 
  
    
         
      Move in parallel with the move cursor | 
         
      Move the endpoint with the crosshair cursor | 
     
  
 
 Figure 1.2(b) Moving a polyline 
 
	
  
    
         
      An original polyline | 
         
      Moves the end point rightward  
      with the crosshair cursor | 
     
    
         
      Moves the end point leftward  
      with the crosshair cursor | 
         
      Moves the end point upward  
      with the crosshair cursor | 
     
  
 
  Figure 1.2(c) Moving the endpoint of a polyline to various directions.
  
  
    
         
      Resize the polyline by dragging the NE resize habdle. | 
     
    
         
      Resize the ellipse by dragging the N resize habdle. | 
     
  
 
	 
  Figure 1.2(d) Resizing a closed shape by dragging the resize handle.
 
1.3 The operation with holding down the Shift, Ctrl or Alt key 
  
    
      | Operation | 
      Description | 
     
    
      | Moving a shape | 
      
       Drag a selection box with holding down the Shift or Ctrl key, then
      a shape will be moved horizontally or vertically. 
      Drag a connector (line or polyline) with holding down the Ctrl/Shift key 
			and if the connector is connected to guide lines/curves at the endpoints, 
			then the endpoints of the connector will be moved along the guide lines/curves 
			(Figure 1.3). This function is used to move lines in a table. 
       | 
     
    
      | Moving a endpoint of a line or polyline | 
      Drag a endpoint with holding down the Shift or Ctrl key, then the endpoint
      will be moved horizontally or vertically. | 
     
    
      | Resizing a shape | 
      Drag the NW, SW, SE or NE resize handle with holding
      down the Shift or Ctrl key, and then a shape will be resized with keeping
      its wide to height ratio. 
      Drag the NW, SW, SE or NE  resize handle with holding
      down the Alt key, then a shape will be resized to fit a square rectangle.
       | 
     
  
 
 
  
    
        
      Moves the vertical line to the right  
      with holding down the Ctrl/Shift key. | 
        
      The connections (red marks)  
      can be preserved.  | 
     
    
         | 
         | 
     
  
 
Figure 1.3 The effect of the Ctrl/Shfit key 
 
  
1.4 Auto align  
The auto_align function automatically executes the same operation
as the "align objects" command while a shape is moved or
resized. For example, Figure 1.4(a) shows the diagram whose components are
not aligned.   
 =>
User's guide  align objects 
 
	
	  
Figure 1.4(a) Sample drawing: block diagram. 
 
 
First we move the "Keyboard" box upward. If the "Keyboard"
box is aligned with a neighboring object within a given error margin, red
dashed lines are displayed as Figure 1.4(b). In Figure 1.4(b), the "Keyboard"
box and the "Keytyped" box have the same size, therefore the
three conditions such as align_top, align_middle and align_bottom
are established at the same time and the three red dashed lines are displayed. 
If you release the mouse button at this moment, the "Keyboard"
box will be aligned with the "Keytyped" box accurately. 
To confirm the align of the two boxes, press the mouse button on the selection
box of the "Keyboard" box, then the three red dashed  lines
will be displayed again. 
 
	
	  
	Figure 1.4(b) Move the "Keyboard" box upward 
 
Next, moves the "Keytyped" box slightly to the left, then it
will aligned vertically with the "ListenerPanel" box and horizontally
with the "Keyboard" box and the red dashed lines will be displayed
horizontally and vertically as Figure 1.4(c). 
Release the mouse button, then "Keytyped" box will be aligned
with the "ListenerPanel" box and "Keyboard" box simultaneously.
 
 
	  
	Figure 1.4(c) Move the "Keytyped" box slightly to the left 
		Repeat the operations, then finally we get Figure 1.4(d). 
 
   
Figure 1.4(d) The completion diagram. 
  
2. Class MoveResizeShapeLS
	return=>page top 
2.1 Control flow 
(1) Moving/Resizing a shape 
 
(2) Connecting a connector 
  
    
      | 
       Step 
       | 
      Description | 
     
    
      | Step1 Displaying a connection point | 
      Drag the endpoint of a selected line/polyline and move the endpoint to
      a target shape, then the red or blue mark will be displayed on the boundary
      of the target shape. Here the mark is showing a expected connection point. 
      To do this processing, the mouseDragged method of this class calls the ConnectionLS.drawMouseHitPT method which displays the connection point if the endpoint is close enough
      to the target shape. 
       => User's guide Connector, Figure 2.1, 2.2 | 
     
    
      Step2 connecting a connector to a target 
       | 
      If the ConnectionLS.drawMouseHitPT method returns a connection point,  the mouseDragged method moves the connector's endpoint to the connection point by the ShapeElement.moveEndPoint method. The connection point is calculated very acculately, so the connector's
      endpoint lies on the shape boundary within round-off error. | 
     
  
 
 : 
More detailed description =>Connector, ConnectionLS 
  
 Figure 2.1 Connecting a line(connector) to a shape boundary. 
  
 Figure 2.2 Connecting the line(connector) to a corner (junction/terminal) point. 
 
(3) Maintaining the connection with a target shape 
When the target shape is moved or resized, the connectors connecting to the target shape are transformed
and maintains the connections with the target shape. Even if the target
shape belongs to a group, the connection must be maintained. 
 => 
User's guide Connector 
 
  
    
      | 
       Step
        | 
      Description | 
     
    
      | Step1 Initial set | 
      The start method of this class calls the 
				setTargets method of the 
				ConnectionUtil 
				ich creates the list of the target shapes to be move or resized and
      the connectors which connect to the target shapes. | 
     
    
      | Step2 Resizing the connector | 
      While the target shapes is moved/resized by dragging, the 
				mouseDragged method of this class calls the 
				resizeConnectors method of the 
				ConnectionUtil 
				which moves the endpoints of the connectors and maintains the connections with the target shapes. | 
     
    
      | Step3 Post process | 
      When the mouse button is released, the mouseReleased method calls the end method of the ConnectionUtil for post processing. | 
     
  
 
  : More detailed description =>
 Connector Maintaining the connections 
   
  
    
         
      (a) original | 
         
      (b) moves "keyboad" box to the left. | 
     
    
         
      (c) moves "keyTyped" box downward. | 
         
      (d) moves "InputMethodTextChanged"  
      and "keyTyped" boxes upward. | 
     
  
 
Figure 2.3 Maintaining the connection 
Color marks represent the connection points between the shapes being moved
and the connectors
  
(4) Moving a line or polyline along guide lines or curves (Figure 1.3) 
This function is achieved by calling the 
	setTargets method of the 
	ConnectionUtil (see (3)) for preparation, and calls the 
	resizeTargetsByGuideLines method of the 
	ConnectionUtil in the 
	mouseDragged method of this class. 
  
2.2 MoveResizeShapeLS API
	return=>page top 
 public class MoveResizeShapeLS implements MouseListener, MouseMotionListener 
 
  
    
      | 
       Method 
       | 
      
       Description 
       | 
     
    
      | start | 
      public void start(MousePositionInfo info, MouseEvent e),/p>
       Parameters: 
      info - MousePositionInfo data when a mouse is pressed on a selected shape to move or resize the
          selected shape. 
      e - The MouseEvent object which is obtained in the 
				SelectionLS.mousePressed method. 
      Processing: 
            This method is called from the 
				SelectionLS.prepareMoveResizeCommand via the 
				ExecCommand.exec method. 
				The ExecCommand.exec method 
				creates a new MoveResizeShapeLS object and calls this method. 
      ⋅ Registers this object (MoveResizeShapeLS) to the 
			ListenerPanel as a MouseListener 
			and MouseMotionListener, and stops the SelectionLS object 
			by calling the SelectionLS.end method. 
      ⋅ Calls the init method of this class. 
      ⋅ Calls the undoSetupStart method of the 
			ContainerManager  
       | 
     
    
      | init | 
      
      public void init(MouseEvent e) 
      Parameters: The same parameter as the start method 
      Processing: 
      This method does the initial setting before the mouse is dragged. 
      ⋅ Sets the MousePositionInfo object to the 
			mousePositionInfo. 
      The MousePositionInfo is given by the 
				MousePositionLS.getMousePositionInfoForMoveResize method. 
      ⋅ Sets the mode using the data in the parameter of the mousePositionInfo. 
      ⋅ Sets the selected shapes to the 
			selectedContainers. 
      Gets the selected shapes by using the 
				ContainerManager.getSelectedContainers method 
				and stores them to the field of the selectedContainers.  
      If the mode equals MOVE_ENDPT, the operation is allowed only for lines, open polylines
      and open curves. This check is performed by the 
			isSuitableForMoveEndPT method. 
      ⋅ Calls the ConnectionUtil.setTargets method. 
      The setTargets method creates the list of the target shapes to be move/resized, and the
      list of the connectors which connect to the target shapes. 
       =>Control flow Connecting a connector 
      Sets the values to the startBox, 
			newBox, oldBox etc. 
      ⋅ Initial setting to the ShapeElement. 
      Calls the ShapeElement.mouseStart method. 
      ⋅ Sets auto_align 
      If the DrawParameters.AUTO_ALIGN is true, 
				then this method calls the folowing methods. 
      ・Calls the AutoAlign.start method to set  
				AUTO_ALIGN. 
      ・Call the ConnectionUtil.start method 
			to carry out the connector related initial setting (
				2.1 (2), 2.1 (3)). 
       | 
     
    
      | end | 
      public void end() 
      ⋅ Removes this object from the ListenerPanel and calls the 
			SelectionLS.start method.  
      ⋅ Calls the ConnectionUtil.end method. 
      ⋅ Calls the undoSetupEnd method of the ContainerManager. | 
     
    
      isSuitableFor 
      MoveEndPT | 
      public boolean isSuitableForMoveEndPT(ShapeContainer container) 
      Returns true if the shape specified by the container is suitable for moving its endpoint.  
      The endpoint of a line, open polyline or open cubic curve can be moved. | 
     
    
      | mousePressed | 
      
      public void mousePressed(MouseEvent e) 
      This method isn't called because the SelectionLS.mousePressed method already received the MouseEvent object. 
       =>Control flow Moving/Resizing a shape 
       | 
     
    
      | mouseDragged | 
      
      public void mouseDragged(MouseEvent e) 
      ⋅ Checks whether the Shift/Ctrl/Alt key is held down while dragging. 
       =>The operation with holding down the Shift, Ctrl or Alt key 
      ⋅ Executes moving or resizing the selected shapes according to the mode. 
      (a) mode=Command.MOVING_MODE 
      Calls the ShapeElement.move method. 
      (b) mode=Command.RESIZING_MODE  
      Calls the ShapeElement.resize method. 
      (c) mode=Command.MOVING_ENDPT_MODE  
      Calls the ShapeElement.moveEndPoint method. 
      ・Caslls the AutoAlign.mouseDragged and the 
			ConnectionUtil.mouseDragged methods 
			for the processings of Auto_Align and  connectors. 
       | 
     
    
      | mouseReleased | 
      
      public void mouseReleased(MouseEvent e) 
      ⋅ If the DrawParameters.AUTO_ALIGN is true, then this method performs the following. 
      This method calls the AutoAlign.ajustAlignment method to align the selected shape with a neighboring shape exactly within
      round-off error and calls the ConnectionUtil.resizeConnectors method. 
      ⋅ Calls the end method of this class for post processing. 
      ・Caslls the AutoAlign.mouseReleased and the 
			ConnectionUtil.mouseReleased methods 
			for the processings of Auto_Align and  connectors.  
       | 
     
    
      | 
       mouseMoved 
       | 
      public void mouseMoved(MouseEvent e) 
      Nothing is done. | 
     
    
      | mouseClicked | 
      public void mouseClicked(MouseEvent e) 
      Nothing is done. | 
     
    
      | mouseEntered | 
      public void mouseEntered(MouseEvent e) 
      Nothing is done. | 
     
    
      | mouseExited | 
      public void mouseExited(MouseEvent e) 
      Nothing is done. | 
     
  
 
  
 :
	The move/resize method of the ShapeElement 
Gets the mouse position code from the MousePositionInfo and determines whether the operation is moving or resizing a shape. Then
calls the corresponding method of the ShapeElement to update the shape data. 
Moving is a kind of resizing which changes only the shape position, so
for moving the shape, the ShapeElement.resize method is called. 
 
  
    
      | 
       Move 
       | 
      If the mouse position code equals SELECTION_BOX, SHAPE_BOUNDARY or INSIDE_SHAPE, then the operation is moving a shape. 
      => Calls the ShapeElement.resize method (*1) for moving. | 
     
    
      | 
       Resize 
       | 
      If the mouse position code equals NW_RESIZE, NE_RESIZE, SE_RESIZE, SW_RESIZE, N_RESIZE, E_RESIZE, S_RESIZE or W_RESIZE, then the operation is resizing a shape. 
      => Calls the ShapeElement.resize method. 
       
      If the mouse position code equals END_POINT, then the operation is moving the endpoint of a line, polyline or cubic
      curve.  
      => Calls the ShapeElement.moveEndPoint method for moving an endpoint. | 
     
  
 
 
   (*1) The resize method can be used for moving a shape. 
 
3. Class AutoAlign
	return=>page top  
 public class AutoAlign 
3.1 AutoAlign Examples 
	  => 
	Auto align Figure 1.4(a) - 1.4(d) on this page, 
	User's guide 
	auto align, 
	auto align example1 - example5, 
	Example-1 
	The auto align capability automatically performs the same operation as the 
	align command 
	- align_left, align_center, align_right. align_top, align_middle, align_bottom 
	- in real time , while the selected shape is being moved or resized. 
	When you move or resize the selected shape and if the selected shape is aligned to other shapes, 
	then red dashed lines are displayed. 
	When you release the mouse button while red dashed lines are being displayed, 
	the selected shape will be aligned with the other shapes very accurately. 
	
 
 
3.2 Control flow 
 
3.3 Summary of the processing
  
    
      | 
       Step 
       | 
      
       Description 
       | 
     
    
      | 
				Step1. Creating scale marks on the x-axis and y-axis
			 | 
      
      The createAlign method of this class creates 
			scale marks based on the existing unselected shapes. 
			The six scale marks - x left, x center, x right, y top, y middle,
      y bottom - are created from each of the unselected shapes. The first three
      are scale marks on the x-axis and the last three are scale marks on the
      y-axis. The scale marks are, of course, not equally spaced. 
      The scale mark is represented by an Align object. 
			The Align object has an attribute (alignAxis) 
			of the Align.XALIGN or Align.YALIGN 
			which shows whether the scale mark belongs to the x-axis or the y-axis. 
      The Align objects of Align.XALIGN are further classified 
			by the sub-attribute (alignType) 
			into Align.LEFT, Align.CENTER 
			and Align.RIGHT, 
			and the Align objects of Align.YALIGN are classified in the same way 
			into Align.TOP, Align.MIDDLE 
			and Align.BOTTOM. 
      The scale marks on the x-axis are saved to xAlignList 
			and those on the y-axis are saved to yAlignList. 
			The scale marks are arranged in ascending order in each ArrayList. 
      The xAlignList and the yAlignList act 
			as a kind of x-ruler and y-ruler. 
			For example, to know whether the left side of the selected shape - which is being moved or resized - 
			is aligned to other unselected shape, we search an Align object whose attribute
      and sub attribute are Align.XALIGN and Align.LEFT 
			and whose value matches the left side of the selected shape.
       | 
     
    
      | 
				Step2. Checking alignment
			 | 
      
				If the selected shape happens to aligned with a scale mark - which we call
				"hitAlign" 
				- in the xAlignList or 
				yAlignList within a given error margin, 
				the AutoAlign.createHitAlignedCouples method 
				creates a new Align object from the selected shape - 
				which we call "targetAlign". 
				Then the AutoAlign.createHitAlignedCouples 
				method creates a new object of the AlignedCouple 
				which represents a couple of the targetAlign 
				and the hitAlign 
				and stores the new AlignedCouple object 
				in the hitAlignedCouples(Vector object). 
				 : The rules of checking alignment 
				(1) The moving or resizing operation can handle multiple selected shapes,
				however the screen looks so crowded if the auto_align function
				displays all the alignments for the multiple selected shapes with red dashed lines. 
				So the auto_align function is limited to handle the single selected
				shape on which the mouse button was pressed. 
				(2) The alignAxis of the targetAlign 
				should be the same as that of the hitAlign. 
       | 
     
    
      
				Step3. Displaying alignments 
       =>Figure 1.4(b),(c) | 
      
      The drawAlign method of this class displays an alignment by a red dashed line between
      the shape denoted by the targetAlign 
			and hitAlign (see Figure 1.4(b)). 
      If several shapes are already aligned, then the selected shape being moved/resized may be aligned to many shapes at once, 
			the drawAlign method may display many overlapped red dashed lines. 
			This display looks so crowded and the overlapped dashed red lines are unnecessary.  
			To avoid this, the AutoAlign.selectHitAlignedCouple method selects
			AlignedCouple objects. 
			So, for each alignment of the Align.LEFT, Align.CENTER, .... Align.BOTTOM, 
			the selectHitAlignedCouple method selects 
			one or two AlignedCouple objects and stores it to 
			selectedHitAlignedCouples(Vector). 
			 : Displaying red dashed lines for cubic curves etc. 
      If the two shapes denoted by the targetAlign 
			and hitAlign are simple shapes like a rectangle or ellipse, 
			the interval of the red dashed line can be determined easily. 
			The Figure (e), (f) shows the alignment of two cubic curves.  
			In this case, the x interval of the red dashed line can't be determined trivially. 
			To determine the interval the red dashed line, 
			the AlignCouple.setAlignPoints sets 
			the top, middle or bottom points of the two shapes - which are
      denoted by the targetAlign 
			and hitAlign - 
			by using the Align.getAlignedPoints method (point sampling method). 
      Thus the drawAlign method of this class draws the red dashed line as Figure (e), (f).
       
      
        
          
              
            Figure (e) Align top     | 
               
            Figure (f) Align bottom | 
           
        
       
       
       | 
     
    
      | 
				Step4.Aligning exactly 
			 | 
      
      The two shapes in the targetAlign 
			and hitAlign are aligned within a given error margin. 
      The AutoAlign.ajustAlignment method 
			slightly moves or resizes the shape in the targetAlign 
			to align it to the hitAlign exactly within round-off error. 
       : If the cases shown in Figure 1.3, Figure 2.1, 2.2 happen, this step is skipped, because the keeping
      connections has high priority.
       | 
     
  
 
 
3.4 AutoAlign API
return=>page top 
 public class AutoAlign 
  
 
  
    
      | 
       Method 
       | 
      
       Description 
       | 
     
    
      | Constructor | 
      public AutoAlign(MoveResizeShapeLS moveResizeShapeLS) | 
     
    
      | Constructor | 
      public AutoAlign(int mode, MousePositionInfo mousePositionInfo, ShapeContainer[]
      selectedContainers) 
      This constructor is called by the init method of the MoveResizeShapeLS. 
      Parameters: 
      mode - See the mode field. 
      mousePositionInfo - See the mousePositionInfo field. 
      selectedContainers - See the selectedContainers field. | 
     
    
      | start | 
      
				public void start(int mode, MousePositionInfo mousePositionInfo, ShapeContainer[] selectedContainers) 
				⋅ Initial set for AUTO_ALIGN 
				 : 
				This method called from the MoveResizeShapeLS.init method 
				is implemented in order to avoid that the MoveResizeShapeLS.init method is too complicated.
       | 
     
    
      | mouseDragged | 
      
				public void mouseDragged(MouseEvent e) 
				⋅ Calles the drawHitAligns method of this class. 
					 : 
					This method is called from the MoveResizeShapeLS.mouseDragged method. 
       | 
     
    
      | mouseReleased | 
      
        public void mouseReleased(MouseEvent e) 
				⋅ mode=Command.MOVING_ENDPT_MODE 
				Checks the ConnectionUtil.connected field. 
					If it is not true, calls the ajustAlignment method of this class.
				 
				⋅ mode=Command.MOVING_MODE/RESIZING_MODE 
				Checks the ConnectionUtil.guided field. 
					If it is not true, calls the ajustAlignment method. 
				 : This method is called from the 
				MoveResizeShapeLS.mouseReleased method. 
       | 
     
    
      | createAlign | 
      private void createAlign()    
       =>Summary Step1 
      This method is called by the constructor. 
			It creates the six Align objects 
			-  Align.LEFT, Align.CENTER, 
			Align.RIGHT, Align.TOP, 
			Align.MIDDLE and Align.BOTTOM - for each unselected shape.  
			The six Align objects are added 
			to the xAlignList or yAlignList. | 
     
    
      | putAlign | 
      private void putAlign(int alignAxis, int alignType, double value, ShapeContainer
      shapeContainer) 
      Parameters: 
      alignAxis - Align.XALIGN or Align.YALIGN 
      alignType - Align.LEFT, Align.CENTER, Align.RIGHT, Align.TOP, Align.MIDDLE or Align.BOTTOM  
      value -  The position of an alignment. If alignAxis equals Align.XALIGN, then sets x value, if alignAxis equals Align.YALIGN, then sets y value. 
      shapeContainer - Represents a shape. 
      Processing: 
      This method is called by the createAlign method. 
			It creates an new Align object whose attributes are specified by the parameters, 
			and adds the new Align object to the xAlignList 
			or yAlignList.  
			The Align objects in the xAlignList 
			or yAlignList are arranged in ascending order. | 
     
    
      | drawHitAligns | 
      public void drawHitAligns() 
       =>Summary Step3 
			Processing: 
      This method is called by the mouseDragged and mouseReleased of the MoveResizeShapeLS. 
      If the shape being moved or resized is aligned to a neighboring shape within
      a given error margin, then this method displays a red dashed line. The
      createHitAlignedCouples method checks the alignment and calls the drawAlign method of this class to display the red dashed line. | 
     
		
    
      | createHitAlignedCouples | 
      private void createHitAlignedCouples(ShapeContainer targetContainer, int
      endPTindex) 
       =>Summary Step2 
      Parameters: 
      targetContainer - The shape to be moved or resized on which the mouse button was pressed. 
      endPTindex - This parameter is effective if the mode equals Command.MOVE_ENDPT 
      endPTindex=0: The startpoint of the line/polyline/cubic curve is moved.  
      endPTindex=1: The endpoint of the line/polyline/cubic curve is moved.  
      endPTindex=-1: Otherwise.  
      Processing: 
      This method finds an Align object (stored in the xAlignList 
			or yAlignList) which the targetContainer is aligned to.  
      If the Align object (hitAlign) is found, 
			then this methods creates a new Align object (targetAlign) 
			from the targetContainer and creates a new AlignedCouple object 
			using the targetAlign 
			and the hitAlign. 
			Finally this method adds the new AlignedCouple object to the
      hitAlignedCouples.
       | 
     
    
      | selectMovingEndPT | 
      private int selectMovingEndPT() 
				This method called by the constructor of this class.  
				It determines which endpoint of the shape is dragged with the mouse referring 
				the mousePositionInfo. 
				If the start point or end point of the shape is being moved, then returns 0 or 1 respectively.
			 | 
     
    
      | selectHitAlignedCouple | 
      
				private AlignedCouple selectHitAlignedCouple(int alignType, int dir) 
				 =>Summary Step3 
				Parameters: 
				alignType - The same as Align.alignType. 
				dir - 0/1  
				
					if the dir=0, then returns the AlignedCouple object 
					whose hitAlignPoint is located around the left side or upper side 
					of the targetAlignPoint on the screen.  
					If the dir=1, then returns the AlignedCouple object
					whose hitAlignPoint is located at the right side or lower side 
					of the targetAlignPoint.
				 
				Returns: Returns the AlignedCouple object 
				Processing: 
				This method is called by the AutoAlign.drawHitAligns method. 
				This method selects AlignedCouple objects whose targetAlign 
				and hitAlign have the same alignType 
				and it equals the alignType parameter.  
				If the multiple AlignedCouple objects are found, this method selects one AlignedCouple object 
				whose returned distance by the getAlignOrthogonalDistance 
				method is minimum.  
				If the AlignedCouple isn't found, this method returns null.
			 | 
     
    
      | drawAlign | 
      private void drawAlign(AlignedCouple couple) 
				Parameters: 
				couple - The AlignedCouple object to be displayed with red dashed lines. 
				Processing: 
				This method is called by the drawHitAligns method 
				and displays red dashed lines which shows that the two shapes in the AlignedCouple 
				are aligned within a given error margin. 
				The red dashed lines are drawn by the DrawShapeUtil.drawMarkOnDrawPane method. 
				 : Figure 3.1, Figure 3.2, Figure 3.3
			 | 
     
    
      | ajustAlignment | 
      
				public void ajustAlignment(int ctrl) 
				Parameters: 
				ctrl - When the mouse is dragged with holding down the Shift/Ctrl/Alt key, then
				the ctrl value is 1/2/3 respectively. 
				The ctrl is passed to ShapeElement.move method. 
				Processing:  
				Case 1. this.mode=Command.MOVING_MODE 
				Step 1. Selects the bestAlignedCouple for each XALIGN and YALIGN.
				
						bestCoupleX=this.getBestAlignedCouple(Align.XALIGN); 
						bestCoupleY=this.getBestAlignedCouple(Align.YALIGN);
				 
				Step 2. Gets the align errors(errorX and errorY) for each XALIGN and YALIGN.
				
						errorX=bestCoupleX.getAlignedError(); 
						errorY=bestCoupleY.getAlignedError(); 
				 
				Step 3. Moves the this.selectedContainers along the vector of (errorX, errorY).
				
					this.selectedContainers[i].getElement().move(ctrl, newP, true);
					0≦i<this.selectedContainers.length,  
					The newP(Point2D.double) is the point created by moving the current mouse position along the vector (errorX, errorY).
				 
				 : 
				As the result of above prosessing, the shapeContainer 
				in the targetAlign is aligned 
				to the shapeContainer 
				in the hitAlign accurately within round-off error.
				
  
				
				Case 2. this.mode=Command.RESIZING_MODE 
				In the resizing mode, more detailed specification is required. 
				For example, if resizing is done by moving NW Resize Handle, 
				then the TOP and LEFT sides of the shape are needed to be moved,
				so the bestAlignedCouple can be selected in the following manner.
				 
				Step 1. Selects the bestAlignedCouple for each XALIGN and YALIGN.
				
						bestCoupleX = this.getBestAlignedCouple(Align.XALIGN, Align.LEFT); 
						bestCoupleY = this.getBestAlignedCouple(Align.YALIGN, Align.TOP);
				 
				Step 2. Do the same processing as the Case 1. Step 2 
				Step 3. Resizes this.selectedContainers 
				by moving the NW Resize Handle along the vector of (errorX, errorY)
				
						this.selectedContainers[i].getElement().mouseStart(ctrl, P0); 
						this.selectedContainers[i].getElement().resize(ctrl, P1, mousePosition, true);
				 
				 
				Case 3. this.mode=Command.MOVING_ENDPT_MODE 
				The Align.ENDPT is specified to the second parameter of 
				the getBestAlignedCouple.
				 
				Step 1. Selects the bestAlignedCouple for each XALIGN and YALIGN.
				
						bestCoupleX = this.getBestAlignedCouple(Align.XALIGN, Align.ENDPT); 
						bestCoupleY = this.getBestAlignedCouple( Align.YALIGN, Align.ENDPT);
				 
				Step 2. Do the same processing as the Case 1. Step2 
				Step 3. Moves the end point of the this.selectedContainers 
				by the vector of (errorX, errorY). 
				Here, the end point is specified by the ptIndex given from the selectMovingEndPT.
				
						this.selectedContainers[0].getElement().moveEndPoint(ctrl, ptIndex, newPoint);
					
  
				 	
				 : 
				The connections with connectors are assured in the above processings, 
				because this method is called from the MoveResizeShapeLS.mouseReleased method. 
				=> Figure 3.4
			 | 
     
    
      | getBestAlignedCouple | 
      private AlignedCouple getBestAlignedCouple(int alignAxis) 
				Parameters: 
				alignAxis - XALIGN or YALIGN. 
				Returns: 
				AlignedCouple - The best AlignedCouple object 
				for the ajustAlignment method. 
				Processing: 
				This method selects an AlignedCouple object 
				from the selectedHitAlignedCouples (Vector object) 
				by specifying the alignAxis attribute and returns the AlignedCouple object. 
				If the multiple AlignedCouple objects are found, select one by the following manner. 
				Case 1. Overlapping between the boundingBox of the shape 
				in the targetAlign and that in hitAlign. 
				
					Selects the AlignedCouple object whose overlapping interval is maximum. 
					Here, the overlapping interval is given by the AlignedCouple.checkIntersection method.
				 
				Case 2. No overlapping. 
				
					Selects the AlignedCouple object whose align error along alignAxis is minimum 
					Here, the align error is given by the AlignedCouple.getAlignedError method.
				 
			 | 
     
    
      | getBestAlignedCouple | 
      private AlignedCouple getBestAlignedCouple(int alignAxis, int targetAlignType) 
				More detailed specification can be possible by adding the parameter: targetAlignType. 
				Parameters: 
				alignAxis - XALIGN or YALIGN. 
				targetAlignType - Either from LEFT to ENDP. 
				Returns: 
				AlignedCouple - The best AlignedCouple object 
				for the ajustAlignment method. 
				Processing: 
				This method selects an AlignedCouple object 
				from the selectedHitAlignedCouples (Vector object) 
				by specifying the alignAxis attribute and returns the AlignedCouple object.  
				The targetAlignType is used to compare to the alignType 
				of the couple.targetAlign. 
				If the multiple AlignedCouple objects are found, select one by the following manner. 
				Case 1. Overlapping between the boundingBox of the shape 
				in the targetAlign and that in hitAlign. 
				
					Selects the AlignedCouple object whose overlapping interval is maximum. 
					Here, the overlapping interval is given by the AlignedCouple.checkIntersection method.
				 
				Case 2. No overlapping. 
				
					Selects the AlignedCouple object whose align error along alignAxis is minimum 
					Here, the align error is given by the AlignedCouple.getAlignedError method.
				 
			 | 
     
  
 
 
2.3 AutoAlign support classes
return=>page top
 
2.3.1 Class Align 
An Align object represents the left side position, center position, right
side position, top side position, middle position or bottom side position
of a shape. If the shape is a line, an open polyline or an open cubic curve,
then an Align object also represents the endpoint of the shape. 
  
    
      | Field | 
      Description | 
     
    
      | alignAxis | 
      int alignAxis 
      XALIGN or YALIGN is set to this field. | 
     
    
      | alignType | 
      int alignType 
      LEFT, CENTER, RIGHT, TOP, MIDDLE, BOTTOM or ENDPT is set to this field. | 
     
    
      | value | 
      double value 
      Alignment position. If alignAxis equals XALIGN, then x value is set to this field.
      If alignAxis equals YALIGN, then y value is set to this field. | 
     
    
      | shapeContainer | 
      ShapeContainer shapeContainer 
      The shape from which this Align object is originated (=>ShapeContainer). | 
     
    
      | endPTindex | 
      int endPTindex 
      If the alignType equals ENDPT and a endpoint of the shape is moved, then this field is
      effective. 
      endPTindex=0: The startpoint of the shape is moved. 
      endPTindex=1: The endpoint of the shape is moved. 
      endPTindex=-1: ineffective | 
     
        
          | boundingBox | 
          
						Rectangle2D boundingBox 
						The rectangle which encloses the shape denoted by the shapeContainer. 
						This field is set by the setBoundingBox method. 
						If alignType equals ENDPT, 
						the boundingBox is the rectangle which encloses the startpoint or the endpoint of the shape according to endPTindex,
						and its width and height is zero.
           | 
         
        
          | alignedPoints | 
          
          Point2D[] alignedPoints 
          this field is set by the setAlignedPoints method.
           | 
         
        
      | XALIGN | 
      static final int XALIGN=10 
      The constant for the alignAxis. | 
     
    
      | YALIGN | 
      static final int YALIGN=11 
      The constant for the alignAxis. | 
     
    
      | LEFT | 
      static final int LEFT=0 
      The constant for the alignType. | 
     
    
      | CENTER | 
      static final int CENTER=1 
      The constant for the alignType. | 
     
    
      | RIGHT | 
      static final int RIGHT=2 
      The constant for the alignType. | 
     
    
      | TOP | 
      static final int TOP=3 
      The constant for the alignType. | 
     
    
      | MIDDLE | 
      static final int MIDDLE=4 
      The constant for the alignType. | 
     
    
      | BOTTOM | 
      static final int BOTTOM=5 
      The constant for the alignType. | 
     
    
      | ENDPT | 
      static final int ENDPT=6 
      The constant for the alignType. | 
     
    
      | alignString | 
      String[] alignString 
      String[] representing XALIGN, YALIGN, LEFT, CENTER, RIGHT, TOP, MIDDLE, BOTTOM and ENDPT. | 
     
  
 
  
  
    
      | 
       Method 
        | 
      
       Description 
       | 
     
    
      | Constructor | 
      
				Align(int alignAxis, int alignType, double value, ShapeContainer shapeContainer) 
          Sets the parameters to the corresponding fields. 
          Calls the setBoundingBox and  setAlignedPoints methods to set the values to the fields of the boundingBox and alignedPoints. | 
     
    
      | Constructor | 
      
				Align(int alignAxis, int alignType, double value,  ShapeContainer shapeContainer, int endPTindex) 
        Sets the parameters to the corresponding fields.  
				This constructor is used if the shape denoted by the shapeContainer is a line, an open polyline or an open cubic curve. 
        Calls the setBoundingBox and  setAlignedPoints methods to set the values to the fields of the boundingBox and alignedPoints. | 
     
    
      | 
				setBoundingBox
       | 
      
				private void setBoundingBox() 
				Sets the bounding box which encloses the shape denoted by the shapeContainer 
				to the field variable this.boundingBox. 
				If the alignType equals ENDPT, then sets the bounding box that encloses the startpoint or the endpoint
        of the shape and its width and height are zero.
       | 
     
    
      | 
      setAlignedPoints
       | 
      
				public Point2D[] getAlignedPoints() 
				 =>Summary Step3 Figure (e), (f) 
				Returns the points whose x-value or y-value matches the value within a given margin.  
				If the shape denoted by the shapeContainer is a simple shape, it's easy to obtain the point like top side point,
				center point, bottom side point, left side point, middle point or right side point. 
				If the shape isn't a simple shape, for example a cubic curve, then this 
				method obtains the points by point sampling method on the boundary of the shape.
       | 
     
    
      | getAlignAxis | 
      
				int getAlignType() 
      Returns the alignAxis field.
			 | 
     
    
      | getAlignType | 
      int getAlignType()  
      Returns the alignType field.
			 | 
     
    
      | getValue | 
      double getValue() 
				Returns the value field.
			 | 
     
    
      | getShapeContainer | 
      ShapeContainer getShapeContainer() 
      Returns the shapeContainer field. | 
     
    
      | getEndPTindex | 
      int getEndPTindex() 
      Returns the endPTindex field. | 
     
		
      | getBoundingBox | 
      
				Rectangle2D getBoundingBox() 
        Returns the boundingBox field.
			 | 
     
		
      | getAlignedPoints | 
      
				public Point2D[] getAlignedPoints() 
				Returns the alignedPoints field.
			 | 
     
		
      | update | 
      public void update() 
				Updates this object when this.shapeContainer is updated.
			 | 
     
		
      | toString | 
      public String toString() 
				Returns the string representing this object.
			 | 
     
  
 
  
2.3.2 Class AlignedCouple
return=>page top 
  
    
      | 
       Field 
       | 
      
       Description 
       | 
     
    
      | targetAlign | 
      
				protected Align targetAlign 
				The Align object that is created from the target shape to be moved or resized. | 
     
    
      | hitAlign | 
      
				protected Align hitAlign 
				The Align object which is stored in xAlignList or yAlignList and it is
				aligned to the target shape. | 
     
    
      | targetAlignPoint | 
      protected Point2D targetAlignPoint 
				The point on the boundary of the shape stored in the targetAlign object. 
				This point is the start point of a red dashed line that shows the alignment and is set by the
				setAlignPointsmetod.
			 | 
     
    
      | hitAlignPoint | 
      protected Point2D hitAlignPoint 
				The point on the boundary of the shape stored in the hitAlign object. 
				This point is the end point of a red dashed line which shows the alignment and is set by the
				setAlignPoints method.
			 | 
     
  
 
 
    
        
             
                 
                Copyright (c) 2009-2013 
                    All other trademarks are property of their respective owners.
                
 
 
 
 
 
 
 
 
 
 
 
  
             | 
         
     
     |