kaapo.project.graphics
Class ConnectionGraphics

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by kaapo.project.graphics.DCGraphics
                  extended by kaapo.project.graphics.ConnectionGraphics
All Implemented Interfaces:
ImageObserver, MenuContainer, Serializable, Observer
Direct Known Subclasses:
AssociationGraphics, DataFlowGraphics, DependencyGraphics, GeneralizationGraphics

public class ConnectionGraphics
extends DCGraphics

A general graphics class for connections, with versatile arrow heads. Start and end line heads and line stroke (normal or dashed) can be customized.

The line is divided into three parts: start head, regular connection line and end head. The heads may be missing. Heads are are instances of LineHead. LineHead gives a graphic shape of the head that is drawn by ConnectionGraphics.

The connection line may also have a graphic text component that is used to render connection name or some other attribute. Currently, the text can't be edited directly and is limited to one-line text.

Author:
hkovaska
See Also:
LineHead, Serialized Form

Nested Class Summary
static class ConnectionGraphics.LineType
           
 
Nested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BltBufferStrategy, Component.FlipBufferStrategy
 
Field Summary
protected  String centerTextAttributeName
           
protected  TextLayout centerTextLayout
           
protected  double centerTextX
           
protected  double centerTextY
           
protected  GeneralPath connectionBoundary
           
protected  ConnectionWrapper cwrapper
           
protected  GeneralPath endArrowShape
           
protected  LineHead endHead
           
protected  GeneralPath lineShape
           
protected  ConnectionGraphics.LineType lineType
           
protected static double OUTER_BOUNDARY_MARGIN
           
protected  Shape outerBoundary
           
protected  GeneralPath startArrowShape
           
protected  LineHead startHead
           
protected static double TEXT_DISTANCE_FROM_LINE
           
 
Fields inherited from class kaapo.project.graphics.DCGraphics
dc, dcw, pm
 
Fields inherited from class javax.swing.JComponent
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
ConnectionGraphics(DiagramComponent dc, ConnectionWrapper cw, ProjectManager pm, ConnectionGraphics.LineType lineType, LineHead startHead, LineHead endHead)
          Constructs the connection graphics with no text field.
ConnectionGraphics(DiagramComponent dc, ConnectionWrapper cw, ProjectManager pm, ConnectionGraphics.LineType lineType, LineHead startHead, LineHead endHead, String centerTextAttributeName)
          Constructs the connection graphics with text in center.
 
Method Summary
protected  GeneralPath buildLinePath(double translateX, double translateY)
          Builds the path for the regular line (between the heads).
protected  Point2D calcCenterTextStartPoint(double width, double height)
          Calculates the coordinates for center text area.
protected  Point2D calcEndHeadStartPoint(double translateX, double translateY)
          Calculates the starting point of the end head.
protected  Shape calcOuterBoundary()
          Calculates the outer boundary which is used for mouse hit checks.
protected  Point2D calcStartHeadEndPoint(double translateX, double translateY)
          Calculates the ending point of the start head.
 Shape getConnectionBoundary()
          Returns the boundary where connection points may be attached.
 Shape getOuterBoundary()
          Returns the outer boundary (shape) of graphical representation of the element.
protected  void paintComponent(Graphics g)
           
 void removeObserver()
          This method should be called before disposing an observer.
 void update(Observable observable, Object message)
          This method is called whenever the observed object is changed.
 void updateDCGraphics()
          Update the graphical appearance after element properties have been changed.
 
Methods inherited from class kaapo.project.graphics.DCGraphics
calcConnectionIntersectPoint, getDiagramComponent, getDiagramComponentWrapper, getHotSpots, getProjectManager, updateDCGraphicsLater
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getAccessibleContext, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getWidth, getVisibleRect, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

OUTER_BOUNDARY_MARGIN

protected static final double OUTER_BOUNDARY_MARGIN
See Also:
Constant Field Values

TEXT_DISTANCE_FROM_LINE

protected static final double TEXT_DISTANCE_FROM_LINE
See Also:
Constant Field Values

cwrapper

protected ConnectionWrapper cwrapper

lineType

protected ConnectionGraphics.LineType lineType

startHead

protected LineHead startHead

endHead

protected LineHead endHead

startArrowShape

protected GeneralPath startArrowShape

endArrowShape

protected GeneralPath endArrowShape

lineShape

protected GeneralPath lineShape

outerBoundary

protected Shape outerBoundary

connectionBoundary

protected GeneralPath connectionBoundary

centerTextAttributeName

protected String centerTextAttributeName

centerTextLayout

protected TextLayout centerTextLayout

centerTextX

protected double centerTextX

centerTextY

protected double centerTextY
Constructor Detail

