Class TLcdGXYCompositeLabelPainter

java.lang.Object
com.luciad.view.gxy.ALcdGXYLabelPainter
com.luciad.view.gxy.painter.TLcdGXYCompositeLabelPainter
All Implemented Interfaces:
ILcdPropertyChangeSource, ILcdGXYLabelEditor, ILcdGXYLabelEditorProvider, ILcdGXYLabelPainter, ILcdGXYLabelPainter2, ILcdGXYLabelPainterProvider, ILcdGXYMultiLabelPainter, Serializable, Cloneable

public class TLcdGXYCompositeLabelPainter extends ALcdGXYLabelPainter implements ILcdGXYLabelPainterProvider, ILcdGXYLabelEditor, ILcdGXYLabelEditorProvider
This label painter composes a list of ILcdGXYLabelPainters into 1 label painter. It does so by remapping the label and sublabel indices of the delegate label painters to get consistent indices.

An advantage of using this class is that labels of the same object can be easily represented in different ways. For example one of the labels of an object can be represented by an icon (e.g. by using TLcdGXYLabelPainterAdapter) while another label can be represented textually (e.g by using TLcdGXYLabelPainter).

This label painter can also be used as ILcdLabelGXYEditor. It is not necessary to add a label editor for each label painter. In case no label editor is added for a label painter, no editing will be performed for those labels.

The remapping of the indices can be done in two ways.

1) SHIFT_LABEL_INDEX

When using this mode the label indices are shifted. For example label painter P1 has 2 labels, each with 2 sublabels, label painter P2 has 3 labels, each with one sublabel. Then the composite label painter has the following labels and sublabels :

label sublabel target label painter target label target sublabel
00P100
01P101
10P110
11P111
20P200
30P210
40P220

2) SHIFT_SUBLABEL_INDEX

When using this mode the sublabel indices are shifted. For example label painter P1 has 2 labels, each with 2 sublabels, label painter P2 has 3 labels, each with one sublabel. Then the composite label painter has the following labels and sublabels :

label sublabel target label painter target label target sublabel
00P100
01P101
02P200
10P110
11P111
12P210
20P220

Note :

This painter passes ( null, null ) to the delegate label painter's getLabelCount method. The delegate label painter should take this into account.

