Class TLcdGXYCompositeLabelPainter
- All Implemented Interfaces:
ILcdPropertyChangeSource
,ILcdGXYLabelEditor
,ILcdGXYLabelEditorProvider
,ILcdGXYLabelPainter
,ILcdGXYLabelPainter2
,ILcdGXYLabelPainterProvider
,ILcdGXYMultiLabelPainter
,Serializable
,Cloneable
ILcdGXYLabelPainter
s 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.
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 |
---|---|---|---|---|
0 | 0 | P1 | 0 | 0 |
0 | 1 | P1 | 0 | 1 |
1 | 0 | P1 | 1 | 0 |
1 | 1 | P1 | 1 | 1 |
2 | 0 | P2 | 0 | 0 |
3 | 0 | P2 | 1 | 0 |
4 | 0 | P2 | 2 | 0 |
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 |
---|---|---|---|---|
0 | 0 | P1 | 0 | 0 |
0 | 1 | P1 | 0 | 1 |
0 | 2 | P2 | 0 | 0 |
1 | 0 | P1 | 1 | 0 |
1 | 1 | P1 | 1 | 1 |
1 | 2 | P2 | 1 | 0 |
2 | 0 | P2 | 2 | 0 |
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:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic enum
Possible index remapping modes. -
Field Summary
Fields inherited from interface com.luciad.view.gxy.ILcdGXYLabelEditor
CREATING, END_CREATION, RESHAPED, START_CREATION, TRANSLATED
Fields inherited from interface com.luciad.view.gxy.ILcdGXYLabelPainter
DEFAULT, SELECTED
Fields inherited from interface com.luciad.view.gxy.ILcdGXYLabelPainter2
BODY, CREATING, HANDLES, RESHAPING, SNAPS, TRANSLATING
-
Constructor Summary
ConstructorDescriptionCreates a new composite label painter.TLcdGXYCompositeLabelPainter
(TLcdGXYCompositeLabelPainter.IndexRemappingMode aIndexRemappingMode) Creates a new composite label painter using the given index remapping mode. -
Method Summary
Modifier and TypeMethodDescriptionboolean
acceptSnapTargetForLabel
(Graphics aGraphics, ILcdGXYContext aGXYContext) Returns whether the label specified bysetObject
,setLabelIndex
andsetSubLabelIndex
accepts the snap target in the givenILcdGXYContext
.void
addLabelPainter
(ILcdGXYLabelPainter aLabelPainter) Adds the given label painter to this composite label painter.void
addLabelPainter
(ILcdGXYLabelPainter aLabelPainter, int aIndex) Adds the given label painter to this composite label painter at the given index.void
addLabelPainter
(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor) Adds the given label painter and editor to this composite label painter.void
addLabelPainter
(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor, int aIndex) Adds the given label painter and editor to this composite label painter at the given index.clone()
Returns a new instance of thisALcdGXYLabelPainter
.boolean
editLabel
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext) Adapts the setTLcdLabelLocation
according to the information present in aGXYContext.getGXYLabelEditor
(Object aObject) Returns a validILcdGXYLabelEditor
for editing the labels of aObject.getGXYLabelPainter
(Object aObject) Finds anILcdGXYLabelPainter
that can be used to label the object passed.Returns the index remapping mode used by this composite label painter.int
getLabelCount
(Graphics aGraphics, ILcdGXYContext aGXYContext) Return the number of labels for the currently set object.int
Returns the number of points required to initialize the label of the setObject
.getLabelCursor
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext) Returns aCursor
to indicate the type of editingaMode
andaGXYContext
.Returns a list of label editors that are used in this composite label painter.Returns a list of label painters that are used in this composite label painter.int
getPossibleLocationCount
(Graphics aGraphics) Returns the number of possible locations where thisILcdGXYLabelPainter
can paint/draw the labels of the set domainObject
.int
getSubLabelCount
(int aLabelIndex) Returns the number of sublabels for the set object and the given label index.boolean
isLabelTouched
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext) Tests if the label specified bysetObject
,setLabelIndex
andsetSubLabelIndex
is touched at view location(specified by aGXYContext.getX()
andaGXYContext.getY()
), considering the mode and theILcdGXYContext
instance.void
labelAnchorPointSFCT
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Point aPointSFCT) SetsaPointSFCT
to the anchor point of the label specified bysetObject
,setLabelIndex
andsetSubLabelIndex
.double
labelBoundsSFCT
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Rectangle aRectangleSFCT) Calculates the bounds of the label that can be painted.void
paintLabel
(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext) Paints the label specified bysetObject
,setLabelIndex
andsetSubLabelIndex
onaGraphics
.int
removeLabelPainter
(ILcdGXYLabelPainter aLabelPainter) Removes the given label painter from this composite label painter.void
setIndexRemappingMode
(TLcdGXYCompositeLabelPainter.IndexRemappingMode aRemappingMode) Sets the index remapping mode to be used by this composite label painter.Methods inherited from class com.luciad.view.gxy.ALcdGXYLabelPainter
addPropertyChangeListener, firePropertyChangeEvent, getDisplayName, getLabelIndex, getLabelLocation, getLocationIndex, getObject, getSubLabelIndex, labelSnapTarget, removePropertyChangeListener, setDisplayName, setLabelIndex, setLabelLocation, setLocationIndex, setObject, setSubLabelIndex, supportLabelSnap
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.luciad.view.gxy.ILcdGXYLabelEditor
getDisplayName, getLabelIndex, getLabelLocation, getObject, getSubLabelIndex, setLabelIndex, setLabelLocation, setObject, setSubLabelIndex
Methods inherited from interface com.luciad.util.ILcdPropertyChangeSource
addPropertyChangeListener, removePropertyChangeListener
-
Constructor Details
-
TLcdGXYCompositeLabelPainter
public TLcdGXYCompositeLabelPainter()Creates a new composite label painter. The delegate label painters should first be set usingaddLabelPainter(ILcdGXYLabelPainter)
. When using this constructor, the index remapping mode is set toTLcdGXYCompositeLabelPainter.IndexRemappingMode.SHIFT_LABEL_INDEX
. -
TLcdGXYCompositeLabelPainter
public TLcdGXYCompositeLabelPainter(TLcdGXYCompositeLabelPainter.IndexRemappingMode aIndexRemappingMode) Creates a new composite label painter using the given index remapping mode. The delegate label painters should first be set usingaddLabelPainter(ILcdGXYLabelPainter)
.- Parameters:
aIndexRemappingMode
- an index remapping mode.
-
-
Method Details
-
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
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
Adds the given label painter to this composite label painter.- Parameters:
aLabelPainter
- a label painter.
-
addLabelPainter
Adds the given label painter to this composite label painter at the given index.- Parameters:
aLabelPainter
- a label painter.aIndex
- a given index.
-
addLabelPainter
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
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
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
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
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 interfaceILcdGXYLabelEditor
- Specified by:
getLabelCount
in interfaceILcdGXYMultiLabelPainter
- Overrides:
getLabelCount
in classALcdGXYLabelPainter
- Parameters:
aGraphics
- TheGraphics
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 interfaceILcdGXYLabelEditor
- Specified by:
getSubLabelCount
in interfaceILcdGXYMultiLabelPainter
- Overrides:
getSubLabelCount
in classALcdGXYLabelPainter
- 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
Description copied from class:ALcdGXYLabelPainter
Returns aCursor
to indicate the type of editingaMode
andaGXYContext
.This default implementation always returns
null
. Override this method if you want to display custom cursors.- Specified by:
getLabelCursor
in interfaceILcdGXYLabelPainter2
- Overrides:
getLabelCursor
in classALcdGXYLabelPainter
- Parameters:
aGraphics
- TheGraphics
instance on which the label is painted.aMode
- The mode to consider. SeeILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, ILcdGXYContext)
for more information.aGXYContext
- TheILcdGXYContext
containing extra information, such as the layer, the view and the mouse position.- Returns:
- a
Cursor
to indicate the type of editingaMode
andaGXYContext
. Returnsnull
if no particularCursor
is required.
-
isLabelTouched
Description copied from interface:ILcdGXYLabelPainter2
Tests if the label specified bysetObject
,setLabelIndex
andsetSubLabelIndex
is touched at view location(specified by aGXYContext.getX()
andaGXYContext.getY()
), considering the mode and theILcdGXYContext
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 interfaceILcdGXYLabelPainter2
- Parameters:
aGraphics
- TheGraphics
instance on which the label is painted.aMode
- the mode to consider. This is a bitwise combinations of several constants. SeeILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext)
for more information.aGXYContext
- theILcdGXYContext
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 bysetObject
,setLabelIndex
andsetSubLabelIndex
.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 thelabel
and itslocation
.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 interfaceILcdGXYLabelPainter2
- Parameters:
aGraphics
- TheGraphics
instance on which the label is painted.aMode
- The mode to consider. This can be a bitwise combination of several constants. SeeILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext)
for more information.aGXYContext
- TheILcdGXYContext
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 ofaRectangleSFCT
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 interfaceILcdGXYLabelPainter
- Specified by:
labelBoundsSFCT
in interfaceILcdGXYLabelPainter2
- Parameters:
aGraphics
- theaGraphics
to consider.aMode
- the representation mode of the label.aGXYContext
- theILcdGXYContext
the drawing depends on.aRectangleSFCT
- theRectangle
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
Description copied from interface:ILcdGXYLabelPainter2
Paints the label specified by
setObject
,setLabelIndex
andsetSubLabelIndex
onaGraphics
.aGXYContext
should contain theILcdGXYView
for which the label is painted andILcdGXYLayer
to which the object belongsThe implementation of this method shall define how to paint the specified label in the given mode, considering
aGXYContext
and the setTLcdLabelLocation
.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
orILcdGXYLabelPainter.SELECTED
, the mode now can be a bitwise combination of several constants- Specified by:
paintLabel
in interfaceILcdGXYLabelPainter
- Specified by:
paintLabel
in interfaceILcdGXYLabelPainter2
- Parameters:
aGraphics
- The graphics object to paint the label onaMode
- A bitwise combination ofaGXYContext
- the drawing context for the label- See Also:
-
getPossibleLocationCount
Description copied from interface:ILcdGXYLabelPainter
Returns the number of possible locations where thisILcdGXYLabelPainter
can paint/draw the labels of the set domainObject
.The domain
Object
for which the location count is retrieved should be set before calling this method using theILcdGXYLabelPainter.setObject(java.lang.Object)
method.- Specified by:
getPossibleLocationCount
in interfaceILcdGXYLabelPainter
- 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
Description copied from class:ALcdGXYLabelPainter
Returns a new instance of thisALcdGXYLabelPainter
. 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 interfaceILcdGXYLabelEditor
- Specified by:
clone
in interfaceILcdGXYLabelEditorProvider
- Specified by:
clone
in interfaceILcdGXYLabelPainter
- Specified by:
clone
in interfaceILcdGXYLabelPainter2
- Specified by:
clone
in interfaceILcdGXYLabelPainterProvider
- Overrides:
clone
in classALcdGXYLabelPainter
- Returns:
- A new instance of this
ALcdGXYLabelPainter
of which the label location is a deep clone.
-
getGXYLabelPainter
Description copied from interface:ILcdGXYLabelPainterProvider
Finds anILcdGXYLabelPainter
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 interfaceILcdGXYLabelPainterProvider
- 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
Description copied from interface:ILcdGXYLabelEditor
Adapts the set
TLcdLabelLocation
according to the information present in aGXYContext. If the method returnstrue
, theTLcdLabelLocation
was modified, iffalse
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 andaGXYContext
. These should all be set before calling this method. Note that ifaMode
is one of the creating modes, the (sub) label indices are irrelevant.- Specified by:
editLabel
in interfaceILcdGXYLabelEditor
- Parameters:
aGraphics
- TheGraphics
on which the label is painted.aMode
- the mode to consider when editing aObject: aMode shall be a combination ofILcdGXYLabelEditor.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 setObject
.- Specified by:
getLabelCreationClickCount
in interfaceILcdGXYLabelEditor
- 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
Description copied from interface:ILcdGXYLabelEditor
Returns whether the label specified by
setObject
,setLabelIndex
andsetSubLabelIndex
accepts the snap target in the givenILcdGXYContext
.The snap target is the
Object
returned byaGXYContext.getSnapTarget()
, and is on theILcdGXYLayer
returned byaGXYContext.getSnapTargetLayer()
.- Specified by:
acceptSnapTargetForLabel
in interfaceILcdGXYLabelEditor
- Parameters:
aGraphics
- TheGraphics
on which the label is painted.aGXYContext
- TheILcdGXYContext
containing the snapping information.- Returns:
true
if the label accepts the snap target,false
otherwise.- See Also:
-
getGXYLabelEditor
Description copied from interface:ILcdGXYLabelEditorProvider
Returns a valid
ILcdGXYLabelEditor
for editing the labels of aObject. The returnedILcdGXYLabelEditor
must haveaObject
set on it. The TLcdLabelLocation must not yet be set on it.- Specified by:
getGXYLabelEditor
in interfaceILcdGXYLabelEditorProvider
- Parameters:
aObject
- the Object for which to obtain aILcdGXYLabelEditor
.- Returns:
- a valid
ILcdGXYLabelEditor
for editing the labels ofaObject
withaObject
set on it. - See Also:
-