using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
	/// 
	/// Summary description for BarEditor.
	/// 
	public class BarEditor : System.Windows.Forms.Form
	{
		private System.Windows.Forms.Panel panel1;
		private System.Windows.Forms.TreeView barTree;
		private System.Windows.Forms.PropertyGrid propertyGrid1;
		private System.Windows.Forms.Splitter splitter1;
		private System.ComponentModel.IContainer components;
		private DevComponents.DotNetBar.DockSite barTopDockSite;
		private DevComponents.DotNetBar.DockSite barBottomDockSite;
		private DevComponents.DotNetBar.DockSite barLeftDockSite;
		private DevComponents.DotNetBar.DockSite barRightDockSite;
		private DevComponents.DotNetBar.DotNetBarManager barManager;
		private System.Windows.Forms.ImageList imageList;
		private DotNetBarManager m_DotNetBar;
		private Bar m_Bar=null;
		private TreeNode m_BarsNode=null,m_CategoriesNode=null,m_PopupsNode=null;
		private System.Windows.Forms.Button btnClose;
		private System.Windows.Forms.Button btnCancel;
		private System.Windows.Forms.OpenFileDialog m_OpenFileDialog;
		private Hashtable m_catTable;
		private System.Windows.Forms.SaveFileDialog m_SaveFileDialog;
		private System.Windows.Forms.ImageList m_BarImages;
		private string m_DefinitionFileName="";
		private bool m_ShowItemText=true;
		private GridViewSubclass m_GridViewSubclass=null;
		private bool m_DataChanged=false;
		private HTMLHelp m_HtmlHelp=null;
		internal IDesignerServices _barDesigner=null;
		public BarEditor(DotNetBarManager dotnetbar)
		{
			m_DotNetBar=dotnetbar;
			Initialize();
		}
		public BarEditor(Bar bar)
		{
            m_Bar=bar;
			Initialize();
		}
		private void Initialize()
		{
			InitializeComponent();
			if(m_Bar!=null)
				propertyGrid1.BrowsableAttributes=new AttributeCollection(new Attribute[] {BrowsableAttribute.Yes});
			else
				propertyGrid1.BrowsableAttributes=new AttributeCollection(new Attribute[] {DevCoBrowsable.Yes});
			propertyGrid1.CommandsVisibleIfAvailable=false;
			LoadResourceImages();
			m_catTable=new Hashtable(20);
			
			m_GridViewSubclass=new GridViewSubclass();
			m_GridViewSubclass.OnRightMouseDown+=new EventHandler(this.GridViewMouseDown);
			foreach(Control ctrl in propertyGrid1.Controls)
			{
				if(ctrl.GetType().ToString().IndexOf("PropertyGridView")>=0)
				{
					m_GridViewSubclass.AssignHandle(ctrl.Handle);
					break;
				}
			}
			if(m_DotNetBar!=null && !m_DotNetBar.IsDesignTime() || m_Bar!=null)
			{
				btnCancel.Visible=false;
				btnClose.Location=btnCancel.Location;
			}
			CreateToolbar();
			RefreshView();
		}
		/// 
		/// Clean up any resources being used.
		/// 
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}
		#region Windows Form Designer generated code
		/// 
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// 
		private void InitializeComponent()
		{
			this.components = new System.ComponentModel.Container();
			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(BarEditor));
			this.panel1 = new System.Windows.Forms.Panel();
			this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
			this.splitter1 = new System.Windows.Forms.Splitter();
			this.barTree = new System.Windows.Forms.TreeView();
			this.imageList = new System.Windows.Forms.ImageList(this.components);
		#if TRIAL
			this.barManager = new DevComponents.DotNetBar.DotNetBarManager(this.components);
		#else
			this.barManager = new DevComponents.DotNetBar.DotNetBarManager(this.components,false);
		#endif
			this.barBottomDockSite = new DevComponents.DotNetBar.DockSite();
			this.m_BarImages = new System.Windows.Forms.ImageList(this.components);
			this.barLeftDockSite = new DevComponents.DotNetBar.DockSite();
			this.barRightDockSite = new DevComponents.DotNetBar.DockSite();
			this.barTopDockSite = new DevComponents.DotNetBar.DockSite();
			this.m_OpenFileDialog = new System.Windows.Forms.OpenFileDialog();
			this.m_SaveFileDialog = new System.Windows.Forms.SaveFileDialog();
			this.btnClose = new System.Windows.Forms.Button();
			this.btnCancel = new System.Windows.Forms.Button();
			this.panel1.SuspendLayout();
			this.SuspendLayout();
			// 
			// panel1
			// 
			this.panel1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
				| System.Windows.Forms.AnchorStyles.Left) 
				| System.Windows.Forms.AnchorStyles.Right);
			this.panel1.Controls.AddRange(new System.Windows.Forms.Control[] {
																				 this.propertyGrid1,
																				 this.splitter1,
																				 this.barTree});
			this.panel1.Location = new System.Drawing.Point(8, 48);
			this.panel1.Name = "panel1";
			this.panel1.Size = new System.Drawing.Size(520, 232);
			this.panel1.TabIndex = 5;
			// 
			// propertyGrid1
			// 
			this.propertyGrid1.CommandsVisibleIfAvailable = true;
			this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
			this.propertyGrid1.LargeButtons = false;
			this.propertyGrid1.LineColor = System.Drawing.SystemColors.ScrollBar;
			this.propertyGrid1.Location = new System.Drawing.Point(182, 0);
			this.propertyGrid1.Name = "propertyGrid1";
			this.propertyGrid1.Size = new System.Drawing.Size(338, 232);
			this.propertyGrid1.TabIndex = 1;
			this.propertyGrid1.Text = "propertyGrid1";
			this.propertyGrid1.ViewBackColor = System.Drawing.SystemColors.Window;
			this.propertyGrid1.ViewForeColor = System.Drawing.SystemColors.WindowText;
			this.propertyGrid1.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.OnPropertyValueChanged);
			// 
			// splitter1
			// 
			this.splitter1.Location = new System.Drawing.Point(176, 0);
			this.splitter1.Name = "splitter1";
			this.splitter1.Size = new System.Drawing.Size(6, 232);
			this.splitter1.TabIndex = 2;
			this.splitter1.TabStop = false;
			// 
			// barTree
			// 
			this.barTree.Dock = System.Windows.Forms.DockStyle.Left;
			this.barTree.HideSelection = false;
			this.barTree.ImageList = this.imageList;
			this.barTree.Name = "barTree";
			this.barTree.Size = new System.Drawing.Size(176, 232);
			this.barTree.TabIndex = 0;
			this.barTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TreeKeyDown);
			this.barTree.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TreeMouseDown);
			this.barTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.ItemSelected);
			this.barTree.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.BeforeItemSelect);
			this.barTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.ItemEdited);
			this.barTree.BeforeCollapse += new System.Windows.Forms.TreeViewCancelEventHandler(this.NodeCollapsing);
			this.barTree.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.NodeExpanding);
			// 
			// imageList
			// 
			this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
			this.imageList.ImageSize = new System.Drawing.Size(16, 16);
			this.imageList.TransparentColor = System.Drawing.Color.Magenta;
			// 
			// barManager
			// 
			this.barManager.BottomDockSite = this.barBottomDockSite;
			this.barManager.Images = this.m_BarImages;
			this.barManager.ImagesLarge = null;
			this.barManager.ImagesMedium = null;
			this.barManager.LeftDockSite = this.barLeftDockSite;
			this.barManager.ParentForm = this;
			this.barManager.RightDockSite = this.barRightDockSite;
			this.barManager.TopDockSite = this.barTopDockSite;
			this.barManager.UseHook = true;
			this.barManager.ItemClick += new System.EventHandler(this.BarItemClick);
			// 
			// barBottomDockSite
			// 
			this.barBottomDockSite.Dock = System.Windows.Forms.DockStyle.Bottom;
			this.barBottomDockSite.Location = new System.Drawing.Point(0, 325);
			this.barBottomDockSite.Name = "barBottomDockSite";
			this.barBottomDockSite.Size = new System.Drawing.Size(536, 0);
			this.barBottomDockSite.TabIndex = 8;
			this.barBottomDockSite.TabStop = false;
			// 
			// m_BarImages
			// 
			this.m_BarImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
			this.m_BarImages.ImageSize = new System.Drawing.Size(16, 16);
			this.m_BarImages.TransparentColor = System.Drawing.Color.Magenta;
			// 
			// barLeftDockSite
			// 
			this.barLeftDockSite.Dock = System.Windows.Forms.DockStyle.Left;
			this.barLeftDockSite.Name = "barLeftDockSite";
			this.barLeftDockSite.Size = new System.Drawing.Size(0, 325);
			this.barLeftDockSite.TabIndex = 9;
			this.barLeftDockSite.TabStop = false;
			// 
			// barRightDockSite
			// 
			this.barRightDockSite.Dock = System.Windows.Forms.DockStyle.Right;
			this.barRightDockSite.Location = new System.Drawing.Point(536, 0);
			this.barRightDockSite.Name = "barRightDockSite";
			this.barRightDockSite.Size = new System.Drawing.Size(0, 325);
			this.barRightDockSite.TabIndex = 10;
			this.barRightDockSite.TabStop = false;
			// 
			// barTopDockSite
			// 
			this.barTopDockSite.Dock = System.Windows.Forms.DockStyle.Top;
			this.barTopDockSite.Name = "barTopDockSite";
			this.barTopDockSite.Size = new System.Drawing.Size(536, 0);
			this.barTopDockSite.TabIndex = 7;
			this.barTopDockSite.TabStop = false;
			// 
			// m_OpenFileDialog
			// 
			this.m_OpenFileDialog.Filter = "DotNetBar Files (*.dnb)|*.dnb|All Files (*.*)|*.*";
			this.m_OpenFileDialog.ShowReadOnly = true;
			this.m_OpenFileDialog.Title = "Open DotNetBar Definition File";
			// 
			// m_SaveFileDialog
			// 
			this.m_SaveFileDialog.CreatePrompt = false;
			this.m_SaveFileDialog.DefaultExt = "dnb";
			this.m_SaveFileDialog.FileName = "dotnetbardefinition";
			this.m_SaveFileDialog.Filter = "DotNetBar Files (*.dnb)|*.dnb|XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
			this.m_SaveFileDialog.Title = "Save DotNetBar Definition";
			// 
			// btnClose
			// 
			this.btnClose.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
			this.btnClose.DialogResult = System.Windows.Forms.DialogResult.OK;
			this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
			this.btnClose.Location = new System.Drawing.Point(376, 291);
			this.btnClose.Name = "btnClose";
			this.btnClose.Size = new System.Drawing.Size(73, 24);
			this.btnClose.TabIndex = 6;
			this.btnClose.Text = "OK";
			this.btnClose.Click += new System.EventHandler(this.CloseClick);
			// 
			// btnCancel
			// 
			this.btnCancel.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
			this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
			this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
			this.btnCancel.Location = new System.Drawing.Point(455, 291);
			this.btnCancel.Name = "btnCancel";
			this.btnCancel.Size = new System.Drawing.Size(73, 24);
			this.btnCancel.TabIndex = 7;
			this.btnCancel.Text = "Cancel";
			this.btnCancel.Click += new System.EventHandler(this.CloseClick);
			// 
			// BarEditor
			// 
			//this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(536, 325);
			this.Controls.AddRange(new System.Windows.Forms.Control[] {
																		  this.panel1,
																		  this.btnClose,
																		  this.btnCancel,
																		  this.barTopDockSite,
																		  this.barBottomDockSite,
																		  this.barLeftDockSite,
																		  this.barRightDockSite});
			this.MinimizeBox = false;
			this.Name = "BarEditor";
			this.Text = "DotNetBar Editor";
			this.Closing += new System.ComponentModel.CancelEventHandler(this.FormClosing);
			this.Load += new EventHandler(this.FormLoad);
			this.panel1.ResumeLayout(false);
			this.ResumeLayout(false);
		}
		#endregion
		private void FormLoad(object sender, EventArgs e)
		{
			try
			{
				Microsoft.Win32.RegistryKey key=Microsoft.Win32.Registry.LocalMachine;
				string helpfile="";
				try
				{
					key=key.OpenSubKey("Software\\DevComponents\\DotNetBar");
					helpfile=key.GetValue("InstallationFolder","").ToString();
				}
				finally{key.Close();}
				if(helpfile.Substring(helpfile.Length-1,1)!="\\")
					helpfile+="\\";
				if(System.IO.File.Exists(helpfile+"dotnetbar.chm"))
					helpfile+="dotnetbar.chm";
				else
					helpfile="";
				if(helpfile!="")
					m_HtmlHelp=new HTMLHelp(this,helpfile);
			}
			catch(Exception)
			{
			}
			// Load position if any
			try
			{
				Microsoft.Win32.RegistryKey key=Microsoft.Win32.Registry.CurrentUser;
				key=key.OpenSubKey("Software\\DevComponents\\DotNetBar");
				if(key!=null)
				{
					try
					{
						string s=key.GetValue("DesignerPosition","").ToString();
						if(s!="")
						{
							if(s=="1")
							{
								this.WindowState=FormWindowState.Maximized;
							}
							else
							{
								string[] arr=s.Split(',');
								if(arr.Length==4)
								{
									Rectangle r=new Rectangle(int.Parse(arr[0]),int.Parse(arr[1]),int.Parse(arr[2]),int.Parse(arr[3]));
									foreach(Screen screen in Screen.AllScreens)
									{
										if(screen.Bounds.IntersectsWith(r))
										{
											this.StartPosition=FormStartPosition.Manual;
											this.DesktopLocation=r.Location;
											this.Size=r.Size;
											break;
										}
									}
								}
							}
						}
						s=key.GetValue("DesignerPanelSize","").ToString();
						barTree.Width=int.Parse(s);
					}
					finally
					{
						key.Close();
					}
				}
			}
			catch(Exception)
			{
			}
		}
		
		#region Toolbar Definition Code
		private void CreateToolbar()
		{
			Bar bar, barToolbar;
			ButtonItem item, item2, item3, popupmain;
			ButtonItem popup=new ButtonItem("popup");
			barManager.Items.Add(popup);
			bar=new Bar("Main Menu");
			barManager.Bars.Add(bar);
			bar.MenuBar=true;
			bar.Stretch=true;
			barToolbar=new Bar("Item Navigation");
			barManager.Bars.Add(barToolbar);
			// File Menu
            item=new ButtonItem("file");
			item.Text="&File";
			item.PopupType=ePopupType.Menu;
			bar.Items.Add(item);
			item2=new ButtonItem("open");
			item2.Shortcuts.Add(eShortcut.CtrlO);
			item.SubItems.Add(item2);
			item2.Text="&Open definition...";
			item2.ImageIndex=4;
			barToolbar.Items.Add(item2.Copy());
			
			item2=new ButtonItem("save");
			item2.Shortcuts.Add(eShortcut.CtrlS);
			item.SubItems.Add(item2);
			item2.Text="&Save definition...";
			item2.ImageIndex=5;
			barToolbar.Items.Add(item2.Copy());
			item2.BeginGroup=true;
			item2=new ButtonItem("saveas");
			item2.Text="&Save definition as...";
			item.SubItems.Add(item2);
			
			item2=new ButtonItem("loadbar");
			item2.Shortcuts.Add(eShortcut.CtrlL);
			item.SubItems.Add(item2);
			item2.Text="Load Bar...";
			barManager.Items.Add(item2.Copy());
			item2.BeginGroup=true;
			item2.Enabled=true;
			item2=new ButtonItem("savebaras");
			item2.Shortcuts.Add(eShortcut.CtrlD);
			item.SubItems.Add(item2);
			item2.Text="Save Bar as...";
			barManager.Items.Add(item2.Copy());
			item2.Enabled=false;
			item2=new ButtonItem("close");
			item2.Text="&Close Designer";
			item2.BeginGroup=true;
			item.SubItems.Add(item2);
			// Tools
			item=new ButtonItem("tools");
			item.Text="&Tools";
			item.PopupType=ePopupType.Menu;
			bar.Items.Add(item);
			item2=new ButtonItem("barscreation","Create Bar");
			item.SubItems.Add(item2);
			popupmain=item2.Copy() as ButtonItem;
			popup.SubItems.Add(popupmain);
			if(m_Bar!=null)
				item2.Visible=false;
			else if(m_DotNetBar.LeftDockSite==null && m_DotNetBar.RightDockSite==null && m_DotNetBar.TopDockSite==null && m_DotNetBar.BottomDockSite==null)
				item2.Enabled=false;
			item3=new ButtonItem("createbar");
			item3.Text="&Toolbar";
			item2.SubItems.Add(item3);
			popupmain.SubItems.Add(item3.Copy());
			item3=new ButtonItem("createmenubar");
			item3.Text="&Menu Bar";
			item2.SubItems.Add(item3);
			popupmain.SubItems.Add(item3.Copy());
			item3=new ButtonItem("createstatusbar","&Status Bar");
			item2.SubItems.Add(item3);
			popupmain.SubItems.Add(item3.Copy());
			item3=new ButtonItem("createdockwindow","&Dockable Window");
			item2.SubItems.Add(item3);
			popupmain.SubItems.Add(item3.Copy());
			item3=new ButtonItem("createtaskpane","&Task Pane");
			item2.SubItems.Add(item3);
			popupmain.SubItems.Add(item3.Copy());
			item2=new ButtonItem("buttonitem");
			item2.Text="Add &ButtonItem";
			item2.BeginGroup=true;
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("textboxitem");
			item2.Text="Add &TextBoxItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("comboboxitem");
			item2.Text="Add &ComboBoxItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("labelitem");
			item2.Text="Add &LabelItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			// Progress Bar Item
			item2=new ButtonItem("progressbaritem");
			item2.Tooltip="Displays a progress bar.";
			item2.Text="Add &ProgressBarItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("customizeitem");
			item2.BeginGroup=true;
			item2.Tooltip="Lets end users hide/show Bar items as well as open the Customize dialog.";
			item2.Text="Add Custo&mizeItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("mdiwindowlistitem");
			item2.Tooltip="Displays list of MDI Child forms.";
			item2.Text="Add &MdiWindowListItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("controlcontaineritem");
			item2.Tooltip="Allows you to host any Control on Bar or Menu-bar.";
			item2.Text="Add &ControlContainerItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			item2=new ButtonItem("dockcontaineritem");
			item2.Tooltip="Helps you create dockable windows.";
			item2.Text="Add &DockContainerItem";
			item.SubItems.Add(item2);
			popup.SubItems.Add(item2.Copy());
			// Pop-up specific items
			item2=new ButtonItem("copyto");
            item2.Text="Copy To";
            item2.BeginGroup=true;
			item2.PopupType=ePopupType.Menu;
			popup.SubItems.Add(item2);
			item2=new ButtonItem("moveto");
			item2.Text="Move To";
			item2.PopupType=ePopupType.Menu;
			popup.SubItems.Add(item2);
			item2=new ButtonItem("delselected");
			item.SubItems.Add(item2);
			item2.Text="&Delete Selected Item";
			item2.BeginGroup=true;
			item2.ImageIndex=7;
			popup.SubItems.Add(item2.Copy());
			// Help
			item=new ButtonItem("help");
			item.Text="&Help";
			item.PopupType=ePopupType.Menu;
			bar.Items.Add(item);
			item2=new ButtonItem("contents");
			item2.Text="&Contents...";
			item.SubItems.Add(item2);
//			item2=new ButtonItem("index");
//			item2.Text="&Index...";
//			item.SubItems.Add(item2);
//			item2=new ButtonItem("search");
//			item2.Text="&Search...";
//			item.SubItems.Add(item2);
			item2=new ButtonItem("about");
			item2.Text="&About";
			item2.BeginGroup=true;
			item.SubItems.Add(item2);
			bar.DockSide=eDockSide.Top;
			// Create left bar with the item navigation buttons
			item=new ButtonItem("addnewitems");
			barToolbar.Items.Add(item);
			item.PopupType=ePopupType.Menu;
			item.ImageIndex=6;
			item.Text="Create new item";
			item.Tooltip="Press to see available items that can be created";
			item.BeginGroup=true;
			item.Enabled=true;
			item.SubItems.Add(barManager.Items["buttonitem"].Copy());
			item.SubItems.Add(barManager.Items["textboxitem"].Copy());
			item.SubItems.Add(barManager.Items["comboboxitem"].Copy());
			item.SubItems.Add(barManager.Items["customizeitem"].Copy());
			item.SubItems.Add(barManager.Items["mdiwindowlistitem"].Copy());
            item.SubItems.Add(barManager.Items["controlcontaineritem"].Copy());
			item.SubItems.Add(barManager.Items["dockcontaineritem"].Copy());
			item.SubItems.Add(barManager.Items["progressbaritem"].Copy());
			barToolbar.Items.Add(barManager.Items["delselected"].Copy());
			item=new ButtonItem("moveleft");
			barToolbar.Items.Add(item);
			item.ImageIndex=0;
			item.Text="Move Left";
			item.Tooltip="Move selected item left";
			item.BeginGroup=true;
			item.Enabled=false;
			item.ClickAutoRepeat=true;
			barManager.Items.Add(item.Copy());
			
			item=new ButtonItem("moveright");
			barToolbar.Items.Add(item);
			item.ImageIndex=1;
			item.Text="Move Right";
			item.Tooltip="Move selected item right";
			item.Enabled=false;
			item.ClickAutoRepeat=true;
			barManager.Items.Add(item.Copy());
			
			item=new ButtonItem("moveup");
			barToolbar.Items.Add(item);
			item.ImageIndex=2;
			item.Text="Move Up";
			item.Tooltip="Move selected item up";
			item.Enabled=false;
			item.ClickAutoRepeat=true;
			barManager.Items.Add(item.Copy());
			
			item=new ButtonItem("movedown");
			barToolbar.Items.Add(item);
			item.ImageIndex=3;
			item.Text="Move Down";
			item.Tooltip="Move selected item down";
			item.Enabled=false;
			item.ClickAutoRepeat=true;
			barManager.Items.Add(item.Copy());
			item=new ButtonItem("synccat");
			barToolbar.Items.Add(item);
			item.ImageIndex=8;
			item.Text="Sync Categories";
			item.Tooltip="Recreates Categories from your current definition.";
			item.Enabled=true;
			item.ButtonStyle=eButtonStyle.ImageAndText;
			item.ClickAutoRepeat=false;
			
			barToolbar.DockLine=1;
			barToolbar.DockSide=eDockSide.Top;
			popup=new ButtonItem("resetimagepopup");
			item=new ButtonItem("resetimage","Reset");
			popup.SubItems.Add(item);
			barManager.ContextMenus.Add(popup);
			barManager.Style=eDotNetBarStyle.Office2003;
		}
		#endregion
		protected void CloseClick (object sender, System.EventArgs e)
		{
			this.Close();
		}
		private void RefreshView()
		{
			barTree.Nodes.Clear();
			if(m_Bar!=null)
			{
				try
				{
					this.Cursor=Cursors.WaitCursor;
					m_BarsNode=barTree.Nodes.Add("Bar");
					m_BarsNode.ImageIndex=2;
					m_BarsNode.SelectedImageIndex=2;
					TreeNode barNode=m_BarsNode.Nodes.Add(m_Bar.Text);
					barNode.Tag=m_Bar;
					barNode.ImageIndex=1;
					barNode.SelectedImageIndex=1;
					foreach(BaseItem objItem in m_Bar.Items)
					{
						TreeNode itemNode=barNode.Nodes.Add(GetTreeItemText(objItem));
						itemNode.Tag=objItem;
						itemNode.ImageIndex=GetItemImageIndex(objItem);
						itemNode.SelectedImageIndex=itemNode.ImageIndex;
						AddSubItems(objItem,itemNode);
					}
					m_BarsNode.Expand();
					barNode.Expand();
				}
				finally
				{
					this.Cursor=Cursors.Arrow;
				}
				return;
			}
			if(m_DotNetBar==null)
				return;
			this.Cursor=Cursors.WaitCursor;
			if(m_DotNetBar.TopDockSite==null && m_DotNetBar.BottomDockSite==null && m_DotNetBar.LeftDockSite==null && m_DotNetBar.RightDockSite==null)
			{
				m_CategoriesNode=null;
				m_BarsNode=null;
			}
			else
			{
				m_CategoriesNode=barTree.Nodes.Add("Categories");
				m_CategoriesNode.ImageIndex=5;
				m_CategoriesNode.SelectedImageIndex=5;
				m_BarsNode=barTree.Nodes.Add("Bars");
				m_BarsNode.ImageIndex=2;
				m_BarsNode.SelectedImageIndex=2;
			}
			m_PopupsNode=barTree.Nodes.Add("Context Menus");
			m_PopupsNode.ImageIndex=12;
			m_PopupsNode.SelectedImageIndex=12;
			if(m_BarsNode!=null)
			{
				foreach(Bar bar in m_DotNetBar.Bars)
				{
					TreeNode barNode=m_BarsNode.Nodes.Add(bar.Text);
					barNode.Tag=bar;
					barNode.ImageIndex=1;
					barNode.SelectedImageIndex=1;
					foreach(BaseItem objItem in bar.Items)
					{
						TreeNode itemNode=barNode.Nodes.Add(GetTreeItemText(objItem));
						itemNode.Tag=objItem;
						itemNode.ImageIndex=GetItemImageIndex(objItem);
						itemNode.SelectedImageIndex=itemNode.ImageIndex;
						AddSubItems(objItem,itemNode);
					}
				}
			}
			// Load nodes from items
			m_catTable.Clear();
			if(m_CategoriesNode!=null)
			{
				foreach(DictionaryEntry o in m_DotNetBar.Items)
				{
					BaseItem objItem=o.Value as BaseItem;
					TreeNode itemNode=CategorizeItem(objItem);
					itemNode.Tag=objItem;
					itemNode.ImageIndex=GetItemImageIndex(objItem);
					itemNode.SelectedImageIndex=itemNode.ImageIndex;
					AddSubItems(objItem,itemNode);
				}
			}
			// Load all popups
			foreach(BaseItem objItem in m_DotNetBar.ContextMenus)
			{
				TreeNode itemNode=m_PopupsNode.Nodes.Add(GetTreeItemText(objItem));
				itemNode.Tag=objItem;
				itemNode.ImageIndex=GetItemImageIndex(objItem);
				itemNode.SelectedImageIndex=itemNode.ImageIndex;
				AddSubItems(objItem,itemNode);
			}
			if(m_BarsNode!=null)
				m_BarsNode.Expand();
			if(m_CategoriesNode!=null)
				m_CategoriesNode.Expand();
			m_PopupsNode.Expand();
			this.Cursor=Cursors.Arrow;
		}
		private void AddSubItems(BaseItem objItem, TreeNode parentNode)
		{
			if(objItem.SubItems.Count==0)
				return;
			foreach(BaseItem objChild in objItem.SubItems)
			{
				TreeNode itemNode=parentNode.Nodes.Add(GetTreeItemText(objChild));
				itemNode.Tag=objChild;
				itemNode.ImageIndex=GetItemImageIndex(objChild);
				itemNode.SelectedImageIndex=itemNode.ImageIndex;
				AddSubItems(objChild,itemNode);
			}
		}
		// TODO: Make sure that when designing the Menu Bar when new item is added default
		// PopupType is MENU not TOOLBAR
		private void ItemSelected(object sender,TreeViewEventArgs e)
		{
			barTree.LabelEdit=false;
			if(e.Node.Tag==null)
			{
				propertyGrid1.SelectedObject=null;
				return;
			}
			if(e.Node.Tag is BaseItem)
			{
				propertyGrid1.SelectedObject=e.Node.Tag;
				barTree.LabelEdit=true;
				// Now way to detect when Items collection has changed, reset changed flag if combo box is selected...
				if(e.Node.Tag is ComboBoxItem)
					m_DataChanged=true;
			}
			else if(e.Node.Tag is Bar)
			{
				propertyGrid1.SelectedObject=(Bar)e.Node.Tag;
			}
			else
			{
				propertyGrid1.SelectedObject=null;
			}
		}
		private void BeforeItemSelect(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
		{
			// Disable/Enable toolbar items...
			bool bLeftEnabled=false, bRightEnabled=false, bUpEnabled=false, bDownEnabled=false;
			BaseItem popupItem=barManager.Items["popup"];
			if(e.Node!=null && e.Node.Tag is BaseItem)
			{
				if(e.Node.Parent==m_PopupsNode)
				{
					bRightEnabled=true;
				}
				else
				{
					BaseItem objItem=e.Node.Tag as BaseItem;
					int i=0;
					if(objItem.Parent!=null)
						i=objItem.Parent.SubItems.IndexOf(objItem);
					else
						i=e.Node.Index;
					if(i>0)
					{
						bUpEnabled=true;
						bRightEnabled=true;
					}
					int iCount=0;
					if(objItem.Parent!=null)
						iCount=objItem.Parent.SubItems.Count-1;
					else
						iCount=e.Node.Parent.Nodes.Count-1;
					if(i0)
					if(MessageBox.Show(this,"Are you sure you want to delete selected item?","DotNetBar Editor",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.No)
						return;
				if(barTree.SelectedNode.Tag is BaseItem)
				{
					BaseItem item=barTree.SelectedNode.Tag as BaseItem;
					Bar cont=item.ContainerControl as Bar;
					TreeNode topParentNode=barTree.SelectedNode;
					while(topParentNode.Parent!=null)
						topParentNode=topParentNode.Parent;
					
					if(item.Parent!=null)
						item.Parent.SubItems.Remove(item);
					else if(topParentNode==m_CategoriesNode)
						m_DotNetBar.Items.Remove(item);
					else if(barTree.SelectedNode.Parent==m_PopupsNode)
						m_DotNetBar.ContextMenus.Remove(item);
					
					if(_barDesigner!=null)
						_barDesigner.DestroyComponent(item);
					else
						item.Dispose();
					barTree.SelectedNode.Tag=null;
					TreeNode parentNode=barTree.SelectedNode.Parent;
					barTree.Nodes.Remove(barTree.SelectedNode);
					// If it is last node under one of the categories remove parent too
					if(parentNode!=null && parentNode.Parent==m_CategoriesNode && parentNode.Nodes.Count==0)
						barTree.Nodes.Remove(parentNode);
					if(cont!=null)
						cont.RecalcLayout();
					
				}
				else if(barTree.SelectedNode.Tag is Bar)
				{
					Bar bar=barTree.SelectedNode.Tag as Bar;
					m_DotNetBar.Bars.Remove(bar);
					barTree.SelectedNode.Tag=null;
					barTree.Nodes.Remove(barTree.SelectedNode);
				}
				else if(m_CategoriesNode!=null && barTree.SelectedNode.Parent==m_CategoriesNode)
				{
					// Delete all items within this category
					foreach(TreeNode node in barTree.SelectedNode.Nodes)
					{
						objItem=node.Tag as BaseItem;
						if(objItem!=null)
						{
							m_DotNetBar.Items.Remove(objItem);
							objItem.Dispose();
						}
						node.Tag=null;
					}
					barTree.SelectedNode.Remove();					
				}
				return;
			}
			else if(objItem.Name=="open")
			{
				if(m_OpenFileDialog.ShowDialog()==DialogResult.OK && System.IO.File.Exists(m_OpenFileDialog.FileName))
				{
					m_DotNetBar.Bars.Owner.LoadDefinition(m_OpenFileDialog.FileName);
					m_DefinitionFileName=m_OpenFileDialog.FileName;
					RefreshView();
					m_DataChanged=true;
				}
				return;
			}
			else if(objItem.Name=="save" && m_DefinitionFileName!="")
			{
				m_DotNetBar.Bars.Owner.SaveDefinition(m_DefinitionFileName);
				return;
			}
			else if(objItem.Name=="saveas" || objItem.Name=="save" && m_DefinitionFileName=="")
			{
				if(m_SaveFileDialog.ShowDialog()==DialogResult.OK)
				{
					m_DotNetBar.Bars.Owner.SaveDefinition(m_SaveFileDialog.FileName);
					m_DefinitionFileName=m_SaveFileDialog.FileName;
				}
				return;
			}
			else if(objItem.Name=="savebaras")
			{
				// Save currently selected bar
				if(barTree.SelectedNode==null || !(barTree.SelectedNode.Tag is Bar))
					return;
				
				Bar bar=barTree.SelectedNode.Tag as Bar;
				string stitle=m_SaveFileDialog.Title;
				string defaultExt=m_SaveFileDialog.DefaultExt;
				string fileName=m_SaveFileDialog.FileName;
				string filter=m_SaveFileDialog.Filter;
				m_SaveFileDialog.Title="Save Bar Definition";
				m_SaveFileDialog.DefaultExt = "xml";
				m_SaveFileDialog.FileName = (bar.Name!=""?bar.Name:"MyBar");
				m_SaveFileDialog.Filter = "DotNetBar Bar Files (*.xml)|*.xml|All Files (*.*)|*.*";
				
				if(m_SaveFileDialog.ShowDialog()==DialogResult.OK)
				{
					bar.SaveDefinition(m_SaveFileDialog.FileName);
				}
				m_SaveFileDialog.Title=stitle;
				m_SaveFileDialog.DefaultExt=defaultExt;
				m_SaveFileDialog.FileName=fileName;
				m_SaveFileDialog.Filter=filter;
				return;
			}
			else if(objItem.Name=="loadbar")
			{
				string defaultExt=m_OpenFileDialog.DefaultExt;
				string filter=m_OpenFileDialog.Filter;
				m_OpenFileDialog.DefaultExt="xml";
				m_OpenFileDialog.Filter = "DotNetBar Bar Files (*.xml)|*.xml|All Files (*.*)|*.*";
				if(m_OpenFileDialog.ShowDialog()==DialogResult.OK && System.IO.File.Exists(m_OpenFileDialog.FileName))
				{
					Bar bar=new Bar();
					try
					{
						bar.LoadDefinition(m_OpenFileDialog.FileName);
					}
					catch(Exception ex)
					{
						MessageBox.Show("File '"+m_OpenFileDialog.FileName+"' does not appear to be valid Bar file.\n\rException has been generated while loading: "+ex.Source+": "+ex.Message+"\n\r"+ex.StackTrace);
						return;
					}
					bar.Dispose();
					bar=new Bar();
					m_DotNetBar.SuspendLayout=true;
					m_DotNetBar.Bars.Add(bar);
					bar.LoadDefinition(m_OpenFileDialog.FileName);
					m_DotNetBar.SuspendLayout=false;
				}
				m_OpenFileDialog.DefaultExt=defaultExt;
				m_OpenFileDialog.Filter=filter;
			}
			else if(objItem.Name=="moveleft" || objItem.Name=="moveright" || objItem.Name=="moveup" || objItem.Name=="movedown")
				MoveSelectedItem(objItem.Name);
			else if(objItem.Name=="addnewitems")
				objItem.Expanded=true;
			else if(objItem.Name=="synccat")
			{
				RescanCategories();
				return;
			}
			m_DataChanged=true;
			// Creation of new items only below this point
			if(objItem.Name!="buttonitem" && objItem.Name!="textboxitem" && objItem.Name!="comboboxitem" && objItem.Name!="customizeitem" && objItem.Name!="labelitem" && objItem.Name!="mdiwindowlistitem" && objItem.Name!="controlcontaineritem" && objItem.Name!="dockcontaineritem" && objItem.Name!="progressbaritem")
				return;
			
			// Item creation buttons only below!!!
			if(objItem.Name=="buttonitem")
			{
				ButtonItem btn=CreateObject(typeof(ButtonItem)) as ButtonItem;
				btn.Text="New Button";
				newItem=btn;
			}
			else if(objItem.Name=="textboxitem")
			{
				TextBoxItem tb=CreateObject(typeof(TextBoxItem)) as TextBoxItem;
				tb.Text="Text Box";
				newItem=tb;
			}
			else if(objItem.Name=="comboboxitem")
			{
				ComboBoxItem cb=CreateObject(typeof(ComboBoxItem)) as ComboBoxItem;
				cb.Text="Combo Box";
				newItem=cb;
			}
			else if(objItem.Name=="customizeitem")
			{
				CustomizeItem cust=CreateObject(typeof(CustomizeItem)) as CustomizeItem;
				newItem=cust;
			}
			else if(objItem.Name=="labelitem")
			{
				LabelItem li=CreateObject(typeof(LabelItem)) as LabelItem;
				li.Text="Label";
				li.BorderType=eBorderType.SingleLine;
				newItem=li;
			}
			else if(objItem.Name=="mdiwindowlistitem")
			{
				MdiWindowListItem mdi=CreateObject(typeof(MdiWindowListItem)) as MdiWindowListItem;
				mdi.Text="MDI Window List";
				newItem=mdi;
			}
			else if(objItem.Name=="controlcontaineritem")
			{
				ControlContainerItem cci=CreateObject(typeof(ControlContainerItem)) as ControlContainerItem;
				newItem=cci;
			}
			else if(objItem.Name=="dockcontaineritem")
			{
				DockContainerItem dci=CreateObject(typeof(DockContainerItem)) as DockContainerItem;
				dci.Text="Dockable Window";
				newItem=dci;
			}
			else if(objItem.Name=="progressbaritem")
			{
				ProgressBarItem pb=CreateObject(typeof(ProgressBarItem)) as ProgressBarItem;
				pb.Text="Progress Bar";
				pb.SetDesignMode(true);
				pb.Style=m_DotNetBar.Style;
				pb.ResetBackgroundStyle();
				newItem=pb;
			}
			if(_barDesigner==null)
			{
				string name="item_";
				long id=newItem.Id;
				if(m_DotNetBar!=null)
				{
					while(m_DotNetBar.GetItem(name+id,true)!=null)
						id++;
				}
				else if(m_Bar!=null)
				{
					while(m_Bar.GetItem(name+id)!=null)
						id++;
				}
				newItem.Name=name+id;
			}
			if(barTree.SelectedNode.Tag is BaseItem)
			{
				newItem.Style=((BaseItem)barTree.SelectedNode.Tag).Style;
				if(barTree.SelectedNode.Tag is PopupItem && newItem is PopupItem)
					((PopupItem)newItem).PopupType=((PopupItem)barTree.SelectedNode.Tag).PopupType;
			}
			else if(barTree.SelectedNode.Tag is Bar)
			{
				newItem.Style=((Bar)barTree.SelectedNode.Tag).Style;
				if(newItem is PopupItem && ((Bar)barTree.SelectedNode.Tag).MenuBar)
					((PopupItem)newItem).PopupType=ePopupType.Menu;
			}
			// We need to determine is new item being added to the Categories
			TreeNode itemNode=barTree.SelectedNode;
			while(itemNode.Parent!=null)
				itemNode=itemNode.Parent;
			if(itemNode==m_CategoriesNode)
			{
				// Assign category to new item
				if(barTree.SelectedNode==m_CategoriesNode)
					newItem.Category="(Untitled)";
				else if(barTree.SelectedNode.Parent==m_CategoriesNode)
					newItem.Category=barTree.SelectedNode.Text;
				else
					newItem.Category=((BaseItem)barTree.SelectedNode.Tag).Category;
				m_DotNetBar.Items.Add(newItem);                
				itemNode=CategorizeItem(newItem);
			}
			else if(itemNode==m_PopupsNode)
			{
				//if(barTree.SelectedNode.Tag is BaseItem && barTree.SelectedNode.Parent.Tag is BaseItem)
				if(barTree.SelectedNode.Tag is BaseItem)
				{
					//itemNode=barTree.SelectedNode.Parent.Nodes.Add(GetTreeItemText(newItem));
					itemNode=barTree.SelectedNode.Nodes.Add(GetTreeItemText(newItem));
					//BaseItem objParent=((BaseItem)barTree.SelectedNode.Tag).Parent;
					BaseItem objParent=(BaseItem)barTree.SelectedNode.Tag;
					int iPos=-1;
					// New Items are always added before any system items which are by default kept at the end
					if(objParent.SubItems.Count>0 && !newItem.SystemItem)
					{
						iPos=GetAppendPosition(objParent);
					}
					objParent.SubItems.Add(newItem,iPos);
				}
				else
				{
					itemNode=m_PopupsNode.Nodes.Add(GetTreeItemText(newItem));
					m_DotNetBar.ContextMenus.Add(newItem);
				}
			}
			else
			{
				Control cont=null;
				if(barTree.SelectedNode.Tag is BaseItem)
				{
					//itemNode=barTree.SelectedNode.Parent.Nodes.Add(GetTreeItemText(newItem));
					itemNode=barTree.SelectedNode.Nodes.Add(GetTreeItemText(newItem));
					//BaseItem objParent=((BaseItem)barTree.SelectedNode.Tag).Parent;
					BaseItem objParent=(BaseItem)barTree.SelectedNode.Tag;
					int iPos=-1;
					// New Items are always added before any system items which are by default kept at the end
					if(objParent.SubItems.Count>0 && !newItem.SystemItem)
					{
						iPos=GetAppendPosition(objParent);
					}
					objParent.SubItems.Add(newItem,iPos);
					cont=newItem.ContainerControl as Control;
					if(cont==null)
						((BaseItem)barTree.SelectedNode.Tag).Refresh();
				}
				else if(barTree.SelectedNode.Tag is Bar)
				{
					itemNode=barTree.SelectedNode.Nodes.Add(GetTreeItemText(newItem));
					Bar bar=(Bar)barTree.SelectedNode.Tag;
					int iPos=-1;
					// New Items are always added before any system items which are by default kept at the end
					if(bar.Items.Count>0 && !newItem.SystemItem)
					{
						iPos=GetAppendPosition(bar.ItemsContainer);
					}
					bar.Items.Add(newItem,iPos);
					cont=bar;
				}
				if(cont!=null && cont is Bar)
					((Bar)cont).RecalcLayout();
			}
			itemNode.Tag=newItem;
			itemNode.ImageIndex=GetItemImageIndex(newItem);
			itemNode.SelectedImageIndex=itemNode.ImageIndex;
			itemNode.EnsureVisible();
			barTree.SelectedNode=itemNode;
			//itemNode.BeginEdit();
		}
		public void RescanCategories()
		{
			if(m_DotNetBar==null)
				return;
			if(m_DotNetBar.Bars.Count==0)
				return;
			m_DotNetBar.Items.Clear();
			foreach(Bar bar in m_DotNetBar.Bars)
			{
				foreach(BaseItem item in bar.Items)
					AutoCategorizeItem(item);
			}
			m_DataChanged=true;
			RefreshView();
		}
		private void AutoCategorizeItem(BaseItem item)
		{
			if(item.Category!="" && item.Name!="" && !m_DotNetBar.Items.Contains(item.Name))
				m_DotNetBar.Items.Add(item.Copy());
			foreach(BaseItem i in item.SubItems)
				AutoCategorizeItem(i);
		}
		private void MoveSelectedItem(string Direction)
		{
			if(barTree.SelectedNode==null)
				return;
			m_DataChanged=true;
			BaseItem objItem=barTree.SelectedNode.Tag as BaseItem;
			if(objItem==null)
				return;
			bool bCategoryItem=false;
			if(barTree.SelectedNode.Parent==m_CategoriesNode)
				bCategoryItem=true;
			
			bool bPopupsItem=false;
			if(barTree.SelectedNode.Parent==m_PopupsNode)
				bPopupsItem=true;
			TreeNode selNode=barTree.SelectedNode;
			TreeNode parentNode=selNode.Parent;
			BaseItem objParent=objItem.Parent;
			int i=0;
			if(objParent!=null)
				i=objParent.SubItems.IndexOf(objItem);
			else
				i=selNode.Index;
			if(Direction=="moveup" && i>0)
			{
				if(objParent!=null)
				{
					objParent.SubItems.Remove(objItem);
					objParent.SubItems.Add(objItem,i-1);
					if(objParent.ContainerControl is Bar)
						((Bar)objParent.ContainerControl).RecalcLayout();
				}
				
				i=selNode.Index;
				selNode.Remove();
                parentNode.Nodes.Insert(i-1,selNode);
				barTree.SelectedNode=selNode;
				selNode.EnsureVisible();
			}
			else if(Direction=="moveright" && i>0)
			{
				BaseItem objNewParent=null;
				
				if(bCategoryItem)
					m_DotNetBar.Items.Remove(objItem);
				else if(bPopupsItem)
					m_DotNetBar.ContextMenus.Remove(objItem);
				if(objParent!=null)
				{
					objNewParent=objParent.SubItems[i-1];
					objParent.SubItems.Remove(objItem);
					if(objParent.ContainerControl is Bar)
						((Bar)objParent.ContainerControl).RecalcLayout();
				}
				else
				{
					objNewParent=selNode.PrevNode.Tag as BaseItem;
				}
				objNewParent.SubItems.Add(objItem,GetAppendPosition(objNewParent));
				objNewParent.Refresh();
				if(objNewParent.ContainerControl is Bar)
					((Bar)objNewParent.ContainerControl).RecalcLayout();
				i=selNode.Index;
				TreeNode newParent=selNode.PrevNode;
				selNode.Remove();
				newParent.Nodes.Add(selNode);
				barTree.SelectedNode=selNode;
				selNode.EnsureVisible();
			}
			else if(Direction=="movedown" && ((objParent!=null && i=0;i--)
			{
				if(objParent.SubItems[i].SystemItem)
					iPos=i;
				else
					break;
			}
			return iPos;
		}
		private void OnPropertyValueChanged(object s, System.Windows.Forms.PropertyValueChangedEventArgs e)
		{
			m_DataChanged=true;
			// If user changes the category of the item that is in categories we need to
			// reflect that change and move item to the right category
			TreeNode node=barTree.SelectedNode;
			BaseItem item=node.Tag as BaseItem;
			if(e.ChangedItem.PropertyDescriptor.Name=="Category" && e.ChangedItem.Value!=e.OldValue)
			{
				if(node.Tag==null || !(node.Tag is BaseItem))
					return;
				while(node.Parent!=null)
					node=node.Parent;
				if(node!=m_CategoriesNode)
					return;
	            
				node=barTree.SelectedNode;
				BaseItem objItem=node.Tag as BaseItem;
				node.Remove();
				node=CategorizeItem(objItem);
				node.ImageIndex=GetItemImageIndex(objItem);
				node.SelectedImageIndex=node.ImageIndex;
				AddSubItems(objItem,node);
				node.EnsureVisible();
				barTree.SelectedNode=node;
			}
			else if(e.ChangedItem.PropertyDescriptor.Name=="Name" && e.ChangedItem.Value!=e.OldValue && !m_ShowItemText)
			{
				node.Text=(string)e.ChangedItem.Value;
			}
			else if(e.ChangedItem.PropertyDescriptor.Name=="Text" && e.ChangedItem.Value!=e.OldValue && m_ShowItemText)
			{
				node.Text=(string)e.ChangedItem.Value;
			}
			else if(e.ChangedItem.PropertyDescriptor.Name=="DockLine" || e.ChangedItem.PropertyDescriptor.Name=="DockOffset")
			{
				Bar bar=node.Tag as Bar;
				if(bar!=null)
					bar.RecalcLayout();
			}
			if(e.ChangedItem.PropertyDescriptor.Name=="Name" && m_DotNetBar!=null)
			{
				TreeNode parent=node;
				while(parent.Parent!=null)
					parent=parent.Parent;
				if(parent==m_CategoriesNode)
				{
					if(m_DotNetBar.Items.Contains(e.ChangedItem.Value.ToString()))
					{
						item.Name=e.OldValue.ToString();
						propertyGrid1.Refresh();
						MessageBox.Show("Item with that name already exists.");
					}
					else
					{
						m_DotNetBar.Items.Remove(e.OldValue.ToString());
						m_DotNetBar.Items.Add(item);						
					}
				}
			}
			if(item!=null)
			{
				Bar barContainer=item.ContainerControl as Bar;
				if(barContainer!=null)
					barContainer.RecalcLayout();
			}
		}
		private TreeNode CategorizeItem(BaseItem newItem)
		{
			// Assign item to category
			if(newItem.Category=="")
				newItem.Category="(Untitled)";
			TreeNode parentNode=null;
			if(m_catTable.ContainsKey(newItem.Category))
				parentNode=m_catTable[newItem.Category] as TreeNode;
			else
			{
				parentNode=m_CategoriesNode.Nodes.Add(newItem.Category);
				parentNode.ImageIndex=5;
				parentNode.SelectedImageIndex=5;
				m_catTable.Add(newItem.Category,parentNode);
			}
			
			TreeNode newNode=parentNode.Nodes.Add(GetTreeItemText(newItem));
			newNode.ImageIndex=GetItemImageIndex(newItem);
			newNode.SelectedImageIndex=newNode.ImageIndex;
			newNode.Tag=newItem;
			return newNode;
		}
		private void CopyMoveToClick(object sender, System.EventArgs e)
		{
			BaseItem item=sender as BaseItem;
			BaseItem itemSel=barTree.SelectedNode.Tag as BaseItem;
			BaseItem itemOriginal=barTree.SelectedNode.Tag as BaseItem;
			bool bMove=(item.Parent.Name=="moveto");
			if(!bMove)
			{
				itemSel=itemSel.Copy();
				if((Control.ModifierKeys & Keys.Control)==Keys.Control)
					itemSel.Name=itemOriginal.Name;
				else
					itemSel.Name="item_"+itemSel.Id;
			}
			if((item.Tag is string && (string)item.Tag=="cat") || item.Name=="tocategories")
			{
				// To Categories
				if(item.Name!="tocategories")
					itemSel.Category=item.Text;
				if(bMove)
				{
					if(itemSel.Parent!=null)
						itemSel.Parent.SubItems.Remove(itemSel);
					barTree.SelectedNode.Remove();
				}
				if(m_DotNetBar.Items.Contains(itemSel.Name))
				{
					string sDupName=itemSel.Name;
					itemSel.Name="item_"+itemSel.Id;
					MessageBox.Show("Item with name: '"+sDupName+"' already exists. Item that you are trying to move will be renamed.");
				}
				m_DotNetBar.Items.Add(itemSel);
				barTree.SelectedNode=CategorizeItem(itemSel);
				barTree.SelectedNode.EnsureVisible();
			}
			else if(item.Name=="topopups" || item.Tag is BaseItem)
			{
				if(bMove)
				{
					if(itemSel.Parent!=null)
						itemSel.Parent.SubItems.Remove(itemSel);
					barTree.SelectedNode.Remove();
				}
				if(item.Name=="topopups")
				{
					TreeNode itemNode=m_PopupsNode.Nodes.Add(GetTreeItemText(itemSel));
					itemNode.Tag=itemSel;
					itemNode.ImageIndex=GetItemImageIndex(itemSel);
					itemNode.SelectedImageIndex=itemNode.ImageIndex;
					AddSubItems(itemSel,itemNode);
					m_DotNetBar.ContextMenus.Add(itemSel);
					itemNode.EnsureVisible();
				}
				else
				{
                    BaseItem objParent=item.Tag as BaseItem;
					objParent.SubItems.Add(itemSel);
					foreach(TreeNode node in m_PopupsNode.Nodes)
					{
						if(node.Tag==objParent)
						{
							TreeNode itemNode=node.Nodes.Add(GetTreeItemText(itemSel));
							itemNode.Tag=itemSel;
							itemNode.ImageIndex=GetItemImageIndex(itemSel);
							itemNode.SelectedImageIndex=itemNode.ImageIndex;
							AddSubItems(itemSel,itemNode);
							itemNode.EnsureVisible();
							break;
						}
					}
				}
			}
			else if(item.Tag is TreeNode)
			{
				// To Bar
				TreeNode barNode=item.Tag as TreeNode;
				Bar bar=barNode.Tag as Bar;
				if(bMove)
				{
					if(itemSel.Parent!=null)
						itemSel.Parent.SubItems.Remove(itemSel);
					barTree.SelectedNode.Remove();
				}
				bar.Items.Add(itemSel,GetAppendPosition(bar.ItemsContainer));
				TreeNode itemNode=barNode.Nodes.Add(GetTreeItemText(itemSel));
				itemNode.Tag=itemSel;
				itemNode.ImageIndex=GetItemImageIndex(itemSel);
				itemNode.SelectedImageIndex=itemNode.ImageIndex;
				AddSubItems(itemSel,itemNode);
				barTree.SelectedNode=itemNode;
				barTree.SelectedNode.EnsureVisible();
				bar.RecalcLayout();
			}
            
			// Clear Copy To and Move To
			item=barManager.Items["popup"];
			item.SubItems["copyto"].SubItems.Clear();
			item.SubItems["moveto"].SubItems.Clear();
		}
		private void ItemEdited(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
		{
			if(e.CancelEdit)
				return;
			BaseItem objItem=e.Node.Tag as BaseItem;
			if(m_ShowItemText)
				objItem.Text=e.Label;
			else
				objItem.Name=e.Label;
			
			propertyGrid1.Refresh();
			m_DataChanged=true;
		}
		private string GetTreeItemText(BaseItem objItem)
		{
			if(objItem==null)
				return "";
			if(m_ShowItemText)
				return objItem.Text;
			else
				return objItem.Name;
		}
		private int GetItemImageIndex(BaseItem objItem)
		{
			int index=0;
			if(objItem is ButtonItem)
			{
				index=7;
			}
			else if(objItem is ComboBoxItem)
			{
				index=8;
			}
			else if(objItem is TextBoxItem)
			{
				index=9;
			}
			else if(objItem is CustomizeItem)
			{
				index=10;
			}
			else if(objItem is LabelItem)
			{
				index=11;
			}
			return index;
		}
		private void TreeKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if(e.KeyCode==Keys.F2 && barTree.SelectedNode!=null && barTree.LabelEdit)
				barTree.SelectedNode.BeginEdit();
		}
		private void GridViewMouseDown(object sender, EventArgs e)
		{
			if(propertyGrid1.SelectedGridItem==null)
				return;
			if(!(propertyGrid1.SelectedGridItem.PropertyDescriptor.PropertyType==typeof(System.Drawing.Image)))
				return;
            PopupItem popup=barManager.ContextMenus["resetimagepopup"] as PopupItem;
            popup.PopupMenu(Control.MousePosition);		
		}
		private void FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			m_GridViewSubclass.ReleaseHandle();
			m_GridViewSubclass=null;
			if(m_HtmlHelp!=null)
				m_HtmlHelp.CloseHelpWindow();
			// ColorScheme property when changed is not detected, so try to fix it here...
			if(m_DotNetBar!=null)
			{
				foreach(Bar bar in m_DotNetBar.Bars)
				{
					if(bar.ColorScheme._DesignTimeSchemeChanged)
					{
						m_DataChanged=true;
						bar.ColorScheme._DesignTimeSchemeChanged=false;
					}
				}
			}
			else if(m_Bar!=null)
			{
				if(m_Bar.ColorScheme._DesignTimeSchemeChanged)
				{
					m_DataChanged=true;
					m_Bar.ColorScheme._DesignTimeSchemeChanged=false;
				}
			}
			// Save form position
			if(this.WindowState!=FormWindowState.Minimized)
			{
				string s="";
				if(this.WindowState==FormWindowState.Maximized)
				{
					s="1";
				}
				else
				{
					s=this.DesktopLocation.X+","+this.DesktopLocation.Y+","+this.Width+","+this.Height;
				}
				try
				{
					Microsoft.Win32.RegistryKey key=Microsoft.Win32.Registry.CurrentUser;
					key=key.CreateSubKey("Software\\DevComponents\\DotNetBar");
					key.SetValue("DesignerPosition",s);
					// Save Panel size
					key.SetValue("DesignerPanelSize",barTree.Width);
					key.Close();
				}
				catch(Exception)
				{
				}
			}
		}
		private class GridViewSubclass:NativeWindow
		{
			public event EventHandler OnRightMouseDown;
			protected override void WndProc(ref Message m)
			{
				if(m.Msg==NativeFunctions.WM_CONTEXTMENU)
				{
					if(OnRightMouseDown!=null)
						OnRightMouseDown(this,new EventArgs());
					return;
				}
				base.WndProc(ref m);
			}
		}
		public bool DataChanged
		{
			get { return m_DataChanged;}
			set { m_DataChanged=value;}
		}
		public DotNetBarManager FormBarManager
		{
			get
			{
				return barManager;
			}
		}
		private void LoadResourceImages()
		{
			Image img=null;
			try
			{
				m_BarImages.Images.Clear();
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.MoveItemLeft.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.MoveItemRight.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.MoveItemUp.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.MoveItemDown.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.FileOpen.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.FileSave.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.CreateItem.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.DeleteItem.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.RescanCategories.bmp");
				m_BarImages.Images.Add(img,Color.Magenta);
				imageList.Images.Clear();
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Item.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Toolbar.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Toolbars.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Toolbar.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Item.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.Folder.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.FolderOpen.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.ButtonItem.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.ComboItem.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.TextBoxItem.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.CustomizeItem.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.LableItem.bmp");
				imageList.Images.Add(img,Color.Magenta);
				img=new Bitmap(typeof(DevComponents.DotNetBar.DotNetBarManager),"BarEditorImages.PopupMenu.bmp");
				imageList.Images.Add(img,Color.Magenta);
                				
			}
			catch(Exception e)
			{
				MessageBox.Show("Could not load resource images. Exception was thrown: "+e.ToString());
			}
		}
		private object CreateObject(Type type)
		{
			if(_barDesigner!=null)
				return _barDesigner.CreateComponent(type);
			else
				return type.Assembly.CreateInstance(type.FullName);
		}
	}
}