Since:
10.1
See Also:
  • Constructor Details

  • Method Details

    • getIndexRemappingMode

      public TLcdGXYCompositeLabelPainter.IndexRemappingMode getIndexRemappingMode()
      Returns the index remapping mode used by this composite label painter.
      Returns:
      the index remapping mode used by this composite label painter.
      See Also:
    • setIndexRemappingMode

      public void setIndexRemappingMode(TLcdGXYCompositeLabelPainter.IndexRemappingMode aRemappingMode)
      Sets the index remapping mode to be used by this composite label painter.
      Parameters:
      aRemappingMode - the index remapping mode to be used by this composite label painter.
      See Also:
    • addLabelPainter

      public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter)
      Adds the given label painter to this composite label painter.
      Parameters:
      aLabelPainter - a label painter.
    • addLabelPainter

      public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, int aIndex)
      Adds the given label painter to this composite label painter at the given index.
      Parameters:
      aLabelPainter - a label painter.
      aIndex - a given index.
    • addLabelPainter

      public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor)
      Adds the given label painter and editor to this composite label painter.
      Parameters:
      aLabelPainter - a label painter.
      aLabelEditor - a label editor.
    • addLabelPainter

      public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor, int aIndex)
      Adds the given label painter and editor to this composite label painter at the given index.
      Parameters:
      aLabelPainter - a label painter.
      aLabelEditor - a label editor.
      aIndex - a given index.
    • removeLabelPainter

      public int removeLabelPainter(ILcdGXYLabelPainter aLabelPainter)
      Removes the given label painter from this composite label painter.
      Parameters:
      aLabelPainter - a label painter.
      Returns:
      the index at which the removed label painter was stored or -1 if this composite label painter didn't contain the given label painter.
    • getLabelPainters

      public List<ILcdGXYLabelPainter> getLabelPainters()
      Returns a list of label painters that are used in this composite label painter. Modifying this list will have no effect on this composite label painter.
      Returns:
      a list of label painters that are used in this composite label painter.
    • getLabelEditors

      public List<ILcdGXYLabelEditor> getLabelEditors()
      Returns a list of label editors that are used in this composite label painter. Modifying this list will have no effect on this composite label painter.
      Returns:
      a list of label editors that are used in this composite label painter.
    • getLabelCount

      public int getLabelCount(Graphics aGraphics, ILcdGXYContext aGXYContext)
      Description copied from class: ALcdGXYLabelPainter

      Return the number of labels for the currently set object. The default implementation returns 1. Override this method if you need to support multiple labels.

      Specified by:
      getLabelCount in interface ILcdGXYLabelEditor
      Specified by:
      getLabelCount in interface ILcdGXYMultiLabelPainter
      Overrides:
      getLabelCount in class ALcdGXYLabelPainter
      Parameters:
      aGraphics - The Graphics instance on which the labels would be painted.
      aGXYContext - The context containing information about the layer and the view for which the label would be drawn.
      Returns:
      The number of labels for the set object. This should be greater than 0.
    • getSubLabelCount

      public int getSubLabelCount(int aLabelIndex)
      Description copied from class: ALcdGXYLabelPainter

      Returns the number of sublabels for the set object and the given label index. The default implementation returns 1. Override this method if you need to support multiple sublabels.

      Specified by:
      getSubLabelCount in interface ILcdGXYLabelEditor
      Specified by:
      getSubLabelCount in interface ILcdGXYMultiLabelPainter
      Overrides:
      getSubLabelCount in class ALcdGXYLabelPainter
      Parameters:
      aLabelIndex - The label index for which you need to know the number of sublabels.
      Returns:
      The number of sublabels. This should be greater than 0.
      See Also:
    • getLabelCursor

      public Cursor getLabelCursor(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
      Description copied from class: ALcdGXYLabelPainter
      Returns a Cursor to indicate the type of editing aMode and aGXYContext.

      This default implementation always returns null. Override this method if you want to display custom cursors.

      Specified by:
      getLabelCursor in interface ILcdGXYLabelPainter2
      Overrides:
      getLabelCursor in class ALcdGXYLabelPainter
      Parameters:
      aGraphics - The Graphics instance on which the label is painted.
      aMode - The mode to consider. See ILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, ILcdGXYContext) for more information.
      aGXYContext - The ILcdGXYContext containing extra information, such as the layer, the view and the mouse position.
      Returns:
      a Cursor to indicate the type of editing aMode and aGXYContext. Returns null if no particular Cursor is required.
    • isLabelTouched

      public boolean isLabelTouched(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
      Description copied from interface: ILcdGXYLabelPainter2
      Tests if the label specified by setObject, setLabelIndex and setSubLabelIndex is touched at view location (specified by aGXYContext.getX() and aGXYContext.getY()), considering the mode and the ILcdGXYContext instance.

      Before calling this method, the domain object, the label index, the sublabel index and the location of the label should be set using the respective methods.

      Specified by:
      isLabelTouched in interface ILcdGXYLabelPainter2
      Parameters:
      aGraphics - The Graphics instance on which the label is painted.
      aMode - the mode to consider. This is a bitwise combinations of several constants. See ILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext) for more information.
      aGXYContext - the ILcdGXYContext to consider.
      Returns:
      true if the representation of the Object returned by getObject() is touched, false otherwise
      See Also:
    • labelAnchorPointSFCT

      public void labelAnchorPointSFCT(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Point aPointSFCT) throws TLcdNoBoundsException
      Description copied from interface: ILcdGXYLabelPainter2

      Sets aPointSFCT to the anchor point of the label specified by setObject, setLabelIndex and setSubLabelIndex.

      If the location index is less than 0, the label anchor point is unambiguously determined by the label location. The actual label is to be painted somewhere around this anchor point. This method is typically called to compare the result with the label bounds, thus determining the exact relation between the label and its location.

      Before calling this method, the domain object, the label index, the sublabel index and the location of the label should be set using the respective methods.

      Specified by:
      labelAnchorPointSFCT in interface ILcdGXYLabelPainter2
      Parameters:
      aGraphics - The Graphics instance on which the label is painted.
      aMode - The mode to consider. This can be a bitwise combination of several constants. See ILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext) for more information.
      aGXYContext - The ILcdGXYContext that can be used to retrieve extra information.
      aPointSFCT - The point which will be updated to reflect the location of the anchor point.
      Throws:
      TLcdNoBoundsException - if the Object doesn't have any valid anchor point, e.g. if it is always invisible in the current projection.
      See Also:
    • labelBoundsSFCT

      public double labelBoundsSFCT(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Rectangle aRectangleSFCT) throws TLcdNoBoundsException
      Description copied from interface: ILcdGXYLabelPainter2

      Calculates the bounds of the label that can be painted. The bounds are set as a side effect in aRectangleSFCT, the orientation of aRectangleSFCT is returned as an angle.

      The bounds represent the upper left point of the label, and a width and a height. The rotation value represents the rotation of the label bounds around the upper left point.

      The domain object, the label index, the sublabel index and the location of the label for which the bounds are retrieved should be set before calling this method using the respective methods.

      Note that if this label painter is used in conjunction with a labeling algorithm, the bounds should preferably be independent of the location, as this will yield the best results.

      Specified by:
      labelBoundsSFCT in interface ILcdGXYLabelPainter
      Specified by:
      labelBoundsSFCT in interface ILcdGXYLabelPainter2
      Parameters:
      aGraphics - the aGraphics to consider.
      aMode - the representation mode of the label.
      aGXYContext - the ILcdGXYContext the drawing depends on.
      aRectangleSFCT - the Rectangle containing the bounds of the label in view / graphics coordinates as side effect.
      Returns:
      the angle orientation of the rectangle around the labels in RADIANs, clockwise, 0 at 3 o'clock.
      Throws:
      TLcdNoBoundsException - if the Object doesn't have any valid bounds, e.g. if it is always invisible in the current projection.
      See Also:
    • paintLabel

      public void paintLabel(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
      Description copied from interface: ILcdGXYLabelPainter2

      Paints the label specified by setObject, setLabelIndex and setSubLabelIndex on aGraphics. aGXYContext should contain the ILcdGXYView for which the label is painted and ILcdGXYLayer to which the object belongs

      The implementation of this method shall define how to paint the specified label in the given mode, considering aGXYContext and the set TLcdLabelLocation.

      The domain object, label index, sublabel index and the label location should be set before calling this method using the respective methods.

      This interface extends the original contract of the paintLabel method to allow for more modes. Where in the super interface the mode could only be one of ILcdGXYLabelPainter.DEFAULT or ILcdGXYLabelPainter.SELECTED, the mode now can be a bitwise combination of several constants

      Specified by:
      paintLabel in interface ILcdGXYLabelPainter
      Specified by:
      paintLabel in interface ILcdGXYLabelPainter2
      Parameters:
      aGraphics - The graphics object to paint the label on
      aMode - A bitwise combination of
      aGXYContext - the drawing context for the label
      See Also:
    • getPossibleLocationCount

      public int getPossibleLocationCount(Graphics aGraphics)
      Description copied from interface: ILcdGXYLabelPainter
      Returns the number of possible locations where this ILcdGXYLabelPainter can paint/draw the labels of the set domain Object.

      The domain Object for which the location count is retrieved should be set before calling this method using the ILcdGXYLabelPainter.setObject(java.lang.Object) method.

      Specified by:
      getPossibleLocationCount in interface ILcdGXYLabelPainter
      Parameters:
      aGraphics - the Graphics the label will be painted on.
      Returns:
      the number of possible locations where this ILcdGXYLabelPainter can paint/draw the labels of the set Object.
      See Also:
    • clone

      public Object clone()
      Description copied from class: ALcdGXYLabelPainter
      Returns a new instance of this ALcdGXYLabelPainter. The label location of the clone is a clone of the label location of the original. No other objects are cloned.
      Specified by:
      clone in interface ILcdGXYLabelEditor
      Specified by:
      clone in interface ILcdGXYLabelEditorProvider
      Specified by:
      clone in interface ILcdGXYLabelPainter
      Specified by:
      clone in interface ILcdGXYLabelPainter2
      Specified by:
      clone in interface ILcdGXYLabelPainterProvider
      Overrides:
      clone in class ALcdGXYLabelPainter
      Returns:
      A new instance of this ALcdGXYLabelPainter of which the label location is a deep clone.
    • getGXYLabelPainter

      public ILcdGXYLabelPainter getGXYLabelPainter(Object aObject)
      Description copied from interface: ILcdGXYLabelPainterProvider
      Finds an ILcdGXYLabelPainter that can be used to label the object passed.

      The label painter provider is responsible for setting the object to the label painter before returning the label painter. An implementation should therefore have the following structure:

      
       public ILcdGXYLabelPainter getGXYLabelPainter(Object aObject) {
         ILcdGXYLabelPainter labelPainter = ... // find the label painter for the object
         if (labelPainter != null) {
          labelPainter.setObject(aObject);
         }
         return labelPainter;
       }
       

      Specified by:
      getGXYLabelPainter in interface ILcdGXYLabelPainterProvider
      Parameters:
      aObject - the object to find a label painter for
      Returns:
      a label painter that can be used to label the object; or null if no label painter could be found for the given object, or the object could not be set on the retrieved label painter.
    • editLabel

      public boolean editLabel(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
      Description copied from interface: ILcdGXYLabelEditor

      Adapts the set TLcdLabelLocation according to the information present in aGXYContext. If the method returns true, the TLcdLabelLocation was modified, if false is returned, it wasn't changed.

      The implementation of this method shall define how to edit the label specified by the set domain Object , label index and sublabel index, considering the given mode and aGXYContext. These should all be set before calling this method. Note that if aMode is one of the creating modes, the (sub) label indices are irrelevant.

      Specified by:
      editLabel in interface ILcdGXYLabelEditor
      Parameters:
      aGraphics - The Graphics on which the label is painted.
      aMode - the mode to consider when editing aObject: aMode shall be a combination of
      • ILcdGXYLabelEditor.TRANSLATED,
      • ILcdGXYLabelEditor.RESHAPED,
      • ILcdGXYLabelEditor.START_CREATION,
      • ILcdGXYLabelEditor.CREATING,
      • ILcdGXYLabelEditor.END_CREATION.
      .
      aGXYContext - contains the information to consider when editing the set Object.
      Returns:
      true if the label of the set Object has changed, false otherwise.
      See Also:
    • getLabelCreationClickCount

      public int getLabelCreationClickCount()
      Description copied from interface: ILcdGXYLabelEditor
      Returns the number of points required to initialize the label of the set Object.
      Specified by:
      getLabelCreationClickCount in interface ILcdGXYLabelEditor
      Returns:
      the number of points required to initialize the label of the set Object or -1 if this is undefined like for a polyline or a polygon. 0 means graphical creation of labels is not supported.
    • acceptSnapTargetForLabel

      public boolean acceptSnapTargetForLabel(Graphics aGraphics, ILcdGXYContext aGXYContext)
      Description copied from interface: ILcdGXYLabelEditor

      Returns whether the label specified by setObject, setLabelIndex and setSubLabelIndex accepts the snap target in the given ILcdGXYContext.

      The snap target is the Object returned by aGXYContext.getSnapTarget(), and is on the ILcdGXYLayer returned by aGXYContext.getSnapTargetLayer().

      Specified by:
      acceptSnapTargetForLabel in interface ILcdGXYLabelEditor
      Parameters:
      aGraphics - The Graphics on which the label is painted.
      aGXYContext - The ILcdGXYContext containing the snapping information.
      Returns:
      true if the label accepts the snap target, false otherwise.
      See Also:
    • getGXYLabelEditor

      public ILcdGXYLabelEditor getGXYLabelEditor(Object aObject)
      Description copied from interface: ILcdGXYLabelEditorProvider

      Returns a valid ILcdGXYLabelEditor for editing the labels of aObject. The returned ILcdGXYLabelEditor must have aObject set on it. The TLcdLabelLocation must not yet be set on it.

      Specified by:
      getGXYLabelEditor in interface ILcdGXYLabelEditorProvider
      Parameters:
      aObject - the Object for which to obtain a ILcdGXYLabelEditor.
      Returns:
      a valid ILcdGXYLabelEditor for editing the labels of aObject with aObject set on it.
      See Also: