1.Overview 
1.1 Operation 
The operation of selecting shape is as follow: 
∙ Click on a shape's boundary. If the shape's boundary is closed, you can
select the shape by clicking inside the shape. If the shape is a line,
polyline or cubic curve and it's not closed, you have to click on (or near)
the line or the curve. 
∙ To select multiple shapes at once, drag a large rectangle around the
shape. 
 
 : 
	The rules for selecting shapes 
∙ Click on a already selected shape, then it will be deselected. 
∙ If you click on empty space of the canvas, all the selected shapes will be deselected. 
∙ Click on a shape with holding down the Shift or Ctrl key, the already 
selected shapes will remain selected and the clicked shape will be selected. 
∙ Click inside a text box, it will be selected and editable (able to input 
text or delete text). The editable text box is shown by a green frame inside it. 
  => 
 User's guide Text box, 
 Editing text 
  You can click inside a text box in a group object, then the text box will be editable. 
 
1.2 Display of selected shapes 
(1) A basic shape and a closed shape (its boundary line/curve is closed) 
∙ The selected shape 
is displayed with the light gray flame called selection 
box (Figure 1). The selected shape can be moved by dragging the 
selection box with the mouse. 
∙ The square marks and the circle marks on the selection box are resize 
handles. The square marks are used for resizing the selected shape horizontally 
and vertically. The circle marks are used for resizing the selected shape diagonally. 
 
 
 
Figure 1.The selection box 
 
(2) A open shape (its boundary is not closed) 
∙ The square marks are displayed at the end points of a selected shape.
The square mark is a kind of resize handle and used for dragging the end
	point of the shape with the mouse.
 
∙ If a selected shape is a polyline or a cubic curve and it is not closed, 
then the selection box will be displayed in addition to the resize handles 
 
  
    
       
        
      Lines | 
      
				  
      Polyline | 
      
				  
      Cubic curve | 
     
  
 
Figure 2.The resize handles at the end points and the selection box 
 
1.3 The calling order of the MouseListener and MouseMotionListener methods of
	the SelectionLS and MousePositionLS 
• When the mouse is clicked 
MousePositionLS.mousePressed -> SelectionLS.mousePressed -> MousePositionLS mouseReleased -> 
	SelectionLS.mouseReleased  
-> MousePositionLS mouseClicked -> SelectionLS.mouseClicked 
 
• When the mouse is dragged 
MousePositionLS.mousePressed -> SelectionLS.mousePressed -> MousePositionLS mouseDragged -> SelectionLS.mouseDragged ->.................... 
-> MousePositionLS mouseDragged -> SelectionLS.mouseDragged ->
MousePositionLS mouseReleased -> SelectionLS.mouseReleased
 
 
2. Class SelectionLS (LS: Listener)
	return=>page top 
	 
	2.1 Important items 
  
    
      | Item | 
      Description | 
     
    
      | 1. Monitoring the mouse position | 
      It is important for the selecting operation to know where on the shape
      the mouse is located. This information is created by the mouse position
      monitor (MousePositionLS object).  
      The SelectionLS gets this information by the 
			MousePositionLS.getMousePositionInfoForSelection 
			method in real time and performs the selecting operation. | 
     
    
      | 
				2. Activating and deactivating SelectionLS
			 | 
      The SelectionLS object resides in this application and it is usually active.
      However, it may do unnecessary operations in the following cases, at that time
      it must be deactivated. 
      (a) In the process of creating a shape, the mouse must be clicked
      or dragged on the canvas. If an existing shape is clicked or enclosed in
      by the dragged rectangle, then the shape will be selected. This is an unnecessary
      operation for creating a shape. So the SelectionLS must be deactivated
      while creating a shape. 
       => CreateShapeLS Control flow of creating a shape object Step4 
          (b)When you edit the text in a text box, you have to click or drag the
          mouse inside the text box. If the SelectionLS is active at this time, the text box
          itself or overlapped shapes will be unexpectedly selected or deselected
          by the mouse operation ( =>The rules for selecting shape). This is inconvenient for editing a text, so the SelectionLS must be
          deactivated inside an editable text box. To do this, the mouse position
          (X, Y) is always checked whether it is iside an editable text box or not
          by the inEditableTextArea method. | 
     
    
      | 3. Moving and resizing commands | 
      
      The commands are usually issued by clicking a button on the tool bar. However,
      the moving or resizing command must be issued when the mouse button is
      pressed on the selection box or the resize handle of a selected shape. 
      To do this, the SelectionLS always gets the mouse position from the
      MousePositionLS, and if the mouse button is pressed on the selection box or the resize
      handle, then the SelectionLS issues the moving or resizing command by the 
			prepareMoveResizeCommand method. 
       | 
     
  
 
  
