// 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
{
///
/// Provides a directorey based interface to creating a Menu
///
public class MenuTree
{
// --------------------------------
// PUBLIC
// --------------------------------
///
/// Constructs the pathed Menu
///
/// The GUI object to manage
public MenuTree(Menu m)
{
m_defHandler=null;
m_dir=new DirectoryCollection();
m_dir.Add("/",m);
}
///
/// The default event handler for menu items.
///
public EventHandler DefaultHandler
{
set {m_defHandler = value;}
}
///
/// Adds a menu item
///
/// The path to the item
/// The text to put in the menu item
public void Add(string path, string name)
{
if (m_defHandler!=null)
{
Add(path,new MenuItem(name,m_defHandler));
}
else
{
Add(path,new MenuItem(name));
}
}
///
/// Adds a menu item
///
/// The path to the item
/// The text to put in the menu item
/// The event handler to associate with the menu item
public void Add(string path, string name, EventHandler handler)
{
Add(path,new MenuItem(name,handler));
}
///
/// Adds a menu item
///
/// The path to the item
/// The menu item
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);
}
}
///
/// Gets a menu item
///
/// The path to the menu item
/// The MenuItem object
public MenuItem Get(string path)
{
if (m_dir.IsRoot(path))
{
throw new ArgumentException("Cannot get the root element");
}
return (MenuItem)m_dir.Get(path);
}
///
/// Removes a section of the menu recursively
///
/// The path to remove
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;
}
}