protected TreePath getPath() {
      if (node == null) return null;

      if (isNodeParentNode)
        return node.getTreePath()
            .pathByAddingChild(treeModel.getChild(node.getUserObject(), childIndex));
      return node.path;
    }
    /** Messaged to set the user object. This resets the path. */
    public void setUserObject(Object o) {
      super.setUserObject(o);
      if (path != null) {
        FHTreeStateNode parent = (FHTreeStateNode) getParent();

        if (parent != null) resetChildrenPaths(parent.getTreePath());
        else resetChildrenPaths(null);
      }
    }
    /** @return next visible TreePath. */
    public TreePath nextElement() {
      if (!hasMoreElements()) throw new NoSuchElementException("No more visible paths");

      TreePath retObject;

      if (nextIndex == -1) retObject = parent.getTreePath();
      else {
        FHTreeStateNode node = parent.getChildAtModelIndex(nextIndex);

        if (node == null)
          retObject =
              parent
                  .getTreePath()
                  .pathByAddingChild(treeModel.getChild(parent.getUserObject(), nextIndex));
        else retObject = node.getTreePath();
      }
      updateNextObject();
      return retObject;
    }
 /** Removes the mapping for a previously added node. */
 private void removeMapping(FHTreeStateNode node) {
   treePathMapping.remove(node.getTreePath());
 }
 /** Adds a mapping for node. */
 private void addMapping(FHTreeStateNode node) {
   treePathMapping.put(node.getTreePath(), node);
 }