Class ALcyDomainObjectCustomizerPanel
- All Implemented Interfaces:
ILcdUndoableSource
,ILcyCustomizerPanel
,ILcdPropertyChangeSource
,ImageObserver
,MenuContainer
,Serializable
,Accessible
Abstract class that facilitates the implementation of ILcyCustomizerPanel
for domain
objects. This class can only be used to edit instances of TLcyDomainObjectContext
.
This class adds listeners to the model and the layer so that when the set domain object
changes or when the editable property of the layer changes,
updateCustomizerPanelFromObject(boolean)
is called. Furthermore it adds several
convenience methods to easily retrieve the domain object and its model, layer and view.
It is however up to the extension of this class to ensure that:
-
A write lock is taken when updating the domain object in the
applyChangesImpl()
method -
A read lock is taken when reading the properties from the domain object to update the UI in the
updateCustomizerPanelFromObject(boolean)
method.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class javax.swing.JPanel
JPanel.AccessibleJPanel
Nested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponent
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
-
Field Summary
Fields inherited from class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
Fields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
Fields inherited from interface com.luciad.lucy.gui.customizer.ILcyCustomizerPanel
HINT_PINNED, HORIZONTAL_ALIGNMENT_HINT, LONG_DESCRIPTION, NAME, SHORT_DESCRIPTION, SMALL_ICON
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
-
Constructor Summary
ModifierConstructorDescriptionprotected
ALcyDomainObjectCustomizerPanel
(ILcdFilter aDomainObjectContextFilter, String aName) Create a newALcyDomainObjectCustomizerPanel
instance -
Method Summary
Modifier and TypeMethodDescriptionboolean
Updates the setObject
according to the current state of the user interface.protected abstract boolean
Apply any pending changes.boolean
canSetObject
(Object aObject) Returnstrue
if and only ifsetObject
would not throw anIllegalArgumentException
.protected Object
Convenience method to return the domain object (e.g. polyline) that was set by setting aTLcyDomainObjectContext
usingsetObject
.protected final TLcyDomainObjectContext
Returns theTLcyDomainObjectContext
object that was set on this customizer.protected ILcdLayer
getLayer()
Convenience method to return theILcdLayer
that was set by setting aTLcyDomainObjectContext
usingsetObject
.protected ILcdModel
getModel()
Convenience method to return theILcdModel
that was set by setting aTLcyDomainObjectContext
usingsetObject
.protected ILcdView
getView()
Convenience method to return theILcdView
that was set by setting aTLcyDomainObjectContext
usingsetObject
.protected boolean
Returns whether the panel is editable or not.void
Set the object to be edited.protected void
CallsupdateCustomizerPanelFromObject( isPanelEditable() )
.protected abstract void
updateCustomizerPanelFromObject
(boolean aPanelEditable) This means updating the user interface state according to the current state of the setObject
.Methods inherited from class com.luciad.lucy.gui.customizer.ALcyCustomizerPanel
addUndoableListener, cancelChanges, fireUndoableHappened, getObject, getObjectFilter, getValue, isChangesPending, isChangesValid, putValue, removeUndoableListener, setChangesPending, setChangesValid, setName, setObjectFilter
Methods inherited from class javax.swing.JPanel
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface com.luciad.util.ILcdPropertyChangeSource
addPropertyChangeListener, removePropertyChangeListener
Methods inherited from interface com.luciad.lucy.gui.customizer.ILcyCustomizerPanel
addPropertyChangeListener, getPropertyChangeListeners, getPropertyChangeListeners, removePropertyChangeListener
-
Constructor Details
-
ALcyDomainObjectCustomizerPanel
Create a new
ALcyDomainObjectCustomizerPanel
instance- Parameters:
aDomainObjectContextFilter
- TheILcdFilter
that defines which objects are accepted bycanSetObject
andsetObject
. When specified, this filter should only acceptTLcyDomainObjectContext
instances.aName
- The name for thisALcyCustomizerPanel
, seeILcyCustomizerPanel.NAME
.
-
-
Method Details
-
applyChanges
public boolean applyChanges()Updates the setObject
according to the current state of the user interface. This means all pending changes are committed. If there were any pending changes, soisChangesPending
returnedtrue
, it should returnfalse
after this method has finished, and therefore also a"changesPending"
property change event must be fired. E.g. consider that aILcdGXYLayer
object is set and a new label text is entered in a text field. When this method is called, the new label text should be set to theILcdGXYLayer
(usingILcdGXYLayer.setLabel
). This implementation invokesALcyCustomizerPanel.applyChangesImpl()
and sets the "changesPending" property. As a result, the "changesPending" event is fired when needed.Note: you should never override this method. Instead, you need to implement the
applyChangesImpl()
method.- Specified by:
applyChanges
in interfaceILcyCustomizerPanel
- Overrides:
applyChanges
in classALcyCustomizerPanel
- Returns:
True
if the changes were applied or if there were no changes,false
if the changes could not be applied because they are invalid. In that event,isChangesValid
returnsfalse
.- See Also:
-
applyChangesImpl
protected abstract boolean applyChangesImpl()Apply any pending changes. This method should do the same as
ALcyCustomizerPanel.applyChanges()
, except that it should not take care of "changesPending".Note that the implementation of this method needs
-
to call
ILcdModel.elementChanged(Object, int)
if the domain object is actually adapted - to take a write lock on the model before changing the domain object
A typical implementation of this method would look like
@Override protected boolean applyChangesImpl() { Object domainObject = getDomainObject(); if (domainObject != null) { ILcdModel model = getModel(); try (TLcdLockUtil.Lock autoUnlock = TLcdLockUtil.writeLock(model)) { //Thanks to the write lock, it is now safe to update the domain object updateDomainObject(domainObject); model.elementChanged(domainObject, ILcdModel.FIRE_LATER); } finally { model.fireCollectedModelChanges(); } } return true; }
- Specified by:
applyChangesImpl
in classALcyCustomizerPanel
- Returns:
- True if changes could be applied or if there were no changes, false otherwise.
Please refer to
ALcyCustomizerPanel.applyChanges()
for more detailed information.
-
to call
-
getView
Convenience method to return theILcdView
that was set by setting aTLcyDomainObjectContext
usingsetObject
.- Returns:
- Null if no
TLcyDomainObjectContext
is set, theILcdView
related to that context object otherwise.
-
getLayer
Convenience method to return theILcdLayer
that was set by setting aTLcyDomainObjectContext
usingsetObject
.- Returns:
- Null if no
TLcyDomainObjectContext
is set, theILcdLayer
related to that context object otherwise.
-
getModel
Convenience method to return theILcdModel
that was set by setting aTLcyDomainObjectContext
usingsetObject
.- Returns:
- Null if no
TLcyDomainObjectContext
is set, theILcdModel
related to that context object otherwise.
-
getDomainObject
Convenience method to return the domain object (e.g. polyline) that was set by setting aTLcyDomainObjectContext
usingsetObject
.- Returns:
- Null if no
TLcyDomainObjectContext
object is set, the domain object (e.g., polyline) related to that context object otherwise.
-
canSetObject
Description copied from class:ALcyCustomizerPanel
Returnstrue
if and only ifsetObject
would not throw anIllegalArgumentException
. Only acceptsnull
or objects that pass the object filter. If the filter itself isnull
, all objects are accepted.- Specified by:
canSetObject
in interfaceILcyCustomizerPanel
- Overrides:
canSetObject
in classALcyCustomizerPanel
- Parameters:
aObject
- The object to check.- Returns:
true
ifsetObject
would accept the object,false
if it would throw an exception.
-
setObject
Set the object to be edited. This method should be called before theILcyCustomizerPanel
has been added to any parent AWT container. It can be called afterwards as well however. In this case the user interface should update itself to represent the newly set object. A value ofnull
is set to inform thisILcyCustomizerPanel
to (temporarily) deinitialize itself, it allows to perform cleanup tasks, such as removing listeners. InvokesALcyCustomizerPanel.updateCustomizerPanelFromObject()
to update the user interface.Also adds a
ILcdModelListener
to the model of the setTLcyDomainObjectContext
that callsupdateCustomizerPanelFromObject
whenever the set domain object changes in that model, as well as aPropertyChangeListener
to the layer of the setTLcyDomainObjectContext
that does the same when the"editable"
property of the layer changes.- Specified by:
setObject
in interfaceILcyCustomizerPanel
- Overrides:
setObject
in classALcyCustomizerPanel
- Parameters:
aObject
- The object to be customized, ornull
to inform that editing is temporarily disabled.
-
getDomainObjectContext
Returns the
TLcyDomainObjectContext
object that was set on this customizer. This context object can be used to retrieve the domain object and the model, layer and view in which it is contained.- Returns:
- The set
TLcyDomainObjectContext
. This object can benull
when this customizer was deinitialized (withsetObject(null)
).
-
updateCustomizerPanelFromObject
protected void updateCustomizerPanelFromObject()Calls
updateCustomizerPanelFromObject( isPanelEditable() )
.Updates the user interface state according to the current state of the set
Object
. This method is called whenever a new object is set usingsetObject
, or when the changes are canceled usingcancelChanges
.It does not need to take care of
"changesPending"
.Consider for example that a
TLcyLayerContext
is set and a new label text is entered in a text field. When this method is called, the new label text should be cleared and the original label of theILcdLayer
(getLabel()
) should be put in the text field.Note: you should never override this method. Instead, you need to implement the
applyChangesImpl()
method.- Specified by:
updateCustomizerPanelFromObject
in classALcyCustomizerPanel
-
updateCustomizerPanelFromObject
protected abstract void updateCustomizerPanelFromObject(boolean aPanelEditable) This means updating the user interface state according to the current state of the set
Object
. This method is called whenever a new object is set usingsetObject
, or when the changes are canceled usingcancelChanges
.It does not need to take care of
"changesPending"
.Consider for example that a
TLcyLayerContext
is set and a new label text is entered in a text field. When this method is called, the new label text should be cleared and the original label of theILcdLayer
(getLabel()
) should be put in the text field.Note that the implementation of this method needs to take a read lock on the model before querying the domain object.
A typical implementation of this method would look like
@Override protected void updateCustomizerPanelFromObject(boolean aPanelEditable){ updateEditableState( aPanelEditable ); Object domainObject = getDomainObject(); if ( domainObject != null ){ ILcdModel model = getModel(); try( TLcdLockUtil.Lock autoUnlock = TLcdLockUtil.readLock(model) ){ //thanks to the read lock, the domain object can now safely be queried updateUI( domainObject ); } } }
- Parameters:
aPanelEditable
-true
if the panel should be editable,false
otherwise. SeeisPanelEditable()
for more information.
-
isPanelEditable
protected boolean isPanelEditable()Returns whether the panel is editable or not. Editable means the values it displays can be modified; for example, the content of a text field can be adapted. Not editable means the values it displays cannot be adapted; for example, a text field should be disabled. The default implementation returns
orgetLayer().isEditableSupported() && getLayer().isEditable()
true
ifgetLayer()
isnull
. Override this method to redefine when the panel is editable or not.- Returns:
True
if the panel should be editable,false
otherwise.
-