public class TLcdGXYCompositeLabelPainter extends ALcdGXYLabelPainter implements ILcdGXYLabelPainterProvider, ILcdGXYLabelEditor, ILcdGXYLabelEditorProvider
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.
Modifier and Type | Class and Description |
---|---|
static class |
TLcdGXYCompositeLabelPainter.IndexRemappingMode
Possible index remapping modes.
|
CREATING, END_CREATION, RESHAPED, START_CREATION, TRANSLATED
BODY, CREATING, HANDLES, RESHAPING, SNAPS, TRANSLATING
DEFAULT, SELECTED
Constructor and Description |
---|
TLcdGXYCompositeLabelPainter()
Creates a new composite label painter.
|
TLcdGXYCompositeLabelPainter(TLcdGXYCompositeLabelPainter.IndexRemappingMode aIndexRemappingMode)
Creates a new composite label painter using the given index remapping mode.
|
Modifier and Type | Method and Description |
---|---|
boolean |
acceptSnapTargetForLabel(Graphics aGraphics,
ILcdGXYContext aGXYContext)
Returns whether the label specified by
setObject , setLabelIndex and
setSubLabelIndex accepts the snap target in the given
ILcdGXYContext . |
void |
addLabelPainter(ILcdGXYLabelPainter aLabelPainter)
Adds the given label painter to this composite label painter.
|
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.
|
void |
addLabelPainter(ILcdGXYLabelPainter aLabelPainter,
int aIndex)
Adds the given label painter to this composite label painter at the given index.
|
Object |
clone()
Returns a new instance of this
ALcdGXYLabelPainter . |
boolean |
editLabel(Graphics aGraphics,
int aMode,
ILcdGXYContext aGXYContext)
Adapts the set
TLcdLabelLocation according to the information present in
aGXYContext. |
ILcdGXYLabelEditor |
getGXYLabelEditor(Object aObject)
Returns a valid
ILcdGXYLabelEditor for editing the labels of aObject. |
ILcdGXYLabelPainter |
getGXYLabelPainter(Object aObject)
Finds an
ILcdGXYLabelPainter that can be used to label the object passed. |
TLcdGXYCompositeLabelPainter.IndexRemappingMode |
getIndexRemappingMode()
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 |
getLabelCreationClickCount()
Returns the number of points required to initialize the label of the set
Object . |
Cursor |
getLabelCursor(Graphics aGraphics,
int aMode,
ILcdGXYContext aGXYContext)
Returns a
Cursor to indicate the type of editing aMode and
aGXYContext . |
List<ILcdGXYLabelEditor> |
getLabelEditors()
Returns a list of label editors that are used in this composite label painter.
|
List<ILcdGXYLabelPainter> |
getLabelPainters()
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 this
ILcdGXYLabelPainter can
paint/draw the labels of the set domain Object . |
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 by
setObject , setLabelIndex and
setSubLabelIndex is touched at view location (specified by
aGXYContext.getX() and aGXYContext.getY() ), considering the mode and the
ILcdGXYContext instance. |
void |
labelAnchorPointSFCT(Graphics aGraphics,
int aMode,
ILcdGXYContext aGXYContext,
Point aPointSFCT)
Sets
aPointSFCT to the anchor point of the label specified by
setObject , setLabelIndex and setSubLabelIndex . |
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 by
setObject , setLabelIndex and
setSubLabelIndex on aGraphics . |
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.
|
addPropertyChangeListener, firePropertyChangeEvent, getDisplayName, getLabelIndex, getLabelLocation, getLocationIndex, getObject, getSubLabelIndex, labelSnapTarget, removePropertyChangeListener, setDisplayName, setLabelIndex, setLabelLocation, setLocationIndex, setObject, setSubLabelIndex, supportLabelSnap
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getDisplayName, getLabelIndex, getLabelLocation, getObject, getSubLabelIndex, setLabelIndex, setLabelLocation, setObject, setSubLabelIndex
addPropertyChangeListener, removePropertyChangeListener
public TLcdGXYCompositeLabelPainter()
addLabelPainter(ILcdGXYLabelPainter)
. When using this constructor, the index remapping
mode is set to TLcdGXYCompositeLabelPainter.IndexRemappingMode.SHIFT_LABEL_INDEX
.public TLcdGXYCompositeLabelPainter(TLcdGXYCompositeLabelPainter.IndexRemappingMode aIndexRemappingMode)
addLabelPainter(ILcdGXYLabelPainter)
.aIndexRemappingMode
- an index remapping mode.public TLcdGXYCompositeLabelPainter.IndexRemappingMode getIndexRemappingMode()
setIndexRemappingMode(IndexRemappingMode)
public void setIndexRemappingMode(TLcdGXYCompositeLabelPainter.IndexRemappingMode aRemappingMode)
aRemappingMode
- the index remapping mode to be used by this composite label painter.getIndexRemappingMode()
public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter)
aLabelPainter
- a label painter.public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, int aIndex)
aLabelPainter
- a label painter.aIndex
- a given index.public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor)
aLabelPainter
- a label painter.aLabelEditor
- a label editor.public void addLabelPainter(ILcdGXYLabelPainter aLabelPainter, ILcdGXYLabelEditor aLabelEditor, int aIndex)
aLabelPainter
- a label painter.aLabelEditor
- a label editor.aIndex
- a given index.public int removeLabelPainter(ILcdGXYLabelPainter aLabelPainter)
aLabelPainter
- a label painter.-1
if this
composite label painter didn't contain the given label painter.public List<ILcdGXYLabelPainter> getLabelPainters()
public List<ILcdGXYLabelEditor> getLabelEditors()
public int getLabelCount(Graphics aGraphics, ILcdGXYContext aGXYContext)
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.
getLabelCount
in interface ILcdGXYLabelEditor
getLabelCount
in interface ILcdGXYMultiLabelPainter
getLabelCount
in class ALcdGXYLabelPainter
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.0
.public int getSubLabelCount(int aLabelIndex)
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.
getSubLabelCount
in interface ILcdGXYLabelEditor
getSubLabelCount
in interface ILcdGXYMultiLabelPainter
getSubLabelCount
in class ALcdGXYLabelPainter
aLabelIndex
- The label index for which you need to know the number of sublabels.0
.ALcdGXYLabelPainter.getLabelCount(java.awt.Graphics, com.luciad.view.gxy.ILcdGXYContext)
public Cursor getLabelCursor(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
ALcdGXYLabelPainter
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.
getLabelCursor
in interface ILcdGXYLabelPainter2
getLabelCursor
in class ALcdGXYLabelPainter
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.Cursor
to indicate the type of editing aMode
and
aGXYContext
. Returns null
if no particular
Cursor
is required.public boolean isLabelTouched(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
ILcdGXYLabelPainter2
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.
isLabelTouched
in interface ILcdGXYLabelPainter2
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.ILcdGXYContext
public void labelAnchorPointSFCT(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Point aPointSFCT) throws TLcdNoBoundsException
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.
labelAnchorPointSFCT
in interface ILcdGXYLabelPainter2
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.TLcdNoBoundsException
- if the Object doesn't have any valid anchor point, e.g. if it is
always invisible in the current projection.ILcdGXYLabelPainter2.paintLabel(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext)
,
ILcdGXYLabelPainter2.getLabelLocation()
,
ILcdGXYLabelPainter2.labelBoundsSFCT(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext, java.awt.Rectangle)
public double labelBoundsSFCT(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext, Rectangle aRectangleSFCT) throws TLcdNoBoundsException
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.
labelBoundsSFCT
in interface ILcdGXYLabelPainter
labelBoundsSFCT
in interface ILcdGXYLabelPainter2
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.TLcdNoBoundsException
- if the Object doesn't have any valid bounds, e.g. if it is always
invisible in the current projection.ILcdGXYViewLabelPainter
,
ILcdGXYLayerLabelPainter
,
ILcdGXYLabelPainter2.labelAnchorPointSFCT(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext, java.awt.Point)
public void paintLabel(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
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
paintLabel
in interface ILcdGXYLabelPainter
paintLabel
in interface ILcdGXYLabelPainter2
aGraphics
- The graphics object to paint the label onaMode
- A bitwise combination of aGXYContext
- the drawing context for the labelILcdGXYLabelPainter.DEFAULT
,
ILcdGXYLabelPainter.SELECTED
public int getPossibleLocationCount(Graphics aGraphics)
ILcdGXYLabelPainter
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.
getPossibleLocationCount
in interface ILcdGXYLabelPainter
aGraphics
- the Graphics the label will be painted on.ILcdGXYLabelPainter
can
paint/draw the labels of the set Object.ILcdGXYLabelPainter.setLocationIndex(int)
public Object clone()
ALcdGXYLabelPainter
ALcdGXYLabelPainter
. The label location
of the clone is a clone of the label location of the original. No other objects
are cloned.clone
in interface ILcdGXYLabelEditor
clone
in interface ILcdGXYLabelEditorProvider
clone
in interface ILcdGXYLabelPainter
clone
in interface ILcdGXYLabelPainter2
clone
in interface ILcdGXYLabelPainterProvider
clone
in class ALcdGXYLabelPainter
ALcdGXYLabelPainter
of which the label location
is a deep clone.public ILcdGXYLabelPainter getGXYLabelPainter(Object aObject)
ILcdGXYLabelPainterProvider
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;
}
getGXYLabelPainter
in interface ILcdGXYLabelPainterProvider
aObject
- the object to find a label painter forpublic boolean editLabel(Graphics aGraphics, int aMode, ILcdGXYContext aGXYContext)
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.
editLabel
in interface ILcdGXYLabelEditor
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.ILcdGXYContext
public int getLabelCreationClickCount()
ILcdGXYLabelEditor
Object
.getLabelCreationClickCount
in interface ILcdGXYLabelEditor
Object
or
-1 if this is undefined like for a polyline or a polygon. 0 means graphical creation
of labels is not supported.public boolean acceptSnapTargetForLabel(Graphics aGraphics, ILcdGXYContext aGXYContext)
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()
.
acceptSnapTargetForLabel
in interface ILcdGXYLabelEditor
aGraphics
- The Graphics
on which the label is painted.aGXYContext
- The ILcdGXYContext
containing the snapping information.true
if the label accepts the snap target, false
otherwise.ILcdGXYContext.getSnapTarget()
,
ILcdGXYContext.getSnapTargetLayer()
public ILcdGXYLabelEditor getGXYLabelEditor(Object aObject)
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.
getGXYLabelEditor
in interface ILcdGXYLabelEditorProvider
aObject
- the Object for which to obtain a ILcdGXYLabelEditor
.ILcdGXYLabelEditor
for editing the labels of aObject
with aObject
set on it.ILcdGXYLabelEditor.setObject(java.lang.Object)