Browse Source

Updated PropertyGrid and related items.

svn path=/trunk/mcs/; revision=42105
Jonathan Chambers 21 years ago
parent
commit
275ea834be

+ 11 - 0
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog

@@ -1,3 +1,14 @@
+2005-03-22  Jonathan Chambers  <[email protected]>
+
+	* CategoryGridEntry.cs: Added
+	* GridItem.cs: Added helper properties
+	* PropertyGridTextBox.cs: Custom textbox control for PropertyGrid.
+	* GridEntry.cs: Updated code for collection
+	* PropertyGrid.cs: Cleaned up some formatting
+	* PropertyGridView.cs: Added drop down functionality for enums.
+	* GridItemCollection.cs: Added enumerator logic
+	* PropertyGridEntry.cs: Added
+
 2005-03-19  Alexander Olk  <[email protected]>
 
 	* FileDialog.cs:

+ 35 - 6
mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridEntry.cs

@@ -28,22 +28,28 @@
 using System;
 using System.Windows.Forms;
 using System.ComponentModel;
+using System.Drawing;
 
 namespace System.Windows.Forms.PropertyGridInternal
 {
-	public class GridEntry : GridItem
+	internal class GridEntry : GridItem
 	{
 		#region Local Variables
-		private bool expanded = false;
+		private bool expanded = true;
 		private GridItemCollection grid_items;
 		private GridItem parent;
 		private PropertyDescriptor property_descriptor;
 		private object selected_object;
+		private string label;
+		private int top;
+		private Rectangle plus_minus_bounds;
 		#endregion	// Local Variables
 
 		#region  Contructors
-		public GridEntry() : base() {
-			grid_items = GridItemCollection.Empty;
+		public GridEntry() : base() {
+			plus_minus_bounds = new Rectangle(0,0,0,0);
+			top = -1;
+			grid_items = new GridItemCollection();
 		}
 
 		public GridEntry(object obj, PropertyDescriptor prop_desc) : this() {
@@ -56,7 +62,7 @@ namespace System.Windows.Forms.PropertyGridInternal
 		public override bool Expandable
 		{
 			get {
-				return false;
+				return grid_items.Count > 0;
 			}
 		}
 
@@ -109,7 +115,10 @@ namespace System.Windows.Forms.PropertyGridInternal
 		public override object Value
 		{
 			get {
-				return property_descriptor.GetValue(selected_object);
+				object return_value = null;
+				if (selected_object != null)
+					return_value = property_descriptor.GetValue(selected_object);
+				return return_value;
 			}
 		}
 		#endregion	// Public Instance Properties
@@ -120,5 +129,25 @@ namespace System.Windows.Forms.PropertyGridInternal
 			throw new NotImplementedException();
 		}
 		#endregion	// Public Instance Methods
+
+		internal override int Top {
+			get {
+				return top;
+			}
+			set {
+				top = value;
+			}
+		}
+
+		internal override Rectangle PlusMinusBounds {
+			get{
+				return plus_minus_bounds;
+			}
+			set{
+				plus_minus_bounds = value;
+			}
+		}
+
+
 	}
 }

+ 11 - 0
mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridItem.cs

@@ -26,6 +26,7 @@
 // NOT COMPLETE
 
 using System;
+using System.Drawing;
 
 namespace System.Windows.Forms
 {
@@ -94,5 +95,15 @@ namespace System.Windows.Forms
 		public abstract new bool Select ();
 		#endregion	// Public Instance Methods
 
+		internal abstract int Top {
+			get;
+			set;
+		}
+
+		internal abstract Rectangle PlusMinusBounds {
+			get;
+			set;
+		}
+
 	}
 }

+ 27 - 1
mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridItemCollection.cs

@@ -83,7 +83,33 @@ namespace System.Windows.Forms
 		#region IEnumerable Members
 		public IEnumerator GetEnumerator()
 		{
-			return list.GetEnumerator();
+			return new GridItemEnumerator(this);
+		}
+		#endregion
+
+		#region Enumerator Class
+		public class GridItemEnumerator : IEnumerator{
+			int nIndex;
+			GridItemCollection collection;
+			public GridItemEnumerator(GridItemCollection coll) {
+				collection = coll;
+				nIndex = -1;
+			}
+
+			public bool MoveNext() {
+				nIndex++;
+				return(nIndex < collection.Count);
+			}
+
+			public void Reset() {
+				nIndex = -1;
+			}
+
+			object System.Collections.IEnumerator.Current {
+				get {
+					return(collection[nIndex]);
+				}
+			}
 		}
 		#endregion
 	}

+ 156 - 151
mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyGrid.cs

@@ -26,10 +26,11 @@
 // NOT COMPLETE
 
 using System;
-using System.Collections;
+using System.Drawing;
+using System.Drawing.Design;
 using System.ComponentModel;
+using System.Collections;
 using System.ComponentModel.Design;
-using System.Drawing;
 using System.Reflection;
 using System.Windows.Forms.Design;
 using System.Windows.Forms.PropertyGridInternal;
@@ -40,7 +41,7 @@ namespace System.Windows.Forms
 	public class PropertyGrid : System.Windows.Forms.ContainerControl, ComponentModel.Com2Interop.IComPropertyBrowser
 	{
 		#region Private Members
-
+		
 		
 		private const int GRID_ITEM_HEIGHT = 16;
 		private const int GRID_LEFT_COLUMN_WIDTH = 16;
@@ -82,12 +83,15 @@ namespace System.Windows.Forms
 		#endregion	// Private Members
 
 		#region Contructors
-		public PropertyGrid()
-		{
+		public PropertyGrid() {
+			selected_objects = new object[1];
+			grid_items = new GridItemCollection();
+
+			line_color = SystemColors.ScrollBar;
 			line_color = SystemColors.ScrollBar;
 			browsable_attributes = new AttributeCollection(new Attribute[] {});
 			commands_visible_if_available = false;
-			property_sort = PropertySort.CategorizedAlphabetical;
+			property_sort = PropertySort.Categorized;
 
 			property_grid_view = new PropertyGridView(this);
 			property_grid_view.Dock = DockStyle.Fill;
@@ -133,10 +137,10 @@ namespace System.Windows.Forms
 			toolbar.Appearance = ToolBarAppearance.Flat;
 			toolbar.AutoSize = false;
 			toolbar.Buttons.AddRange(new ToolBarButton[] {
-				categorized_toolbarbutton,
-				alphabetic_toolbarbutton,
-				separator_toolbarbutton,
-				propertypages_toolbarbutton});
+									     categorized_toolbarbutton,
+									     alphabetic_toolbarbutton,
+									     separator_toolbarbutton,
+									     propertypages_toolbarbutton});
 
 			toolbar.ButtonSize = new System.Drawing.Size(20, 20);
 			toolbar.ImageList = toolbar_imagelist;
@@ -154,6 +158,7 @@ namespace System.Windows.Forms
 			alphabetic_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
 			alphabetic_toolbarbutton.ToolTipText = "Alphabetic";
 			alphabetic_toolbarbutton.Text = "A";
+			alphabetic_toolbarbutton.ImageIndex = 0;
 
 			separator_toolbarbutton.Style = ToolBarButtonStyle.Separator;
 
@@ -178,10 +183,7 @@ namespace System.Windows.Forms
 			this.Controls.Add(help_panel);
 			this.Name = "PropertyGrid";
 			this.Size = new System.Drawing.Size(256, 400);
-
-			selected_objects = new object[1];
-			grid_items = new GridItemCollection();
-
+
 			has_focus = false;
 
 			//TextChanged+=new System.EventHandler(RedrawEvent);
@@ -195,6 +197,8 @@ namespace System.Windows.Forms
 			SetStyle(ControlStyles.AllPaintingInWmPaint, true);
 			SetStyle(ControlStyles.ResizeRedraw, true);
 			SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);
