Class ALcdGXYDiscretePlacementsLabelingAlgorithm
- All Implemented Interfaces:
ILcdCloneable,ILcdGXYLabelingAlgorithm,Cloneable
- Direct Known Subclasses:
ALcdGXYDiscretePlacementsLabelingAlgorithmWrapper,TLcdGXYCompositeDiscretePlacementsLabelingAlgorithm,TLcdGXYCurvedPathLabelingAlgorithm,TLcdGXYInPathLabelingAlgorithm,TLcdGXYLabelPainterLocationLabelingAlgorithm,TLcdGXYLocationListLabelingAlgorithm,TLcdGXYOnPathLabelingAlgorithm
Iterator. While iterating over the labels,
the algorithm iterates over a discrete number of label placements for each label. It does
so by using an Iterator. Each time a label placement is returned, this placement
is evaluated using an ILcdLabelPlacementEvaluator. If the evaluator approves the
placement for the label, it is added to the list of label placements to be painted.
This abstract class also makes sure that the labels are sorted using their priority (see
TLcdCollectedLabelInfo.PRIORITY_KEY).
This abstract implementation also makes sure that the label offset functionality is correctly
handled (see TLcdLabelLocation.getParentLabel(), TLcdLabelLocation.getAnchorPoint).
So classes implementing this abstract labeling algorithm should just place their labels relative
to the object anchor point (with no anchor point and parent label specified in the TLcdLabelLocation), and
this class will make sure they are offset correctly.
This abstract implementation also makes sure that edited or sticky labels are correctly handled. So implementations of this abstract algorithm should not try to handle sticky or edited labels themselves.
When implementing this abstract algorithm, the following methods should be implemented :
When wrapping anALcdGXYDiscretePlacementsLabelingAlgorithm, these methods should
be implemented by creating an iterator or evaluator using the delegate algorithm, and returning
a wrapped iterator of evaluator.- Since:
- 10.1
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionclone()MakesObject.clone()public.collectLabelInfo(List<TLcdLabelIdentifier> aLabelsToCollect, Graphics aGraphics, ILcdGXYView aGXYView) This method returns aTLcdCollectedLabelInfoListobject based on the given list ofTLcdLabelIdentifiers.final List<TLcdLabelPlacement> computeLabelPlacements(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aLabelConflictChecker, ILcdGXYView aView) This method computes a list ofTLcdLabelPlacements using the givenTLcdCollectedLabelInfoList.protected abstract Iterator<TLcdCollectedLabelInfo> createLabelIterator(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newIteratorthat iterates over theTLcdCollectedLabelInfos.protected abstract ILcdLabelPlacementEvaluatorcreateLabelPlacementEvaluator(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newILcdLabelPlacementEvaluatorusing the given parameters.protected abstract Iterator<TLcdLabelPlacement> createLabelPlacementIterator(TLcdCollectedLabelInfo aLabel, TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newIteratorthat iterates over theTLcdLabelPlacements for the given label.
-
Constructor Details
-
ALcdGXYDiscretePlacementsLabelingAlgorithm
public ALcdGXYDiscretePlacementsLabelingAlgorithm()
-
-
Method Details
-
clone
Description copied from interface:ILcdCloneableMakes
When for example extending fromObject.clone()public.java.lang.Object, it can be implemented like this:public Object clone() { try { return super.clone(); } catch ( CloneNotSupportedException e ) { // Cannot happen: extends from Object and implements Cloneable (see also Object.clone) throw new RuntimeException( e ); } }- Specified by:
clonein interfaceILcdCloneable- Overrides:
clonein classObject- See Also:
-
collectLabelInfo
public TLcdCollectedLabelInfoList collectLabelInfo(List<TLcdLabelIdentifier> aLabelsToCollect, Graphics aGraphics, ILcdGXYView aGXYView) Description copied from interface:ILcdGXYLabelingAlgorithmThis method returns aTLcdCollectedLabelInfoListobject based on the given list ofTLcdLabelIdentifiers. The returnedTLcdCollectedLabelInfoListshould contain aTLcdCollectedLabelInfoobject for each label that should be placed.Each
TLcdCollectedLabelInfoshould also contain all information needed bycomputeLabelPlacementsto place the labels. In order to enable correct asynchronous label placing, all calls to the layer and the (label) painters should be done in this method. The results should then be stored in the info objects.It is possible that the returned
TLcdCollectedLabelInfoListdoesn't contain aTLcdCollectedLabelInfoobject for every givenTLcdLabelIdentifier. In that case the missing labels are not placed.- Specified by:
collectLabelInfoin interfaceILcdGXYLabelingAlgorithm- Parameters:
aLabelsToCollect- the labels for which aTLcdCollectedLabelInfoListshould be created.aGraphics- the graphics.aGXYView- the view.- Returns:
- a
TLcdCollectedLabelInfoListwhich contains all the information needed to place the labels.
-
computeLabelPlacements
public final List<TLcdLabelPlacement> computeLabelPlacements(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aLabelConflictChecker, ILcdGXYView aView) This method computes a list ofTLcdLabelPlacements using the givenTLcdCollectedLabelInfoList. The returned label placements should contain a validTLcdLabelLocationand label bounds. They should also point to their correspondingTLcdCollectedLabelInfo, which in turn should point to its correspondingTLcdCollectedLabeledObjectInfo.The given
TLcdCollectedLabelInfoListshould always be an object created or returned bycollectLabelInfo.The returned
ListofTLcdLabelPlacements contains label placements that are either visible or invisible. When a placement is present in the list, it means that the location should be stored. When a placement in the list is marked as visible, it means that its location should be marked as to-be-painted.The labels should by preference be placed in the order in which the labels are returned by
TLcdCollectedLabelInfoList.getLabels().This method implements an abstract algorithm to create labels. It tries a discrete number of placements for each label. It first creates a label iterator, looping over all labels to be handled. For each such label, a label placement iterator is created to iterate over label placements. A label placement is then evaluated by a label placement evaluator and possibly added to the list of placed labels.
The implementation of this method first sorts all labels using the priorities set in the label. It then creates the label iterator and label placement evaluator using the sorted labels and then executes the abstract algorithm using them. During the algorithm, label placement iterators are created for each processed label.
- Specified by:
computeLabelPlacementsin interfaceILcdGXYLabelingAlgorithm- Parameters:
aLabelInfoList- the info object that contains all information needed to place the labels.aLabelConflictChecker- the bounds conflict checker that can be used to detect conflicts between labels.aView- the view.- Returns:
- a list of labels to be rendered.
- See Also:
-
createLabelIterator
protected abstract Iterator<TLcdCollectedLabelInfo> createLabelIterator(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newIteratorthat iterates over theTLcdCollectedLabelInfos. The abstract labeling algorithm will continue iterating overTLcdCollectedLabelInfos as long asIterator.hasNext()returnstrue. When it returnsfalse, no more labels will be tried, andcomputeLabelPlacementsreturns.Iterator.hasNext()should always be called before callingIterator.next(), and if it returnstrue,Iterator.next()should never returnnull.The implementation of this method should be as independent as possible. It should not rely on
createLabelPlacementIteratororcreateLabelPlacementEvaluator. Not respecting this might result in unexpected behaviour when wrapping or extending this class.The returned
TLcdCollectedLabelInfoshould be correctly initialized, i.e. it should contain all information needed to create validTLcdLabelPlacements usingcreateLabelPlacementIterator. It should also always point to its correspondingTLcdCollectedLabeledObjectInfo.Override this method to provide a custom implementation.
- Parameters:
aLabelInfoList- the label infos object that contains all information needed to place the labels.aBoundsConflictChecker- the bounds conflict checker to be used when evaluating label placements.aView- the view.- Returns:
- a new
Iteratorthat iterates overTLcdCollectedLabelInfos.
-
createLabelPlacementIterator
protected abstract Iterator<TLcdLabelPlacement> createLabelPlacementIterator(TLcdCollectedLabelInfo aLabel, TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newIteratorthat iterates over theTLcdLabelPlacements for the given label. The abstract labeling algorithm will continue iterating overTLcdLabelPlacements as long asIterator.hasNext()returnstrue. When it returnsfalse, a new label will be tried.Iterator.hasNext()should always be called before callingIterator.next(), and if it returnstrue,Iterator.next()should never returnnull.The implementation of this method should be as independent as possible. It should not rely on
createLabelIteratororcreateLabelPlacementEvaluator. Not respecting this might result in unexpected behaviour when wrapping or extending this class.The returned
TLcdLabelPlacementshould be correctly initialized, i.e. it should at least be able to return a valid label location, bounds rectangle and bounds rotation. It should also reference its correspondingTLcdCollectedLabelInfo.Override this method to provide a custom implementation.
- Parameters:
aLabel- the label for which an iterator should be created.aLabelInfoList- the info object that contains all information needed to place the labels.aBoundsConflictChecker- the bounds conflict checker to be used when evaluating label placements.aView- the view.- Returns:
- a new
Iteratorthat iterates overTLcdLabelPlacements.
-
createLabelPlacementEvaluator
protected abstract ILcdLabelPlacementEvaluator createLabelPlacementEvaluator(TLcdCollectedLabelInfoList aLabelInfoList, ILcdLabelConflictChecker aBoundsConflictChecker, ILcdGXYView aView) Creates a newILcdLabelPlacementEvaluatorusing the given parameters. It evaluates the placements returned bycreateLabelPlacementIterator, and returns aPlacementResultto denote if the placement should be used for its label or not.The following actions are undertaken for the following placement results :
PlacementResult.SUCCESS: the given label placement will be used for its label, it will be added to the list of placed labels, and it will be added to the givenILcdLabelConflictChecker. After that,ILcdLabelPlacementEvaluator.placementAppliedwill be called and no more placements are tried for the label.PlacementResult.FALLBACK: the abstract algorithm will try to find an other placements which returnsPlacementResult.SUCCESS. When no such placement is found, this placement will be added to the list of placed labels, and it will be added to the givenILcdLabelConflictChecker. After that,ILcdLabelPlacementEvaluator.placementAppliedwill be called.PlacementResult.TRY_NEW_PLACEMENT: the abstract algorithm will try to find an other placement which returnsPlacementResult.SUCCESSorPlacementResult.FALLBACK. When no such placement is found,ILcdLabelPlacementEvaluator.noPlacementAppliedis called.PlacementResult.FAILED: the abstract algorithm will immediately callILcdLabelPlacementEvaluator.noPlacementAppliedand will not try to find other placements for the label.
Override this method to provide a custom implementation.
- Parameters:
aLabelInfoList- the info object that contains all information needed to place the labels.aBoundsConflictChecker- the bounds conflict checker to be used when evaluating label placements.aView- the view- Returns:
- a new LabelPlacementEvaluator
- See Also:
-