public abstract class Node extends FeatureDescriptor implements Lookup.Provider, HelpCtx.Provider
The node has three purposes:
Frequently nodes are created to represent DataObject
s.
But they may also represent anything to be displayed to the user or manipulated programmatically,
even if they have no data directly stored behind them; for example, a control panel or debugger
breakpoint.
There are two listeners in this class: PropertyChangeListener
and NodeListener
(which extends PropertyChangeListener
). The first
is designed to listen on properties that can be returned from
Node.getPropertySets()
, the later for listening on changes in the
node itself (including the name, children, parent, set of properties,
icons, etc.). Be sure to distinguish between these two.
The node is cloneable. When a node is cloned, it is initialized with an empty set of listeners and no parent. The display name and short description are copied to the new node. The set of properties is shared.
Implements Lookup.Provider
since 3.11.
Modifier and Type | Class and Description |
---|---|
static interface |
Node.Cookie
Marker interface for all cookies.
|
static interface |
Node.Handle
Serializable node reference.
|
static class |
Node.IndexedProperty<T,E>
Description of an indexed property and operations on it.
|
static class |
Node.Property<T>
Description of a Bean property on a node, and operations on it.
|
static class |
Node.PropertySet
Class that represents one set of properties.
|
Modifier and Type | Field and Description |
---|---|
static Node |
EMPTY
An empty leaf node.
|
static String |
PROP_COOKIE
Property for a node's cookie set.
|
static String |
PROP_DISPLAY_NAME
Property for node display name.
|
static String |
PROP_ICON
Property for the normal (closed) icon of a node.
|
static String |
PROP_LEAF
Property saying whether the Node is Leaf
|
static String |
PROP_NAME
Property for internal (not displayable) name of a node.
|
static String |
PROP_OPENED_ICON
Property for the opened icon of a node.
|
static String |
PROP_PARENT_NODE
Property for a node's parent.
|
static String |
PROP_PROPERTY_SETS
Property for a node's list of property sets.
|
static String |
PROP_SHORT_DESCRIPTION
Property for short description of a node.
|
Modifier | Constructor and Description |
---|---|
protected |
Node(Children h)
Creates a new node with a given hierarchy of children.
|
protected |
Node(Children h,
Lookup lookup)
Creates a new node with a given hierarchy of children and a lookup
providing content for
Node.getCookie(java.lang.Class<T>) and Node.getLookup() methods. |
Modifier and Type | Method and Description |
---|---|
void |
addNodeListener(NodeListener l)
Add a listener to changes in the node's intrinsic properties (name, cookies, etc.).
|
void |
addPropertyChangeListener(PropertyChangeListener l)
Add a listener to the node's computed Bean properties.
|
abstract boolean |
canCopy()
Test whether this node permits copying.
|
abstract boolean |
canCut()
Test whether this node permits cutting.
|
abstract boolean |
canDestroy()
Test whether this node can be deleted.
|
abstract boolean |
canRename()
Test whether this node can be renamed.
|
abstract Transferable |
clipboardCopy()
Called when a node is to be copied to the clipboard.
|
abstract Transferable |
clipboardCut()
Called when a node is to be cut to the clipboard.
|
protected Object |
clone()
Implements
Object.clone() to behave correctly if cloning is desired. |
abstract Node |
cloneNode()
Clone the node.
|
void |
destroy()
Called when a node is deleted.
|
abstract Transferable |
drag()
Called when a drag is started with this node.
|
boolean |
equals(Object obj)
Compares for equality.
|
protected void |
fireCookieChange()
Fires a change event for
Node.PROP_COOKIE . |
protected void |
fireDisplayNameChange(String o,
String n)
Allow subclasses that override the getDisplayName method to fire
the changes of the name by itself.
|
protected void |
fireIconChange()
Fire a change event for
Node.PROP_ICON . |
protected void |
fireNameChange(String o,
String n)
Allow subclasses that override the getName method to fire
the changes of the name by itself.
|
protected void |
fireNodeDestroyed()
To all node listeners fire node destroyed notification.
|
protected void |
fireOpenedIconChange()
Fire a change event for
Node.PROP_OPENED_ICON . |
protected void |
firePropertyChange(String name,
Object o,
Object n)
Fire a property change event.
|
protected void |
firePropertySetsChange(Node.PropertySet[] o,
Node.PropertySet[] n)
Fires a (Bean) property change event (for
Node.PROP_PROPERTY_SETS ). |
protected void |
fireShortDescriptionChange(String o,
String n)
Allow subclasses that override the getShortDescription method to fire
the changes of the description by itself.
|
SystemAction[] |
getActions()
Deprecated.
Use getActions (false) instead.
|
Action[] |
getActions(boolean context)
Get the set of actions that are associated with this node.
|
Children |
getChildren()
Get the list of children.
|
SystemAction[] |
getContextActions()
Deprecated.
Use getActions (true) instead.
|
JPopupMenu |
getContextMenu()
Makes a context menu for this node.
|
<T extends Node.Cookie> |
getCookie(Class<T> type)
Get a cookie for this node.
|
abstract Component |
getCustomizer()
Get the customizer component.
|
SystemAction |
getDefaultAction()
Deprecated.
Use
Node.getPreferredAction() instead. |
abstract PasteType |
getDropType(Transferable t,
int action,
int index)
Determine if there is a paste operation that can be performed
on provided transferable.
|
abstract Node.Handle |
getHandle()
Obtain handle for this node (for serialization).
|
abstract HelpCtx |
getHelpCtx()
Get context help associated with this node.
|
String |
getHtmlDisplayName()
Return a variant of the display name containing HTML markup
conforming to the limited subset of font-markup HTML supported by
the lightweight HTML renderer
org.openide.awt.HtmlRenderer
(font color, bold, italic and strike-through supported; font
colors can be UIManager color keys if they are prefixed with
a ! character, i.e. |
abstract Image |
getIcon(int type)
Find an icon for this node (in the closed state).
|
Lookup |
getLookup()
Obtains a Lookup representing additional content of this Node.
|
abstract NewType[] |
getNewTypes()
Get the new types that can be created in this node.
|
abstract Image |
getOpenedIcon(int type)
Find an icon for this node (in the open state).
|
Node |
getParentNode()
Get the parent node.
|
abstract PasteType[] |
getPasteTypes(Transferable t)
Determine which paste operations are allowed when a given transferable is in the clipboard.
|
Action |
getPreferredAction()
Gets the preferred action for this node.
|
abstract Node.PropertySet[] |
getPropertySets()
Get the list of property sets for this node.
|
abstract boolean |
hasCustomizer()
Test whether there is a customizer for this node.
|
int |
hashCode() |
protected boolean |
hasPropertyChangeListener()
Allows to figure out, whether the node has any
PropertyChangeListeners attached.
|
boolean |
isLeaf()
Test whether the node is a leaf, or may contain children.
|
void |
removeNodeListener(NodeListener l)
Remove a node listener.
|
void |
removePropertyChangeListener(PropertyChangeListener l)
Remove a Bean property change listener.
|
protected void |
setChildren(Children ch)
Allows to change Children of the node.
|
void |
setDisplayName(String s)
Set the display name.
|
void |
setHidden(boolean hidden)
Deprecated.
Has no effect. To make a node disappear, simply remove it from the
children of its parent. For example, you might call
Children.Keys.setKeys(Collection) with a smaller collection. |
void |
setName(String s)
Set the system name.
|
void |
setShortDescription(String s)
Set the short description of the node.
|
String |
toString() |
attributeNames, getDisplayName, getName, getShortDescription, getValue, isExpert, isHidden, isPreferred, setExpert, setPreferred, setValue
public static final Node EMPTY
public static final String PROP_DISPLAY_NAME
public static final String PROP_NAME
public static final String PROP_SHORT_DESCRIPTION
public static final String PROP_ICON
public static final String PROP_OPENED_ICON
public static final String PROP_PARENT_NODE
public static final String PROP_PROPERTY_SETS
public static final String PROP_COOKIE
public static final String PROP_LEAF
protected Node(Children h) throws IllegalStateException
h
- the children to use for this nodeIllegalStateException
- if the children object is already in use by
a different nodeprotected Node(Children h, Lookup lookup) throws IllegalStateException
Node.getCookie(java.lang.Class<T>)
and Node.getLookup()
methods.
As the lookup needs to be constructed before Node's constructor is called, it might not be obvious how to add Node or other objects into it without type casting. Here is the recommended suggestion that uses public/private pair of constructors:
public MyNode(Children ch, FileObject file) { this(ch, file, new InstanceContent()); } /** A private constructor that takes an InstanceContent and * uses it as internals for the Node lookup and also allow us * to modify the content, for example by adding a reference * to the node itself or any other object we want to represent. * * @param ch children we wish to use * @param file sample object we wish to have in lookup * @param content the content created by the first constructor */ private MyNode(Children ch, FileObject file, InstanceContent content) { super(ch, new AbstractLookup(content)); // adds the node to our own lookup content.add (this); // adds additional items to the lookup content.add (file); }
h
- the children to use for this nodelookup
- the lookup to provide content of Node.getLookup()
and also Node.getCookie(java.lang.Class<T>)
IllegalStateException
- if the children object is already in use by
a different nodeprotected Object clone() throws CloneNotSupportedException
Object.clone()
to behave correctly if cloning is desired.
But Cloneable
is not declared by default.
The default implementation checks whether the child list implements
Cloneable
, and if so, it clones the children.
If the child list does not support cloning, Children.LEAF
is used
instead for the children. The parent of this node is set to null
and an empty set
of listeners is attached to the node.
clone
in class Object
CloneNotSupportedException
- if the children cannot be cloned
in spite of implementing Cloneable
public abstract Node cloneNode()
public void setName(String s)
setName
in class FeatureDescriptor
s
- the new nameIllegalArgumentException
- if the new name cannot represent
a valid node namepublic void setDisplayName(String s)
setDisplayName
in class FeatureDescriptor
s
- the new namepublic void setShortDescription(String s)
This description may be used for tool tips, etc.
setShortDescription
in class FeatureDescriptor
s
- the new description@Deprecated public void setHidden(boolean hidden)
Children.Keys.setKeys(Collection)
with a smaller collection.setHidden
in class FeatureDescriptor
public abstract Image getIcon(int type)
type
- constant from BeanInfo
public abstract Image getOpenedIcon(int type)
type
- constant from BeanInfo
public abstract HelpCtx getHelpCtx()
getHelpCtx
in interface HelpCtx.Provider
null
or HelpCtx.DEFAULT_HELP
)public final Children getChildren()
protected final void setChildren(Children ch)
ch
- New children to be set on the node.public final boolean isLeaf()
true
if the children list is actually Children.LEAF
public final Node getParentNode()
null
if this node is the root of a hierarchypublic abstract boolean canRename()
FeatureDescriptor.getName()
to obtain the current name and
Node.setName(java.lang.String)
to change it.true
if the node can be renamedpublic abstract boolean canDestroy()
true
if canpublic void destroy() throws IOException
The default
implementation obtains write access to
Children.MUTEX
, and removes
the node from its parent (if any). Also fires a property change.
Subclasses which return true from Node.canDestroy()
should override
this method to remove the associated model object from its parent. There
is no need to call the super method in this case.
There is no guarantee that after this method has been called, other
methods such as Node.getIcon(int)
will not also be called for a little while.
IOException
- if something failspublic abstract Node.PropertySet[] getPropertySets()
public abstract Transferable clipboardCopy() throws IOException
IOException
- when the
copy cannot be performedpublic abstract Transferable clipboardCut() throws IOException
IOException
- when the
cut cannot be performedpublic abstract Transferable drag() throws IOException
IOException
- if a drag cannot be startedpublic abstract boolean canCopy()
true
if sopublic abstract boolean canCut()
true
if sopublic abstract PasteType[] getPasteTypes(Transferable t)
t
- the transferable in the clipboardpublic abstract PasteType getDropType(Transferable t, int action, int index)
t
- the transferableaction
- the drag'n'drop action to do DnDConstants.ACTION_MOVE, ACTION_COPY, ACTION_LINKindex
- index between children the drop occurred at or -1 if not specifiedpublic abstract NewType[] getNewTypes()
public Action[] getActions(boolean context)
By default this method delegates to the deprecated getActions or getContextActions method depending on the value of supplied argument.
It is supposed to be overridden by subclasses accordingly.
context
- whether to find actions for context meaning or for the
node itself@Deprecated public SystemAction[] getActions()
context menu
.
By default returns the actions in NodeOp.getDefaultActions()
.
@Deprecated public SystemAction[] getContextActions()
For example, right-clicking on a parent node in a hierarchical view (such as
the normal Explorer) should use getActions
. However, if this node
is serving as the parent of a (say) a window tab full of icons (e.g., in
IconView
), and the users right-clicks on
the empty space in this pane, then this method should be used to get
the appropriate actions for a context menu.
Note that in the Windows UI system, e.g., these action sets are quite different.
Node.getActions(boolean)
.@Deprecated public SystemAction getDefaultAction()
Node.getPreferredAction()
instead.null
indicating there should be none default actionpublic Action getPreferredAction()
Node.getActions(boolean)
.
In case it is, the context menu created from those actions
is encouraged to highlight the preferred action.
Override in subclasses accordingly.null
if there is nonepublic final JPopupMenu getContextMenu()
Component action maps are not taken into consideration.
Utilities.actionsToPopup(Action[], Component)
is a better choice
if you want to use actions such as "Paste" which look at action maps.
NodeOp.findContextMenu(org.openide.nodes.Node[])
public abstract boolean hasCustomizer()
Node.getCustomizer()
.true
if there is a customizerpublic abstract Component getCustomizer()
null
if there is no customizerpublic <T extends Node.Cookie> T getCookie(Class<T> type)
The set of cookies can change. If a node changes its set of
cookies, it fires a property change event with Node.PROP_COOKIE
.
If the Node was constructed with a Lookup
in constructor
than this method delegates to the provided lookup object.
type
- the representation class of the cookienull
if this node has no such cookieLookup
public final Lookup getLookup()
getLookup
in interface Lookup.Provider
public String getHtmlDisplayName()
org.openide.awt.HtmlRenderer
(font color, bold, italic and strike-through supported; font
colors can be UIManager color keys if they are prefixed with
a ! character, i.e. <font color='!controlShadow'>).
Enclosing <html> tags are not needed. If returning non-null, HTML
markup characters that should be literally rendered must be
escaped (> becomes > and so forth).
This method should return either an HTML display name or null; it should not return the non-HTML display name.
Note the specified foreground color has to have a high luminescence difference
to the background color in order to be used (displayed).
If not, the specified foreground color will be ignored and the default color will be used.
Luminescence of a color is calculated as following:
(Red value * 299 + Green value * 587 + Blue value * 114) / 1000
and the difference has to be greater or equal to 80.
Note there is no property corresponding to the HTML display name -
if it should change, a change in the display name should be fired; this
should not be a mechanism for returning anything other than a marked
up version of the return value of getDisplayName
.
HtmlRenderer
public abstract Node.Handle getHandle()
Node.Handle.getNode()
used after
deserialization to obtain the original node.null
if this node is not persistablepublic final void addNodeListener(NodeListener l)
The listener is not notified about changes in subnodes until the
method getChildren().getNodes()
is called.
l
- the listener to addpublic final void removeNodeListener(NodeListener l)
l
- the listenerpublic final void addPropertyChangeListener(PropertyChangeListener l)
l
- the listenerprotected final boolean hasPropertyChangeListener()
public final void removePropertyChangeListener(PropertyChangeListener l)
l
- the listenerprotected final void firePropertyChange(String name, Object o, Object n)
name
- name of changed property (from Node.getPropertySets()
); may be nullo
- old value; may be nulln
- new value; may be nullPropertyChangeEvent
protected final void fireNameChange(String o, String n)
protected final void fireDisplayNameChange(String o, String n)
protected final void fireShortDescriptionChange(String o, String n)
protected final void fireIconChange()
Node.PROP_ICON
.protected final void fireOpenedIconChange()
Node.PROP_OPENED_ICON
.protected final void fireNodeDestroyed()
protected final void firePropertySetsChange(Node.PropertySet[] o, Node.PropertySet[] n)
Node.PROP_PROPERTY_SETS
).o
- the old setn
- the new setprotected final void fireCookieChange()
Node.PROP_COOKIE
.
The old and new values are set to null.public boolean equals(Object obj)
public String toString()
toString
in class FeatureDescriptor