+
+			UpdateToolBarButtons();
 		}
 		#endregion	// Constructors
 
@@ -203,8 +207,7 @@ namespace System.Windows.Forms
 		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
 		[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
-		public AttributeCollection BrowsableAttributes
-		{
+		public AttributeCollection BrowsableAttributes {
 			get {
 				return browsable_attributes;
 			}
@@ -218,8 +221,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public override Color BackColor
-		{
+		public override Color BackColor {
 			get {
 				return base.BackColor;
 			}
@@ -233,17 +235,15 @@ namespace System.Windows.Forms
 		}
 
 
-		[BrowsableAttribute(false)]
+		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
-		public virtual bool CanShowCommands 
-		{
+		public virtual bool CanShowCommands {
 			get {
 				return can_show_commands;
 			}
 		}
 
-		public Color CommandsBackColor 
-		{
+		public Color CommandsBackColor {
 			get {
 				return commands_back_color;
 			}
@@ -256,8 +256,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public Color CommandsForeColor 
-		{
+		public Color CommandsForeColor {
 			get {
 				return commands_fore_color;
 			}
@@ -272,16 +271,14 @@ namespace System.Windows.Forms
 
 		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
-		public virtual bool CommandsVisible 
-		{
+		public virtual bool CommandsVisible {
 			get {
 				return commands_visible;
 			}
 		}
 
 		[DefaultValue(false)]
-		public virtual bool CommandsVisibleIfAvailable 
-		{
+		public virtual bool CommandsVisibleIfAvailable {
 			get {
 				return commands_visible_if_available;
 			}
@@ -294,26 +291,23 @@ namespace System.Windows.Forms
 			}
 		}
 
-		[BrowsableAttribute(false)]
+		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
 		[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
-		public Point ContextMenuDefaultLocation
-		{
+		public Point ContextMenuDefaultLocation {
 			get {
 				return context_menu_default_location;
 			}
 		}
-
-		public Color HelpBackColor
-		{
+
+		public Color HelpBackColor {
 			get
 			{
-				return help_panel.BackColor;
-			}
-
+				return help_panel.BackColor;
+			}
 			set
 			{
-				if (help_panel.BackColor == value) {
+				if (help_panel.BackColor == value) {
 					return;
 				}
 
@@ -321,8 +315,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public Color HelpForeColor
-		{
+		public Color HelpForeColor {
 			get {
 				return help_panel.ForeColor;
 			}
@@ -335,11 +328,10 @@ namespace System.Windows.Forms
 				help_panel.ForeColor = value;
 			}
 		}
-
+
 		[DefaultValue(true)]
 		[Localizable(true)]
-		public virtual bool HelpVisible
-		{
+		public virtual bool HelpVisible {
 			get {
 				return help_panel.Visible;
 			}
@@ -353,8 +345,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public bool LargeButtons
-		{
+		public bool LargeButtons {
 			get {
 				return large_buttons;
 			}
@@ -368,8 +359,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public Color LineColor
-		{
+		public Color LineColor {
 			get {
 				return line_color;
 			}
@@ -382,10 +372,9 @@ namespace System.Windows.Forms
 				line_color = value;
 			}
 		}
-
-		[DefaultValue(PropertySort.CategorizedAlphabetical)]
-		public PropertySort PropertySort
-		{
+
+		[DefaultValue(PropertySort.Categorized)]
+		public PropertySort PropertySort {
 			get {
 				return property_sort;
 			}
@@ -399,25 +388,30 @@ namespace System.Windows.Forms
 					return;
 				}
 
-				property_sort = value;
+				property_sort = value;
+				
+				ReflectObjects();
+				property_grid_view.Redraw();
+				
+				if (PropertySortChanged != null) {
+					PropertySortChanged(this, EventArgs.Empty);
+				}
 			}
 		}
 
-		[BrowsableAttribute(false)]
+		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
 		[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
-		public PropertyTabCollection PropertyTabs
-		{
+		public PropertyTabCollection PropertyTabs {
 			get {
 				return property_tabs;
 			}
 		}
 
-		[BrowsableAttribute(false)]
+		[BrowsableAttribute(false)]
 		[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
 		[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
-		public GridItem SelectedGridItem
-		{
+		public GridItem SelectedGridItem {
 			get {
 				return selected_grid_item;
 			}
@@ -427,18 +421,21 @@ namespace System.Windows.Forms
 					return;
 				}
 
-				selected_grid_item = value;
-				this.help_title_label.Text = selected_grid_item.PropertyDescriptor.Name;
-				this.help_description_label.Text = selected_grid_item.PropertyDescriptor.Description;
+				GridItem oldItem = selected_grid_item;
+				selected_grid_item = value;
+				this.help_title_label.Text = selected_grid_item.Label;
+				if (selected_grid_item.PropertyDescriptor != null)
+					this.help_description_label.Text = selected_grid_item.PropertyDescriptor.Description;
 				property_grid_view.Redraw();
-		
+				if (SelectedGridItemChanged != null) {
+					SelectedGridItemChanged(this, new SelectedGridItemChangedEventArgs( oldItem, selected_grid_item));
+				}
 			}
 		}
 
 		[DefaultValue(null)]
 		[TypeConverter("System.Windows.Forms.PropertyGrid+SelectedObjectConverter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-		public object SelectedObject
-		{
+		public object SelectedObject {
 			get {
 				return selected_objects[0];
 			}
@@ -452,8 +449,7 @@ namespace System.Windows.Forms
 
 		[BrowsableAttribute(false)]
 		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
-		public object[] SelectedObjects
-		{
+		public object[] SelectedObjects {
 			get {
 				return selected_objects;
 			}
@@ -467,15 +463,13 @@ namespace System.Windows.Forms
 		[BrowsableAttribute(false)]
 		[EditorBrowsable(EditorBrowsableState.Advanced)]
 		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
-		public PropertyTab SelectedTab
-		{
+		public PropertyTab SelectedTab {
 			get {
 				return selected_tab;
 			}
 		}
 
-		public override ISite Site
-		{
+		public override ISite Site {
 			get {
 				return base.Site;
 			}
@@ -485,10 +479,9 @@ namespace System.Windows.Forms
 			}
 		}
 
-
+
 		[DefaultValue(true)]
-		public virtual bool ToolbarVisible 
-		{
+		public virtual bool ToolbarVisible {
 			get {
 				return toolbar.Visible;
 			}
@@ -502,8 +495,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public Color ViewBackColor
-		{
+		public Color ViewBackColor {
 			get {
 				return property_grid_view.BackColor;
 			}
@@ -517,8 +509,7 @@ namespace System.Windows.Forms
 			}
 		}
 
-		public Color ViewForeColor
-		{
+		public Color ViewForeColor {
 			get {
 				return property_grid_view.ForeColor;
 			}
@@ -536,8 +527,7 @@ namespace System.Windows.Forms
 
 		#region Protected Instance Properties
 
-		protected override Size DefaultSize
-		{
+		protected override Size DefaultSize {
 			get {
 				return base.DefaultSize;
 			}
@@ -547,15 +537,13 @@ namespace System.Windows.Forms
 		[MonoTODO]
 		[Browsable(false)]
 		[EditorBrowsable(EditorBrowsableState.Advanced)]
-		protected virtual Type DefaultTabType 
-		{
+		protected virtual Type DefaultTabType {
 			get {
 				throw new NotImplementedException();
 			}
 		}
 
-		protected override bool ShowFocusCues
-		{
+		protected override bool ShowFocusCues {
 			get {
 				return base.ShowFocusCues;
 			}
@@ -565,31 +553,31 @@ namespace System.Windows.Forms
 
 		#region Public Instance Methods
 		[MonoTODO]
-		public void CollapseAllGridItems()
+		public void CollapseAllGridItems () 
 		{
 			throw new NotImplementedException();
 		}
 
 		[MonoTODO]
-		public void ExpandAllGridItems()
+		public void ExpandAllGridItems () 
 		{
 			throw new NotImplementedException();
 		}
 
-		public override void Refresh()
+		public override void Refresh () 
 		{
 			base.Refresh ();
 		}
 
 
 		[MonoTODO]
-		public void RefreshTabs(PropertyTabScope tabScope)
+		public void RefreshTabs (PropertyTabScope tabScope) 
 		{
 			throw new NotImplementedException();
 		}
 
 		[MonoTODO]
-		public void ResetSelectedProperty()
+		public void ResetSelectedProperty() 
 		{
 			throw new NotImplementedException();
 		}
@@ -597,102 +585,102 @@ namespace System.Windows.Forms
 
 		#region Protected Instance Methods
 		[MonoTODO]
-		protected virtual PropertyTab CreatePropertyTab(Type tabType)
+		protected virtual PropertyTab CreatePropertyTab(Type tabType) 
 		{
 			throw new NotImplementedException();
 		}
 
-		protected override void OnFontChanged(EventArgs e)
+		protected override void OnFontChanged(EventArgs e) 
 		{
 			base.OnFontChanged (e);
 		}
 
 		protected override void OnGotFocus(EventArgs e) 
 		{
+			has_focus=true;
 			base.OnGotFocus(e);
 		}
 
-		protected override void OnHandleCreated(EventArgs e)
+		protected override void OnHandleCreated (EventArgs e) 
 		{
 			base.OnHandleCreated (e);
 		}
 
-		protected override void OnHandleDestroyed(EventArgs e)
+		protected override void OnHandleDestroyed (EventArgs e) 
 		{
 			base.OnHandleDestroyed (e);
 		}
 
-
-		protected override void OnMouseDown(MouseEventArgs e)
+		protected override void OnMouseDown (MouseEventArgs e) 
 		{
 			base.OnMouseDown (e);
 		}
 
-		protected override void OnMouseMove(MouseEventArgs e)
+		protected override void OnMouseMove (MouseEventArgs e) 
 		{
 			base.OnMouseMove (e);
 		}
 
-		protected override void OnMouseUp(MouseEventArgs e)
+		protected override void OnMouseUp (MouseEventArgs e) 
 		{
 			base.OnMouseUp (e);
 		}
-
-		protected override void OnPaint(PaintEventArgs pevent)
-		{
+
+		protected override void OnPaint (PaintEventArgs pevent) 
+		{
 			base.OnPaint (pevent);
 		}
 
 		[MonoTODO]
-		protected virtual void OnPropertyTabChanged(PropertyTabChangedEventArgs e)
+		protected virtual void OnPropertyTabChanged (PropertyTabChangedEventArgs e) 
 		{
 			throw new NotImplementedException();
 		}
 
 		[MonoTODO]
-		protected virtual void OnPropertyValueChanged(PropertyValueChangedEventArgs e)
+		protected virtual void OnPropertyValueChanged (PropertyValueChangedEventArgs e) 
 		{
 			throw new NotImplementedException();
 		}
 
-		protected override void OnResize(EventArgs e)
+		protected override void OnResize (EventArgs e) 
 		{
 			base.OnResize (e);
 		}
 
 		[MonoTODO]
-		protected virtual void OnSelectedGridItemChanged(SelectedGridItemChangedEventArgs e)
+		protected virtual void OnSelectedGridItemChanged (SelectedGridItemChangedEventArgs e) 
 		{
 			throw new NotImplementedException();
 		}
 
 		[MonoTODO]
-		protected virtual void OnSelectedObjectsChanged(EventArgs e)
+		protected virtual void OnSelectedObjectsChanged (EventArgs e) 
 		{
 			throw new NotImplementedException();
 		}
 
-		protected override void OnSystemColorsChanged(EventArgs e)
+		protected override void OnSystemColorsChanged (EventArgs e) 
 		{
 			base.OnSystemColorsChanged (e);
 		}
 
-		protected override void OnVisibleChanged(EventArgs e)
+		protected override void OnVisibleChanged (EventArgs e) 
 		{
 			base.OnVisibleChanged (e);
 		}
 
-		protected override bool ProcessDialogKey(Keys keyData)
+		protected override bool ProcessDialogKey (Keys keyData) 
 		{
 			return base.ProcessDialogKey (keyData);
 		}
 
-		protected override void ScaleCore(float dx, float dy)
+		protected override void ScaleCore (float dx, float dy) 
 		{
 			base.ScaleCore (dx, dy);
 		}
 
-		protected override void WndProc(ref Message m)
+		protected override void WndProc (ref Message m) 
 		{
 			base.WndProc (ref m);
 		}
@@ -756,19 +744,18 @@ namespace System.Windows.Forms
 
 			#endregion	// Private Constructors
 
-			[MonoTODO]
-			public PropertyTab this[int index]
-			{
-				get {
+			[MonoTODO]
+			public PropertyTab this[int index] {
+				get {
 					throw new NotImplementedException();
 				}
 			}
 		
 			#region ICollection Members
-			[MonoTODO]
+			[MonoTODO]
 			bool ICollection.IsSynchronized
 			{
-				get {
+				get {
 					// TODO:  Add PropertyTabCollection.IsSynchronized getter implementation
 					return false;
 				}
@@ -780,10 +767,10 @@ namespace System.Windows.Forms
 				// TODO:  Add PropertyTabCollection.CopyTo implementation
 			}
 
-			[MonoTODO]
+			[MonoTODO]
 			object ICollection.SyncRoot
 			{
-				get {
+				get {
 					// TODO:  Add PropertyTabCollection.SyncRoot getter implementation
 					return null;
 				}
@@ -793,8 +780,7 @@ namespace System.Windows.Forms
 
 			#region IEnumerable Members
 			[MonoTODO]
-			public IEnumerator GetEnumerator()
-			{
+			public IEnumerator GetEnumerator() {
 				// TODO:  Add PropertyTabCollection.GetEnumerator implementation
 				return null;
 			}
@@ -802,10 +788,9 @@ namespace System.Windows.Forms
 			#endregion
 		
 			#region ICollection Members
-			[MonoTODO]
-			public int Count
-			{
-				get {
+			[MonoTODO]
+			public int Count {
+				get {
 					// TODO:  Add PropertyTabCollection.Count getter implementation
 					return 0;
 				}
@@ -815,67 +800,87 @@ namespace System.Windows.Forms
 		}
 		#endregion	// PropertyTabCollection Class
 
-
 		#region Private Helper Methods
-
-		private void toolbar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
+
+		private void toolbar_ButtonClick (object sender, ToolBarButtonClickEventArgs e) 
 		{
-			if (e.Button == alphabetic_toolbarbutton) {
-				this.PropertySort = PropertySort.Alphabetical;
-			} else if (e.Button == categorized_toolbarbutton) {
+			if (e.Button == alphabetic_toolbarbutton) {
+				this.PropertySort = PropertySort.Alphabetical;
+			}
+			else if (e.Button == categorized_toolbarbutton) {
 				this.PropertySort = PropertySort.Categorized;
 			}
+			UpdateToolBarButtons();
+			ReflectObjects();
+			property_grid_view.Redraw();
 		}
-
-		internal void UpdateToolBarButtons()
+
+		internal void UpdateToolBarButtons () 
 		{
-			if (PropertySort == PropertySort.Alphabetical) {
+			if (PropertySort == PropertySort.Alphabetical) {
 				categorized_toolbarbutton.Pushed = false;
-				alphabetic_toolbarbutton.Pushed = true;
-			} else if (PropertySort == PropertySort.Categorized) {
+				alphabetic_toolbarbutton.Pushed = true;
+			}
+			else if (PropertySort == PropertySort.Categorized) {
 				categorized_toolbarbutton.Pushed = true;
-				alphabetic_toolbarbutton.Pushed = false;
-			} else {
+				alphabetic_toolbarbutton.Pushed = false;
+			}
+			else {
 				categorized_toolbarbutton.Pushed = false;
 				alphabetic_toolbarbutton.Pushed = false;
 			}
 		}
 
-		private void OnResetPropertyClick(object sender, EventArgs e)
+		private void OnResetPropertyClick (object sender, EventArgs e) 
 		{
 			ResetSelectedProperty();
 		}
 
-		private void OnDescriptionClick(object sender, EventArgs e)
+		private void OnDescriptionClick (object sender, EventArgs e) 
 		{
 			this.HelpVisible = !this.HelpVisible;
 			description_menuitem.Checked = this.HelpVisible;
 
 		}
-
-		private void ReflectObjects()
+
+		private void ReflectObjects () 
 		{
-			grid_items = new GridItemCollection();
+			GridItemCollection alphabetical_grid_items = new GridItemCollection();
+			GridItemCollection category_grid_items = new GridItemCollection();
 			foreach (object obj in selected_objects) {
 				if (obj != null) {
-					PopulateGridItemCollection(obj,grid_items);
+					PopulateGridItemCollection(obj,alphabetical_grid_items, category_grid_items);
 				}
 			}
+			if (PropertySort == PropertySort.Alphabetical) {
+				grid_items = alphabetical_grid_items;
+			}
+			// need to use categories
+			else {
+				grid_items = category_grid_items;
+			}
 		}
 
-		private void PopulateGridItemCollection(object obj, GridItemCollection grid_item_coll)
+		private void PopulateGridItemCollection (object obj, GridItemCollection grid_item_coll, GridItemCollection category_grid_item_coll) 
 		{
-			PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
+			PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
 			for (int i = 0; i < properties.Count;i++) {
-				bool not_browseable = properties[i].Attributes.Contains(new Attribute[] {new BrowsableAttribute(false)});
-				if (!not_browseable) {
-					GridEntry grid_entry = new GridEntry(obj, properties[i]);
-					//object test = grid_item_coll["Length"];
+				bool not_browseable = properties[i].Attributes.Contains(new BrowsableAttribute(false));
+				if (!not_browseable) {
+					GridEntry grid_entry = new GridEntry(obj, properties[i]);
 					grid_item_coll.Add(properties[i].Name,grid_entry);
-					//PopulateGridItemCollection(grid_entry.Value,grid_entry.GridItems);
+
+					string category = properties[i].Category;
+					GridItem cat_item = category_grid_item_coll[category];
+					if (cat_item == null) {
+						cat_item = new CategoryGridEntry(category);
+						category_grid_item_coll.Add(category,cat_item);
+					}
+					cat_item.GridItems.Add(properties[i].Name,grid_entry);
 				}
 			}
-		}
+		}
+
 		#endregion	// Private Helper Methods
 	}
 }

+ 443 - 196
mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyGridView.cs

@@ -1,218 +1,465 @@
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
-//
-// Authors:
-//      Jonathan Chambers	([email protected])
-//
-//
-
-// NOT COMPLETE
-
-using System;
-using System.Drawing;
-
-namespace System.Windows.Forms.PropertyGridInternal
-{
-	public class PropertyGridView : System.Windows.Forms.ScrollableControl
-	{
-		internal const int LEFT_COLUMN_WIDTH = 16;
-		internal const int ROW_HEIGHT = 16;
-		internal const int RESIZE_WIDTH = 3;
-		private TextBox grid_textbox;
-		internal PropertyGrid property_grid;
-		internal bool redraw;
-		internal bool resizing_grid;
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+//
+// Authors:
+//      Jonathan Chambers	([email protected])
+//
+//
+
+// NOT COMPLETE
+
+using System;
+using System.Collections;
+using System.Drawing;
+using System.Drawing.Design;
+using System.ComponentModel;
+
+namespace System.Windows.Forms.PropertyGridInternal 
+{
+	public class PropertyGridView : System.Windows.Forms.ScrollableControl 
+	{
+
+		#region Private Members
+		internal const int V_INDENT = 16;
+		internal const int ROW_HEIGHT = 16;
+		internal const int RESIZE_WIDTH = 3;
+		internal const int BUTTON_WIDTH = 25;
+		private PropertyGridTextBox grid_textbox;
+		internal PropertyGrid property_grid;
+		internal bool redraw;
+		internal bool resizing_grid;
 		internal int label_column_width;
-
-		public PropertyGridView(PropertyGrid property_grid)
+		private bool add_hscroll;
+		private int open_grid_item_count = -1;
+		private VScrollBar vbar;
+		private bool vbar_added;
+		private int skipped_grid_items;
+		private Form dropdown_form;
+		private ListBox listBox;
+		#endregion
+
+		#region Contructors
+		public PropertyGridView (PropertyGrid propertyGrid) 
+		{
+			property_grid = propertyGrid;
+			this.BackColor = Color.Beige;
+			grid_textbox = new PropertyGridTextBox();
+			grid_textbox.DropDownButtonClicked +=new EventHandler(grid_textbox_DropDownButtonClicked);
+
+			dropdown_form = new Form();
+			dropdown_form.FormBorderStyle = FormBorderStyle.None;
+			dropdown_form.Deactivate +=new EventHandler(dropdown_form_Deactivate);
+
+			listBox = new ListBox();
+			listBox.Dock = DockStyle.Fill;
+			listBox.SelectedIndexChanged +=new EventHandler(listBox_SelectedIndexChanged);
+			dropdown_form.Controls.Add(listBox);
+
+			grid_textbox.Visible = true;
+			grid_textbox.Font = new Font(this.Font,FontStyle.Bold);
+			grid_textbox.BackColor = this.BackColor;
+			// Not working at all, used to??
+			//grid_textbox.TextBox.Validated += new EventHandler(TextBoxValidated);
+
+			label_column_width = 65;
+			resizing_grid = false;
+
+			ForeColorChanged+=new EventHandler(RedrawEvent);
+			BackColorChanged+=new System.EventHandler(RedrawEvent);
+			FontChanged+=new EventHandler(RedrawEvent);
+			SizeChanged+=new EventHandler(RedrawEvent);
+			
+			SetStyle(ControlStyles.UserPaint, true);
+			SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+			SetStyle(ControlStyles.ResizeRedraw, true);
+			SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);
+		}
+
+		#endregion
+
+		#region Protected Instance Methods
+		protected override void WndProc (ref Message m) 
 		{
-			this.property_grid = property_grid;
-			this.BackColor = Color.Beige;
-			grid_textbox = new TextBox();
-
-			grid_textbox.Visible = false;
-			grid_textbox.Font = new Font(this.Font,FontStyle.Bold);
-			grid_textbox.BorderStyle = BorderStyle.None;
-			grid_textbox.BackColor = this.BackColor;
-			grid_textbox.Validated += new EventHandler(grid_textbox_Validated);
-
-			label_column_width = 65;
-			resizing_grid = false;
-
-			this.Controls.Add(grid_textbox);
+			switch ((Msg) m.Msg) {
+			case Msg.WM_PAINT: {				
+				PaintEventArgs	paint_event;
 
-			ForeColorChanged+=new EventHandler(RedrawEvent);
-			BackColorChanged+=new System.EventHandler(RedrawEvent);
-			FontChanged+=new EventHandler(RedrawEvent);
-			SizeChanged+=new EventHandler(RedrawEvent);
-			MouseMove+=new MouseEventHandler(PropertyGridView_MouseMove);
-			
-			SetStyle(ControlStyles.UserPaint, true);
-			SetStyle(ControlStyles.AllPaintingInWmPaint, true);
-			SetStyle(ControlStyles.ResizeRedraw, true);
-			SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);
-		}
-
-		protected override void OnPaint(PaintEventArgs pevent)
+				paint_event = XplatUI.PaintEventStart (Handle);
+				DoPaint (paint_event);
+				XplatUI.PaintEventEnd (Handle);
+				return;
+			}
+			}
+			base.WndProc (ref m);
+		}
+
+		protected override void OnMouseMove (MouseEventArgs e) 
+		{
+			if (resizing_grid) {
+				label_column_width = Math.Max(e.X - V_INDENT,V_INDENT);
+				Redraw();
+			}
+			else if (e.X > label_column_width+V_INDENT - RESIZE_WIDTH && e.X < label_column_width+V_INDENT + RESIZE_WIDTH) {
+				this.Cursor = Cursors.VSplit;
+			}
+			base.OnMouseMove (e);
+		}
+
+		private GridItem GetSelectedGridItem (GridItemCollection grid_items, int y) 
+		{
+			foreach (GridItem child_grid_item in grid_items) {
+				if (y > child_grid_item.Top && y < child_grid_item.Top + ROW_HEIGHT) {
+					return child_grid_item;
+				}
+				GridItem foundItem = GetSelectedGridItem(child_grid_item.GridItems, y);
+				if (foundItem != null)
+					return foundItem;
+			}
+			return null;
+		}
+
+		protected override void OnMouseDown (MouseEventArgs e) 
+		{
+			if (e.X > label_column_width+V_INDENT + 2 - RESIZE_WIDTH && e.X < label_column_width+V_INDENT + 2 + RESIZE_WIDTH) {
+				resizing_grid = true;
+			}
+			else {
+				GridItem foundItem = GetSelectedGridItem(property_grid.grid_items, e.Y);
+				if (this.property_grid.SelectedGridItem != null) {
+					PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;
+					if (desc != null) {
+						desc.SetValue(property_grid.SelectedObject, desc.Converter.ConvertFromString(grid_textbox.TextBoxText));
+					}
+				}
+				if (foundItem != null)
+					property_grid.SelectedGridItem = foundItem;
+				if (property_grid.SelectedGridItem.Expandable) {
+					if (((CategoryGridEntry)property_grid.SelectedGridItem).PlusMinusBounds.Contains(e.X,e.Y)){
+						property_grid.SelectedGridItem.Expanded = !property_grid.SelectedGridItem.Expanded;
+					}
+				}
+				Redraw();
+				base.OnMouseDown (e);
+			}
+		}
+
+		protected override void OnMouseUp (MouseEventArgs e) 
+		{
+			resizing_grid = false;
+			base.OnMouseUp (e);
+		}
+
+		protected override void OnKeyDown (KeyEventArgs e) 
+		{
+			base.OnKeyDown (e);
+		}
+
+		#endregion
+
+		#region Private Helper Methods
+		private void AddVerticalScrollBar (int total_grid_items, bool count_changed) 
 		{
-			this.grid_textbox.Visible = false;
-			Draw(pevent);
-			pevent.Graphics.DrawImage(this.ImageBuffer, pevent.ClipRectangle, pevent.ClipRectangle, GraphicsUnit.Pixel);
-			if (property_grid.SelectedGridItem != null)
-				grid_textbox.Visible = true;
-			base.OnPaint (pevent);
-		}
+			if (vbar == null) {
+				vbar = new VScrollBar ();
+				count_changed = true;
+			}
 
-		// Derived classes should override Draw method and we dont want
-		// to break the control signature, hence this approach.
-		internal virtual void Draw (PaintEventArgs e) 
-		{
-			if (redraw) 
-			{
-				Rectangle grid_rect = new Rectangle(0,0,this.Width-1,this.Height-1);
+			vbar.Bounds = new Rectangle (ClientRectangle.Width - vbar.Width,
+				0, vbar.Width, Height);
 
-				Rectangle grid_left_rect = new Rectangle(grid_rect.Left+1,grid_rect.Top+1,LEFT_COLUMN_WIDTH,ROW_HEIGHT);
-				Rectangle grid_label_rect = new Rectangle(grid_left_rect.Right,grid_rect.Top+1,label_column_width,ROW_HEIGHT);
-				Rectangle grid_value_rect = new Rectangle(grid_label_rect.Right,grid_rect.Top+1,grid_rect.Right-grid_label_rect.Right,ROW_HEIGHT);
+			if (count_changed) {
+				vbar.Maximum = total_grid_items;
+				int height = ClientRectangle.Height;
+				vbar.LargeChange = height / ROW_HEIGHT;
+			}
 
+			if (!vbar_added) {
+				Controls.Add (vbar);
+				vbar.ValueChanged += new EventHandler (VScrollBarValueChanged);
+				vbar_added = true;
+			}
 
-				Brush label_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindowText);
-				Brush label_backcolor_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindow);
-				Brush back_color_brush = ThemeEngine.Current.ResPool.GetSolidBrush(this.BackColor);
-				Brush control_brush = ThemeEngine.Current.ResPool.GetSolidBrush(property_grid.LineColor);
-				Pen control_pen = ThemeEngine.Current.ResPool.GetPen(property_grid.LineColor);
+			vbar.Visible = true;
+		}
+
+		internal void Redraw () 
+		{
+			redraw = true;
+			Refresh ();
+		}
+
+		private GridItem GetGridItemAt (int y) 
+		{
+			return null;
+		}
+
+		#region Drawing Code
+		private void DoPaint (PaintEventArgs pevent) 
+		{
+			Draw(pevent.ClipRectangle);
+			pevent.Graphics.DrawImage(this.ImageBuffer, pevent.ClipRectangle, pevent.ClipRectangle, GraphicsUnit.Pixel);
+		}
+
+		[MonoTODO("Do a better job of clipping")]
+		private void Draw (Rectangle clip) 
+		{
+			if (redraw) {
 				
+				// Decide if we need a scrollbar
+				bool add_vscroll = false;
+				int old_open_grid_item_count = open_grid_item_count;
+
+				// Use same brushes for all grid items
+				Brush line_brush = ThemeEngine.Current.ResPool.GetSolidBrush(property_grid.LineColor);
+				Pen line_pen = ThemeEngine.Current.ResPool.GetPen(property_grid.LineColor);
+				Brush text_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindowText);
+
+
+				Rectangle fill = ClientRectangle;
 				// draw grid outline
-				e.Graphics.FillRectangle(back_color_brush,grid_rect);
-				e.Graphics.DrawRectangle(ThemeEngine.Current.ResPool.GetPen(SystemColors.ControlDark),grid_rect);
-
-				// draw items
-				GridItemCollection grid_items = this.property_grid.grid_items;
-				for (int i = 0; i < grid_items.Count; i++) {
-					GridItem grid_item = grid_items[i];
-					
-					label_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindowText);
-					label_backcolor_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindow);
-					if (grid_item == this.property_grid.SelectedGridItem) {
-						label_backcolor_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorHilight);
-						label_brush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorHilightText);
-						grid_textbox.Size = new Size(grid_value_rect.Size.Width-6,grid_value_rect.Size.Height);
-						grid_textbox.Location = new Point(grid_value_rect.Location.X+4,grid_value_rect.Location.Y+1);
-						
-						// PDB - added check to prevent crash with test app
-						if (grid_item.Value != null)  {
-							grid_textbox.Text = grid_item.Value.ToString();
-						} else {
-							grid_textbox.Text = string.Empty;
-						}
-					}
-
-					e.Graphics.FillRectangle(control_brush,grid_left_rect);
-
-					e.Graphics.FillRectangle(label_backcolor_brush,grid_label_rect);
-					e.Graphics.DrawRectangle(control_pen,grid_label_rect);
-					e.Graphics.DrawString(grid_item.Label,this.Font,label_brush,grid_label_rect.Left + 5,grid_label_rect.Top+1);
-
-					e.Graphics.FillRectangle(back_color_brush,grid_value_rect);
-					e.Graphics.DrawRectangle(control_pen,grid_value_rect);
-					// PDB - added check to prevent crash with test app
-					if (grid_item.Value != null) {
-						e.Graphics.DrawString(grid_item.Value.ToString(),new Font(this.Font,FontStyle.Bold),ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorWindowText),grid_value_rect.Left + 2,grid_value_rect.Top+1);
-					}
-
-				   
-					// shift down for next item
-					grid_left_rect.Y = grid_label_rect.Y = grid_value_rect.Y = grid_left_rect.Y + ROW_HEIGHT;
+				DeviceContext.FillRectangle (new SolidBrush (BackColor), fill);
+				DeviceContext.DrawRectangle(ThemeEngine.Current.ResPool.GetPen(SystemColors.ControlDark),fill);
+
+				int depth = 0;
+				int item_height = ROW_HEIGHT;
+				Font font = Font;
+				int height = ClientRectangle.Height;
+
+				GridItemCollection grid_items = this.property_grid.grid_items;
+
+				open_grid_item_count = 0;
+				foreach (GridItem grid_item in grid_items) {
+					DrawGridItem (grid_item, clip, ref depth, item_height, font, height, line_brush, text_brush, line_pen);
+					depth = 0;
 				}
-				redraw = false;
-			}
-		}
 
+				add_vscroll = (open_grid_item_count * ROW_HEIGHT) > ClientRectangle.Height;
+
+				if (add_vscroll) {
+					AddVerticalScrollBar (open_grid_item_count, old_open_grid_item_count != open_grid_item_count);
+				} else if (vbar != null) {
+					vbar.Visible = false;
+					skipped_grid_items = 0;
+				}
+
+				if (property_grid.SelectedGridItem != null && property_grid.SelectedGridItem.GridItemType == GridItemType.Property) {
+					//if (grid_textbox.Visible == false) {
+					this.Controls.Add(grid_textbox);
+					//}
+					//grid_textbox.Visible = true;
+					if (!grid_textbox.Focused)
+						grid_textbox.Focus();
+				}
+				else {
+					this.Controls.Remove(grid_textbox);
+					//grid_textbox.Visible = false;
+				}
+
+				redraw = false;
+			}
+		}
+
+		private void DrawGridItem (GridItem grid_item, Rectangle clip, ref int depth, int item_height,
+			Font font, int max_height, Brush line_brush, Brush text_brush, Pen line_pen) 
+		{
+
+			int y = ClientRectangle.Top+1+(ROW_HEIGHT*(open_grid_item_count-skipped_grid_items));
+			grid_item.Top = y;
+
+			Rectangle indentRectangle = new Rectangle(ClientRectangle.Left+1,y,V_INDENT,ROW_HEIGHT);
+			Rectangle labelRectangle = new Rectangle(indentRectangle.Right,y,label_column_width,ROW_HEIGHT);
+			Rectangle valueRectangle = new Rectangle(labelRectangle.Right,y,ClientRectangle.Right-labelRectangle.Right,ROW_HEIGHT);
+
+			DrawGridItemIndent(grid_item, line_brush, indentRectangle, grid_item.Expandable, grid_item.Expanded);
+			DrawGridItemLabel(grid_item, labelRectangle, line_pen, text_brush, Font, depth, line_brush);
+			DrawGridItemValue(grid_item, valueRectangle, line_pen, text_brush, new Font(Font, FontStyle.Bold), line_brush);
+
+			if (grid_item == property_grid.SelectedGridItem) {
+				if (grid_item.Value != null) {
+					grid_textbox.TextBoxText = grid_item.Value.ToString();
+				} 
+				else {
+					grid_textbox.TextBoxText = string.Empty;
+				}
+				grid_textbox.Size = new Size(valueRectangle.Size.Width- (vbar == null || !vbar.Visible ? 0 : ThemeEngine.Current.VerticalScrollBarWidth),valueRectangle.Size.Height);
+				grid_textbox.Location = new Point(valueRectangle.Location.X+4,valueRectangle.Location.Y+1);
+			}
 			
-		private void grid_textbox_Validated(object sender, EventArgs e)
-		{
-			if (this.property_grid.SelectedGridItem != null)
-			this.property_grid.SelectedGridItem.PropertyDescriptor.SetValue(this.property_grid.SelectedObject,this.property_grid.SelectedGridItem.PropertyDescriptor.Converter.ConvertTo(((TextBox)sender).Text,this.property_grid.SelectedGridItem.PropertyDescriptor.PropertyType));
-		}
-
-		protected override void OnMouseMove(MouseEventArgs e)
-		{
-			if (resizing_grid) {
-				label_column_width = Math.Max(e.X - LEFT_COLUMN_WIDTH,LEFT_COLUMN_WIDTH);
-				Redraw();
-			} else if (e.X > label_column_width+LEFT_COLUMN_WIDTH - RESIZE_WIDTH && e.X < label_column_width+LEFT_COLUMN_WIDTH + RESIZE_WIDTH) {
-				this.Cursor = Cursors.VSplit;
-			}
-			base.OnMouseMove (e);
-		}
-
-
-		protected override void OnMouseDown(MouseEventArgs e)
-		{
-			if (e.X > label_column_width+LEFT_COLUMN_WIDTH + 2 - RESIZE_WIDTH && e.X < label_column_width+LEFT_COLUMN_WIDTH + 2 + RESIZE_WIDTH) {
-				resizing_grid = true;
-			} else {
-				int index = e.Y / ROW_HEIGHT;
-				if (index < property_grid.grid_items.Count)
-					this.property_grid.SelectedGridItem = this.property_grid.grid_items[index];
-				base.OnMouseDown (e);
-			}
-		}
+			open_grid_item_count++;
+
+			
+			depth++;
+			if (grid_item.Expanded) {
+				foreach (GridItem child_item in grid_item.GridItems) {
+					int tdepth = depth;
+					DrawGridItem(child_item, clip, ref tdepth, item_height, font, max_height, line_brush, text_brush, line_pen);
+				}
+			}
+		}
+
+		private void DrawGridItemIndent (GridItem grid_item, Brush brush, Rectangle rect, bool showPlusMinus, bool expanded) 
+		{
+
+			DeviceContext.FillRectangle(brush,rect);
+
+			if (showPlusMinus) {
+				Rectangle plus_minus_rect = new Rectangle(rect.X+3,rect.Y+3,8,8);
+				grid_item.PlusMinusBounds = plus_minus_rect;
+
+				DeviceContext.DrawRectangle (SystemPens.ControlDark, plus_minus_rect);
 
-		protected override void OnMouseUp(MouseEventArgs e)
-		{
-			resizing_grid = false;
-			base.OnMouseUp (e);
-		}
+				int middle = (plus_minus_rect.Bottom-plus_minus_rect.Top)/2 + plus_minus_rect.Top;
+				int x = plus_minus_rect.X;
+				DeviceContext.DrawLine (SystemPens.ControlDarkDark, x + 2, middle, x + 6, middle); 
 
+				if (!expanded) {
+					DeviceContext.DrawLine (SystemPens.ControlDarkDark, x + 4, middle - 2, x + 4, middle + 2);
+				}
+			}
+		}
+
+		private void DrawGridItemLabel (GridItem grid_item, Rectangle rect, Pen pen, Brush brush, Font font, int depth, Brush line_brush) 
+		{
+			Brush backBrush = ThemeEngine.Current.ResPool.GetSolidBrush(BackColor);
+			Brush foreBrush = brush;
+			bool selectedItem = false, expandable = false;
+			if (grid_item == property_grid.SelectedGridItem){
+				backBrush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorHilight);
+				foreBrush = ThemeEngine.Current.ResPool.GetSolidBrush(ThemeEngine.Current.ColorHilightText);
+			}
+			if (grid_item.Expandable){
+				backBrush = line_brush;
+				foreBrush = brush;
+			}
+
+			DeviceContext.FillRectangle(backBrush,rect);
+			DeviceContext.DrawRectangle(pen,rect);
+			DeviceContext.DrawString(grid_item.Label,font,foreBrush,rect.Left + 5 + depth*V_INDENT,rect.Top+1);
+		}
+
+		[MonoTODO("GetEditor once the TypeDescriptor class is complete")]
+		private void DrawGridItemValue (GridItem grid_item, Rectangle rect, Pen pen, Brush brush, Font font, Brush line_brush) 
+		{
+			DeviceContext.FillRectangle((grid_item.GridItemType == GridItemType.Property) ? ThemeEngine.Current.ResPool.GetSolidBrush(BackColor) : line_brush,rect);
+			DeviceContext.DrawRectangle(pen,rect);
 
-		protected override void OnKeyDown(KeyEventArgs e)
+			// PDB - added check to prevent crash with test app
+			if (grid_item.Value != null) {
+				DeviceContext.DrawString(grid_item.Value.ToString(),font,brush,rect.Left + 2,rect.Top+1);
+			}
+
+			if (grid_item == property_grid.SelectedGridItem) {
+				grid_textbox.ReadOnly = false;
+				if (grid_item.PropertyDescriptor != null) {
+					UITypeEditor editor = null;//(UITypeEditor)grid_item.PropertyDescriptor.GetEditor(typeof(UITypeEditor));
+					if (editor != null) {
+						UITypeEditorEditStyle style =  editor.GetEditStyle();
+						if (style == UITypeEditorEditStyle.DropDown) {
+							grid_textbox.DropDownButtonVisible = true;
+							grid_textbox.DialogButtonVisible = false;
+							
+						}
+						else if (style == UITypeEditorEditStyle.Modal) {
+							grid_textbox.DropDownButtonVisible = false;
+							grid_textbox.DialogButtonVisible = true;
+						}
+						
+					}
+					else if (grid_item.PropertyDescriptor.Converter.GetStandardValuesSupported()) {
+						listBox.Items.Clear();
+						foreach (object obj in grid_item.PropertyDescriptor.Converter.GetStandardValues())
+							listBox.Items.Add(obj);
+						grid_textbox.DropDownButtonVisible = true;
+						grid_textbox.DialogButtonVisible = false;
+						grid_textbox.ReadOnly = true;
+					}
+					else {
+						grid_textbox.DropDownButtonVisible = false;
+						grid_textbox.DialogButtonVisible = false;
+					}
+				}
+				else {
+					grid_textbox.DropDownButtonVisible = false;
+					grid_textbox.DialogButtonVisible = false;
+				}
+			}
+		}
+
+		#endregion
+
+		#region Event Handling
+		private void RedrawEvent (object sender, System.EventArgs e) 
+		{
+			Redraw();
+		}
+
+		private void VScrollBarValueChanged (object sender, EventArgs e) 
 		{
-			if (this.property_grid.SelectedGridItem != null) {
-				grid_textbox.Focus();
-			}
-			base.OnKeyDown (e);
-		}
+			int old_skip = skipped_grid_items;
+			skipped_grid_items = vbar.Value;
 
-
-		internal void Redraw() 
-		{
+			int y_move = (old_skip - skipped_grid_items) * ROW_HEIGHT;
+			// need this to refresh drawing
 			redraw = true;
-			Refresh ();
-		}
-
-		private void RedrawEvent(object sender, System.EventArgs e) 
-		{
-			Redraw();
+			XplatUI.ScrollWindow (Handle, ClientRectangle, 0, y_move, true);
 		}
+
+		private void TextBoxValidated (object sender, EventArgs e) 
+		{
+			if (this.property_grid.SelectedGridItem != null) {
+				PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;
+				if (desc != null) {
+					desc.SetValue(property_grid.SelectedObject, desc.Converter.ConvertFromString(grid_textbox.TextBoxText));
+				}
+			}
+		}
 
-		private void PropertyGridView_MouseMove(object sender, MouseEventArgs e)
-		{
-
-			if (e.X > label_column_width+LEFT_COLUMN_WIDTH - RESIZE_WIDTH && e.X < label_column_width+LEFT_COLUMN_WIDTH + RESIZE_WIDTH
-				|| resizing_grid) {
-				this.Cursor = Cursors.VSplit;
-			} else {
-				this.Cursor = Cursors.Default;
-			}
-		}
-	}
+		#endregion
+
+		
+		#endregion
+
+		private void dropdown_form_Deactivate (object sender, EventArgs e) 
+		{
+			dropdown_form.Hide();
+		}
+
+
+		private void listBox_SelectedIndexChanged (object sender, EventArgs e) 
+		{
+			if (this.property_grid.SelectedGridItem != null) {
+				PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;
+				if (desc != null) {
+					desc.SetValue(property_grid.SelectedObject, listBox.SelectedItem);
+				}
+			}
+			dropdown_form.Hide();
+			Redraw();
+		}
+
+		private void grid_textbox_DropDownButtonClicked (object sender, EventArgs e) 
+		{
+			dropdown_form.Location = PointToScreen(new Point(grid_textbox.Location.X,grid_textbox.Location.Y+ROW_HEIGHT));
+			dropdown_form.Width = grid_textbox.Width;
+			dropdown_form.Show();
+		}
+	}
 }