2.2 SelectionLS API    
return=>page top 
public class SelectionLS implements MouseListener, MouseMotionListener 
  
    
      | 
      Field
       | 
      
      Description
       | 
     
    
      listenerList 
       | 
      protected EventListenerList listenerList = new EventListenerList(); 
      A list storing the SelectionListeners. | 
     
    
      popupTrigger 
      (static) 
       | 
      public static boolean popupTrigger 
      This field stores the return value of the isPopupTrigger method of
      java.awt.event.MouseEvent. 
       =>Getting PopupTrigger 
      If the this field is true, the SelectionLS launches the popup menu after
      selecting a shape. 
       =>Popup Menu Triggers popup menu | 
     
    
      clicked 
       | 
      boolean clicked 
      This field is referred by the mouseEventCompleted method of this class. 
      When a mouse event occurs and the methods - the mousePressed, mouseReleased,
      and mouseClicked - have finished, true is set to this field. | 
     
    
      clickedPoint 
       | 
      public Point2D clickedPoint 
      This field stores the mouse clicked position. This field is referred in
      the execSelection method and set to the parameter of the sendResult method. | 
     
    
      | draggedRectangle | 
      Rectangle2D draggedRectangle 
      The dragged rectangle. This field is passed to the execSelection method as the parameter and referred in the drawDraggedRectangle method to draw the border of the dragged rectangle dynamically. | 
     
    
      startPoint 
       | 
      Point2D startPoint 
      This field stores the start point of mouse dragging. | 
     
    
      endPoint 
       | 
      Point2D endPoint 
      This field stores the current or end point of mouse dragging. | 
     
    
      | ctrl | 
      private int ctrl 
      ctrl=2: the mouse button 2 was pressed. 
      ctrl=3: the mouse button 3 was pressed. 
      This field is referred in the execSelection method. | 
     
      
 
 
  
    
      | 
      Method
       | 
      
      Description
       | 
     
    
      start 
       | 
      public void start() 
      Calls the activateListener method of this class to register the SelectionLS to the ListenerPanel as a MouseListener and MouseMotionListener. | 
     
    
      | end | 
      public void end() 
      ∙ Calls the activateListener method with the parameter as false to remove the SelectionLS from ListenerPanel. 
      ∙ Clears the following fields: 
       this.draggedRectangle=null; this.startPoint=null; this.endPoint=null;
       this.clickedPoint=null; | 
     
        
      | isMouseListener | 
      boolean isMouseListener(MouseListener listener) 
      Inquires whether this object is registered to the ListenerPanel or not. | 
     
    
      | isMouseMotionListener | 
      public boolean isMouseMotionListener(MouseMotionListener listener) 
      Inquires whether this object is registered to the ListenerPanel or not. | 
     
    
      | activateListener | 
      private void activateListener(boolean activate) 
      If the activate parameter is true, this method registers this object to the
      ListenerPanel as a MouseListener and MouseMotionListener. 
      If the activate parameter is false, this method removes this object from the
      ListenerPanel. | 
     
    
    
      | addSelectionListener | 
      public void addSelectionListener(SelectionListener listener) 
          Adds the specified SelectionListener object to the listenerList for receiving a SelectionEvent from the SelectionLS when shapes are selected in the SelectionLS. | 
     
    
      | removeSelectionListener | 
      public void removeSelectionListener(SelectionListener listener) 
          Remove a SelectionListener object from the listenerList. | 
     
    
      | removeSelectionListener | 
      public void removeSelectionListener() 
          Remove all the SelectionListener object from the listenerList. | 
     
    
      | fireEvent | 
      public void fireEvent(SelectionEvent event) 
          Reports a SelectionEvent to the objects registered in the listenerList when shapes are selected in the SelectionLS. | 
     
        
      | mousePressed | 
      public void mousePressed(MouseEvent e) 
      ∙ Stores the return value of the isPopupTrigger method of the e (MouseEvent
      ) to the static field popupTrigger. 
       =>Getting PopupTrigger 
      ∙ If the mouse right button was pressed, then 2 or 3 is set to the ctrl. 
      ∙ If the mouse button was pressed on a selection box or a resize handle,
      then calls the prepareMoveResizeCommand method. 
       =>Important items Moving and resizing commands | 
     
    
      | mouseDragged | 
      public void mouseDragged(MouseEvent e) 
      Creates the current dragged rectangle and stores it to the draggedRectangle. 
      The current  dragged rectangle will be drawn with a dotted line by
      the drawDraggedRectangle method. | 
     
    
      | mouseReleased | 
      public void mouseReleased(MouseEvent e) 
      ∙ Stores the return value of the isPopupTrigger method of the e (MouseEvent)
      to the static field popupTrigger. 
       =>Getting PopupTrigger 
      ∙ The dragged rectangle is determined finally, then calls the
      execSelection method as follow. 
        if(this.draggedRectangle!=null) execSelection(ctrl, this.draggedRectangle); | 
     
    
      | mouseClicked | 
      
      public void mouseClicked(MouseEvent e) 
      ∙ Checks whether the Shift/Ctrl key was held down at the mouse click ornot . 
      ∙ Calls prepareClickedPointCommand method of this class. 
      ∙ Calls execSelection method of this class to select shapes. 
      ∙ Launching a popup menu 
      If the static field popupTrigger 
				and the static field MousePositionLS.popupTrigger 
				are both true, then calls the ExecPopupMenu.show method 
				to launch a popup menu. 
       =>
			Popup Menu Triggering popup menu   
			 
       | 
     
    
      | mouseEntered | 
      public void mouseEntered(MouseEvent e) 
      Nothing is done. | 
     
    
      | mouseExited | 
      public void mouseExited(MouseEvent e) 
      Nothing is done. | 
     
    
      | mouseMoved | 
      public void mouseMoved(MouseEvent e) 
      Nothing is done. | 
     
        
          | inEditableTextArea | 
          private boolean inEditableTextArea(double X, double Y) 
          It is judged whether the point (X, Y) is located in an editable text box.
          If so, no shape can be selected by the clicked point (X, Y). The editable
          text box can be retrieved by the ContainerManager.getEditableTextBox method. | 
         
        
      | drawDraggedRectangle  | 
      public void drawDraggedRectangle(Graphics g) 
      This method is called from the DrawPanel.paint method for drawing the dragged rectangle (given by the field of the
      draggedRectangle) with dotted line. | 
     
    
      execSelection
  | 
      
      public void execSelection(int ctrl, Rectangle2D draggedRectangle) 
			Parameters: 
        ctrl - If ctrl>0, this method selects a shape without deselecting the already selected shapes. 
				If the mouse was clicked or dragged with holding down Shift/Ctrl key, 1 or 2 is set to ctrl. 
        draggedRectangle - The dragged rectangle which encloses the selected shapes. 
        If the selecting a shape is done by the mouse click, the draggedRectangle is null. 
      Processing: 
      This method is called from the mouseClicked and mouseReleased methods and
      it selects a shape or shapes according to the rules 
			( =>Operation) 
			 
			
      (1) Opens the Shape tab (User's Guide 
			Shape tab) 
			by calling the setSelectedIndex method of the javax.swing.JTabbedPane. 
       
      (2) The case that the draggedRectangle parameter isn't null. 
      Calls the selectInDraggedArea method 
				and retrieves the selected shapes from its returned array of the
      MousePositionInfo objects. 
       : 
			To select or deselect the shape, calls the ShapeContainer.setSelected method.           
          shapeContainer.setSelected(true/false);
			 
       
			
      (3) The case that the draggedRectangle parameter is null. 
      
				Calls the getMousePositionInfoForSelection method of the 
				MousePositionLS and retrieves the selected shape from the returned 
				MousePositionInfo object .
  
          
      (4)Calls the PaintStyle.setPaintStyleToMenu 
			static method at the end of this method. 
       The PaintStyle object represents the attributes of the selected shapes
          such as color, line width, line stroke. 
					The above static method changes the appearance of the corresponding menu components on the tool bar.
			  
			
      (5)Calls the FontStyle.setFontStyleToMenu 
			 static method at the end of this method. 
      
				The FontStyle object represents the attributes of the selected styled 
        characterts such as  font family, font size, bold, italic, underline, 
        suprtscript/subscript and color. The above static method changes the appearance 
        of the corresponding menu components on the tool bar.
			 
       | 
     
    
      | execSelectionByDrag | 
      
      public void execSelectionByDrag(int ctrl, Rectangle2D draggedArea) 
      Parameters: 
      ctrl - If ctrl>0, this method selects a shape without deselecting the already selected
          shapes. If the mouse was dragged with holding down Shift/Ctrl key, 1 or 2 is set to
          ctrl. 
      draggedRectangle - The dragged rectangle which encloses the selected shapes. 
       If the selecting a shape is done by the mouse click, the draggedRectangle is null. 
      Processing: 
       This method is called from the mouseReleased methods. 
      (1) Calls the selectInDraggedArea method 
			and gets the array of the MousePositionInfo objects. 
      (2) According to the selection rules (Operation), 
			this method performs the selection procedure for the shapes in the 
			MousePositionInfo objects.
       | 
     
    
      | selectInDraggedArea  | 
      
      private MousePositionInfo[] selectInDraggedArea(Rectangle2D draggedRectangle) 
      Returns: 
      The array of the MousePositionInfo objects 
			which represent the selected shapes. 
      Processing: 
      This method is called from the above execSelectionByDrag method. 
          Select the shape objects which lies inside the draggedRectangle and return
          the MousePositionInfo array 
					which represent the selected shape objects.
       | 
     
    
      | execSelectionByClick | 
      public void execSelectionByClick(int ctrl) 
      Parameters: 
      ctrl - If ctrl>0, this method selects a shape without deselecting the already selected
      shapes. If the mouse was clicked with holding down Shift/Ctrl key, the ctrl is 1 or 2. 
      Processing: 
      This method is called from the mouseClicked method and it selects a shape
      or shapes according to the rules ( =>
			Operation) 
      (1) Gets the MousePositionInfo objects by 
			the MousePositionLS.getMousePositionInfoForSelection method. 
      If no MousePositionInfo object exists, then deselects all the selected
        shapes. 
        In general the returned MousePositionInfo objects are multiple 
				and they are stored in the array in the order of high priority.  
			
       (2) Selects the MousePositionInfo object of the highest priority and
          performs the selection procedure for the shape retrieved from the MousePositionInfo
          object. If the clicked point is inside a text box, then makes the text
          box editable by calling the selectTextBox method.
  
					
       (3) Creates a SelectionEvent 
					and sends the event to the objects implementing the SelectionListener interface
					by the fireEvent method.
       | 
     
    
      | selectTextBox | 
      private void selectTextBox(ShapeContainer selectedContainer, MousePositionInfo
      info, int ctrl) 
      This method is called by the execSelection method. 
      Parameters: 
      selectedContainer - The ShapeContainer of the selected shape object which has a text box. 
      info - Used for getting the clicked point from the parameter info
      (MousePositionInfo) and passes it to the ShapeContainer.makeTextBoxEditable method to set the cursor(caret) position in the text box. 
      ctrl - If the mouse was clicked with holding down Shift/Ctrl key, the ctrl is 1/2. | 
     
    
      | selectAll | 
      public void selectAll(boolean select) 
      Selects/deselect all the shape objects on the canvas. This method is called
      by the ExecCommand. | 
     
    
      prepareMoveResize 
      Command | 
      public void prepareMoveResizeCommand(MousePositionInfo mouseInfo, MouseEvent
      e) 
      This method is called from the mousePressed method, when the mouse button was pressed on a selection box or a
      resize handle. This method generates a MOVE or RESIZE command and calls the ExecCommand.exec method for command dispatch. | 
     
    
      prepareClickedPoint 
      Command | 
      public void prepareClickedPointCommand(Point2D point) 
      This method is called by the mouseClicked method. 
      This method generates the CLICKEDPOINT command and calls the exec method of the ExecCommand for command dispatch. 
       : The clicked point is stored to the clickedPoint field of the ExecCommand. Currently the clickedPoint is referred to specify the paste position of selected objects before pasting
      them. | 
     
    
      | mouseEventCompleted | 
      public boolean mouseEventCompleted() 
      Inquires whether or not the methods of this class - mousePressed, mouseDragged,
      mouseReleased and mouseClicked - have all finished. This
      method is called from this class and MousePositionLS class. | 
     
    
      | allMouseEventCompleted | 
      
      public boolean allMouseEventCompleted() 
      Returns:  
      True if the mouseEventCompleted method of this class and the same method
      of the MousePositionLS both returns true. 
       =>
			Popup Menu Triggers popup menu
       | 
     
      
 
     
 : 
