| Summary: The function of modifying a shape can change a corner radius of a rounded
          rectangle, move a junction point of a polyline or a cubic curve, add a
          new junction point to it or delete a junction point from it. In addition,
          the function can change a tangent direction of a cubic curve. | 
     
    
      | Classes on this page: ModifyShape, ModifyShapeAction, ModifyShapeLS | 
     
  
 
  
1. Overview 
1.1 Examples 
(1) Changing a corner radius 
return=>page top 
 
  
    
      
				 
       | 
      
				 
       | 
      
				 
       | 
     
    
      |  Original round rectangle | 
       Enlarge the corner radius | 
       Maximizing the corner radius | 
     
  
 
 Figure 1.1 Changing the corner radius 
(The blue marks are the control points) 
 
(2) Modifying a polyline
return=>page top 
A junction point or a line segment of a selected polyline can be moved.
    A new junction point can be added to the polyline and a existing junction
    point can be removed from it.  
    In Figure 1.2, the marks filled with blue are used for dragging a junction point of a polyline. 
		And the marks filled with white are used for dragging a line segment of a polyline. 
 : 
	If a junction point is dragged with holding down the Shift or Ctrl key, 
  then the junction point will be moved horizontally or vertically. Similarly, 
  a line segment is dragged with holding down the Shift or Ctrl key, 
	then the direction of the line segment will be forcibly changed to horizontal or vertical direction.
 
  
    
        | 
        | 
        | 
        | 
     
    
      (a) Original  | 
      (b) Move the left side line to right.   | 
      
				 (c) Change line segmens to horizontal or vertical segments by moving them 
						with holding down Shift/Ctrl key.   | 
      (d) Completed drawing  | 
     
  
 
 Figure 1.2 Moving a junction point a line segment of the polyline 
 
  
    
        | 
        | 
     
    
      | (e) Add junction points to Figure (d) | 
      (f) Delete a junction point from figure (e) | 
     
  
 
Figure 1.3 adding and deleting a junction point 
 
(3) Modifying a cubic curve
return=>page top 
	As well as a polyline, a junction point and a tangent line (direction) of a selected cubic curve can be moved. 
	A new junction point can be added to the cubic curve and a junction point can be deleted from it.  
  In Figure 1.4, the marks filled with blue and filled with white are used 
  for dragging a junction point and dragging a tangent line of the cubic curve respectively.
 
 : 
If a junction point is dragged with holding down the Shift or Ctrl key, 
then the junction point will be moved horizontally or vertically. 
 
  
    
        | 
        | 
        | 
     
    
      | (a)Original | 
      (b)Move the second junction point to upper left | 
      (c)Change the tangent direction at the start point | 
     
  
 
Figure 1.4 Moving a junction point and changing a tangent direction 
 
(4) Processing senment points
return=>page top 
 
  
    
        | 
        | 
        | 
        | 
     
    
      | (a)Original | 
      
				(b)Adds points to the bottom edge(ARC) and the right side edge(LINE) | 
      
				(c)Deletes the upper right point | 
      
				(d)Deletes the left lower and right lower poins | 
     
    
        | 
        | 
        | 
        | 
     
    
      |  (e)Smooths the curve at the upper left point | 
       (f)Makes all junction points into cusp points | 
       (g)Disconnects the curve at all junction points
  | 
       (g)Ordinary display | 
     
  
 
  
1.2 Dialog
return=>page top 
Select the radio button representing the operation to be performed. 
      
        
          
              
							Moves a segment or junction point
             | 
            >  
							Adds point on a edge
             | 
              
							Deletes a junction point
             | 
           
          
              
							Smooths the curve at a junction point
             | 
              
							Makes a junction point into cusp point
						 | 
              
							Disconnect a curevs at a junction point
						 | 
         
      
     
    Figure 2. Dialog(for a polyline) 
		
  
1.3 Control flow
return=>page top 
The ModifyShape class displays the dialog of 
	Figure 2 and the ModifyShapeAction 
	performs the action processing of the buttons in the dialog. 
	The ModifyShapeLS class receives the mouse motion and calls the corresponding method of 
	the ShapeElement subclass to update the shape data. 
  
 
  
 
