* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / PropertyGrid.cs
index 8efa1063f95c4a1b8f72220a77992efbb0ec42e2..72d5958de1ea09d33a48eb58607adf17b7c63d4a 100644 (file)
@@ -35,11 +35,9 @@ using System.Reflection;
 using System.Windows.Forms.Design;
 using System.Windows.Forms.PropertyGridInternal;
 
-namespace System.Windows.Forms
-{
-       [Designer("System.Windows.Forms.Design.PropertyGridDesigner, " + Consts.AssemblySystem_Design)]
-       public class PropertyGrid : System.Windows.Forms.ContainerControl, ComponentModel.Com2Interop.IComPropertyBrowser
-       {
+namespace System.Windows.Forms {
+       [Designer("System.Windows.Forms.Design.PropertyGridDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+       public class PropertyGrid : System.Windows.Forms.ContainerControl, ComponentModel.Com2Interop.IComPropertyBrowser {
                #region Private Members
                
                
@@ -78,14 +76,15 @@ namespace System.Windows.Forms
                private ContextMenu context_menu;
                private MenuItem reset_menuitem;
                private MenuItem description_menuitem;
-
+               private object current_property_value;
 
                #endregion      // Private Members
-
+               
                #region Contructors
                public PropertyGrid() {
                        selected_objects = new object[1];
                        grid_items = new GridItemCollection();
+                       property_tabs = new PropertyTabCollection();
 
                        line_color = SystemColors.ScrollBar;
                        line_color = SystemColors.ScrollBar;
@@ -94,29 +93,41 @@ namespace System.Windows.Forms
                        property_sort = PropertySort.Categorized;
 
                        property_grid_view = new PropertyGridView(this);
-                       property_grid_view.Dock = DockStyle.Fill;
 
                        splitter = new Splitter();
                        splitter.Dock = DockStyle.Bottom;
 
                        help_panel = new Panel();
                        help_panel.Dock = DockStyle.Bottom;
+                       //help_panel.DockPadding.All = 3;
                        help_panel.Height = 50;
+                       help_panel.BackColor = SystemColors.Control;
 
-                       help_description_label = new Label();
-                       help_description_label.Dock = DockStyle.Fill;
-                       help_description_label.Name = "help_description_label";
-                       help_description_label.Font = this.Font;
 
                        help_title_label = new Label();
-                       help_title_label.Dock = DockStyle.Top;
+                       help_title_label.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
                        help_title_label.Name = "help_title_label";
-                       help_description_label.Font = new Font(this.Font,FontStyle.Bold);
+                       help_title_label.Font = new Font(this.Font,FontStyle.Bold);
+                       help_title_label.Text = "Title";
+                       help_title_label.Location = new Point(2,2);
+                       help_title_label.Height = 17;
+                       help_title_label.Width = help_panel.Width - 4;
+
+                       
+                       help_description_label = new Label();
+                       help_description_label.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+                       help_description_label.Name = "help_description_label";
+                       help_description_label.Font = this.Font;
+                       help_description_label.Text = "The long important Description";
+                       help_description_label.Location = new Point(2,help_title_label.Top+help_title_label.Height);
+                       help_description_label.Width = help_panel.Width - 4;
+                       help_description_label.Height = 17;
 
                        help_panel.Controls.Add(help_description_label);
                        help_panel.Controls.Add(help_title_label);
+                       help_panel.Paint+=new PaintEventHandler(help_panel_Paint);
 
-                       toolbar = new ToolBar();
+                       toolbar = new PropertyToolBar();
                        toolbar.Dock = DockStyle.Top;
                        categorized_toolbarbutton = new ToolBarButton();
                        alphabetic_toolbarbutton = new ToolBarButton();
@@ -124,48 +135,44 @@ namespace System.Windows.Forms
                        propertypages_toolbarbutton = new ToolBarButton();
                        context_menu = new ContextMenu();
 
-                       //help_title_label.Dock = DockStyle.Top;
-                       help_title_label.Name = "help_title_label";
-                       help_title_label.Location = new Point(2,20);
-                       help_title_label.Size = new Size(20,20);
-
                        toolbar_imagelist = new ImageList();
                        toolbar_imagelist.ColorDepth = ColorDepth.Depth32Bit;
                        toolbar_imagelist.ImageSize = new System.Drawing.Size(16, 16);
                        toolbar_imagelist.TransparentColor = System.Drawing.Color.Transparent;
+                       toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_sort_category") );
+                       toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_sort_alphabetical") );
+                       toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_tab_properties") );
 
                        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;
                        toolbar.Location = new System.Drawing.Point(0, 0);
-                       toolbar.Name = "toolbar";
                        toolbar.ShowToolTips = true;
                        toolbar.Size = new System.Drawing.Size(256, 27);
                        toolbar.TabIndex = 0;
                        toolbar.ButtonClick += new ToolBarButtonClickEventHandler(toolbar_ButtonClick);
 
+                       categorized_toolbarbutton.ImageIndex = 0;
                        categorized_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
-                       categorized_toolbarbutton.ToolTipText = "Categorized";
-                       categorized_toolbarbutton.Text = "C";
+                       categorized_toolbarbutton.ToolTipText = (string)Locale.GetResource( "Categorized");
 
+                       alphabetic_toolbarbutton.ImageIndex = 1;
                        alphabetic_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
-                       alphabetic_toolbarbutton.ToolTipText = "Alphabetic";
-                       alphabetic_toolbarbutton.Text = "A";
-                       alphabetic_toolbarbutton.ImageIndex = 0;
+                       alphabetic_toolbarbutton.ToolTipText = (string)Locale.GetResource( "Alphabetic");
 
                        separator_toolbarbutton.Style = ToolBarButtonStyle.Separator;
 
                        propertypages_toolbarbutton.Enabled = false;
+                       propertypages_toolbarbutton.ImageIndex = 2;
                        propertypages_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
                        propertypages_toolbarbutton.ToolTipText = "Property Pages";
-                       propertypages_toolbarbutton.Text = "P";
 
                        
                        reset_menuitem = context_menu.MenuItems.Add("Reset");
@@ -176,27 +183,17 @@ namespace System.Windows.Forms
                        description_menuitem.Checked = this.HelpVisible;
                        this.ContextMenu = context_menu;
                        toolbar.ContextMenu = context_menu;
-
-                       this.Controls.Add(property_grid_view);
+                       
+                       BorderHelperControl helper = new BorderHelperControl ();
+                       helper.Dock = DockStyle.Fill;
+                       helper.Controls.Add (property_grid_view);
+                       
+                       this.Controls.Add(helper);
                        this.Controls.Add(toolbar);
                        this.Controls.Add(splitter);
                        this.Controls.Add(help_panel);
                        this.Name = "PropertyGrid";
                        this.Size = new System.Drawing.Size(256, 400);
-\r
-                       has_focus = false;
-
-                       //TextChanged+=new System.EventHandler(RedrawEvent);
-                       //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);
 
                        UpdateToolBarButtons();
                }
@@ -220,6 +217,17 @@ namespace System.Windows.Forms
                                browsable_attributes = value;
                        }
                }
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public override bool AutoScroll {
+                       get {
+                               return base.AutoScroll;
+                       }
+                       set {
+                               base.AutoScroll = value;
+                       }
+               }
 
                public override Color BackColor {
                        get {
@@ -227,15 +235,25 @@ namespace System.Windows.Forms
                        }
 
                        set {
-                               if (base.BackColor == value) {
-                                       return;
-                               }
                                base.BackColor = value;
+                               toolbar.BackColor = value;
+                               Refresh ();
+                       }
+               }
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public override Image BackgroundImage {
+                       get {
+                               return base.BackgroundImage;
+                       }               
+                       set {
+                               base.BackgroundImage = value;
                        }
                }
 
 
-               [BrowsableAttribute(false)]\r
+               [BrowsableAttribute(false)]
                [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
                public virtual bool CanShowCommands {
                        get {
@@ -291,7 +309,7 @@ namespace System.Windows.Forms
                        }
                }
 
-               [BrowsableAttribute(false)]\r
+               [BrowsableAttribute(false)]
                [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
                [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
                public Point ContextMenuDefaultLocation {
@@ -299,15 +317,33 @@ namespace System.Windows.Forms
                                return context_menu_default_location;
                        }
                }
-\r
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+               public new Control.ControlCollection Controls {
+                       get {
+                               return base.Controls;
+                       }
+               }
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public override Color ForeColor {
+                       get {
+                               return base.ForeColor;
+                       }
+                       set {
+                               base.ForeColor = value;
+                       }
+               }
+
                public Color HelpBackColor {
-                       get
-                       {
-                               return help_panel.BackColor;\r
-                       }\r
-                       set
-                       {
-                               if (help_panel.BackColor == value) {\r
+                       get {
+                               return help_panel.BackColor;
+                       }
+                       set {
+                               if (help_panel.BackColor == value) {
                                        return;
                                }
 
@@ -328,10 +364,10 @@ namespace System.Windows.Forms
                                help_panel.ForeColor = value;
                        }
                }
-\r
+
                [DefaultValue(true)]
                [Localizable(true)]
-               public virtual bool HelpVisible {\r
+               public virtual bool HelpVisible {
                        get {
                                return help_panel.Visible;
                        }
@@ -372,9 +408,9 @@ namespace System.Windows.Forms
                                line_color = value;
                        }
                }
-\r
-               [DefaultValue(PropertySort.Categorized)]
-               public PropertySort PropertySort {\r
+
+               [DefaultValue(PropertySort.CategorizedAlphabetical)]
+               public PropertySort PropertySort {
                        get {
                                return property_sort;
                        }
@@ -388,18 +424,19 @@ namespace System.Windows.Forms
                                        return;
                                }
 
-                               property_sort = value;\r
-                               
+                               property_sort = value;
+
+                               UpdateToolBarButtons();
                                ReflectObjects();
-                               property_grid_view.Redraw();
+                               property_grid_view.Refresh();
                                
                                if (PropertySortChanged != null) {
                                        PropertySortChanged(this, EventArgs.Empty);
-                               }\r
+                               }
                        }
                }
 
-               [BrowsableAttribute(false)]\r
+               [BrowsableAttribute(false)]
                [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
                [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
                public PropertyTabCollection PropertyTabs {
@@ -408,7 +445,7 @@ namespace System.Windows.Forms
                        }
                }
 
-               [BrowsableAttribute(false)]\r
+               [BrowsableAttribute(false)]
                [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
                [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
                public GridItem SelectedGridItem {
@@ -422,19 +459,27 @@ namespace System.Windows.Forms
                                }
 
                                GridItem oldItem = selected_grid_item;
-                               selected_grid_item = value;\r
+                               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));
-                               }\r
+                                       
+                               current_property_value = value.Value;
+                               if (oldItem != null && oldItem.PropertyDescriptor != null)
+                                       oldItem.PropertyDescriptor.RemoveValueChanged(SelectedObject, new EventHandler(HandlePropertyValueChanged));
+                               if (selected_grid_item.PropertyDescriptor != null)
+                                       selected_grid_item.PropertyDescriptor.AddValueChanged(SelectedObject, new EventHandler(HandlePropertyValueChanged));
+                               OnSelectedGridItemChanged(new SelectedGridItemChangedEventArgs( oldItem, selected_grid_item));
+                               
                        }
                }
 
+               private void HandlePropertyValueChanged(object sender, EventArgs e) {
+                       OnPropertyValueChanged(new PropertyValueChangedEventArgs( selected_grid_item, current_property_value));
+               }
+
                [DefaultValue(null)]
-               [TypeConverter("System.Windows.Forms.PropertyGrid+SelectedObjectConverter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
+               [TypeConverter("System.Windows.Forms.PropertyGrid+SelectedObjectConverter, " + Consts.AssemblySystem_Windows_Forms)]
                public object SelectedObject {
                        get {
                                return selected_objects[0];
@@ -442,8 +487,17 @@ namespace System.Windows.Forms
 
                        set {
                                selected_objects = new object[] {value};
+                               if (this.SelectedObject == null)
+                                       return;
+                               PropertyTabAttribute[] propTabs = (PropertyTabAttribute[])this.SelectedObject.GetType().GetCustomAttributes(typeof(PropertyTabAttribute),true);
+                               if (propTabs.Length > 0) {
+                                       foreach (Type tabType in propTabs[0].TabClasses) {
+                                               this.PropertyTabs.AddTabType(tabType);
+                                       }
+                               }
+                               RefreshTabs(PropertyTabScope.Component);
                                ReflectObjects();
-                               property_grid_view.Redraw();
+                               property_grid_view.Refresh();
                        }
                }
 
@@ -479,9 +533,9 @@ namespace System.Windows.Forms
                        }
                }
 
-\r
+
                [DefaultValue(true)]
-               public virtual bool ToolbarVisible {\r
+               public virtual bool ToolbarVisible {
                        get {
                                return toolbar.Visible;
                        }
@@ -534,12 +588,24 @@ namespace System.Windows.Forms
                }
 
 
-               [MonoTODO]
                [Browsable(false)]
                [EditorBrowsable(EditorBrowsableState.Advanced)]
+               [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
                protected virtual Type DefaultTabType {
                        get {
-                               throw new NotImplementedException();
+                               return typeof(PropertiesTab);
+                       }
+               }
+               
+               protected bool DrawFlatToolbar {
+                       get {
+                               return (toolbar.Appearance == ToolBarAppearance.Flat);
+                       }                       
+                       set {
+                               if (value) 
+                                       toolbar.Appearance = ToolBarAppearance.Flat;
+                               else
+                                       toolbar.Appearance = ToolBarAppearance.Normal;
                        }
                }
 
@@ -552,136 +618,154 @@ namespace System.Windows.Forms
                #endregion      // Protected Instance Properties
 
                #region Public Instance Methods
-               [MonoTODO]
-               public void CollapseAllGridItems () 
-               {
-                       throw new NotImplementedException();
+               
+               protected override void Dispose(bool val) {
+                       base.Dispose(val);
+               }
+               
+               public void CollapseAllGridItems () {
+                       foreach (GridItem item in this.grid_items) {
+                               item.Expanded = false;
+                       }
                }
 
-               [MonoTODO]
-               public void ExpandAllGridItems () 
-               {
-                       throw new NotImplementedException();
+               public void ExpandAllGridItems () {
+                       foreach (GridItem item in this.grid_items) {
+                               item.Expanded = true;
+                       }
                }
 
-               public override void Refresh () 
-               {
+               public override void Refresh () {
                        base.Refresh ();
                }
 
+               public void RefreshTabs (PropertyTabScope tabScope) {
+                       
+                       /*button = new ToolBarButton("C");
+                       button.ImageIndex = 0;
+                       this.toolbar.Buttons.Add(button);
+                       button = new ToolBarButton();
+                       button.ImageIndex = 0;
+                       button.Style = ToolBarButtonStyle.Separator;
+                       this.toolbar.Buttons.Add(button);
+                       foreach (PropertyTab tab in this.PropertyTabs)
+                       {
 
-               [MonoTODO]
-               public void RefreshTabs (PropertyTabScope tabScope) 
-               {
-                       throw new NotImplementedException();
+                               int index = toolbar.ImageList.Images.Count;
+                               this.toolbar.ImageList.Images.Add(tab.Bitmap);
+                               button = new ToolBarButton();
+                               button.ImageIndex = index;
+                               this.toolbar.Buttons.Add(button);
+                       }*/
+                       
                }
 
-               [MonoTODO]
-               public void ResetSelectedProperty() 
-               {
-                       throw new NotImplementedException();
+               public void ResetSelectedProperty() {
+                       if (selected_grid_item == null || selected_grid_item.PropertyDescriptor == null)
+                               return;
+                       
+                       selected_grid_item.PropertyDescriptor.ResetValue(SelectedObject);
                }
                #endregion      // Public Instance Methods
 
                #region Protected Instance Methods
+
+               protected virtual PropertyTab CreatePropertyTab(Type tabType) {
+                       return (PropertyTab)Activator.CreateInstance(tabType);
+               }
+               
                [MonoTODO]
-               protected virtual PropertyTab CreatePropertyTab(Type tabType) 
-               {
+               protected void OnComComponentNameChanged(ComponentRenameEventArgs e) {
                        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;
+               protected override void OnGotFocus(EventArgs e) {
                        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);
                }
-\r
-               protected override void OnPaint (PaintEventArgs pevent) 
-               {\r
+               
+               [MonoTODO]
+               protected void OnNotifyPropertyValueUIItemsChanged(object sender, EventArgs e) {
+               }
+
+               protected override void OnPaint (PaintEventArgs pevent) {
+                       pevent.Graphics.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(BackColor), pevent.ClipRectangle);
                        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) 
-               {
-                       throw new NotImplementedException();
+               protected virtual void OnPropertyValueChanged (PropertyValueChangedEventArgs e) {
+                       if (PropertyValueChanged != null) {
+                               PropertyValueChanged(this, e);
+                               current_property_value = selected_grid_item.Value;
+                       }
                }
 
-               protected override void OnResize (EventArgs e) 
-               {
+               protected override void OnResize (EventArgs e) {
                        base.OnResize (e);
                }
 
-               [MonoTODO]
-               protected virtual void OnSelectedGridItemChanged (SelectedGridItemChangedEventArgs e) 
-               {
-                       throw new NotImplementedException();
+               protected virtual void OnSelectedGridItemChanged (SelectedGridItemChangedEventArgs e) {
+                       if (SelectedGridItemChanged != null) {
+                               SelectedGridItemChanged(this, e);
+                       }
                }
 
-               [MonoTODO]
-               protected virtual void OnSelectedObjectsChanged (EventArgs e) 
-               {
-                       throw new NotImplementedException();
+               protected virtual void OnSelectedObjectsChanged (EventArgs e) {
+                       if (SelectedObjectsChanged != null) {
+                               SelectedObjectsChanged(this, e);
+                       }
                }
 
-               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);
                }
+               
+               [MonoTODO]
+               protected void ShowEventsButton(bool value) {
+                       throw new NotImplementedException();
+               }
 
-               protected override void WndProc (ref Message m) 
-               {
+               protected override void WndProc (ref Message m) {
                        base.WndProc (ref m);
                }
                #endregion
@@ -692,6 +776,20 @@ namespace System.Windows.Forms
                public event PropertyValueChangedEventHandler PropertyValueChanged;
                public event SelectedGridItemChangedEventHandler SelectedGridItemChanged;
                public event EventHandler SelectedObjectsChanged;
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public new event EventHandler BackgroundImageChanged {
+                       add { base.BackgroundImageChanged += value; }
+                       remove { base.BackgroundImageChanged -= value; }
+               }
+
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public new event EventHandler ForeColorChanged {
+                       add { base.ForeColorChanged += value; }
+                       remove { base.ForeColorChanged -= value; }
+               }
                #endregion
 
                #region Com2Interop.IComPropertyBrowser Interface
@@ -736,151 +834,208 @@ namespace System.Windows.Forms
                #endregion      // Com2Interop.IComPropertyBrowser Interface
 
                #region PropertyTabCollection Class
-               public class PropertyTabCollection : ICollection, IEnumerable
-               {
+               public class PropertyTabCollection : ICollection, IEnumerable {
+                       System.Collections.ArrayList list;
                        #region Private Constructors
-                       private PropertyTabCollection() {
+                       internal PropertyTabCollection() {
+                               list = new ArrayList();
                        }
 
                        #endregion      // Private Constructors
 
-                       [MonoTODO]\r
                        public PropertyTab this[int index] {
-                               get {\r
-                                       throw new NotImplementedException();
+                               get {
+                                       return (PropertyTab)list[index];
                                }
                        }
                
                        #region ICollection Members
-                       [MonoTODO]\r
-                       bool ICollection.IsSynchronized
-                       {
-                               get {\r
-                                       // TODO:  Add PropertyTabCollection.IsSynchronized getter implementation
-                                       return false;
+                       bool ICollection.IsSynchronized {
+                               get {
+                                       return list.IsSynchronized;
                                }
                        }
 
-                       [MonoTODO]
-                       void ICollection.CopyTo(Array array, int index)
-                       {
-                               // TODO:  Add PropertyTabCollection.CopyTo implementation
+                       void ICollection.CopyTo(Array array, int index) {
+                               list.CopyTo(array, index);
                        }
 
-                       [MonoTODO]\r
-                       object ICollection.SyncRoot
-                       {
-                               get {\r
-                                       // TODO:  Add PropertyTabCollection.SyncRoot getter implementation
-                                       return null;
+                       object ICollection.SyncRoot {
+                               get {
+                                       return list.SyncRoot;
                                }
                        }
 
                        #endregion
 
                        #region IEnumerable Members
-                       [MonoTODO]
                        public IEnumerator GetEnumerator() {
-                               // TODO:  Add PropertyTabCollection.GetEnumerator implementation
-                               return null;
+                               return list.GetEnumerator();
                        }
 
                        #endregion
                
                        #region ICollection Members
-                       [MonoTODO]\r
                        public int Count {
-                               get {\r
-                                       // TODO:  Add PropertyTabCollection.Count getter implementation
-                                       return 0;
+                               get {
+                                       return list.Count;
                                }
                        }
 
                        #endregion
+                       
+                       #region Public Instance Methods
+                       public void AddTabType(System.Type propertyTabType) {
+                               list.Add(Activator.CreateInstance(propertyTabType));
+                       }
+                       [MonoTODO]
+                       public void AddTabType(System.Type propertyTabType,
+                               System.ComponentModel.PropertyTabScope tabScope) {
+                               AddTabType(propertyTabType);
+                       }
+                       [MonoTODO]
+                       public void Clear(System.ComponentModel.PropertyTabScope tabScope) {
+                               throw new NotImplementedException();
+                       }
+                       [MonoTODO]
+                       public void RemoveTabType(System.Type propertyTabType) {
+                               throw new NotImplementedException();
+                       }
+                       #endregion
                }
                #endregion      // PropertyTabCollection Class
 
                #region Private Helper Methods
-\r
-               private void toolbar_ButtonClick (object sender, ToolBarButtonClickEventArgs e) 
-               {
-                       if (e.Button == alphabetic_toolbarbutton) {\r
-                               this.PropertySort = PropertySort.Alphabetical;\r
+
+               private void toolbar_ButtonClick (object sender, ToolBarButtonClickEventArgs e) {
+                       if (e.Button == alphabetic_toolbarbutton) {
+                               this.PropertySort = PropertySort.Alphabetical;
                        }
-                       else if (e.Button == categorized_toolbarbutton) {\r
+                       else if (e.Button == categorized_toolbarbutton) {
                                this.PropertySort = PropertySort.Categorized;
                        }
-                       UpdateToolBarButtons();
-                       ReflectObjects();
-                       property_grid_view.Redraw();
                }
-\r
-               internal void UpdateToolBarButtons () 
-               {
-                       if (PropertySort == PropertySort.Alphabetical) {\r
+
+               internal void UpdateToolBarButtons () {
+                       if (PropertySort == PropertySort.Alphabetical) {
                                categorized_toolbarbutton.Pushed = false;
-                               alphabetic_toolbarbutton.Pushed = true;\r
+                               alphabetic_toolbarbutton.Pushed = true;
                        }
-                       else if (PropertySort == PropertySort.Categorized) {\r
+                       else if (PropertySort == PropertySort.Categorized) {
                                categorized_toolbarbutton.Pushed = true;
-                               alphabetic_toolbarbutton.Pushed = false;\r
+                               alphabetic_toolbarbutton.Pushed = false;
                        }
-                       else {\r
+                       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;
 
                }
-\r
-               private void ReflectObjects () 
-               {
-                       GridItemCollection alphabetical_grid_items = new GridItemCollection();
-                       GridItemCollection category_grid_items = new GridItemCollection();
+
+               private void ReflectObjects () {
+                       grid_items = new GridItemCollection();
                        foreach (object obj in selected_objects) {
                                if (obj != null) {
-                                       PopulateGridItemCollection(obj,alphabetical_grid_items, category_grid_items);\r
+                                       PopulateGridItemCollection(obj,grid_items, true);
                                }
                        }
-                       if (PropertySort == PropertySort.Alphabetical) {
-                               grid_items = alphabetical_grid_items;
+               }
+
+               private void PopulateGridItemCollection (object obj, GridItemCollection grid_item_coll, bool recurse) {
+                       if (!recurse && !TypeDescriptor.GetConverter(obj).GetPropertiesSupported())
+                               return;
+                       PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
+                       foreach (PropertyDescriptor property in properties) {
+                               if (property.IsBrowsable) {
+                                       GridEntry grid_entry = new GridEntry(obj, property);
+                                       if (property_sort == PropertySort.Alphabetical || !recurse) {
+                                               if (grid_item_coll[property.Name] == null)
+                                                       grid_item_coll.Add(property.Name,grid_entry);
+                                       }
+                                       else if (property_sort == PropertySort.Categorized || property_sort == PropertySort.CategorizedAlphabetical) {
+
+                                               string category = property.Category;
+                                               GridItem cat_item = grid_item_coll[category];
+                                               if (cat_item == null) {
+                                                       cat_item = new CategoryGridEntry(category);
+                                                       grid_item_coll.Add(category,cat_item);
+                                               }
+                                               cat_item.GridItems.Add(property.Name,grid_entry);
+                                       }
+                                       if (recurse) {
+                                               object propObj = property.GetValue(obj);
+                                               if (propObj != null)
+                                                       PopulateGridItemCollection(propObj,grid_entry.GridItems, false);
+                                       }
+                                       grid_entry.Expanded = false;
+                               }
                        }
-                       // need to use categories
-                       else {
-                               grid_items = category_grid_items;
+               }
+
+               private void help_panel_Paint(object sender, PaintEventArgs e) {
+                       e.Graphics.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(help_panel.BackColor), help_panel.ClientRectangle );
+                       e.Graphics.DrawRectangle(SystemPens.ControlDark, 0,0,help_panel.Width-1,help_panel.Height-1 );
+               }
+
+               #endregion      // Private Helper Methods
+
+
+#if NET_2_0
+
+               public bool UseCompatibleTextRendering {
+                       get {
+                               return use_compatible_text_rendering;
+                       }
+
+                       set {
+                               use_compatible_text_rendering = value;
                        }
                }
+#endif
+               
+               // as we can not change the color for BorderStyle.FixedSingle and we need the correct
+               // ClientRectangle so that the ScrollBar doesn't draw over the border we need this class
+               internal class BorderHelperControl : Control {
 
-               private void PopulateGridItemCollection (object obj, GridItemCollection grid_item_coll, GridItemCollection category_grid_item_coll) 
-               {
-                       PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);\r
-                       for (int i = 0; i < properties.Count;i++) {
-                               bool not_browseable = properties[i].Attributes.Contains(new BrowsableAttribute(false));
-                               if (!not_browseable) {\r
-                                       GridEntry grid_entry = new GridEntry(obj, properties[i]);\r
-                                       grid_item_coll.Add(properties[i].Name,grid_entry);
+                       public BorderHelperControl ()
+                       {
+                               BackColor = ThemeEngine.Current.ColorWindow;
+                       }
 
-                                       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);
+                       protected override void OnPaint (PaintEventArgs e)
+                       {
+                               e.Graphics.DrawRectangle (SystemPens.ControlDark, 0 , 0 , Width - 1, Height - 1);
+                               base.OnPaint (e);
+                       }
+                       
+                       protected override void OnSizeChanged (EventArgs e)
+                       {
+                               if (Controls.Count == 1) {
+                                       Control control = Controls [0];
+                                       
+                                       if (control.Location.X != 1 || control.Location.Y != 1)
+                                               control.Location = new Point (1, 1);
+                                       
+                                       control.Width = ClientRectangle.Width - 2;
+                                       control.Height = ClientRectangle.Height - 2;
+                                       
+                                       Refresh ();
                                }
+                               base.OnSizeChanged (e);
                        }
-               }\r
-\r
-               #endregion      // Private Helper Methods
+               }
+               
+               // needed! this little helper makes it possible to draw a different toolbar border
+               // and toolbar backcolor in ThemeWin32Classic
+               internal class PropertyToolBar : ToolBar {}
        }
 }