1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2005 Novell, Inc.
23 // Jonathan Chambers (jonathan.chambers@ansys.com)
30 using System.Drawing.Design;
31 using System.ComponentModel;
32 using System.Collections;
33 using System.ComponentModel.Design;
34 using System.Reflection;
35 using System.Windows.Forms.Design;
36 using System.Windows.Forms.PropertyGridInternal;
38 namespace System.Windows.Forms {
39 [Designer("System.Windows.Forms.Design.PropertyGridDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
40 public class PropertyGrid : System.Windows.Forms.ContainerControl, ComponentModel.Com2Interop.IComPropertyBrowser {
41 #region Private Members
44 private const int GRID_ITEM_HEIGHT = 16;
45 private const int GRID_LEFT_COLUMN_WIDTH = 16;
46 private const int DIVIDER_PADDING = 2;
48 private AttributeCollection browsable_attributes = null;
49 private bool can_show_commands = false;
50 private Color commands_back_color;
51 private Color commands_fore_color;
52 private bool commands_visible;
53 private bool commands_visible_if_available;
54 private Point context_menu_default_location;
55 private bool large_buttons;
56 private Color line_color;
57 private PropertySort property_sort;
58 private PropertyTabCollection property_tabs;
59 private GridItem selected_grid_item;
60 internal GridItemCollection grid_items;
61 private object[] selected_objects;
62 private PropertyTab selected_tab;
64 private ImageList toolbar_imagelist;
65 private ToolBarButton categorized_toolbarbutton;
66 private ToolBarButton alphabetic_toolbarbutton;
67 private ToolBarButton separator_toolbarbutton;
68 private ToolBarButton propertypages_toolbarbutton;
70 internal ToolBar toolbar;
71 internal PropertyGridView property_grid_view;
72 internal Splitter splitter;
73 internal Panel help_panel;
74 internal Label help_title_label;
75 internal Label help_description_label;
76 private ContextMenu context_menu;
77 private MenuItem reset_menuitem;
78 private MenuItem description_menuitem;
79 private object current_property_value;
81 #endregion // Private Members
84 public PropertyGrid() {
85 selected_objects = new object[1];
86 grid_items = new GridItemCollection();
87 property_tabs = new PropertyTabCollection();
89 line_color = SystemColors.ScrollBar;
90 line_color = SystemColors.ScrollBar;
91 browsable_attributes = new AttributeCollection(new Attribute[] {});
92 commands_visible_if_available = false;
93 property_sort = PropertySort.Categorized;
95 property_grid_view = new PropertyGridView(this);
97 splitter = new Splitter();
98 splitter.Dock = DockStyle.Bottom;
100 help_panel = new Panel();
101 help_panel.Dock = DockStyle.Bottom;
102 //help_panel.DockPadding.All = 3;
103 help_panel.Height = 50;
104 help_panel.BackColor = SystemColors.Control;
107 help_title_label = new Label();
108 help_title_label.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
109 help_title_label.Name = "help_title_label";
110 help_title_label.Font = new Font(this.Font,FontStyle.Bold);
111 help_title_label.Text = "Title";
112 help_title_label.Location = new Point(2,2);
113 help_title_label.Height = 17;
114 help_title_label.Width = help_panel.Width - 4;
117 help_description_label = new Label();
118 help_description_label.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
119 help_description_label.Name = "help_description_label";
120 help_description_label.Font = this.Font;
121 help_description_label.Text = "The long important Description";
122 help_description_label.Location = new Point(2,help_title_label.Top+help_title_label.Height);
123 help_description_label.Width = help_panel.Width - 4;
124 help_description_label.Height = 17;
126 help_panel.Controls.Add(help_description_label);
127 help_panel.Controls.Add(help_title_label);
128 help_panel.Paint+=new PaintEventHandler(help_panel_Paint);
130 toolbar = new PropertyToolBar();
131 toolbar.Dock = DockStyle.Top;
132 categorized_toolbarbutton = new ToolBarButton();
133 alphabetic_toolbarbutton = new ToolBarButton();
134 separator_toolbarbutton = new ToolBarButton();
135 propertypages_toolbarbutton = new ToolBarButton();
136 context_menu = new ContextMenu();
138 toolbar_imagelist = new ImageList();
139 toolbar_imagelist.ColorDepth = ColorDepth.Depth32Bit;
140 toolbar_imagelist.ImageSize = new System.Drawing.Size(16, 16);
141 toolbar_imagelist.TransparentColor = System.Drawing.Color.Transparent;
142 toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_sort_category") );
143 toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_sort_alphabetical") );
144 toolbar_imagelist.Images.Add( (Image)Locale.GetResource( "propertygrid_tab_properties") );
146 toolbar.Appearance = ToolBarAppearance.Flat;
147 toolbar.AutoSize = false;
148 toolbar.Buttons.AddRange(new ToolBarButton[] {
149 categorized_toolbarbutton,
150 alphabetic_toolbarbutton,
151 separator_toolbarbutton,
152 propertypages_toolbarbutton});
154 toolbar.ButtonSize = new System.Drawing.Size(20, 20);
155 toolbar.ImageList = toolbar_imagelist;
156 toolbar.Location = new System.Drawing.Point(0, 0);
157 toolbar.ShowToolTips = true;
158 toolbar.Size = new System.Drawing.Size(256, 27);
159 toolbar.TabIndex = 0;
160 toolbar.ButtonClick += new ToolBarButtonClickEventHandler(toolbar_ButtonClick);
162 categorized_toolbarbutton.ImageIndex = 0;
163 categorized_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
164 categorized_toolbarbutton.ToolTipText = (string)Locale.GetResource( "Categorized");
166 alphabetic_toolbarbutton.ImageIndex = 1;
167 alphabetic_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
168 alphabetic_toolbarbutton.ToolTipText = (string)Locale.GetResource( "Alphabetic");
170 separator_toolbarbutton.Style = ToolBarButtonStyle.Separator;
172 propertypages_toolbarbutton.Enabled = false;
173 propertypages_toolbarbutton.ImageIndex = 2;
174 propertypages_toolbarbutton.Style = ToolBarButtonStyle.ToggleButton;
175 propertypages_toolbarbutton.ToolTipText = "Property Pages";
178 reset_menuitem = context_menu.MenuItems.Add("Reset");
179 reset_menuitem.Click +=new EventHandler(OnResetPropertyClick);
180 context_menu.MenuItems.Add("-");
181 description_menuitem = context_menu.MenuItems.Add("Description");
182 description_menuitem.Click += new EventHandler(OnDescriptionClick);
183 description_menuitem.Checked = this.HelpVisible;
184 this.ContextMenu = context_menu;
185 toolbar.ContextMenu = context_menu;
187 BorderHelperControl helper = new BorderHelperControl ();
188 helper.Dock = DockStyle.Fill;
189 helper.Controls.Add (property_grid_view);
191 this.Controls.Add(helper);
192 this.Controls.Add(toolbar);
193 this.Controls.Add(splitter);
194 this.Controls.Add(help_panel);
195 this.Name = "PropertyGrid";
196 this.Size = new System.Drawing.Size(256, 400);
198 UpdateToolBarButtons();
200 #endregion // Constructors
202 #region Public Instance Properties
204 [BrowsableAttribute(false)]
205 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
206 [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
207 public AttributeCollection BrowsableAttributes {
209 return browsable_attributes;
213 if (browsable_attributes == value) {
217 browsable_attributes = value;
222 [EditorBrowsable(EditorBrowsableState.Never)]
223 public override bool AutoScroll {
225 return base.AutoScroll;
228 base.AutoScroll = value;
232 public override Color BackColor {
234 return base.BackColor;
238 base.BackColor = value;
239 toolbar.BackColor = value;
245 [EditorBrowsable(EditorBrowsableState.Never)]
246 public override Image BackgroundImage {
248 return base.BackgroundImage;
251 base.BackgroundImage = value;
256 [BrowsableAttribute(false)]
257 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
258 public virtual bool CanShowCommands {
260 return can_show_commands;
264 public Color CommandsBackColor {
266 return commands_back_color;
270 if (commands_back_color == value) {
273 commands_back_color = value;
277 public Color CommandsForeColor {
279 return commands_fore_color;
283 if (commands_fore_color == value) {
286 commands_fore_color = value;
290 [BrowsableAttribute(false)]
291 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
292 public virtual bool CommandsVisible {
294 return commands_visible;
298 [DefaultValue(false)]
299 public virtual bool CommandsVisibleIfAvailable {
301 return commands_visible_if_available;
305 if (commands_visible_if_available == value) {
308 commands_visible_if_available = value;
312 [BrowsableAttribute(false)]
313 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
314 [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
315 public Point ContextMenuDefaultLocation {
317 return context_menu_default_location;
322 [EditorBrowsable(EditorBrowsableState.Never)]
323 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
324 public new Control.ControlCollection Controls {
326 return base.Controls;
331 [EditorBrowsable(EditorBrowsableState.Never)]
332 public override Color ForeColor {
334 return base.ForeColor;
337 base.ForeColor = value;
341 public Color HelpBackColor {
343 return help_panel.BackColor;
346 if (help_panel.BackColor == value) {
350 help_panel.BackColor = value;
354 public Color HelpForeColor {
356 return help_panel.ForeColor;
360 if (help_panel.ForeColor == value) {
364 help_panel.ForeColor = value;
370 public virtual bool HelpVisible {
372 return help_panel.Visible;
376 if (help_panel.Visible == value) {
380 help_panel.Visible = value;
384 public bool LargeButtons {
386 return large_buttons;
390 if (large_buttons == value) {
394 large_buttons = value;
398 public Color LineColor {
404 if (line_color == value) {
412 [DefaultValue(PropertySort.CategorizedAlphabetical)]
413 public PropertySort PropertySort {
415 return property_sort;
419 if (!Enum.IsDefined (typeof (PropertySort), value)) {
420 throw new InvalidEnumArgumentException (string.Format("Enum argument value '{0}' is not valid for PropertySort", value));
423 if (property_sort == value) {
427 property_sort = value;
429 UpdateToolBarButtons();
431 property_grid_view.Refresh();
433 if (PropertySortChanged != null) {
434 PropertySortChanged(this, EventArgs.Empty);
439 [BrowsableAttribute(false)]
440 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
441 [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
442 public PropertyTabCollection PropertyTabs {
444 return property_tabs;
448 [BrowsableAttribute(false)]
449 [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
450 [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
451 public GridItem SelectedGridItem {
453 return selected_grid_item;
457 if (selected_grid_item == value) {
461 GridItem oldItem = selected_grid_item;
462 selected_grid_item = value;
463 this.help_title_label.Text = selected_grid_item.Label;
464 if (selected_grid_item.PropertyDescriptor != null)
465 this.help_description_label.Text = selected_grid_item.PropertyDescriptor.Description;
467 current_property_value = value.Value;
468 if (oldItem != null && oldItem.PropertyDescriptor != null) {
469 object target = SelectedObject;
470 if (oldItem.Parent != null)
471 target = oldItem.Parent.Value;
472 oldItem.PropertyDescriptor.RemoveValueChanged(target, new EventHandler(HandlePropertyValueChanged));
474 if (selected_grid_item.PropertyDescriptor != null) {
475 object target = SelectedObject;
476 if (selected_grid_item.Parent != null)
477 target = selected_grid_item.Parent.Value;
478 selected_grid_item.PropertyDescriptor.AddValueChanged(target, new EventHandler(HandlePropertyValueChanged));
480 OnSelectedGridItemChanged(new SelectedGridItemChangedEventArgs( oldItem, selected_grid_item));
485 private void HandlePropertyValueChanged(object sender, EventArgs e) {
486 OnPropertyValueChanged(new PropertyValueChangedEventArgs( selected_grid_item, current_property_value));
490 [TypeConverter("System.Windows.Forms.PropertyGrid+SelectedObjectConverter, " + Consts.AssemblySystem_Windows_Forms)]
491 public object SelectedObject {
493 return selected_objects[0];
497 selected_objects = new object[] {value};
498 if (this.SelectedObject == null)
500 PropertyTabAttribute[] propTabs = (PropertyTabAttribute[])this.SelectedObject.GetType().GetCustomAttributes(typeof(PropertyTabAttribute),true);
501 if (propTabs.Length > 0) {
502 foreach (Type tabType in propTabs[0].TabClasses) {
503 this.PropertyTabs.AddTabType(tabType);
506 RefreshTabs(PropertyTabScope.Component);
508 property_grid_view.Refresh();
512 [BrowsableAttribute(false)]
513 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
514 public object[] SelectedObjects {
516 return selected_objects;
520 selected_objects = value;
525 [BrowsableAttribute(false)]
526 [EditorBrowsable(EditorBrowsableState.Advanced)]
527 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
528 public PropertyTab SelectedTab {
534 public override ISite Site {
546 public virtual bool ToolbarVisible {
548 return toolbar.Visible;
552 if (toolbar.Visible == value) {
556 toolbar.Visible = value;
560 public Color ViewBackColor {
562 return property_grid_view.BackColor;
566 if (property_grid_view.BackColor == value) {
570 property_grid_view.BackColor = value;
574 public Color ViewForeColor {
576 return property_grid_view.ForeColor;
580 if (property_grid_view.ForeColor == value) {
584 property_grid_view.ForeColor = value;
588 #endregion // Public Instance Properties
590 #region Protected Instance Properties
592 protected override Size DefaultSize {
594 return base.DefaultSize;
600 [EditorBrowsable(EditorBrowsableState.Advanced)]
601 [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
602 protected virtual Type DefaultTabType {
604 return typeof(PropertiesTab);
608 protected bool DrawFlatToolbar {
610 return (toolbar.Appearance == ToolBarAppearance.Flat);
614 toolbar.Appearance = ToolBarAppearance.Flat;
616 toolbar.Appearance = ToolBarAppearance.Normal;
620 protected override bool ShowFocusCues {
622 return base.ShowFocusCues;
626 #endregion // Protected Instance Properties
628 #region Public Instance Methods
630 protected override void Dispose(bool val) {
634 public void CollapseAllGridItems () {
635 foreach (GridItem item in this.grid_items) {
636 item.Expanded = false;
640 public void ExpandAllGridItems () {
641 foreach (GridItem item in this.grid_items) {
642 item.Expanded = true;
646 public override void Refresh () {
650 public void RefreshTabs (PropertyTabScope tabScope) {
652 /*button = new ToolBarButton("C");
653 button.ImageIndex = 0;
654 this.toolbar.Buttons.Add(button);
655 button = new ToolBarButton();
656 button.ImageIndex = 0;
657 button.Style = ToolBarButtonStyle.Separator;
658 this.toolbar.Buttons.Add(button);
659 foreach (PropertyTab tab in this.PropertyTabs)
662 int index = toolbar.ImageList.Images.Count;
663 this.toolbar.ImageList.Images.Add(tab.Bitmap);
664 button = new ToolBarButton();
665 button.ImageIndex = index;
666 this.toolbar.Buttons.Add(button);
671 public void ResetSelectedProperty() {
672 if (selected_grid_item == null || selected_grid_item.PropertyDescriptor == null)
675 selected_grid_item.PropertyDescriptor.ResetValue(SelectedObject);
677 #endregion // Public Instance Methods
679 #region Protected Instance Methods
681 protected virtual PropertyTab CreatePropertyTab(Type tabType) {
682 return (PropertyTab)Activator.CreateInstance(tabType);
686 protected void OnComComponentNameChanged(ComponentRenameEventArgs e) {
687 throw new NotImplementedException();
690 protected override void OnFontChanged(EventArgs e) {
691 base.OnFontChanged (e);
694 protected override void OnGotFocus(EventArgs e) {
698 protected override void OnHandleCreated (EventArgs e) {
699 base.OnHandleCreated (e);
702 protected override void OnHandleDestroyed (EventArgs e) {
703 base.OnHandleDestroyed (e);
706 protected override void OnMouseDown (MouseEventArgs e) {
707 base.OnMouseDown (e);
710 protected override void OnMouseMove (MouseEventArgs e) {
711 base.OnMouseMove (e);
714 protected override void OnMouseUp (MouseEventArgs e) {
719 protected void OnNotifyPropertyValueUIItemsChanged(object sender, EventArgs e) {
722 protected override void OnPaint (PaintEventArgs pevent) {
723 pevent.Graphics.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(BackColor), pevent.ClipRectangle);
724 base.OnPaint (pevent);
728 protected virtual void OnPropertyTabChanged (PropertyTabChangedEventArgs e) {
729 throw new NotImplementedException();
732 protected virtual void OnPropertyValueChanged (PropertyValueChangedEventArgs e) {
733 if (PropertyValueChanged != null) {
734 PropertyValueChanged(this, e);
735 current_property_value = selected_grid_item.Value;
739 protected override void OnResize (EventArgs e) {
743 protected virtual void OnSelectedGridItemChanged (SelectedGridItemChangedEventArgs e) {
744 if (SelectedGridItemChanged != null) {
745 SelectedGridItemChanged(this, e);
749 protected virtual void OnSelectedObjectsChanged (EventArgs e) {
750 if (SelectedObjectsChanged != null) {
751 SelectedObjectsChanged(this, e);
755 protected override void OnSystemColorsChanged (EventArgs e) {
756 base.OnSystemColorsChanged (e);
759 protected override void OnVisibleChanged (EventArgs e) {
760 base.OnVisibleChanged (e);
763 protected override bool ProcessDialogKey (Keys keyData) {
764 return base.ProcessDialogKey (keyData);
767 protected override void ScaleCore (float dx, float dy) {
768 base.ScaleCore (dx, dy);
772 protected void ShowEventsButton(bool value) {
773 throw new NotImplementedException();
776 protected override void WndProc (ref Message m) {
777 base.WndProc (ref m);
782 public event EventHandler PropertySortChanged;
783 public event PropertyTabChangedEventHandler PropertyTabChanged;
784 public event PropertyValueChangedEventHandler PropertyValueChanged;
785 public event SelectedGridItemChangedEventHandler SelectedGridItemChanged;
786 public event EventHandler SelectedObjectsChanged;
789 [EditorBrowsable(EditorBrowsableState.Never)]
790 public new event EventHandler BackgroundImageChanged {
791 add { base.BackgroundImageChanged += value; }
792 remove { base.BackgroundImageChanged -= value; }
796 [EditorBrowsable(EditorBrowsableState.Never)]
797 public new event EventHandler ForeColorChanged {
798 add { base.ForeColorChanged += value; }
799 remove { base.ForeColorChanged -= value; }
803 #region Com2Interop.IComPropertyBrowser Interface
805 bool ComponentModel.Com2Interop.IComPropertyBrowser.InPropertySet {
807 throw new NotImplementedException();
812 void ComponentModel.Com2Interop.IComPropertyBrowser.DropDownDone() {
813 throw new NotImplementedException();
817 bool ComponentModel.Com2Interop.IComPropertyBrowser.EnsurePendingChangesCommitted() {
818 throw new NotImplementedException();
822 void ComponentModel.Com2Interop.IComPropertyBrowser.HandleF4() {
823 throw new NotImplementedException();
827 void ComponentModel.Com2Interop.IComPropertyBrowser.LoadState(Microsoft.Win32.RegistryKey key) {
828 throw new NotImplementedException();
832 void ComponentModel.Com2Interop.IComPropertyBrowser.SaveState(Microsoft.Win32.RegistryKey key) {
833 throw new NotImplementedException();
837 private event ComponentRenameEventHandler com_component_name_changed;
838 event ComponentRenameEventHandler ComponentModel.Com2Interop.IComPropertyBrowser.ComComponentNameChanged {
839 add { com_component_name_changed += value; }
840 remove { com_component_name_changed -= value; }
842 #endregion // Com2Interop.IComPropertyBrowser Interface
844 #region PropertyTabCollection Class
845 public class PropertyTabCollection : ICollection, IEnumerable {
846 System.Collections.ArrayList list;
847 #region Private Constructors
848 internal PropertyTabCollection() {
849 list = new ArrayList();
852 #endregion // Private Constructors
854 public PropertyTab this[int index] {
856 return (PropertyTab)list[index];
860 #region ICollection Members
861 bool ICollection.IsSynchronized {
863 return list.IsSynchronized;
867 void ICollection.CopyTo(Array array, int index) {
868 list.CopyTo(array, index);
871 object ICollection.SyncRoot {
873 return list.SyncRoot;
879 #region IEnumerable Members
880 public IEnumerator GetEnumerator() {
881 return list.GetEnumerator();
886 #region ICollection Members
895 #region Public Instance Methods
896 public void AddTabType(System.Type propertyTabType) {
897 list.Add(Activator.CreateInstance(propertyTabType));
900 public void AddTabType(System.Type propertyTabType,
901 System.ComponentModel.PropertyTabScope tabScope) {
902 AddTabType(propertyTabType);
905 public void Clear(System.ComponentModel.PropertyTabScope tabScope) {
906 throw new NotImplementedException();
909 public void RemoveTabType(System.Type propertyTabType) {
910 throw new NotImplementedException();
914 #endregion // PropertyTabCollection Class
916 #region Private Helper Methods
918 private void toolbar_ButtonClick (object sender, ToolBarButtonClickEventArgs e) {
919 if (e.Button == alphabetic_toolbarbutton) {
920 this.PropertySort = PropertySort.Alphabetical;
922 else if (e.Button == categorized_toolbarbutton) {
923 this.PropertySort = PropertySort.Categorized;
927 internal void UpdateToolBarButtons () {
928 if (PropertySort == PropertySort.Alphabetical) {
929 categorized_toolbarbutton.Pushed = false;
930 alphabetic_toolbarbutton.Pushed = true;
932 else if (PropertySort == PropertySort.Categorized) {
933 categorized_toolbarbutton.Pushed = true;
934 alphabetic_toolbarbutton.Pushed = false;
937 categorized_toolbarbutton.Pushed = false;
938 alphabetic_toolbarbutton.Pushed = false;
942 private void OnResetPropertyClick (object sender, EventArgs e) {
943 ResetSelectedProperty();
946 private void OnDescriptionClick (object sender, EventArgs e) {
947 this.HelpVisible = !this.HelpVisible;
948 description_menuitem.Checked = this.HelpVisible;
952 private void ReflectObjects () {
953 grid_items = new GridItemCollection();
954 foreach (object obj in selected_objects) {
956 PopulateGridItemCollection(obj,grid_items, true, null);
961 private void PopulateGridItemCollection (object obj, GridItemCollection grid_item_coll, bool recurse, GridItem parent_grid_item) {
962 if (!recurse && !TypeDescriptor.GetConverter(obj).GetPropertiesSupported())
964 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
965 foreach (PropertyDescriptor property in properties) {
966 if (property.IsBrowsable) {
967 GridEntry grid_entry = new GridEntry(obj, property);
968 grid_entry.SetParent (parent_grid_item);
969 if (property_sort == PropertySort.Alphabetical || !recurse) {
970 if (grid_item_coll[property.Name] == null)
971 grid_item_coll.Add(property.Name,grid_entry);
973 else if (property_sort == PropertySort.Categorized || property_sort == PropertySort.CategorizedAlphabetical) {
975 string category = property.Category;
976 GridItem cat_item = grid_item_coll[category];
977 if (cat_item == null) {
978 cat_item = new CategoryGridEntry(category);
979 (cat_item as CategoryGridEntry).SetParent (parent_grid_item);
980 grid_item_coll.Add(category,cat_item);
982 cat_item.GridItems.Add(property.Name,grid_entry);
985 object propObj = property.GetValue(obj);
987 PopulateGridItemCollection(propObj,grid_entry.GridItems, false, grid_entry);
989 grid_entry.Expanded = false;
994 private void help_panel_Paint(object sender, PaintEventArgs e) {
995 e.Graphics.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(help_panel.BackColor), help_panel.ClientRectangle );
996 e.Graphics.DrawRectangle(SystemPens.ControlDark, 0,0,help_panel.Width-1,help_panel.Height-1 );
999 #endregion // Private Helper Methods
1004 public bool UseCompatibleTextRendering {
1006 return use_compatible_text_rendering;
1010 use_compatible_text_rendering = value;
1015 // as we can not change the color for BorderStyle.FixedSingle and we need the correct
1016 // ClientRectangle so that the ScrollBar doesn't draw over the border we need this class
1017 internal class BorderHelperControl : Control {
1019 public BorderHelperControl ()
1021 BackColor = ThemeEngine.Current.ColorWindow;
1024 protected override void OnPaint (PaintEventArgs e)
1026 e.Graphics.DrawRectangle (SystemPens.ControlDark, 0 , 0 , Width - 1, Height - 1);
1030 protected override void OnSizeChanged (EventArgs e)
1032 if (Controls.Count == 1) {
1033 Control control = Controls [0];
1035 if (control.Location.X != 1 || control.Location.Y != 1)
1036 control.Location = new Point (1, 1);
1038 control.Width = ClientRectangle.Width - 2;
1039 control.Height = ClientRectangle.Height - 2;
1043 base.OnSizeChanged (e);
1047 // needed! this little helper makes it possible to draw a different toolbar border
1048 // and toolbar backcolor in ThemeWin32Classic
1049 internal class PropertyToolBar : ToolBar {}