2. Class ModifyShape    
return=>page top 
public class ModifyShape extends JDialog 
The ModifyShape class displays the dialog of Figure 2 and the ModifyShapeAction processes the action events of the buttons in the dialog. The ModifyShapeLS class receives the mouse motion and calls the corresponding method of
the ShapeElement subclass to update the shape data. 
 
 
  
    
      | 
				Field
       | 
      
				Description
       | 
     
    
      | 
				 action
        | 
      
				 ModifyShapeAction action 
					Sets the ModifyShapeAction object to this field. 
        | 
     
    
      | 
				 modifyShapeLS
        | 
      
				 ModifyShapeLS modifyShapeLS 
					Set the ModifyShapeLS object.
        | 
     
    
      | targerContainer | 
      ShapeContainer targerContainer 
				The ShapeContainer of the selected shape. | 
     
    
      | 
				 messageLabel1
        | 
      
				 JLabel messageLabel1 
					Sets the label object on which the showMessage methods displays a message.
        | 
     
    
      | 
				 messageLabel2
        | 
      
				 JLabel messageLabel2 
					Sets the label object on which the 
					showMessage methods displays a message.
        | 
     
    
      | 
				moveButton
       | 
      
				JRadioButton moveButton
				Set the "move" button object to this field. Registers the 
				ModifyShapeAction object to the button object 
				as the java.awt.event.ActionListner. 
				When this button is clicked, the ModifyShapeAction.actionPerformed method 
				displays the message of "move button selected" and sets the operation mode of the MOVE_MODE to the 
				ModifyShapeLS.
       | 
     
    
      | 
				addPointButton
       | 
      
				JRadioButton addPointButton 
				Set the "add point" button object to this field. Registers the
				ModifyShapeAction object to the button object 
				as a java.awt.event.ActionListner.
       | 
     
    
      | 
				deletePointButton
       | 
      
				 JRadioButton deletePointButton 
          Set the "delete point" button object to this field. Registers
          the ModifyShapeAction object to the button object 
					as a java.awt.event.ActionListner.
        | 
     
		
			| 
				smoothButton
			 | 
			
				JRadioButton smoothPButton 
				Set the "smooth" button object to this field. Registers the
				ModifyShapeAction object to the button object 
				as a java.awt.event.ActionListner.
			 | 
		 
		
			| 
				cuspButton
			 | 
			
				JRadioButton cuspButton 
				Set the "cusp" button object to this field. Registers the 
				ModifyShapeAction object to the button object 
				as a java.awt.event.ActionListner.
			 | 
		 
		
			| 
				disconnectButton
			 | 
			
				JRadioButton disconnectButton 
				Set the "disconnect" button object to this field. Registers the
				ModifyShapeAction object to the button object as a java.awt.event.ActionListner.
			 | 
		 
		
      | 
				exitButton
       | 
      
				 JButton exitButton 
					Set the "Exit" button object to this field. Registers the ModifyShapeAction object 
					to the button object as the java.awt.event.ActionListner. 
					If this button is clicked, then terminates the ModifyShapeLS and closes the dialog.
        | 
     
    
      | 
				 dialogDimension
        | 
      
				private Dimension dialogDimension=new Dimension(300,80) 
				The size of the dialog.
       | 
     
  
 
 
  
    
      | 
      Method
       | 
      
      Description
       | 
     
    
      | 
      showDialog
       | 
      
      public void showDialog() 
      ∙ Checks the selected shape 
      Gets the selected shape by the ContainerManager.getSelectedContainers method and checks the selected shape is appropriate. If not appropriate,
				this method displays the error message by the JOptionPane.showMessageDialog. 
      ∙ Calls the ModifyShapeLS.start method. 
      ∙ Sets the display position of the dialog. 
      Shows the dialog at the left side of the selected shape. 
      ∙ Adds the label for message output and the buttons to the dialog. 
      Adds the actionListener of the ModifyShapeAction 
				to the buttons. If the button is clicked or selected, 
				then the button's action will be processed by the 
				ModifyShapeAction.actionPerformed method. 
      ∙ Adds the WindowListener to the dialog. 
      Before the window is closed, the 
				windowClosing method is called 
       | 
     
    
      | 
      showMessage
       | 
      
      protected void showMessage(int id, String message) 
      Two message labels are laid vertically in the dialog.  
      The 1 or 2 of the id specifies the messageLabel1 
			or the messageLabel2 respectively.
       | 
     
    
      | 
      getTargetContainer
       | 
      
      protected ShapeContainer getTargetContainer() 
      Returns the targetContainer.
       | 
     
    
      | 
      getModifyShapeLS
       | 
      
      protected ModifyShapeLS getModifyShapeLS() 
      Returns the modifyShapeLS.
       | 
     
  
 
  