ConnectionGraphics

public ConnectionGraphics(DiagramComponent dc,
                          ConnectionWrapper cw,
                          ProjectManager pm,
                          ConnectionGraphics.LineType lineType,
                          LineHead startHead,
                          LineHead endHead,
                          String centerTextAttributeName)
Constructs the connection graphics with text in center.

Parameters:
dc - Associated diagram component (connection)
cw - Associated connection wrapper
pm - Project Manager that is used for attribute modification (in the future)
lineType - Drawing style of the head
startHead - Start head, may be null
endHead - End head, may be null
centerTextAttributeName - Name of the attribute that is used to display text in the center of the connection.

ConnectionGraphics

public ConnectionGraphics(DiagramComponent dc,
                          ConnectionWrapper cw,
                          ProjectManager pm,
                          ConnectionGraphics.LineType lineType,
                          LineHead startHead,
                          LineHead endHead)
Constructs the connection graphics with no text field.

Method Detail

getOuterBoundary

public Shape getOuterBoundary()
Description copied from class: DCGraphics
Returns the outer boundary (shape) of graphical representation of the element. The boundary can be used for checking whether a mouse click is inside the element. The shape closely follows the borders of the element: for a circular element, the shape is circular as well. If an enclosing rectangle is needed, it can be obtained from the Shape instance with Shape.getBounds2D(). For connection types, the outer boundary should be larger than the actual connection line, since it is hard to select a 1 pixel wide line with the mouse.

Specified by:
getOuterBoundary in class DCGraphics
Returns:
area around the DiagramComponent.

getConnectionBoundary

public Shape getConnectionBoundary()
Description copied from class: DCGraphics
Returns the boundary where connection points may be attached. For solid-shape elements, this is usually the shape itself. For other shapes, an appropriate boundary must be created. The default implementation simply call getOuterBoundary and this should be fine for rectangular elements. If you need to fine-tune the boundary, override this method.

Overrides:
getConnectionBoundary in class DCGraphics
Returns:
boundaries for connecting

updateDCGraphics

public void updateDCGraphics()
Description copied from class: DCGraphics
Update the graphical appearance after element properties have been changed. This method is called when other parties have modified the diagram component. Example: the element is present in several diagrams (and thus has several DiagramComponentWrapper's) and a global attribute of the element is modiefied in another diagram. Then, update() must be called for all DCGraphics instances for the element.

Specified by:
updateDCGraphics in class DCGraphics

calcStartHeadEndPoint

protected Point2D calcStartHeadEndPoint(double translateX,
                                        double translateY)
Calculates the ending point of the start head. This is the point where the regular line begins.

Parameters:
translateX - X coordinate to be added to the point
translateY - Y coordinate to be added to the point

calcEndHeadStartPoint

protected Point2D calcEndHeadStartPoint(double translateX,
                                        double translateY)
Calculates the starting point of the end head. This is the point where the regular line ends.

Parameters:
translateX - X coordinate to be added to the point
translateY - Y coordinate to be added to the point

calcCenterTextStartPoint

protected Point2D calcCenterTextStartPoint(double width,
                                           double height)
Calculates the coordinates for center text area.

Parameters:
width - Width of the text area
height - Height of the text area

buildLinePath

protected GeneralPath buildLinePath(double translateX,
                                    double translateY)
Builds the path for the regular line (between the heads).

Parameters:
translateX - X coordinate to be added to the path
translateY - Y coordinate to be added to the path
Returns:
area around the connection line

calcOuterBoundary

protected Shape calcOuterBoundary()
Calculates the outer boundary which is used for mouse hit checks. The boundary is made of four-point polygons. It follows the line path, but is OUTER_BOUNDARY_MARGIN pixel wide.


paintComponent

protected void paintComponent(Graphics g)
Overrides:
paintComponent in class JComponent

update

public void update(Observable observable,
                   Object message)
Description copied from interface: Observer
This method is called whenever the observed object is changed. An application calls an Observable object's notifyObservers method to have all the object's observers notified of the change.

It's safe to modify the subject's observer list from update method. It won't affect the current notify round though, but the next.

Specified by:
update in interface Observer
Overrides:
update in class DCGraphics
Parameters:
observable - the subject that fires the update
message - the message delivered to observer

removeObserver

public void removeObserver()
Description copied from interface: Observer
This method should be called before disposing an observer. The implementation should take care to save reference to observable so that it can remove itself from observables observer list whern asked.

The reason for this is that the observer will remain in memory as long as there is references to it in it's observables' observer list. Observer will also receive updates until it's removed from all lists.

Specified by:
removeObserver in interface Observer
Overrides:
removeObserver in class DCGraphics