Class AbstractDrawing

All Implemented Interfaces:
Drawing, Figure, TransformCachingFigure, PropertyBean, StyleableBean, StyleablePropertyBean, TreeNode<Figure>
Direct Known Subclasses:
AbstractViewBoxDrawing

public abstract class AbstractDrawing extends AbstractCompositeFigure implements Drawing
DrawingFigure.
Author:
Werner Randelshofer
  • Constructor Details

    • AbstractDrawing

      public AbstractDrawing()
    • AbstractDrawing

      public AbstractDrawing(double width, double height)
    • AbstractDrawing

      public AbstractDrawing(CssSize width, CssSize height)
  • Method Details

    • createNode

      public javafx.scene.Node createNode(RenderContext drawingView)
      Description copied from interface: Figure
      This method is invoked by a RenderContext, when it needs a node to create a JavaFX scene graph for a figure.

      A typical implementation should look like this:

      
       public Node createNode(RenderContext v) {
       return new ...desired subclass of Node...();
       }
       

      A figure may be rendered with multiple RenderContexts simultaneously. Each RenderContext uses this method to instantiate a JavaFX node for the figure and associate it to the figure.

      This method must create a new instance because returning an already existing instance may cause undesired side effects on other RenderContexts.

      Note that by convention this method may only be invoked by a RenderContext object.

      Specified by:
      createNode in interface Figure
      Parameters:
      drawingView - the renderer which will use the node
      Returns:
      the newly created node
    • createStyleManager

      protected StylesheetsManager<Figure> createStyleManager()
    • getCssLayoutBounds

      public CssRectangle2D getCssLayoutBounds()
      The bounds of this drawing is determined by its WIDTH and its HEIGHT.

      The bounds of the child figures does not affect the bounds of the drawing.

      Specified by:
      getCssLayoutBounds in interface Figure
      Overrides:
      getCssLayoutBounds in class AbstractCompositeFigure
      Returns:
      bounding box (0, 0, WIDTH, HEIGHT).
    • getLayoutBounds

      public javafx.geometry.Bounds getLayoutBounds()
      Description copied from interface: Figure
      The bounds that should be used for transformations of this figure.

      The bounds are given in the untransformed local coordinate space of the figure.

      This method may use caching and return incorrect results if the cache is stale. Invoke Figure.layout(org.jhotdraw8.draw.render.RenderContext) if you are not sure that the cache is valid.

      Specified by:
      getLayoutBounds in interface Figure
      Overrides:
      getLayoutBounds in class AbstractCompositeFigure
      Returns:
      the local bounds
    • getStyleManager

      public @Nullable StylesheetsManager<Figure> getStyleManager()
      Description copied from interface: Drawing
      Gets the style manager of the drawing.
      Specified by:
      getStyleManager in interface Drawing
      Returns:
      the style manager
    • updateStyleManager

      public void updateStyleManager()
      Description copied from interface: Drawing
      Updates the stylesheets in the style manager.
      Specified by:
      updateStyleManager in interface Drawing
    • reshapeInLocal

      public void reshapeInLocal(javafx.scene.transform.Transform transform)
      Description copied from interface: Figure
      Attempts to change the local bounds of the figure.

      The figure may choose to only partially change its local bounds.

      Specified by:
      reshapeInLocal in interface Figure
      Parameters:
      transform - the desired transformation in local coordinates
    • reshapeInLocal

      public void reshapeInLocal(CssSize x, CssSize y, CssSize width, CssSize height)
      Description copied from interface: Figure
      Attempts to change the local bounds of the figure.

      See {#link #reshapeInLocal(Transform)} for a description of this method.

      This method takes parameters as CssSizes. This can be used to avoid rounding errors when the figure is reshaped in non-pixel units.

      This method can forward a call to Figure.reshapeInLocal(Transform) using the following code:

      
       void reshapeInLocal(CssSize x, CssSize y, CssSize width, CssSize height) {
         Transform tx = Transforms.createReshapeTransform(getCssBoundsInLocal(), x, y, width, height);
         reshapeInLocal(tx);
       }
       
      Specified by:
      reshapeInLocal in interface Figure
      Parameters:
      x - desired x-position in parent coordinates
      y - desired y-position in parent coordinates
      width - desired width in parent coordinates, may be negative
      height - desired height in parent coordinates, may be negative
    • stylesheetChanged

      public void stylesheetChanged(RenderContext ctx)
      Description copied from interface: Figure
      This method is invoked on a figure by DrawingModel when it determines that the figure needs to apply its stylesheet again.

      The default implementation of this method calls Figure.updateCss(org.jhotdraw8.draw.render.RenderContext).

      Specified by:
      stylesheetChanged in interface Figure
      Parameters:
      ctx - the render context (optional)
    • updateNode

      public void updateNode(RenderContext ctx, javafx.scene.Node n)
      Description copied from interface: Figure
      This method is invoked by a RenderContext, when it needs to update the node which represents the scene graph in the figure.

      A figure which is composed from child figures, must addChild the nodes of its getChildren to its node. This ensures that coordinate space transformations of the composed figure are properly propagated to its getChildren.

       public void updateNode(RenderContext rc, Node n) {
           ObservableList<Node> group = ((Group) n).getChildren();
       group.clear();
       for (Figure child : children()) {
       group.addChild(rc.getNode(child));
       }
       

      A figure may be shown in multiple RenderContexts. Each RenderContext uses this method to update the a JavaFX node for the figure.

      Note that the figure must retrieve the JavaFX node from other figures from the render context by invoking rc.getNode(child) rather than creating new nodes using child.createNode(rc). This convention allows to implement a cache in the render context for the Java FX node. Also, render contexts like a drawing view need to associate input events on Java FX nodes to the corresponding figure.

      This figure does not keep track of changes that require node updates. DrawingModel to manage node updates.

      Specified by:
      updateNode in interface Figure
      Parameters:
      ctx - the render context
      n - the node which was created with Figure.createNode(org.jhotdraw8.draw.render.RenderContext)
    • updateBackground

      public void updateBackground(RenderContext ctx, javafx.scene.layout.Pane g)
    • isSuitableParent

      public boolean isSuitableParent(Figure newParent)
      Description copied from interface: Figure
      This method returns whether the provided figure is a suitable parent for this figure.
      Specified by:
      isSuitableParent in interface Figure
      Specified by:
      isSuitableParent in interface TreeNode<Figure>
      Parameters:
      newParent - The new parent figure.
      Returns:
      true if newParent is an acceptable parent