3. Class ModifyShapeAction 
return=>page top 
class ModifyShapeAction extends AbstractAction implements WindowListener 
This class processes the action events of the buttons in the dialog and the window event. 
  
    
      | 
      Field
       | 
      
      Description
       | 
     
    
      | 
      dialog
       | 
      
      <ModifyShape dialog 
      Sets the ModifyShape object to this field. 
       | 
     
  
 
 
  
    
      | 
       Method
        | 
      
       Description
        | 
     
    
      | 
      actionPerformed
       | 
      
      public void actionPerformed(ActionEvent e) 
      When the button is clicked in the dialog, executes the action processing
      of the button. 
      ∙ The "move/add point/delete point" buttons 
      Sets the MOVE_MODE, ADD_POINT_MODE or DELETE_POINT_MODE 
      to the ModifyShapeLS by the 
			setMode method of this class. 
      ∙ The "Exit" button 
       Calls to the closeDialog method.
        | 
     
    
      | 
      closeDialog
       | 
      
      private void closeDialog() 
      Closes the dialog. Calls the end method of the 
			ModifyShapeLS.
       | 
     
    
      | 
      windowClosing
       | 
        public void windowClosing(WindowEvent e) 
      Calls the closeDialog method.  | 
         
  
 
  
4. Class ModifyShapeLS
return=>page top 
public class ModifyShapeLS implements MouseListener, MouseMotionListener 
This class processes the mouse events for moving a junction point, 
	adding a new junction point and deleting a junction point. 
	The mouse events are interpreted and transferred to the corresponding methods of the 
	ShapeElement subclass to update the shape data.
 
 :Special remarks 
    
      
        
          | Item | 
          Description | 
         
        
          | Target curve topology | 
          
          The "ModifyShape" command changes the topology of a target curve
          by connecting it to another curve at its end point, or dividing it to multiple sub-curves
          using "Disconnect" sub-command. 
          To handle changing of the number of the target curve, the ShapeElement which stores the target curve must be a GeneralCurveElement and its parametric curve must be a GeneralCurve2DE. 
          For this reason, the ShapeElement of the target curve is converted to a GeneralCurveElement at the first step (start method of this class) of the "ModifyShape" command. 
          If multiple curves are generated at the end of the "ModifyShape"
          command, this class stores each of the multiple curves to a suitable
          ShapeElemnt at the last step (end method of this class).
           | 
         
        
          | undoSetup | 
          
          It is good to store an undo setting to UndoDrawManager whenever the target-curve's topology changes.  
          In order to do this, the undoSetupStart method is called at the start method of this class, and the undoSetupEnd is called at the setCommand. 
          Moreover, the undoSetupStart method  is called at the setCommand
          method for the next sub-command processing.  
          Finally, the undoSetupEnd is called in the end method of 
					this class and all changes of the target-curve's topology are recorded. 
           | 
         
      
     
 
  
    
      | 
      Field
       | 
      
      Description
       | 
     
    
      | 
      shapeContainer
       | 
      
      ShapeContainer shapeContainer 
      Sets the shape object to be modified to this field.
       | 
     
    
      | 
				
      connectionUtil
       | 
      
      ConnectionUtil connectionUtil 
      Sets the ConnectionUtil object which resizes 
			or transforms the connectors connecting the shapeContainer.
       | 
     
    
      | 
      mode
       | 
      
      int mode 
      The operation mode of this class. 
      The ModifyShapeAction.actionPerformed method sets 
			the MOVE_MODE, ADD_POINT_MODE or DELETE_POINT_MODE to this field.
       | 
     
    
      | 
      startPoint
       | 
      
      Point2D startPoint:The drag start point
       | 
     
    
      | 
      endPoint
       | 
      
      Point2D endPoint:The drag current or end point.
       | 
     
    
      | 
      oldPoint
       | 
      
       Point2D oldPoint:The old drag point. 
      The endPoint is set to this field at the end of the mouseDragged method.
        | 
     
    
      | angledLine | 
      
      DiscreteAngledLine lineAngle: 
			DiscreteAngledLine object.
       | 
     
  
 
 
 |