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.AccessibleJPanelNested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponentNested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainerNested 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_WINDOWFields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENTFields inherited from interface com.luciad.lucy.gui.customizer.ILcyCustomizerPanel
HINT_PINNED, HORIZONTAL_ALIGNMENT_HINT, LONG_DESCRIPTION, NAME, SHORT_DESCRIPTION, SMALL_ICONFields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedALcyDomainObjectCustomizerPanel(ILcdFilter aDomainObjectContextFilter, String aName) Create a newALcyDomainObjectCustomizerPanelinstance -
Method Summary
Modifier and TypeMethodDescriptionbooleanUpdates the setObjectaccording to the current state of the user interface.protected abstract booleanApply any pending changes.booleancanSetObject(Object aObject) Returnstrueif and only ifsetObjectwould not throw anIllegalArgumentException.protected ObjectConvenience method to return the domain object (e.g. polyline) that was set by setting aTLcyDomainObjectContextusingsetObject.protected final TLcyDomainObjectContextReturns theTLcyDomainObjectContextobject that was set on this customizer.protected ILcdLayergetLayer()Convenience method to return theILcdLayerthat was set by setting aTLcyDomainObjectContextusingsetObject.protected ILcdModelgetModel()Convenience method to return theILcdModelthat was set by setting aTLcyDomainObjectContextusingsetObject.protected ILcdViewgetView()Convenience method to return theILcdViewthat was set by setting aTLcyDomainObjectContextusingsetObject.protected booleanReturns whether the panel is editable or not.voidSet the object to be edited.protected voidCallsupdateCustomizerPanelFromObject( isPanelEditable() ).protected abstract voidupdateCustomizerPanelFromObject(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, setObjectFilterMethods inherited from class javax.swing.JPanel
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUIMethods 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, updateMethods 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, validateTreeMethods 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, transferFocusUpCycleMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface com.luciad.util.ILcdPropertyChangeSource
addPropertyChangeListener, removePropertyChangeListenerMethods inherited from interface com.luciad.lucy.gui.customizer.ILcyCustomizerPanel
addPropertyChangeListener, getPropertyChangeListeners, getPropertyChangeListeners, removePropertyChangeListener
-
Constructor Details
-
ALcyDomainObjectCustomizerPanel
Create a new
ALcyDomainObjectCustomizerPanelinstance- Parameters:
aDomainObjectContextFilter- TheILcdFilterthat defines which objects are accepted bycanSetObjectandsetObject. When specified, this filter should only acceptTLcyDomainObjectContextinstances.aName- The name for thisALcyCustomizerPanel, seeILcyCustomizerPanel.NAME.
-
-
Method Details
-
applyChanges
public boolean applyChanges()Updates the setObjectaccording to the current state of the user interface. This means all pending changes are committed. If there were any pending changes, soisChangesPendingreturnedtrue, it should returnfalseafter this method has finished, and therefore also a"changesPending"property change event must be fired. E.g. consider that aILcdGXYLayerobject 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:
applyChangesin interfaceILcyCustomizerPanel- Overrides:
applyChangesin classALcyCustomizerPanel- Returns:
Trueif the changes were applied or if there were no changes,falseif the changes could not be applied because they are invalid. In that event,isChangesValidreturnsfalse.- 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:
applyChangesImplin 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 theILcdViewthat was set by setting aTLcyDomainObjectContextusingsetObject.- Returns:
- Null if no
TLcyDomainObjectContextis set, theILcdViewrelated to that context object otherwise.
-
getLayer
Convenience method to return theILcdLayerthat was set by setting aTLcyDomainObjectContextusingsetObject.- Returns:
- Null if no
TLcyDomainObjectContextis set, theILcdLayerrelated to that context object otherwise.
-
getModel
Convenience method to return theILcdModelthat was set by setting aTLcyDomainObjectContextusingsetObject.- Returns:
- Null if no
TLcyDomainObjectContextis set, theILcdModelrelated to that context object otherwise.
-
getDomainObject
Convenience method to return the domain object (e.g. polyline) that was set by setting aTLcyDomainObjectContextusingsetObject.- Returns:
- Null if no
TLcyDomainObjectContextobject is set, the domain object (e.g., polyline) related to that context object otherwise.
-
canSetObject
Description copied from class:ALcyCustomizerPanelReturnstrueif and only ifsetObjectwould not throw anIllegalArgumentException. Only acceptsnullor objects that pass the object filter. If the filter itself isnull, all objects are accepted.- Specified by:
canSetObjectin interfaceILcyCustomizerPanel- Overrides:
canSetObjectin classALcyCustomizerPanel- Parameters:
aObject- The object to check.- Returns:
trueifsetObjectwould accept the object,falseif it would throw an exception.
-
setObject
Set the object to be edited. This method should be called before theILcyCustomizerPanelhas 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 ofnullis set to inform thisILcyCustomizerPanelto (temporarily) deinitialize itself, it allows to perform cleanup tasks, such as removing listeners. InvokesALcyCustomizerPanel.updateCustomizerPanelFromObject()to update the user interface.Also adds a
ILcdModelListenerto the model of the setTLcyDomainObjectContextthat callsupdateCustomizerPanelFromObjectwhenever the set domain object changes in that model, as well as aPropertyChangeListenerto the layer of the setTLcyDomainObjectContextthat does the same when the"editable"property of the layer changes.- Specified by:
setObjectin interfaceILcyCustomizerPanel- Overrides:
setObjectin classALcyCustomizerPanel- Parameters:
aObject- The object to be customized, ornullto inform that editing is temporarily disabled.
-
getDomainObjectContext
Returns the
TLcyDomainObjectContextobject 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 benullwhen 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
TLcyLayerContextis 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:
updateCustomizerPanelFromObjectin 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
TLcyLayerContextis 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-trueif the panel should be editable,falseotherwise. 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()trueifgetLayer()isnull. Override this method to redefine when the panel is editable or not.- Returns:
Trueif the panel should be editable,falseotherwise.
-