diff options
Diffstat (limited to 'NodeTree.cs')
-rw-r--r-- | NodeTree.cs | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/NodeTree.cs b/NodeTree.cs new file mode 100644 index 0000000..6d4a145 --- /dev/null +++ b/NodeTree.cs @@ -0,0 +1,141 @@ +// Noddybox.GUI - various GUI support routines +// Copyright (C) 2004 Ian Cowburn +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// $Id$ +// +using System; +using System.Windows.Forms; + +namespace Noddybox.GUI +{ + /// <summary> + /// Provides a directory based interface to creating a TreeView + /// </summary> + public class NodeTree + { + // -------------------------------- + // PUBLIC + // -------------------------------- + + /// <summary> + /// Constructs the pathed Tree + /// </summary> + /// <param name="tree">The GUI object to manage</param> + public NodeTree(TreeView tree) + { + m_dir=new DirectoryCollection(); + m_tree=tree; + + m_dir.Add("/",m_tree.Nodes); + } + + /// <summary> + /// Adds a node + /// </summary> + /// <param name="path">The path to the node</param> + /// <param name="name">The text to put in the node</param> + /// <param name="tag">The tag to associate with the node</param> + public void Add(string path, string name, object tag) + { + Add(path,new TreeNode(name),tag); + } + + /// <summary> + /// Adds a node + /// </summary> + /// <param name="path">The path to the node</param> + /// <param name="node">The Node to put there</param> + /// <param name="tag">The tag to associate with node</param> + public void Add(string path, TreeNode node, object tag) + { + if (m_dir.IsRoot(path)) + { + throw new ArgumentException("Cannot set the root element"); + } + + node.Tag=tag; + m_dir.Add(path,node); + + object o=m_dir.GetParent(path); + + if (o is TreeNodeCollection) + { + TreeNodeCollection n=(TreeNodeCollection)o; + + n.Add(node); + } + else + { + TreeNode n=(TreeNode)o; + + n.Nodes.Add(node); + } + } + + /// <summary> + /// Gets a node + /// </summary> + /// <param name="path">The path to the node</param> + /// <returns>The TreeNode object</returns> + public TreeNode Get(string path) + { + if (m_dir.IsRoot(path)) + { + throw new ArgumentException("Cannot get the root element"); + } + + return (TreeNode)m_dir.Get(path); + } + + /// <summary> + /// Removes a section of the tree recursively + /// </summary> + /// <param name="path">The path to remove</param> + public void Remove(string path) + { + if (m_dir.IsRoot(path)) + { + throw new ArgumentException("Cannot remove the root element"); + } + + object o=m_dir.GetParent(path); + TreeNode node=(TreeNode)m_dir.Get(path); + + m_dir.Remove(path); + + if (o is TreeNodeCollection) + { + TreeNodeCollection n=(TreeNodeCollection)o; + + n.Remove(node); + } + else + { + TreeNode n=(TreeNode)o; + + n.Nodes.Remove(node); + } + } + + // -------------------------------- + // PRIVATE + // -------------------------------- + + private DirectoryCollection m_dir; + private TreeView m_tree; + } +} |