Class AbstractNavTreeNode
- java.lang.Object
-
- com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode
-
- All Implemented Interfaces:
java.lang.Iterable<AbstractNavTreeNode>
,javax.swing.tree.TreeNode
- Direct Known Subclasses:
AbstractResourceNavTreeNode
,ComponentNode
,MutableNavTreeNode
,ShapeNode
public abstract class AbstractNavTreeNode extends java.lang.Object implements javax.swing.tree.TreeNode, java.lang.Iterable<AbstractNavTreeNode>
Base TreeNode for the Designer's Project Browser tree. Supports a number of project-browser features, such as:- lazy (but synchronous) loading
- badges for rendering
- selection delegation
- cut/copy/paste handling.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
AbstractNavTreeNode.DeleteReason
Semantically, the "delete" operation gets used for a variety of different reasons.protected static class
AbstractNavTreeNode.PopupAction
A BaseAction that gets set up with the node selection prior to being shown
-
Field Summary
Fields Modifier and Type Field Description protected boolean
bold
protected java.util.List<AbstractNavTreeNode>
children
protected boolean
childrenLoaded
protected static AbstractNavTreeNode.PopupAction
copyAction
protected static AbstractNavTreeNode.PopupAction
copyPathAction
protected static AbstractNavTreeNode.PopupAction
cutAction
protected static AbstractNavTreeNode.PopupAction
deleteAction
protected int
depth
protected javax.swing.Icon
icon
protected boolean
italic
protected LoggerEx
log
protected NavTreePanel.EditableTreeModel
model
protected java.lang.String
name
protected AbstractNavTreeNode
parent
protected static AbstractNavTreeNode.PopupAction
pasteAction
protected static AbstractNavTreeNode.PopupAction
renameAction
protected javax.swing.tree.TreeSelectionModel
selectionModel
protected java.lang.String
text
protected java.awt.image.BufferedImage
thumbnail
protected java.lang.String
tooltip
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractNavTreeNode()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addBadges(BadgeTreeCellRenderer renderer, boolean selected)
Add 'badges' to indicate meta information about this nodeprotected void
addEditActions(javax.swing.JPopupMenu menu)
boolean
canCopy(java.util.List<AbstractNavTreeNode> selectedChildren)
Can this edit action handler handle the copy action, given its current selection? Note that if this andcanDelete(java.util.List)
both return true, the cut action will also be enabled.boolean
canDelete(java.util.List<AbstractNavTreeNode> selectedChildren)
Can this edit action handler handle the delete action, given its current selection? Note that if this andcanCopy(java.util.List)
both return true, the cut action will also be enabled.boolean
canDrag(java.util.List<AbstractNavTreeNode> draggedChildren)
Can the nodes controlled by this action handling node be dragged?boolean
canDrop(AbstractNavTreeNode dropTarget, java.util.List<java.awt.datatransfer.DataFlavor> flavors)
boolean
canPaste(java.util.List<AbstractNavTreeNode> selectedChildren, java.awt.datatransfer.Transferable data)
Can this action handler handle a paste given the data flavors currently available in the clipboard? data may be null.protected void
checkChildren()
Checks to see if the children have been loaded, and if not, loads them.java.util.Enumeration
children()
boolean
confirmDelete(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Used to confirm the delete.protected java.awt.datatransfer.Transferable
createResourceCopy(java.util.List<ProjectResource> resources)
Creates a Transferable that will just be a JSON string containing an array of project resourcesprotected void
debug()
protected void
debug(java.lang.String str)
void
dispatchSelectionEvent(java.util.List<javax.swing.tree.TreePath> selection)
Not part of the public API.java.awt.datatransfer.Transferable
doCopy(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Called when the copy action is performed.java.awt.datatransfer.Transferable
doCut(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Called when the cut action is performed.void
doDelete(java.util.List<? extends AbstractNavTreeNode> selectedChildren, AbstractNavTreeNode.DeleteReason reason)
Called when the delete action is performed, if confirmDelete returned trueboolean
doPaste(java.util.List<? extends AbstractNavTreeNode> selectedChildren, java.awt.datatransfer.Transferable clipboardContents, boolean isDrop)
Called when the paste action is performedvoid
expand()
void
expandAndSelect()
AbstractNavTreeNode
findChild(java.lang.String name)
Looks through the node's children (if any) for a node with the given namestatic AbstractNavTreeNode
findCommonEditActionHandler(javax.swing.tree.TreePath[] paths)
static AbstractNavTreeNode
findDropHandler(javax.swing.tree.TreePath path)
Finds the closest edit action handling node in the hierarchy of the given path, including the last path component itself.static AbstractNavTreeNode
findEditActionHandler(javax.swing.tree.TreePath path)
Finds the closest edit action handling node in the hierarchy of the given path, not including the last path component itself.void
forceChildrenReload()
Will force child nodes to reload the next time checkChildren() is called.boolean
getAllowsChildren()
AbstractNavTreeNode
getChildAt(int idx)
int
getChildCount()
protected java.awt.datatransfer.Clipboard
getClipboard()
protected AbstractNavTreeNode.PopupAction
getDeleteAction()
int
getDepth()
Returns this node's depth in the tree.javax.swing.Icon
getExpandedIcon()
Returns an alternate icon for when this node is expanded, if applicable.javax.swing.Icon
getIcon()
int
getIndex(javax.swing.tree.TreeNode node)
NavTreePanel.EditableTreeModel
getModel()
java.lang.String
getName()
AbstractNavTreeNode
getParent()
Overridden to narrow the return typeprotected java.lang.Iterable<AbstractNavTreeNode.PopupAction>
getPopupActions()
Provide a list ofPopupAction
s that will be set up bysetupEditActions(javax.swing.tree.TreePath[], java.util.List<com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode>)
; that is, will have theirAbstractNavTreeNode.PopupAction.selection
andAbstractNavTreeNode.PopupAction.actionHandler
set.javax.swing.tree.TreeSelectionModel
getSelectionModel()
int
getSortOrder()
Returns the relative sort order for peers.java.lang.String
getText()
The text that will be used to render the nodejava.awt.image.BufferedImage
getThumbnail()
java.lang.String
getTooltip()
java.lang.String
getWorkspaceName()
Returns the name of the desired workspace for this node.protected void
initPopupMenu(javax.swing.JPopupMenu menu, javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection, int modifiers)
Default implementation calls setupEditActions(), and then addEditActions()void
install(AbstractNavTreeNode parent)
boolean
isBold()
boolean
isEditable()
Override this and return true if you want your node's text to be editable.boolean
isEditActionHandler()
Override to return true if you want this node to be an edit action handler for its children.boolean
isItalic()
boolean
isLeaf()
boolean
isRestricted()
Used to display protected Icon for project resources that are able to be protected.boolean
isSelected()
protected boolean
isTopLevelNode()
Indicates whether this node is the "root" of a given tree; primarily used to offer different edit optionsprotected boolean
isValidName(java.lang.String aName)
java.util.Iterator<AbstractNavTreeNode>
iterator()
protected java.util.List<AbstractNavTreeNode>
loadChildren()
Called before this node responds from any of the children-related TreeNode functions, if a list of children wasn't already set.protected LoggerEx
newLogger()
protected void
notifyChildNameChanged(AbstractNavTreeNode child)
Called back by {setName(String)
so the parent can re-sort its children if necessary.void
onChildrenSelected(java.util.List<javax.swing.tree.TreePath> paths)
Called when child nodes (deep) are selected under this node.void
onDoubleClick()
Called when this node is double-clicked on.void
onEdit(java.lang.String newTextValue)
Called after this node has been edited in the tree.void
onSelected()
Called when this node is selected in the treejavax.swing.tree.TreePath
pathToRoot()
protected void
recreate()
Asks the node to create its child list again, and reloads the structureprotected void
recreate(boolean keepSelection)
void
refresh()
Tells the model that this node's representation has changed, but not its structure.void
reload()
Tells the model that this node and its child structure have changed.void
select()
Causes this tree node to become selected, clearing the current selectionvoid
select(boolean append)
Causes this tree node to become selected.void
setBold(boolean bold)
protected void
setChildren(java.util.List<AbstractNavTreeNode> children, boolean notify)
protected void
setIcon(javax.swing.Icon icon)
void
setItalic(boolean italic)
protected void
setName(java.lang.String name)
protected void
setText(java.lang.String text)
protected void
setThumbnail(java.awt.image.BufferedImage thumbnail)
protected void
setTooltip(java.lang.String tooltip)
protected void
setupEditActions(javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection)
Searches for a common edit action handling parent, and if one exists, sets up the edit actions appropriately.void
showPopupMenu(java.awt.Component source, int x, int y, int modifiers, javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection)
Called when a popup triggering event (right click) occurs over this node.java.lang.String
toString()
protected void
uninstall()
Called when the node is removed from the tree.protected void
uninstallChildren()
boolean
useThumbnailTooltip()
void
visitIfLoaded(java.util.function.Consumer<AbstractNavTreeNode> visitor)
Visits children first if they have been loaded
-
-
-
Field Detail
-
children
protected java.util.List<AbstractNavTreeNode> children
-
childrenLoaded
protected boolean childrenLoaded
-
parent
protected AbstractNavTreeNode parent
-
model
protected NavTreePanel.EditableTreeModel model
-
selectionModel
protected javax.swing.tree.TreeSelectionModel selectionModel
-
name
protected java.lang.String name
-
text
protected java.lang.String text
-
tooltip
protected java.lang.String tooltip
-
thumbnail
protected java.awt.image.BufferedImage thumbnail
-
icon
protected javax.swing.Icon icon
-
italic
protected boolean italic
-
bold
protected boolean bold
-
log
protected LoggerEx log
-
depth
protected int depth
-
cutAction
protected static final AbstractNavTreeNode.PopupAction cutAction
-
copyAction
protected static final AbstractNavTreeNode.PopupAction copyAction
-
pasteAction
protected static final AbstractNavTreeNode.PopupAction pasteAction
-
deleteAction
protected static final AbstractNavTreeNode.PopupAction deleteAction
-
renameAction
protected static final AbstractNavTreeNode.PopupAction renameAction
-
copyPathAction
protected static final AbstractNavTreeNode.PopupAction copyPathAction
-
-
Method Detail
-
newLogger
protected LoggerEx newLogger()
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
getSortOrder
public int getSortOrder()
Returns the relative sort order for peers. Not all nav tree node parents will use this sort order, but the root node does. Nodes with equal sort orders will then be sorted by their titles. The default return value here is 0. The config menu node returns Integer.MIN_VALUE.- Returns:
- relative sort order for peers
-
debug
protected void debug(java.lang.String str)
-
debug
protected void debug()
-
getDepth
public int getDepth()
Returns this node's depth in the tree. Will be -1 when the node is not installed.
-
install
public void install(AbstractNavTreeNode parent)
-
uninstall
protected void uninstall()
Called when the node is removed from the tree. Override to provide meaningful implementation.
-
uninstallChildren
protected void uninstallChildren()
-
useThumbnailTooltip
public boolean useThumbnailTooltip()
-
children
public java.util.Enumeration children()
- Specified by:
children
in interfacejavax.swing.tree.TreeNode
-
iterator
public java.util.Iterator<AbstractNavTreeNode> iterator()
- Specified by:
iterator
in interfacejava.lang.Iterable<AbstractNavTreeNode>
-
getAllowsChildren
public boolean getAllowsChildren()
- Specified by:
getAllowsChildren
in interfacejavax.swing.tree.TreeNode
-
checkChildren
protected void checkChildren()
Checks to see if the children have been loaded, and if not, loads them.
-
loadChildren
protected java.util.List<AbstractNavTreeNode> loadChildren()
Called before this node responds from any of the children-related TreeNode functions, if a list of children wasn't already set. Override to use lazy child loading.
-
showPopupMenu
public void showPopupMenu(java.awt.Component source, int x, int y, int modifiers, javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection)
Called when a popup triggering event (right click) occurs over this node.- Parameters:
source
- The component to use as the invoker for the popup menu.x
- popup location x valuey
- popup location y valuemodifiers
- extended modifier mask for this event, e.g. this which end with the _DOWN_MASK suffix, such as ALT_DOWN_MASK, BUTTON1_DOWN_MASK, and others, as defined inInputEvent.getModifiers()
)}selection
- The list of currently selected nodes.
-
initPopupMenu
protected void initPopupMenu(javax.swing.JPopupMenu menu, javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection, int modifiers)
Default implementation calls setupEditActions(), and then addEditActions()
-
addEditActions
protected void addEditActions(javax.swing.JPopupMenu menu)
-
getPopupActions
protected java.lang.Iterable<AbstractNavTreeNode.PopupAction> getPopupActions()
Provide a list ofPopupAction
s that will be set up bysetupEditActions(javax.swing.tree.TreePath[], java.util.List<com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode>)
; that is, will have theirAbstractNavTreeNode.PopupAction.selection
andAbstractNavTreeNode.PopupAction.actionHandler
set.
-
getDeleteAction
@Nonnull protected AbstractNavTreeNode.PopupAction getDeleteAction()
-
setupEditActions
protected void setupEditActions(javax.swing.tree.TreePath[] paths, java.util.List<AbstractNavTreeNode> selection)
Searches for a common edit action handling parent, and if one exists, sets up the edit actions appropriately. If not, disables them.
-
isRestricted
public boolean isRestricted()
Used to display protected Icon for project resources that are able to be protected. This method is overridden in AbstractProtectableResource to return if the the project resource it contains is actually.
-
isTopLevelNode
protected boolean isTopLevelNode()
Indicates whether this node is the "root" of a given tree; primarily used to offer different edit options
-
findCommonEditActionHandler
@Nullable public static AbstractNavTreeNode findCommonEditActionHandler(javax.swing.tree.TreePath[] paths)
-
findEditActionHandler
@Nullable public static AbstractNavTreeNode findEditActionHandler(javax.swing.tree.TreePath path)
Finds the closest edit action handling node in the hierarchy of the given path, not including the last path component itself. (unless no other is found)
-
findDropHandler
@Nullable public static AbstractNavTreeNode findDropHandler(javax.swing.tree.TreePath path)
Finds the closest edit action handling node in the hierarchy of the given path, including the last path component itself.
-
isEditable
public boolean isEditable()
Override this and return true if you want your node's text to be editable. SeeonEdit(String)
-
isValidName
protected boolean isValidName(@Nonnull java.lang.String aName)
-
onEdit
public void onEdit(java.lang.String newTextValue)
Called after this node has been edited in the tree.
-
onDoubleClick
public void onDoubleClick()
Called when this node is double-clicked on.
-
onSelected
public void onSelected()
Called when this node is selected in the tree
-
onChildrenSelected
public void onChildrenSelected(java.util.List<javax.swing.tree.TreePath> paths)
Called when child nodes (deep) are selected under this node.- Parameters:
paths
- the children selected when the parent node is selected
-
select
public void select()
Causes this tree node to become selected, clearing the current selection
-
select
public void select(boolean append)
Causes this tree node to become selected.- Parameters:
append
- Should this node be appended to the current selection, or be selected by itself?
-
expand
public void expand()
-
expandAndSelect
public void expandAndSelect()
-
pathToRoot
public javax.swing.tree.TreePath pathToRoot()
-
getChildAt
public final AbstractNavTreeNode getChildAt(int idx)
- Specified by:
getChildAt
in interfacejavax.swing.tree.TreeNode
-
getChildCount
public final int getChildCount()
- Specified by:
getChildCount
in interfacejavax.swing.tree.TreeNode
-
getIndex
public final int getIndex(javax.swing.tree.TreeNode node)
- Specified by:
getIndex
in interfacejavax.swing.tree.TreeNode
-
isLeaf
public boolean isLeaf()
- Specified by:
isLeaf
in interfacejavax.swing.tree.TreeNode
-
setChildren
protected final void setChildren(java.util.List<AbstractNavTreeNode> children, boolean notify)
-
getParent
public AbstractNavTreeNode getParent()
Overridden to narrow the return type- Specified by:
getParent
in interfacejavax.swing.tree.TreeNode
-
refresh
public void refresh()
Tells the model that this node's representation has changed, but not its structure.
-
reload
public void reload()
Tells the model that this node and its child structure have changed.
-
recreate
protected void recreate()
Asks the node to create its child list again, and reloads the structure
-
recreate
protected void recreate(boolean keepSelection)
-
notifyChildNameChanged
protected void notifyChildNameChanged(AbstractNavTreeNode child)
Called back by {setName(String)
so the parent can re-sort its children if necessary. Simply calls recreate() by default assuming theloadChildren()
call sorts alphabetically.
-
findChild
public AbstractNavTreeNode findChild(java.lang.String name)
Looks through the node's children (if any) for a node with the given name
-
visitIfLoaded
public void visitIfLoaded(java.util.function.Consumer<AbstractNavTreeNode> visitor)
Visits children first if they have been loaded
-
getModel
public NavTreePanel.EditableTreeModel getModel()
-
getSelectionModel
public javax.swing.tree.TreeSelectionModel getSelectionModel()
-
isSelected
public boolean isSelected()
-
getText
public java.lang.String getText()
The text that will be used to render the node
-
getTooltip
public java.lang.String getTooltip()
-
getThumbnail
public java.awt.image.BufferedImage getThumbnail()
-
getIcon
public javax.swing.Icon getIcon()
-
getExpandedIcon
public javax.swing.Icon getExpandedIcon()
Returns an alternate icon for when this node is expanded, if applicable. Default implementation simply returns getIcon()
-
addBadges
public void addBadges(BadgeTreeCellRenderer renderer, boolean selected)
Add 'badges' to indicate meta information about this node- Parameters:
renderer
- the renderer; callBadgeTreeCellRenderer.addBadge(Badge)
to add your badge(s)selected
- the state of this node- Since:
- 8.0 removed the single-arg variant that did not pass selection status
-
getName
public java.lang.String getName()
-
getWorkspaceName
public java.lang.String getWorkspaceName()
Returns the name of the desired workspace for this node. Default behavior is to delegate to the parent. null mean's don't affect workspace selection.
-
dispatchSelectionEvent
public final void dispatchSelectionEvent(java.util.List<javax.swing.tree.TreePath> selection)
Not part of the public API. Used by the nav tree to dispatch a selection event to the nodes. This function take a list of selected paths, which are paths to the children of this node. It then calls onSelected() for any direct children, and calls dispatchSelectionEvent with a sublist to any child folders. Lastly, it will call onChildrenSelected for this node.- Parameters:
selection
- the selected paths
-
setName
protected void setName(java.lang.String name)
-
setText
protected void setText(java.lang.String text)
-
isItalic
public boolean isItalic()
-
setItalic
public void setItalic(boolean italic)
-
isBold
public boolean isBold()
-
setBold
public void setBold(boolean bold)
-
setTooltip
protected void setTooltip(java.lang.String tooltip)
-
setThumbnail
protected void setThumbnail(java.awt.image.BufferedImage thumbnail)
-
setIcon
protected void setIcon(javax.swing.Icon icon)
-
isEditActionHandler
public boolean isEditActionHandler()
Override to return true if you want this node to be an edit action handler for its children.
-
canDelete
public boolean canDelete(java.util.List<AbstractNavTreeNode> selectedChildren)
Can this edit action handler handle the delete action, given its current selection? Note that if this andcanCopy(java.util.List)
both return true, the cut action will also be enabled.
-
canCopy
public boolean canCopy(java.util.List<AbstractNavTreeNode> selectedChildren)
Can this edit action handler handle the copy action, given its current selection? Note that if this andcanDelete(java.util.List)
both return true, the cut action will also be enabled.
-
canPaste
public boolean canPaste(java.util.List<AbstractNavTreeNode> selectedChildren, @Nullable java.awt.datatransfer.Transferable data)
Can this action handler handle a paste given the data flavors currently available in the clipboard? data may be null.
-
canDrop
public boolean canDrop(AbstractNavTreeNode dropTarget, java.util.List<java.awt.datatransfer.DataFlavor> flavors)
-
canDrag
public boolean canDrag(java.util.List<AbstractNavTreeNode> draggedChildren)
Can the nodes controlled by this action handling node be dragged?
-
doDelete
public void doDelete(java.util.List<? extends AbstractNavTreeNode> selectedChildren, AbstractNavTreeNode.DeleteReason reason)
Called when the delete action is performed, if confirmDelete returned true
-
confirmDelete
public boolean confirmDelete(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Used to confirm the delete. If true is returned, doDelete will be called.
-
doCopy
@Nullable public java.awt.datatransfer.Transferable doCopy(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Called when the copy action is performed.- Returns:
- the current selection as a
Transferable
, or null if the copy failed. Will be added to the system clipboard.
-
createResourceCopy
protected java.awt.datatransfer.Transferable createResourceCopy(@Nonnull java.util.List<ProjectResource> resources)
Creates a Transferable that will just be a JSON string containing an array of project resources
-
doCut
public java.awt.datatransfer.Transferable doCut(java.util.List<? extends AbstractNavTreeNode> selectedChildren)
Called when the cut action is performed.- Returns:
- the current selection as a
Transferable
, or null if the cut failed. Will be added to the system clipboard.
-
doPaste
public boolean doPaste(java.util.List<? extends AbstractNavTreeNode> selectedChildren, java.awt.datatransfer.Transferable clipboardContents, boolean isDrop)
Called when the paste action is performed- Parameters:
clipboardContents
- The current contents of the clipboard to paste.isDrop
- Indicates whether this paste originated from a drop action. If false, originated from a keyboard or menu paste shortcut.- Returns:
- whether or not the paste successfully completed.
-
getClipboard
protected java.awt.datatransfer.Clipboard getClipboard()
-
forceChildrenReload
public void forceChildrenReload()
Will force child nodes to reload the next time checkChildren() is called.
-
-