public abstract class ALcyCustomizerPanel extends JPanel implements ILcyCustomizerPanel
Abstract implementation of ILcyCustomizerPanel
that provides default implementations
for most methods of the interface.
What it provides:
"changesPending"
events; extensions only have to invoke
setChangesPending(true)
when the user has made some changes. When
applyChanges
or cancelChanges
is called, the
"changesPending"
property is automatically reset to false
.
What is left for the extensions of this class:
updateCustomizerPanelFromObject()
: this method covers both canceling and setting a new object.
setChangesPending(boolean)
with true
whenever the user has made some changes.
TLcdUndoableEvent
s whenever an operation was performed that can be undone/redone.
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.
JPanel.AccessibleJPanel
JComponent.AccessibleJComponent
Container.AccessibleAWTContainer
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
HINT_PINNED, HORIZONTAL_ALIGNMENT_HINT, LONG_DESCRIPTION, NAME, SHORT_DESCRIPTION, SMALL_ICON
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
Modifier | Constructor and Description |
---|---|
protected |
ALcyCustomizerPanel(ILcdFilter aObjectFilter)
Constructs a new
ALcyCustomizerPanel . |
protected |
ALcyCustomizerPanel(ILcdFilter aObjectFilter,
String aName)
Constructs a new
ALcyCustomizerPanel . |
protected |
ALcyCustomizerPanel(ILcdFilter aObjectFilter,
String aName,
ILcdIcon aSmallIcon)
Constructs a new
ALcyCustomizerPanel . |
protected |
ALcyCustomizerPanel(ILcdFilter aObjectFilter,
String aName,
ILcdIcon aSmallIcon,
String aShortDescription)
Constructs a new
ALcyCustomizerPanel . |
Modifier and Type | Method and Description |
---|---|
void |
addUndoableListener(ILcdUndoableListener aUndoableListener)
Adds a listener to this source, so this listener is notified when something undoable has
happened.
|
boolean |
applyChanges()
Updates the set
Object according to the current state of the user interface. |
protected abstract boolean |
applyChangesImpl()
Apply any pending changes.
|
void |
cancelChanges()
Updates the user interface state according to the current state of the set
Object . |
boolean |
canSetObject(Object aObject)
Returns
true if and only if setObject would not throw an
IllegalArgumentException . |
protected void |
fireUndoableHappened(ILcdUndoable aUndoable)
Fires the given
ILcdUndoable to all associated ILcdUndoableListener s. |
Object |
getObject()
Returns the object that was set using
setObject . |
ILcdFilter |
getObjectFilter()
Returns the object filter.
|
Object |
getValue(String aKey)
Gets the property value for the given key.
|
boolean |
isChangesPending()
Returns
true if changes are pending. |
boolean |
isChangesValid()
Returns
true if the pending changes are valid, or if there are no pending changes. |
void |
putValue(String aKey,
Object aValue)
Sets the property value for
aKey to aValue . |
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 |
setName(String name) |
void |
setObject(Object aObject)
Set the object to be edited.
|
void |
setObjectFilter(ILcdFilter aObjectFilter)
Sets the object filter.
|
protected abstract void |
updateCustomizerPanelFromObject()
Updates the user interface state according to the current state of the set
Object . |
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
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
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
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, getPeer, 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, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
addPropertyChangeListener, getPropertyChangeListeners, getPropertyChangeListeners, removePropertyChangeListener
addPropertyChangeListener, removePropertyChangeListener
protected ALcyCustomizerPanel(ILcdFilter aObjectFilter)
ALcyCustomizerPanel
.aObjectFilter
- The ILcdFilter
that defines which objects are accepted by
canSetObject
and setObject
. See also setPaintState
.protected ALcyCustomizerPanel(ILcdFilter aObjectFilter, String aName)
ALcyCustomizerPanel
.aObjectFilter
- The ILcdFilter
that defines which objects are accepted by
canSetObject
and setObject
. See also setObjectFilter
.aName
- The name for this ALcyCustomizerPanel
, see ILcyCustomizerPanel.NAME
.protected ALcyCustomizerPanel(ILcdFilter aObjectFilter, String aName, ILcdIcon aSmallIcon)
ALcyCustomizerPanel
.aObjectFilter
- The ILcdFilter
that defines which objects are accepted by
canSetObject
and setObject
. See also setPaintState
.aName
- The name for this ALcyCustomizerPanel
, see ILcyCustomizerPanel.NAME
.aSmallIcon
- The small icon of this ALcyCustomizerPanel
, see ILcyCustomizerPanel.SMALL_ICON
.protected ALcyCustomizerPanel(ILcdFilter aObjectFilter, String aName, ILcdIcon aSmallIcon, String aShortDescription)
ALcyCustomizerPanel
.aObjectFilter
- The ILcdFilter
that defines which objects are accepted by
canSetObject
and setObject
. See also setPaintState
.aName
- The name for this ALcyCustomizerPanel
, see ILcyCustomizerPanel.NAME
.aSmallIcon
- The small icon of this ALcyCustomizerPanel
, see ILcyCustomizerPanel.SMALL_ICON
.aShortDescription
- The short description of this ALcyCustomizerPanel
, see ILcyCustomizerPanel.SHORT_DESCRIPTION
.public void setName(String name)
Note: if you want to adjust the display name of this customizer panel,
you need to use the putValue(String, Object)
method with
ILcyCustomizerPanel.NAME
as key.
Consult the documentation of that constant for more information.
public Object getValue(String aKey)
ILcyCustomizerPanel
getValue
in interface ILcyCustomizerPanel
aKey
- The key to retrieve the value for.ILcyCustomizerPanel.putValue(java.lang.String, java.lang.Object)
public void putValue(String aKey, Object aValue)
ILcyCustomizerPanel
aKey
to aValue
. If the value has changed, a
PropertyChangeEvent
is sent to the listeners. The property name of the event equals
the value of aKey
.putValue
in interface ILcyCustomizerPanel
aKey
- The key. Should preferably start with an uppercase letter to avoid confusion with regular properties.aValue
- The value.ILcyCustomizerPanel.getValue(java.lang.String)
,
ILcyCustomizerPanel.NAME
,
ILcyCustomizerPanel.SMALL_ICON
,
ILcyCustomizerPanel.SHORT_DESCRIPTION
,
ILcyCustomizerPanel.LONG_DESCRIPTION
,
ILcyCustomizerPanel.HINT_PINNED
public ILcdFilter getObjectFilter()
null
.setObjectFilter(com.luciad.util.ILcdFilter)
public void setObjectFilter(ILcdFilter aObjectFilter)
setObject
and canSetObject
to determine
which objects should be accepted and which should be rejected. If the filters accept
method returns
true
, canSetObject
also returns true
.
The object given to the filters accept
method is guaranteed to be not null
, as
null
is always accepted: it deinitialises the ILcyCustomizerPanel
.aObjectFilter
- The object filter. This may be null
. In that case, all
objects will be accepted.public boolean isChangesPending()
true
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 method applyChanges
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
.
isChangesPending
in interface ILcyCustomizerPanel
true
if there are pending changes, false
otherwise.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 to false
. Whenever the changes are applied or canceled,
this property is automatically set to false
.
aChangesPending
- true
when there are outstanding changes, false
otherwise.isChangesPending()
,
applyChanges()
,
cancelChanges()
public boolean isChangesValid()
true
if the pending changes are valid, or if there are no pending changes. Returns
false
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 method applyChanges
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 returning true
.
The default value for this implementation is true
.
isChangesValid
in interface ILcyCustomizerPanel
true
.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.
aChangesValid
- true
if the pending changes are valid (or if there are no changes),
false
otherwise.isChangesValid()
public boolean canSetObject(Object aObject)
true
if and only if setObject
would not throw an
IllegalArgumentException
.
Only accepts null
or objects that pass the object filter. If the
filter itself is null
, all objects are accepted.canSetObject
in interface ILcyCustomizerPanel
aObject
- The object to check.true
if setObject
would accept the object, false
if it would throw an exception.public void setObject(Object aObject)
ILcyCustomizerPanel
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 of null
is set to inform this ILcyCustomizerPanel
to (temporarily) deinitialize
itself, it allows to perform cleanup tasks, such as removing listeners.
Invokes updateCustomizerPanelFromObject()
to update the user interface.setObject
in interface ILcyCustomizerPanel
aObject
- The object to be customized, or null
to inform that editing is temporarily disabled.public Object getObject()
setObject
.getObject
in interface ILcyCustomizerPanel
setObject
. Can be null
if this
customizer panel was deinitialized.setObject(Object)
public void addUndoableListener(ILcdUndoableListener aUndoableListener)
ILcdUndoableSource
addUndoableListener
in interface ILcdUndoableSource
aUndoableListener
- The listener to be notified when something undoable has happened.public void removeUndoableListener(ILcdUndoableListener aUndoableListener)
ILcdUndoableSource
removeUndoableListener
in interface ILcdUndoableSource
aUndoableListener
- The listener to remove.protected final void fireUndoableHappened(ILcdUndoable aUndoable)
ILcdUndoable
to all associated ILcdUndoableListener
s. Extensions of this
class should use this method if they want to support undo/redo.aUndoable
- The ILcdUndoable
to fire. All registered ILcdUndoableListener
instances will be notified of this undoable.public boolean applyChanges()
Object
according to the current state of the user interface. This means
all pending changes are committed.
If there were any pending changes, so isChangesPending
returned true
, it should return
false
after this method has finished, and therefore also a "changesPending"
property
change event must be fired.
E.g. consider that a ILcdGXYLayer
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 the ILcdGXYLayer
(using
ILcdGXYLayer.setLabel
).
This implementation invokes applyChangesImpl()
and sets the "changesPending" property.
As a result, the "changesPending" event is fired when needed.applyChanges
in interface ILcyCustomizerPanel
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
returns
false
.setChangesPending(boolean)
public void cancelChanges()
Object
. Any
changes that were made in the user interface but were not yet applied, should be discarded.
E.g. consider that an ILcdGXYLayer
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 the
ILcdGXYLayer
should be put in the text field (ILcdGXYLayer.getLabel()
).
This implementation invokes updateCustomizerPanelFromObject()
and sets the "changesPending" property
to false. As a result, the "changesPending" event is fired when needed.cancelChanges
in interface ILcyCustomizerPanel
setChangesPending(boolean)
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".
applyChanges()
for more detailed information.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 using
setObject
, or when the changes are canceled using cancelChanges
.
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 the ILcdLayer
(getLabel()
)
should be put in the text field.