Class ALcyCustomizerPanel
- All Implemented Interfaces:
ILcdUndoableSource
,ILcyCustomizerPanel
,ILcdPropertyChangeSource
,ImageObserver
,MenuContainer
,Serializable
,Accessible
- Direct Known Subclasses:
ALcyDataPropertyCustomizerPanel
,ALcyDomainObjectCustomizerPanel
,ALcyLayerCustomizerPanel
,ALcyModelCustomizerPanel
,ALcyShapeCustomizerPanel
Abstract implementation of ILcyCustomizerPanel
that provides default implementations
for most methods of the interface.
What it provides:
- It stores the key-value pairs.
- It keeps the collections of listeners.
- It manages the
"changesPending"
events; extensions only have to invokesetChangesPending(true)
when the user has made some changes. WhenapplyChanges
orcancelChanges
is called, the"changesPending"
property is automatically reset tofalse
.
What is left for the extensions of this class:
- Provide a user interface.
- Implement applyChangesImpl()
- Implement
updateCustomizerPanelFromObject()
: this method covers both canceling and setting a new object. - Invoke
setChangesPending(boolean)
withtrue
whenever the user has made some changes. - Optionally fire
TLcdUndoableEvent
s whenever an operation was performed that can be undone/redone. - Optionally invoke
setChangesValid(boolean)
to avoid applying invalid changes.
While this class is a general-purpose base-class for ILcyCustomizerPanel
implementations,
there are several subclasses that are geared towards more specific use-cases, such as
customizing domain objects,
layers or models.
- 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
ALcyCustomizerPanel
(ILcdFilter aObjectFilter) Constructs a newALcyCustomizerPanel
.protected
ALcyCustomizerPanel
(ILcdFilter aObjectFilter, String aName) Constructs a newALcyCustomizerPanel
.protected
ALcyCustomizerPanel
(ILcdFilter aObjectFilter, String aName, ILcdIcon aSmallIcon) Constructs a newALcyCustomizerPanel
.protected
ALcyCustomizerPanel
(ILcdFilter aObjectFilter, String aName, ILcdIcon aSmallIcon, String aShortDescription) Constructs a newALcyCustomizerPanel
. -
Method Summary
Modifier and TypeMethodDescriptionvoid
addUndoableListener
(ILcdUndoableListener aUndoableListener) Adds a listener to this source, so this listener is notified when something undoable has happened.boolean
Updates the setObject
according to the current state of the user interface.protected abstract boolean
Apply any pending changes.void
Updates the user interface state according to the current state of the setObject
.boolean
canSetObject
(Object aObject) Returnstrue
if and only ifsetObject
would not throw anIllegalArgumentException
.protected final void
fireUndoableHappened
(ILcdUndoable aUndoable) Fires the givenILcdUndoable
to all associatedILcdUndoableListener
s.Returns the object that was set usingsetObject
.Returns the object filter.Gets the property value for the given key.boolean
Returnstrue
if changes are pending.boolean
Returnstrue
if the pending changes are valid, or if there are no pending changes.void
Sets the property value foraKey
toaValue
.void
removeUndoableListener
(ILcdUndoableListener aUndoableListener) Removes the specified listener so it is no longer notified.protected void
setChangesPending
(boolean aChangesPending) Sets if there are any outstanding changes in the user interface.protected void
setChangesValid
(boolean aChangesValid) Sets if changes are valid.void
void
Set the object to be edited.void
setObjectFilter
(ILcdFilter aObjectFilter) Sets the object filter.protected abstract void
Updates the user interface state according to the current state of the setObject
.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
-
ALcyCustomizerPanel
Constructs a newALcyCustomizerPanel
.- Parameters:
aObjectFilter
- TheILcdFilter
that defines which objects are accepted bycanSetObject
andsetObject
. See alsosetPaintState
.
-
ALcyCustomizerPanel
Constructs a newALcyCustomizerPanel
.- Parameters:
aObjectFilter
- TheILcdFilter
that defines which objects are accepted bycanSetObject
andsetObject
. See alsosetObjectFilter
.aName
- The name for thisALcyCustomizerPanel
, seeILcyCustomizerPanel.NAME
.
-
ALcyCustomizerPanel
Constructs a newALcyCustomizerPanel
.- Parameters:
aObjectFilter
- TheILcdFilter
that defines which objects are accepted bycanSetObject
andsetObject
. See alsosetPaintState
.aName
- The name for thisALcyCustomizerPanel
, seeILcyCustomizerPanel.NAME
.aSmallIcon
- The small icon of thisALcyCustomizerPanel
, seeILcyCustomizerPanel.SMALL_ICON
.
-
ALcyCustomizerPanel
protected ALcyCustomizerPanel(ILcdFilter aObjectFilter, String aName, ILcdIcon aSmallIcon, String aShortDescription) Constructs a newALcyCustomizerPanel
.- Parameters:
aObjectFilter
- TheILcdFilter
that defines which objects are accepted bycanSetObject
andsetObject
. See alsosetPaintState
.aName
- The name for thisALcyCustomizerPanel
, seeILcyCustomizerPanel.NAME
.aSmallIcon
- The small icon of thisALcyCustomizerPanel
, seeILcyCustomizerPanel.SMALL_ICON
.aShortDescription
- The short description of thisALcyCustomizerPanel
, seeILcyCustomizerPanel.SHORT_DESCRIPTION
.
-
-
Method Details
-
setName
Note: if you want to adjust the display name of this customizer panel, you need to use the
putValue(String, Object)
method withILcyCustomizerPanel.NAME
as key. Consult the documentation of that constant for more information. -
getValue
Description copied from interface:ILcyCustomizerPanel
Gets the property value for the given key.- Specified by:
getValue
in interfaceILcyCustomizerPanel
- Parameters:
aKey
- The key to retrieve the value for.- Returns:
- the property value for the given key.
- See Also:
-
putValue
Description copied from interface:ILcyCustomizerPanel
Sets the property value foraKey
toaValue
. If the value has changed, aPropertyChangeEvent
is sent to the listeners. The property name of the event equals the value ofaKey
.- Specified by:
putValue
in interfaceILcyCustomizerPanel
- Parameters:
aKey
- The key. Should preferably start with an uppercase letter to avoid confusion with regular properties.aValue
- The value.- See Also:
-
getObjectFilter
Returns the object filter.- Returns:
- The object filter. It may be
null
. - See Also:
-
setObjectFilter
Sets the object filter. The filter is used bysetObject
andcanSetObject
to determine which objects should be accepted and which should be rejected. If the filtersaccept
method returnstrue
,canSetObject
also returnstrue
. The object given to the filtersaccept
method is guaranteed to be notnull
, asnull
is always accepted: it deinitialises theILcyCustomizerPanel
.- Parameters:
aObjectFilter
- The object filter. This may benull
. In that case, all objects will be accepted.
-
isChangesPending
public boolean isChangesPending()Returnstrue
if changes are pending. A change is a modification made by the user, e.g., the modified content of a text field. Pending means the methodapplyChanges
was not invoked after the change occurred. A property change event"changesPending"
must be fired if the return value of this method is changed. This can for example be used to enable/disable an apply button.The default value for this implementation is
false
.- Specified by:
isChangesPending
in interfaceILcyCustomizerPanel
- Returns:
true
if there are pending changes,false
otherwise.
-
setChangesPending
protected void setChangesPending(boolean aChangesPending) Sets if there are any outstanding changes in the user interface. Fires a
"changesPending"
property change event if the value has changed.This method has protected access as only extensions of this class should invoke
setChangesPending(true)
whenever the user has made changes in the user interface that are waiting to be committed.Extension of this class can invoke
setChangesPending(false)
when the user undoes any changes. For instance, the user could have checked a checkbox previously, and unchecked it later, in which case this property can be restored tofalse
. Whenever the changes are applied or canceled, this property is automatically set tofalse
.- Parameters:
aChangesPending
-true
when there are outstanding changes,false
otherwise.- See Also:
-
isChangesValid
public boolean isChangesValid()Returnstrue
if the pending changes are valid, or if there are no pending changes. Returnsfalse
if there are invalid pending changes. A change is a modification made by the user, e.g., the modified content of a text field. Pending means the methodapplyChanges
was not invoked after the change occurred.False
could for example be returned if the user has entered invalid input that cannot be applied, such as text where a number is expected. A property change event"changesValid"
must be fired if the return value of this method is changed. This can for example be used to enable/disable an apply button, or to inform the user that he must first correct the invalid content. Implementations can ignore this feature by always returningtrue
.The default value for this implementation is
true
.- Specified by:
isChangesValid
in interfaceILcyCustomizerPanel
- Returns:
true
.
-
setChangesValid
protected void setChangesValid(boolean aChangesValid) Sets if changes are valid. Fires a
"changesValid"
property change event if the value has changed.This method has protected access as only extensions of this class should invoke
setChangesValid(false)
whenever the user has made changes in the user interface that are invalid, such as entering text where a number is expected.Extension of this class can invoke
setChangesValid(true)
when the user undoes any invalid changes, by making them valid again. For instance, when the user replaces some text with some number where that is expected.Note that setting this property is optional as the default value is
true
, which allows to apply any pending changes. The implementation of apply can then, for example, revert any invalid changes.- Parameters:
aChangesValid
-true
if the pending changes are valid (or if there are no changes),false
otherwise.- See Also:
-
canSetObject
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
- 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. InvokesupdateCustomizerPanelFromObject()
to update the user interface.- Specified by:
setObject
in interfaceILcyCustomizerPanel
- Parameters:
aObject
- The object to be customized, ornull
to inform that editing is temporarily disabled.
-
getObject
Returns the object that was set usingsetObject
.- Specified by:
getObject
in interfaceILcyCustomizerPanel
- Returns:
- the object that was set using
setObject
. Can benull
if this customizer panel was deinitialized. - See Also:
-
addUndoableListener
Description copied from interface:ILcdUndoableSource
Adds a listener to this source, so this listener is notified when something undoable has happened.- Specified by:
addUndoableListener
in interfaceILcdUndoableSource
- Parameters:
aUndoableListener
- The listener to be notified when something undoable has happened.
-
removeUndoableListener
Description copied from interface:ILcdUndoableSource
Removes the specified listener so it is no longer notified.- Specified by:
removeUndoableListener
in interfaceILcdUndoableSource
- Parameters:
aUndoableListener
- The listener to remove.
-
fireUndoableHappened
Fires the givenILcdUndoable
to all associatedILcdUndoableListener
s. Extensions of this class should use this method if they want to support undo/redo.- Parameters:
aUndoable
- TheILcdUndoable
to fire. All registeredILcdUndoableListener
instances will be notified of this undoable.
-
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 invokesapplyChangesImpl()
and sets the "changesPending" property. As a result, the "changesPending" event is fired when needed.- Specified by:
applyChanges
in interfaceILcyCustomizerPanel
- 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:
-
cancelChanges
public void cancelChanges()Updates the user interface state according to the current state of the setObject
. Any changes that were made in the user interface but were not yet applied, should be discarded. E.g. consider that anILcdGXYLayer
is being edited and a new label text was entered in a text field. When this method is called, the new label text should be cleared and the current label of theILcdGXYLayer
should be put in the text field (ILcdGXYLayer.getLabel()
). This implementation invokesupdateCustomizerPanelFromObject()
and sets the "changesPending" property to false. As a result, the "changesPending" event is fired when needed.- Specified by:
cancelChanges
in interfaceILcyCustomizerPanel
- See Also:
-
applyChangesImpl
protected abstract boolean applyChangesImpl()Apply any pending changes. This method should do the same as
applyChanges()
, except that it should not take care of "changesPending".- Returns:
- True if changes could be applied or if there were no changes, false otherwise.
Please refer to
applyChanges()
for more detailed information.
-
updateCustomizerPanelFromObject
protected abstract void updateCustomizerPanelFromObject()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.
-