Class TLcdGXYMultiPointEditControllerModel
- All Implemented Interfaces:
ILcdUndoableSource
TLcdGXYMultiPointEditControllerModel contains the logic for
editing objects on an ILcdGXYView.
The most important concepts of this class are the following:
The methods that correspond with the above concepts are typically invoked in that order, but
the implementation must not depend on this exact order.
The editingCandidates are those objects that are involved in the editing
process. The method takes into account the modes to define the involved
objects. If it is for example asked to return the editing candidates for a
EDIT_WHAT_LABELS mode, it only returns objects that have labels
next to them.
While the edit process is ongoing (e.g., the user is performing a drag), the
objects are not edited all the time, they are just painted in their temporary
state. The method paintEditing takes care of this. This method is typically
invoked often (e.g., on mouse drag) while the edit process is ongoing.
Once the edit is complete, the method applyEdit performs the actual edit
operation to the editing candidates. It delegates the real work to the ILcdGXYEditors or the ILcdGXYLabelEditors of the editing
candidates, depending on the modes.
The edit operations, performed by applyEdit, can be
undone, provided the ILcdGXYEditors and/or ILcdGXYLabelEditors to which the real work is delegated implement ILcdUndoableSource as well, to indicate that they support undo. Please
refer to the developer guide for more information about undo.
The method snapTarget returns the target to snap the
edited objects to. Please refer to the developer guide for an overview
of snapping.
This edit controller model supports body label editing, see TLcdLabelLocation.isBodyLabel().
When a body label is translated (EDIT_HOW_TRANSLATING), its domain object is translated
instead. When a body label is reshaped (EDIT_HOW_RESHAPING), it is translated instead.
This is done by calling the ILcdGXYLabelEditor with the
ILcdGXYLabelEditor.TRANSLATED mode instead of
ILcdGXYLabelEditor.RESHAPED.
Subclasses can override these methods to alter their behavior. They can also
introduce new modes, but care should be taken to override all methods, so
that they all know how to handle this new mode (calling super
with an existing mode could be useful). Integer constants used for those new
modes should be greater than or equal to 1 << 25.
Note: editing labels is only supported if:
- The label painter implements
ILcdGXYLabelPainter2(not justILcdGXYLabelPainter) - The layer implements
ILcdGXYEditableLabelsLayer - An
ILcdGXYLabelEditoris set to the layer.
TLcdGXYEditControllerModel2 is that
this model supports multiple input points.- Since:
- 10.0
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intMode defining that no changes should be made.static final intMode defining that editing should reshape the editing candidates.static final intMode defining that editing should translate the editing candidates.static final intMode defining that editing (e.g., translating or reshaping) should act on the first touched label only.static final intMode defining that editing (e.g., translating or reshaping) should act on the labels.static final intMode defining that no changes should be made.static final intMode defining that editing (e.g., translating or reshaping) should act on the objects (e.g., the points, polylines, ...). -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidaddUndoableListener(ILcdUndoableListener aListener) Adds a listener to this source, so this listener is notified when something undoable has happened.booleanapplyEdit(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Applies the edit to every object of the given subset, by delegating the real work toILcdGXYEditor.editwith the modeTRANSLATED(orRESHAPEDifaEditHowisEDIT_HOW_RESHAPING).protected TLcdCompositeUndoablecreateSingleObjectUndoable(Object aDomainObject, ILcdGXYLayer aLayer, ILcdGXYView aGXYView, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Creates the composite undoable that will wrap all the undoables generated by a singleILcdGXYEditorfor a single domain object.protected TLcdCompositeUndoablecreateTotalOperationUndoable(ILcdGXYView aGXYView, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Creates the composite undoable that will wrap all undoables generated by all the underlying editors for all the edited domain objects.static StringeditHowAsString(int aEditHow) Utility method that converts the given edit-how mode to a human readable string.editingCandidates(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat) Returns the set of candidates for editing, respecting the given modes.static StringeditWhatAsString(int aEditWhat) Utility method that converts the given edit-what mode to a human readable string.protected voidfireUndoableHappened(ILcdUndoable aUndoable) Notify all undoable listeners thataUndoablehas happened.intThis method returns the sensitivity that will be used when editing objects or labels.voidpaintEditing(Graphics aGraphics, ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Paints the given set of edit candidates in their temporary editing state.voidremoveUndoableListener(ILcdUndoableListener aListener) Removes the specified listener so it is no longer notified.voidsetSensitivity(int aSensitivity) This method sets the sensitivity that should be used by painters/editors to determine which object (or part of the object) is edited by the input device (usually the mouse).voidsetStringTranslator(ILcdStringTranslator aStringTranslator) Sets theILcdStringTranslatorthat this controller model should use to translate theStringsthat will be visible in the user interface.com.luciad.view.gxy.controller.TLcdGXYMultiPointEditControllerModel.SnapTargetInfosnapTarget(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, Object aObjectToSnap, ILcdGXYLayer aObjectToSnapGXYLayer) Tries to retrieve a snap target from the given aSnappables.
-
Field Details
-
EDIT_HOW_RESHAPING
public static final int EDIT_HOW_RESHAPINGMode defining that editing should reshape the editing candidates. What exactly reshaping means is up to the implementations ofILcdGXYEditorandILcdGXYLabelEditor. -
EDIT_HOW_TRANSLATING
public static final int EDIT_HOW_TRANSLATINGMode defining that editing should translate the editing candidates. What exactly translating means is up to the implementations ofILcdGXYEditorandILcdGXYLabelEditor. -
EDIT_HOW_NO_CHANGE
public static final int EDIT_HOW_NO_CHANGEMode defining that no changes should be made. -
EDIT_WHAT_OBJECTS
public static final int EDIT_WHAT_OBJECTSMode defining that editing (e.g., translating or reshaping) should act on the objects (e.g., the points, polylines, ...). -
EDIT_WHAT_LABELS
public static final int EDIT_WHAT_LABELSMode defining that editing (e.g., translating or reshaping) should act on the labels. -
EDIT_WHAT_FIRST_TOUCHED_LABEL
public static final int EDIT_WHAT_FIRST_TOUCHED_LABELMode defining that editing (e.g., translating or reshaping) should act on the first touched label only. This is especially useful when objects have multiple labels, that should be edited independently. -
EDIT_WHAT_NO_CHANGE
public static final int EDIT_WHAT_NO_CHANGEMode defining that no changes should be made.
-
-
Constructor Details
-
TLcdGXYMultiPointEditControllerModel
public TLcdGXYMultiPointEditControllerModel()Default constructor
-
-
Method Details
-
paintEditing
public void paintEditing(Graphics aGraphics, ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Paints the given set of edit candidates in their temporary editing state. The real painting work is delegated to
ILcdGXYPainter.paintwith the modeILcdGXYPainter.TRANSLATINGorILcdGXYPainter.RESHAPING, depending on aEditHow. Similarly for labels, the work is delegated toILcdGXYLabelPainter2.paintLabelwith the modeILcdGXYLabelPainter2.TRANSLATINGorILcdGXYLabelPainter2.RESHAPING.When either the
aEditHowisEDIT_HOW_NO_CHANGEoraEditWhatisEDIT_WHAT_NO_CHANGE, this method will do nothing.The painting of the snaps (of a label) will be delegated to the (label) painters as well. However, the context will only contain one input point. This means when this method is called with multiple points in
aFromandaTopossibly leading to multiple snap targets, the painting of the snaps will be done for each snap target and corresponding input point individually and not for all snap targets and corresponding input points at once.- Parameters:
aGraphics- The graphics to draw on.aGXYView- TheILcdGXYView, provided as contextual information.aSnappables- The list of potential snapping candidates, provided as contextual information.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.aEditingCandidates- The objects (and their corresponding layers) that are being edited.
-
editingCandidates
public ILcdGXYLayerSubsetList editingCandidates(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat) Returns the set of candidates for editing, respecting the given modes. ForEDIT_HOW_TRANSLATING, the candidates are those objects that are selected, visible and editable on the givenILcdGXYView. If, for these candidates, an object handle is touched, only the object to which the touched handle belongs is returned, otherwise all candidates are returned. ForEDIT_HOW_RESHAPINGandEDIT_WHAT_FIRST_TOUCHED_LABEL, it returns the first selected object that is visible, editable and touched. Touched is defined asILcdGXYPainter.isTouched(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext)orILcdGXYLabelPainter2.isLabelTouched(java.awt.Graphics, int, com.luciad.view.gxy.ILcdGXYContext), depending on aEditWhat.- Parameters:
aGXYView- TheILcdGXYView, provided as contextual information.aSnappables- The list of potential snapping candidates, provided as contextual information.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.- Returns:
- This list of editing candidates. This list can be empty, but never
null.
-
applyEdit
public boolean applyEdit(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Applies the edit to every object of the given subset, by delegating the real work to
ILcdGXYEditor.editwith the modeTRANSLATED(orRESHAPEDifaEditHowisEDIT_HOW_RESHAPING). All input points are passed to theeditmethod. Note that the actual meaning of reshaping and translating is defined by the implementation ofILcdGXYPainter/ILcdGXYEditorthat is used.Similarly editing labels is delegated to
ILcdGXYLabelEditor.editLabelwith the modeILcdGXYLabelEditor.TRANSLATEDorILcdGXYLabelEditor.RESHAPED.This method will do nothing if
aEditHowisEDIT_HOW_NO_CHANGEor ifaEditWhatisEDIT_WHAT_NO_CHANGE, and just returnfalse.After all objects/labels are edited, the needed model changed events and label location changed events are fired.
After the edit is completed, an
TLcdUndoableEventis fired to the registeredlistenersif any undo information was provided by theILcdGXYEditors orILcdGXYLabelEditors to which the real work is delegated. They can do so by implementing theILcdUndoableSourceinterface and by firing anTLcdUndoableEventwhen theireditoreditLabelmethod is invoked. The undoable event this class sends out to its listeners is a composite undoable composed of all the events send out by theILcdGXYEditors orILcdGXYLabelEditors.- Parameters:
aGXYView- TheILcdGXYView, provided as contextual information.aSnappables- The list of potential snapping candidates.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.aEditingCandidates- The objects (and their corresponding layers) that need to be edited.- Returns:
- True if at least one object/label was modified, false otherwise.
-
createTotalOperationUndoable
protected TLcdCompositeUndoable createTotalOperationUndoable(ILcdGXYView aGXYView, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Creates the composite undoable that will wrap all undoables generated by all the underlying editors for all the edited domain objects. This method is called from theapplyEditmethod. This default implementation returns aTLcdCompositeUndoablewith the display name "Edit Objects". Override this method if you want another name.- Parameters:
aGXYView- The view for which the edit operation is being performed for which the undoable is created.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.aEditingCandidates- The objects (and their corresponding layers) that need to be edited.- Returns:
- The composite undoable that will be fired when the edit operation is complete. Must not
be
null.
-
createSingleObjectUndoable
protected TLcdCompositeUndoable createSingleObjectUndoable(Object aDomainObject, ILcdGXYLayer aLayer, ILcdGXYView aGXYView, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, ILcdGXYLayerSubsetList aEditingCandidates) Creates the composite undoable that will wrap all the undoables generated by a singleILcdGXYEditorfor a single domain object. This method is called from theapplyEditmethod. The default implementation returns aTLcdCompositeUndoablewith the display name"Edit " + String.valueOf(aDomainObject).- Parameters:
aDomainObject- The domain object from the model which is being edited.aLayer- The layer of the domain object which is being edited.aGXYView- The view for which the edit operation is being performed for which the undoable is created.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.aEditingCandidates- The objects (and their corresponding layers) that need to be edited.- Returns:
- The composite undoable that will be fired when the edit operation is complete. Must not
be
null.
-
snapTarget
public com.luciad.view.gxy.controller.TLcdGXYMultiPointEditControllerModel.SnapTargetInfo snapTarget(ILcdGXYView aGXYView, ILcdGXYLayerSubsetList aSnappables, List<Point> aFrom, List<Point> aTo, int aEditHow, int aEditWhat, Object aObjectToSnap, ILcdGXYLayer aObjectToSnapGXYLayer) Tries to retrieve a snap target from the given aSnappables. It does so by invoking
snapTarget(orlabelSnapTarget, depending on aEditWhat) on theILcdGXYPainters (orILcdGXYLabelPainter2s) of the objects in aSnappables. If the snap target returned by one of those painters isacceptedby theILcdGXYEditorof aObjectToSnap, it is returned.More concrete: for each input point exactly one snap target is searched by asking the painters of the snapping candidates whether they have a snap target for that particular input point. This means the call to the painter is done with a context containing only one input point. If the painter returns a snap target, this snap target is verified by the editor. Hence the
acceptSnapTargetmethod of the editor is also called with a context containing only one input point.As soon as a snap target is found for an input point, this method stops searching and continues with the next input point. All found snap targets (and possibly
nullvalues when no snap target was found for an input point) are stored in oneSnapTargetInfoobject. ThisSnapTargetInfogroups the snap information of all input points into one object.Further on, the information contained in the
SnapTargetInfoobject will be passed on to the edit method of theILcdGXYEditor. In thateditmethod, the context will contain all input points and snap targets for each input point (ornullwhen no snap target could be found).When no snap target can be found this method returns
.null- Parameters:
aGXYView- TheILcdGXYView, provided as contextual information.aSnappables- The list of potential snapping candidates.aFrom- A list with point(s) where the edit originated. Should have the same length asaTo, and the order of the points in both lists should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aTo- A list with point(s) where the edit terminated (so far). Should have the same length asaFrom, and the order of the points in both list should be the same, e.g. the location of the first point ofaFromwhen the edit terminated should be passed as the first point inaTo.aEditHow- The edit-how mode: one of the constants in this class that start withEDIT_HOW.aEditWhat- The edit-what mode: one of the constants in this class that start withEDIT_WHAT. For example the result of the methodeditWhatMode.aObjectToSnap- the object that would like to snap to one of the candidates in aSnappables, so basically the object that is being edited.aObjectToSnapGXYLayer- the layer whose model contains aObjectToSnap.- Returns:
- The snap info, or null if no snap target was found.
-
editHowAsString
Utility method that converts the given edit-how mode to a human readable string. This method is intended for debugging or logging purposes.- Parameters:
aEditHow- The edit how mode, one of the constants in this class that start withEDIT_HOW.- Returns:
- A human readable string representation for the given edit-how mode.
-
editWhatAsString
Utility method that converts the given edit-what mode to a human readable string. This method is intended for debugging or logging purposes.- Parameters:
aEditWhat- The edit what mode, one of the constants in this class that start withEDIT_WHAT.- Returns:
- A human readable string representation for the given edit-what mode.
-
setStringTranslator
Sets the
ILcdStringTranslatorthat this controller model should use to translate theStringsthat will be visible in the user interface.This method should be called before this editor is used. Any
Stringsalready created by this controller model will not be translated with the specified translator.The following list of
Stringsare translated by the given instance:- "Edit Objects"
- "Edit {0}". The translated
Stringis used as the pattern for aMessageFormat. - "Model was unreferenced due to memory constraints."
- "Domain object was unreferenced due to memory constraints."
- Parameters:
aStringTranslator- TheILcdStringTranslatorthat should be used. Must not benull.
-
addUndoableListener
Description copied from interface:ILcdUndoableSourceAdds a listener to this source, so this listener is notified when something undoable has happened.- Specified by:
addUndoableListenerin interfaceILcdUndoableSource- Parameters:
aListener- The listener to be notified when something undoable has happened.
-
removeUndoableListener
Description copied from interface:ILcdUndoableSourceRemoves the specified listener so it is no longer notified.- Specified by:
removeUndoableListenerin interfaceILcdUndoableSource- Parameters:
aListener- The listener to remove.
-
fireUndoableHappened
Notify all undoable listeners thataUndoablehas happened.- Parameters:
aUndoable- The undoable of which the listeners should be notified.
-
getSensitivity
public int getSensitivity()This method returns the sensitivity that will be used when editing objects or labels. It indicates how far (in screen coordinates) the input location (mouse cursor, etc...) can be from the visual representation of an object or handle on the screen and still interact with it. This value will be passed to all created instances ofTLcdGXYContextpassed to the painters/editors.- Returns:
- the sensitivity to be used for painting/editing purposes.
- See Also:
-
setSensitivity
public void setSensitivity(int aSensitivity) This method sets the sensitivity that should be used by painters/editors to determine which object (or part of the object) is edited by the input device (usually the mouse).- Parameters:
aSensitivity- the sensitivity that will be used for painting/editing purposes.- See Also:
-