diff options
Diffstat (limited to 'MenuTree.cs')
-rw-r--r-- | MenuTree.cs | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/MenuTree.cs b/MenuTree.cs new file mode 100644 index 0000000..10033a0 --- /dev/null +++ b/MenuTree.cs @@ -0,0 +1,163 @@ +// 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 directorey based interface to creating a Menu + /// </summary> + public class MenuTree + { + // -------------------------------- + // PUBLIC + // -------------------------------- + + /// <summary> + /// Constructs the pathed Menu + /// </summary> + /// <param name="m">The GUI object to manage</param> + public MenuTree(Menu m) + { + m_defHandler=null; + m_dir=new DirectoryCollection(); + m_dir.Add("/",m); + } + + /// <summary> + /// The default event handler for menu items. + /// </summary> + public EventHandler DefaultHandler + { + set {m_defHandler = value;} + } + + /// <summary> + /// Adds a menu item + /// </summary> + /// <param name="path">The path to the item</param> + /// <param name="name">The text to put in the menu item</param> + public void Add(string path, string name) + { + if (m_defHandler!=null) + { + Add(path,new MenuItem(name,m_defHandler)); + } + else + { + Add(path,new MenuItem(name)); + } + } + + /// <summary> + /// Adds a menu item + /// </summary> + /// <param name="path">The path to the item</param> + /// <param name="name">The text to put in the menu item</param> + /// <param name="handler">The event handler to associate with the menu item</param> + public void Add(string path, string name, EventHandler handler) + { + Add(path,new MenuItem(name,handler)); + } + + /// <summary> + /// Adds a menu item + /// </summary> + /// <param name="path">The path to the item</param> + /// <param name="item">The menu item</param> + public void Add(string path, MenuItem item) + { + if (m_dir.IsRoot(path)) + { + throw new ArgumentException("Cannot set the root element"); + } + + m_dir.Add(path,item); + + object o=m_dir.GetParent(path); + + if (o is MenuItem) + { + MenuItem m=(MenuItem)o; + + m.MenuItems.Add(item); + } + else + { + Menu m=(Menu)o; + + m.MenuItems.Add(item); + } + } + + /// <summary> + /// Gets a menu item + /// </summary> + /// <param name="path">The path to the menu item</param> + /// <returns>The MenuItem object</returns> + public MenuItem Get(string path) + { + if (m_dir.IsRoot(path)) + { + throw new ArgumentException("Cannot get the root element"); + } + + return (MenuItem)m_dir.Get(path); + } + + /// <summary> + /// Removes a section of the menu 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); + MenuItem item=(MenuItem)m_dir.Get(path); + + m_dir.Remove(path); + + if (o is MenuItem) + { + MenuItem m=(MenuItem)o; + + m.MenuItems.Remove(item); + } + else + { + Menu m=(Menu)o; + + m.MenuItems.Remove(item); + } + } + + // -------------------------------- + // PRIVATE + // -------------------------------- + + private DirectoryCollection m_dir; + private EventHandler m_defHandler; + } +} |