Getting PopupTrigger 
	return=>page top 
    The note about the isPopupTrigger method of 
			java.awt.event.MouseEvent is described in the Java Platform Standard Ed. 6 as follow:  
     
			Popup menus are triggered differently on different systems. 
			Therefore, isPopupTrigger should be checked in both mousePressed and mouseReleased 
			for proper cross-platform functionality.
		 
     
    So, the following two lines are needed in the mousePressed 
			and mouseReleased methods. 
			Here the popupTrigger is the static field of the SelectionLS.
		 
      popupTrigger=false; 
      if(e.isPopupTrigger()) popupTrigger=true; 
  
2. Interface SelectionListener
return=>page top 
A listener interface for receiving SelectionEvents. A class that receives 
such events implements this interface, and then registers itself by calling 
the addSelectionListener method of the SelectionLS.  
    
  
    
      | 
       Method
        | 
      
       Description
        | 
     
    
      selected 
       | 
      
      public void selected(SelectionEvent event) 
      Invoked when the action described by the specified SelectionEvent occurs.
       | 
     
      
     
    
  
		
    3. Class SelectionEvent 
			return=>page top 
			 public class SelectionEvent extends EventObject 
    
  
    
      | Field | 
      Description | 
     
    
      | 
      type
       | 
      
      protected String type=""; 
      Set "clicked" when a shape object was selected by mouse click, 
			and set "dragged" when shape objects were selected by mouse drag.
       | 
     
    
      | shapeContainers | 
      
      protected ShapeContainer[] shapeContainers=null; 
      An array storing selected shapes which are represented by 
			ShapeContainer objects.
       | 
     
    
      | clickedPoint | 
      
      protected Point2D clickedPoint=null; 
          Clicked point when a shape object was selected by mouse click. If the shape
          selection was done by a mouse drag, this field is null.
       | 
     
  
 
 
  
    
      | Method | 
      Description | 
     
    
      getType 
       | 
      
      public String getType() 
      Return the type field.
       | 
     
    
      | getSelectedContainers | 
      
      public ShapeContainer[] getSelectedContainers() 
      Return the shapeContainers field.
       | 
     
    
      | getClickedPoint | 
      
      public Point2D getClickedPoint() 
      Return the clickedPoint field.
       | 
     
  
 
  
4. Class UnselectableAreas
return=>page top 
 This class was abolished 
		because the unselectable area is limited to the text area inside an editable text box, 
		so it can be substituted by a simple method such as inEditableTextArea.
  
  
    
      | Field | 
      Description | 
     
    
      | 
      typeList
       | 
      
      ArrayList<String> typeList = new ArrayList<String>() 
      Store the string representing the kind of an unselectable area.
       | 
     
    
      | areaList | 
      
      ArrayList<Shape> areaList = new ArrayList<Shape>() 
      Store the Shape objects of unselectable areas.
       | 
     
    
      | textBoxString | 
      
      String textBoxString = "TextBox" 
       | 
     
  
 
 
  
    
      | 
       Method
        | 
      
       Description
        | 
     
    
      covers 
       | 
      
      public boolean covers(double X, double Y) 
      If (X,Y)-point is inside the unselectable areas, then return true. 
       | 
     
    
      | covers | 
      
      public boolean covers(double X, double Y, String message) 
      If (X,Y)-point is inside the unselectable areas, then return true.  
       | 
     
    
      | getShapes | 
      
      public Shape[] getShapes() 
      Get all unselectable areas from the areaList and return them as the objects
      of Shape class.
       | 
     
    
      | setUnselectableAreas | 
      
      public void setUnselectableAreas() 
      Registers unselectable areas to the typeList and areaList. 
      Currently the unselectable area is an area inside an active(editable) text
      box. So get the unselectable area by the 
			ContainerManager.getEditableTextBox method. 
       :
			 This method is called from the SelectionLS.execSelection, 
			because whether an editable text box exists or not is decided in the process of selecting a text box.
       | 
     
    
      | clearUnselectableAreas | 
      
      public void clearUnselectableAreas() 
      Clear the typeList and areaList.  
       :
			This method is called from the SelectionLS.resetSelectionLS 
			and the resetSelectionLS method is called from PageManager.
       | 
     
    
      | toString | 
      
      public String toString() 
      Return the string representing this object.
       | 
     
  
 
 |