2005-09-09 Jonathan Chambers <jonathan.chambers@ansys.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / PropertyGridView.cs
1 // Permission is hereby granted, free of charge, to any person obtaining\r
2 // a copy of this software and associated documentation files (the\r
3 // "Software"), to deal in the Software without restriction, including\r
4 // without limitation the rights to use, copy, modify, merge, publish,\r
5 // distribute, sublicense, and/or sell copies of the Software, and to\r
6 // permit persons to whom the Software is furnished to do so, subject to\r
7 // the following conditions:\r
8 // \r
9 // The above copyright notice and this permission notice shall be\r
10 // included in all copies or substantial portions of the Software.\r
11 // \r
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
19 //\r
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)\r
21 //\r
22 // Authors:\r
23 //      Jonathan Chambers       (jonathan.chambers@ansys.com)\r
24 //\r
25 //\r
26 \r
27 // NOT COMPLETE\r
28 \r
29 using System;\r
30 using System.Collections;\r
31 using System.Drawing;\r
32 using System.Drawing.Design;\r
33 using System.ComponentModel;\r
34 using System.Windows.Forms.Design;\r
35 \r
36 namespace System.Windows.Forms.PropertyGridInternal \r
37 {\r
38         internal class PropertyGridView : System.Windows.Forms.ScrollableControl, IWindowsFormsEditorService\r
39         {\r
40 \r
41                 #region Private Members\r
42                 private const int V_INDENT = 16;\r
43                 private const int ROW_HEIGHT = 16;\r
44                 private const int RESIZE_WIDTH = 3;\r
45                 private const int BUTTON_WIDTH = 25;\r
46                 private PropertyGridTextBox grid_textbox;\r
47                 private PropertyGrid property_grid;\r
48                 private bool resizing_grid;\r
49                 private int splitter_location;
50                 private int open_grid_item_count = -1;
51                 private int skipped_grid_items;\r
52                 private PropertyGridDropDown dropdown_form;\r
53                 private bool dropdown_form_showing;\r
54                 private Form dialog_form;\r
55                 private VScrollBar vbar;\r
56                 #endregion\r
57 \r
58                 #region Contructors\r
59                 public PropertyGridView (PropertyGrid propertyGrid) \r
60                 {\r
61                         property_grid = propertyGrid;\r
62 \r
63                         property_grid.SelectedGridItemChanged+=new SelectedGridItemChangedEventHandler(HandleSelectedGridItemChanged);\r
64                         property_grid.PropertyValueChanged+=new PropertyValueChangedEventHandler(HandlePropertyValueChanged);\r
65 \r
66                         this.BackColor = Color.Beige;\r
67                         grid_textbox = new PropertyGridTextBox();\r
68                         grid_textbox.DropDownButtonClicked +=new EventHandler(DropDownButtonClicked);\r
69                         grid_textbox.DialogButtonClicked +=new EventHandler(DialogButtonClicked);\r
70 \r
71                         \r
72                         dropdown_form = new PropertyGridDropDown();\r
73                         dropdown_form.FormBorderStyle = FormBorderStyle.None;
74                         dropdown_form.ShowInTaskbar = false;
75                         \r
76                         dialog_form = new Form();\r
77                         //dialog_form.FormBorderStyle = FormBorderStyle.None;\r
78 \r
79                         \r
80 \r
81                         grid_textbox.Visible = true;\r
82                         grid_textbox.Font = this.Font;//new Font(this.Font,FontStyle.Bold);\r
83                         grid_textbox.BackColor = this.BackColor;\r
84                         // Not working at all, used to??\r
85                         grid_textbox.Validating += new CancelEventHandler(TextBoxValidating);\r
86 \r
87                         vbar = new VScrollBar();\r
88                         vbar.Visible = false;\r
89                         vbar.Scroll+=new ScrollEventHandler(HandleScroll);\r
90                         vbar.Dock = DockStyle.Right;\r
91                         this.Controls.Add(vbar);\r
92 \r
93                         splitter_location = 65;\r
94                         resizing_grid = false;\r
95 \r
96                         ForeColorChanged+=new EventHandler(RedrawEvent);\r
97                         BackColorChanged+=new System.EventHandler(RedrawEvent);\r
98                         FontChanged+=new EventHandler(RedrawEvent);\r
99                         SizeChanged+=new EventHandler(RedrawEvent);\r
100                         \r
101                         SetStyle(ControlStyles.DoubleBuffer, true);\r
102                         SetStyle(ControlStyles.UserPaint, true);\r
103                         SetStyle(ControlStyles.AllPaintingInWmPaint, true);\r
104                         SetStyle(ControlStyles.ResizeRedraw, false);\r
105                         SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);\r
106                 }\r
107 \r
108                 #endregion\r
109 \r
110                 #region Protected Instance Methods\r
111                 \r
112                 protected override void OnPaint(PaintEventArgs e)\r
113                 {\r
114                         if (property_grid.SelectedGridItem != null && property_grid.SelectedGridItem.GridItemType == GridItemType.Property) \r
115                         {\r
116                                 this.Controls.Add(grid_textbox);\r
117                                 if (!grid_textbox.Focused)\r
118                                         grid_textbox.Focus();\r
119                         }\r
120                         else \r
121                         {\r
122                                 this.Controls.Remove(grid_textbox);\r
123                         }\r
124 \r
125                         // Decide if we need a scrollbar
126                         open_grid_item_count = 0;\r
127 \r
128                         // draw grid outline
129                         //DrawBackground(e);\r
130                         
131                         e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (BackColor), ClientRectangle);\r
132 \r
133                         // draw grid items
134                         // can we use the transform
135                         //pevent.Graphics.TranslateTransform(0, -vbar.Value*ROW_HEIGHT);
136                         int yLoc = -vbar.Value*ROW_HEIGHT;
137                         DrawGridItems(property_grid.grid_items, e, 1, ref yLoc);\r
138 \r
139                         DrawGrid(e, yLoc);\r
140                         e.Graphics.DrawRectangle(SystemPens.ControlDark, 0,0,Width-1,Height-1 );\r
141                         \r
142                         \r
143
144 \r
145                         UpdateScrollBar();\r
146                         \r
147                         base.OnPaint(e);\r
148                 }\r
149 \r
150                 protected override void OnMouseMove (MouseEventArgs e) \r
151                 {\r
152                         if (resizing_grid) \r
153                         {\r
154                                 splitter_location = Math.Max(e.X,V_INDENT);\r
155                                 Refresh();\r
156                         }\r
157                         base.OnMouseMove (e);\r
158                 }\r
159 \r
160                 private GridItem GetSelectedGridItem (GridItemCollection grid_items, int y) \r
161                 {\r
162                         foreach (GridItem child_grid_item in grid_items) \r
163                         {\r
164                                 if (y > child_grid_item.Top && y < child_grid_item.Top + ROW_HEIGHT) \r
165                                 {\r
166                                         return child_grid_item;\r
167                                 }\r
168                                 GridItem foundItem = GetSelectedGridItem(child_grid_item.GridItems, y);\r
169                                 if (foundItem != null)\r
170                                         return foundItem;\r
171                         }\r
172                         return null;\r
173                 }\r
174 \r
175                 protected override void OnMouseDown (MouseEventArgs e) \r
176                 {\r
177                         if (e.X > splitter_location - RESIZE_WIDTH && e.X < splitter_location + RESIZE_WIDTH) \r
178                         {\r
179                                 resizing_grid = true;\r
180                         }\r
181                         else \r
182                         {\r
183                                 GridItem foundItem = GetSelectedGridItem(property_grid.grid_items, e.Y);\r
184                                 \r
185                                 if (foundItem != null)\r
186                                 {\r
187                                         if (foundItem.Expandable) \r
188                                         {\r
189                                                 if (foundItem.PlusMinusBounds.Contains(e.X,e.Y))\r
190                                                 {\r
191                                                         foundItem.Expanded = !foundItem.Expanded;\r
192                                                 }\r
193                                         }\r
194                                         this.property_grid.SelectedGridItem = foundItem;\r
195                                 }\r
196                                 \r
197                                 base.OnMouseDown (e);\r
198                         }\r
199                 }\r
200 \r
201                 protected override void OnMouseUp (MouseEventArgs e) \r
202                 {\r
203                         resizing_grid = false;\r
204                         base.OnMouseUp (e);\r
205                 }\r
206 \r
207                 protected override void OnKeyDown (KeyEventArgs e) \r
208                 {\r
209                         base.OnKeyDown (e);\r
210                 }\r
211 \r
212                 #endregion\r
213 \r
214                 #region Private Helper Methods\r
215 \r
216                 private void UpdateScrollBar()\r
217                 {\r
218                         int visible_rows = this.ClientRectangle.Height/ROW_HEIGHT;\r
219                         if (open_grid_item_count > visible_rows)\r
220                         {\r
221                                 vbar.Visible = true;\r
222                                 vbar.SmallChange = 1;\r
223                                 vbar.Minimum = 0;\r
224                                 vbar.Maximum = open_grid_item_count-1;\r
225                                 vbar.LargeChange = visible_rows;\r
226                         }\r
227                         else\r
228                         {\r
229                                 vbar.Visible = false;\r
230                         }\r
231 \r
232                 }\r
233 \r
234                 private GridItem GetGridItemAt (int y) \r
235                 {\r
236                         return null;\r
237                 }\r
238 \r
239                 #region Drawing Code\r
240 \r
241                 private void DrawGrid(PaintEventArgs pevent, int yLoc)\r
242                 {\r
243                         Pen pen = ThemeEngine.Current.ResPool.GetPen(property_grid.LineColor);\r
244                         // vertical divider line\r
245                         pevent.Graphics.DrawLine(pen, splitter_location, 0, splitter_location, yLoc);\r
246                         \r
247                         while (yLoc >= 0)\r
248                         {\r
249                                 // horizontal lines\r
250                                 pevent.Graphics.DrawLine(pen, 0, yLoc, ClientRectangle.Width, yLoc);\r
251                                 yLoc -= ROW_HEIGHT;\r
252                         }\r
253                 }\r
254 \r
255                 private void DrawGridItems(GridItemCollection grid_items, PaintEventArgs pevent, int depth, ref int yLoc)\r
256                 {\r
257                         foreach (GridItem grid_item in grid_items) \r
258                         {
259                                 DrawGridItem (grid_item, pevent, depth, ref yLoc);
260                                 if (grid_item.Expanded)
261                                         DrawGridItems(grid_item.GridItems, pevent, depth, ref yLoc);
262                         }\r
263                 }\r
264 \r
265                 private void DrawGridItemLabel(GridItem grid_item, PaintEventArgs pevent, Rectangle rect)\r
266                 {\r
267                         int x = rect.X+1;\r
268                         if (grid_item.Parent != null && grid_item.Parent.GridItemType != GridItemType.Category)\r
269                                 x += V_INDENT;\r
270 \r
271                         Font font = this.Font;\r
272                         Brush brush = SystemBrushes.WindowText;\r
273                         if (grid_item.GridItemType == GridItemType.Category)\r
274                         {\r
275                                 font = new Font(font, FontStyle.Bold);\r
276                                 brush = SystemBrushes.ControlDark;\r
277                         }\r
278 \r
279                         if (grid_item == property_grid.SelectedGridItem && grid_item.GridItemType != GridItemType.Category)\r
280                         {\r
281                                 pevent.Graphics.FillRectangle (SystemBrushes.Highlight, rect);\r
282                                 // Label\r
283                                 brush = SystemBrushes.HighlightText;\r
284                         }\r
285 \r
286                         \r
287                         pevent.Graphics.DrawString(grid_item.Label,font,brush,new Rectangle(x, rect.Y + 2,x-rect.X+rect.Width,rect.Height-2));\r
288                 }\r
289 \r
290                 private void DrawGridItemValue(GridItem grid_item, PaintEventArgs pevent, Rectangle rect)\r
291                 {\r
292                         // Value\r
293                         if (grid_item.PropertyDescriptor != null)\r
294                         {\r
295 \r
296                                 bool paintsValue = false;\r
297                                 UITypeEditor editor = null;\r
298                                 object temp = grid_item.PropertyDescriptor.GetEditor(typeof(UITypeEditor));\r
299                                 editor = (UITypeEditor)temp;//grid_item.PropertyDescriptor.GetEditor(typeof(UITypeEditor));\r
300                                 if (editor != null) \r
301                                 {\r
302                                         paintsValue = editor.GetPaintValueSupported();\r
303                                 }\r
304 \r
305                                 if (grid_item == property_grid.SelectedGridItem)\r
306                                 {\r
307                                         grid_textbox.DropDownButtonVisible = false;\r
308                                         grid_textbox.DialogButtonVisible = false;\r
309                                         if (editor != null) \r
310                                         {\r
311                                                 UITypeEditorEditStyle style = editor.GetEditStyle();\r
312                                         \r
313                                                 switch (style)\r
314                                                 {\r
315                                                         case UITypeEditorEditStyle.DropDown:\r
316                                                                 grid_textbox.DropDownButtonVisible = true;\r
317                                                                 break;\r
318                                                         case UITypeEditorEditStyle.Modal:\r
319                                                                 grid_textbox.DialogButtonVisible = true;\r
320                                                                 break;\r
321                                                 }\r
322                                         }\r
323                                         else \r
324                                         {
325                                                 try
326                                                 {\r
327                                                         if (grid_item.PropertyDescriptor.Converter != null)\r
328                                                         {\r
329                                                                 if (grid_item.PropertyDescriptor.Converter.GetStandardValuesSupported()) \r
330                                                                 {\r
331                                                         \r
332                                                                         grid_textbox.DropDownButtonVisible = true;\r
333                                                                         grid_textbox.ReadOnly = true;
334                                                                 }\r
335                                                         }\r
336                                                         else\r
337                                                         {\r
338                                                                 System.Console.WriteLine("Converter not available for type {0}",grid_item.PropertyDescriptor.PropertyType);\r
339                                                         }\r
340                                                 \r
341                                                 }
342                                                 catch (Exception ex)
343                                                 {
344                                                 }
345                                         }\r
346                                 }\r
347 \r
348                                 \r
349 \r
350                                 int xLoc = splitter_location+1;\r
351                                 if (paintsValue)\r
352                                 {\r
353                                         pevent.Graphics.DrawRectangle(ThemeEngine.Current.ResPool.GetPen(Color.Black), splitter_location+2,rect.Y+2, 20, ROW_HEIGHT-4);\r
354                                         try\r
355                                         {\r
356                                                 editor.PaintValue(grid_item.Value, pevent.Graphics, new Rectangle(splitter_location+3,rect.Y+3, 19, ROW_HEIGHT-5));\r
357                                         }\r
358                                         catch (Exception ex)\r
359                                         {\r
360                                                 System.Console.WriteLine(ex.Message);\r
361                                                 System.Console.WriteLine("Paint Value failed for type {0}",grid_item.PropertyDescriptor.PropertyType);\r
362                                                 // design time stuff is not playing nice\r
363                                         }\r
364                                         xLoc += 27;\r
365                                 }\r
366 \r
367                                 Font font = this.Font;\r
368                                 try \r
369                                 {
370                                         if (grid_item.PropertyDescriptor.Converter != null)
371                                         {
372                                                 string value = grid_item.PropertyDescriptor.Converter.ConvertToString(grid_item.Value);\r
373                                                 if (grid_item.PropertyDescriptor.CanResetValue(property_grid.SelectedObject))\r
374                                                         font = new Font(font, FontStyle.Bold);\r
375                                 
376                                                 pevent.Graphics.DrawString(value,font,SystemBrushes.WindowText,new RectangleF(xLoc,rect.Y+2, ClientRectangle.Width-(xLoc), ROW_HEIGHT));\r
377                                         }\r
378                                         else\r
379                                         {\r
380                                                 System.Console.WriteLine("No converter for type {0}",grid_item.PropertyDescriptor.PropertyType);\r
381                                         }\r
382 \r
383                                 }
384                                 catch (Exception e)
385                                 {
386                                 }
387                                 if (grid_item == property_grid.SelectedGridItem && grid_item.GridItemType != GridItemType.Category)\r
388                                 {\r
389                                         grid_textbox.Location = new Point(xLoc, rect.Top);\r
390                                         grid_textbox.Size = new Size(ClientRectangle.Width-xLoc,ROW_HEIGHT);\r
391                                 }\r
392                         }\r
393                 }\r
394 \r
395                 private void DrawGridItem (GridItem grid_item, PaintEventArgs pevent, int depth, ref int yLoc) \r
396                 {\r
397                         if (yLoc > -ROW_HEIGHT && yLoc < ClientRectangle.Height)\r
398                         {\r
399                         \r
400                                 // left column\r
401                                 pevent.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (property_grid.LineColor), 0,yLoc,V_INDENT, ROW_HEIGHT);\r
402 \r
403                                 if (grid_item.Expandable) \r
404                                 {\r
405                                         grid_item.PlusMinusBounds = DrawPlusMinus(pevent, 3, yLoc+3, grid_item.Expanded, grid_item.GridItemType == GridItemType.Category);\r
406                                 }\r
407                         \r
408                                 if (grid_item.GridItemType == GridItemType.Category)\r
409                                 {\r
410                                         pevent.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (property_grid.LineColor), depth*V_INDENT,yLoc,ClientRectangle.Width-(depth*V_INDENT), ROW_HEIGHT);\r
411                                 }\r
412 \r
413                                 DrawGridItemLabel(grid_item, pevent, new Rectangle(V_INDENT,yLoc, splitter_location-V_INDENT, ROW_HEIGHT));\r
414                                 DrawGridItemValue(grid_item, pevent, new Rectangle(splitter_location+2,yLoc, ClientRectangle.Width-splitter_location-2, ROW_HEIGHT));\r
415                         \r
416                                 \r
417                                 \r
418                         }\r
419                         grid_item.Top = yLoc;
420                         yLoc += ROW_HEIGHT;
421                         open_grid_item_count++;\r
422                 }\r
423 \r
424                 private Rectangle DrawPlusMinus (PaintEventArgs pevent, int x, int y, bool expanded, bool category)
425                 {
426                         Rectangle bounds = new Rectangle(x, y, 8, 8);
427                         if (!category) pevent.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush(Color.White), bounds);
428                         pevent.Graphics.DrawRectangle (SystemPens.ControlDark, bounds);
429                         pevent.Graphics.DrawLine (SystemPens.ControlDark, x+2, y+4, x + 6, y+4);
430                         if (!expanded)
431                                 pevent.Graphics.DrawLine (SystemPens.ControlDark, x+4, y+2, x+4, y+6);
432
433                         return bounds;
434                 }\r
435 \r
436                 #endregion\r
437 \r
438                 #region Event Handling\r
439                 private void RedrawEvent (object sender, System.EventArgs e) \r
440                 {\r
441                         Refresh();\r
442                 }
443 \r
444                 private void TextBoxValidating (object sender, CancelEventArgs e) \r
445                 {\r
446                         if (this.property_grid.SelectedGridItem != null) \r
447                         {\r
448                                 PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;\r
449                                 if (desc != null) \r
450                                 {\r
451                                         try \r
452                                         {\r
453                                                 if (desc.Converter != null)\r
454                                                 {\r
455                                                         SetPropertyValue(desc.Converter.ConvertFromString(grid_textbox.Text));\r
456                                                 }\r
457                                                 else\r
458                                                 {\r
459                                                         System.Console.WriteLine("No converter for type {0}",desc.PropertyType);\r
460                                                 }\r
461                                         }\r
462                                         catch (Exception ex)\r
463                                         {\r
464                                                 Console.WriteLine("Error converting string");\r
465                                         }\r
466                                 }\r
467                         }\r
468                 }\r
469
470                 #endregion
471 \r
472                 \r
473                 #endregion\r
474 \r
475                 private void dropdown_form_Deactivate (object sender, EventArgs e) \r
476                 {\r
477                         dropdown_form_showing = false;\r
478                         dropdown_form.Hide();\r
479                         //dropdown_form = new Form();\r
480                 }\r
481 \r
482                 private void listBox_SelectedIndexChanged (object sender, EventArgs e) \r
483                 {\r
484                         if (this.property_grid.SelectedGridItem != null) \r
485                         {\r
486                                 PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;\r
487                                 if (desc != null) \r
488                                 {\r
489                                         SetPropertyValue(((ListBox)sender).SelectedItem);\r
490                                 }\r
491                         }\r
492                         dropdown_form.Hide();\r
493                         //dropdown_form = new Form();\r
494                         Refresh();\r
495                 }\r
496 \r
497                 private void SetPropertyValue(object newVal)\r
498                 {\r
499                         if (this.property_grid.SelectedGridItem != null) \r
500                         {\r
501                                 PropertyDescriptor desc = property_grid.SelectedGridItem.PropertyDescriptor;\r
502                                 if (desc != null) \r
503                                 {\r
504                                         desc.SetValue(property_grid.SelectedObject, newVal);\r
505                                 }\r
506                         }\r
507                 }\r
508 \r
509                 private void DropDownButtonClicked (object sender, EventArgs e) \r
510                 {\r
511                         if (property_grid.SelectedGridItem.PropertyDescriptor.GetEditor(typeof(UITypeEditor)) == null)\r
512                         {\r
513                                 //dropdown_form.FormBorderStyle = FormBorderStyle.None;\r
514                                 dropdown_form.Deactivate +=new EventHandler(dropdown_form_Deactivate);\r
515                                 ListBox listBox = new ListBox();\r
516                                 listBox.Dock = DockStyle.Fill;\r
517                                 listBox.SelectedIndexChanged +=new EventHandler(listBox_SelectedIndexChanged);\r
518                                 foreach (object obj in property_grid.SelectedGridItem.PropertyDescriptor.Converter.GetStandardValues())\r
519                                         listBox.Items.Add(obj);\r
520                                 dropdown_form.Controls.Clear();\r
521                                 dropdown_form.Controls.Add(listBox);\r
522                                 dropdown_form.Location = PointToScreen(new Point(grid_textbox.Location.X,grid_textbox.Location.Y+ROW_HEIGHT));\r
523                                 dropdown_form.Width = grid_textbox.Width;\r
524                                 dropdown_form.Show();\r
525                         }\r
526                         else // use editor\r
527                         {\r
528                                 UITypeEditor editor = (UITypeEditor)property_grid.SelectedGridItem.PropertyDescriptor.GetEditor(typeof(UITypeEditor));\r
529                                 System.ComponentModel.Design.ServiceContainer service_container = new System.ComponentModel.Design.ServiceContainer();\r
530                                 service_container.AddService(typeof(System.Windows.Forms.Design.IWindowsFormsEditorService), this);\r
531                                 SetPropertyValue(editor.EditValue(new ITypeDescriptorContextImpl(this.property_grid), service_container,property_grid.SelectedGridItem.Value));\r
532                         }\r
533                 }\r
534                 \r
535                 private void DialogButtonClicked(object sender, EventArgs e) \r
536                 {\r
537                         //dialog_form.Location = PointToScreen(new Point(grid_textbox.Location.X,grid_textbox.Location.Y+ROW_HEIGHT));\r
538                         //dropdown_form.Width = grid_textbox.Width;\r
539                         dialog_form.Show();\r
540                 }\r
541 \r
542                 private void HandleScroll(object sender, ScrollEventArgs e)\r
543                 {\r
544                         if (e.NewValue <= 0)\r
545                         {\r
546                                 e.NewValue = 0;\r
547                                 if (e.NewValue == vbar.Value)return;\r
548                         }\r
549                         if (e.NewValue > vbar.Maximum-ClientRectangle.Height/ROW_HEIGHT)\r
550                         {\r
551                                 e.NewValue = vbar.Maximum-ClientRectangle.Height/ROW_HEIGHT+1;\r
552                                 if (e.NewValue == vbar.Value)return;\r
553                         }\r
554 \r
555                         switch (e.Type)\r
556                         {\r
557                                 case ScrollEventType.SmallDecrement:\r
558                                         XplatUI.ScrollWindow(Handle, 0, ROW_HEIGHT, false);\r
559                                         grid_textbox.Top += ROW_HEIGHT;\r
560                                         Invalidate(ClientRectangle);\r
561                                         //Invalidate(new Rectangle(0,0,ClientRectangle.Width,ROW_HEIGHT));\r
562                                         break;\r
563                                 case ScrollEventType.SmallIncrement:\r
564                                         XplatUI.ScrollWindow(Handle, 0, -ROW_HEIGHT, false);\r
565                                         grid_textbox.Top -= ROW_HEIGHT;\r
566                                         Invalidate(ClientRectangle);\r
567                                         //Invalidate(new Rectangle(0,ClientRectangle.Bottom-ROW_HEIGHT,ClientRectangle.Width,ROW_HEIGHT));\r
568                                         break;\r
569                                 case ScrollEventType.LargeDecrement:\r
570                                         XplatUI.ScrollWindow(Handle, 0, ROW_HEIGHT, false);\r
571                                         Invalidate(ClientRectangle);\r
572                                         break;\r
573                                 case ScrollEventType.LargeIncrement:\r
574                                         XplatUI.ScrollWindow(Handle, 0, -ROW_HEIGHT, false);\r
575                                         Invalidate(ClientRectangle);\r
576                                         break;\r
577                                 case ScrollEventType.ThumbTrack:\r
578                                         XplatUI.ScrollWindow(Handle, 0, -(vbar.Value-e.NewValue), false);\r
579                                         Invalidate(ClientRectangle);\r
580                                         break;\r
581                                 case ScrollEventType.ThumbPosition:\r
582                                         Invalidate(ClientRectangle);\r
583                                         break;\r
584                         }\r
585                 }\r
586 \r
587 \r
588                 private void HandleSelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)\r
589                 {                       \r
590                         // Region not working correctly\r
591                         //Region clip = new Region();\r
592                         //if (property_grid.SelectedGridItem != null)\r
593                         //      clip.Union(new Rectangle(0,property_grid.SelectedGridItem.Top, ClientRectangle.Width, ROW_HEIGHT));\r
594                         //      clip.Union(new Rectangle(0,property_grid.SelectedGridItem.Top, ClientRectangle.Width, ROW_HEIGHT));\r
595 \r
596                         if (e.NewSelection.PropertyDescriptor != null)\r
597                         {\r
598                                 grid_textbox.Text = e.NewSelection.PropertyDescriptor.Converter.ConvertToString(e.NewSelection.Value);\r
599                                 if (e.NewSelection.PropertyDescriptor.CanResetValue(property_grid.SelectedObject))\r
600                                         grid_textbox.Font = new Font(this.Font, FontStyle.Bold);\r
601                                 else\r
602                                         grid_textbox.Font = this.Font;\r
603                         }\r
604 \r
605                         Invalidate(/*clip*/this.ClientRectangle);\r
606                         Update();\r
607                 }\r
608 \r
609                 private void HandlePropertyValueChanged(object s, PropertyValueChangedEventArgs e)\r
610                 {\r
611                         if (e.ChangedItem.PropertyDescriptor != null)\r
612                         {\r
613                                 grid_textbox.Text = e.ChangedItem.PropertyDescriptor.Converter.ConvertToString(e.ChangedItem.Value);\r
614                                 if (e.ChangedItem.PropertyDescriptor.CanResetValue(property_grid.SelectedObject))\r
615                                         grid_textbox.Font = new Font(this.Font, FontStyle.Bold);\r
616                                 else\r
617                                         grid_textbox.Font = this.Font;\r
618                         }\r
619                 }\r
620                 \r
621                 #region IWindowsFormsEditorService Members\r
622 \r
623                 public void CloseDropDown()\r
624                 {\r
625                         dropdown_form_showing = false;\r
626                         dropdown_form.Hide();\r
627                 }\r
628 \r
629                 public void DropDownControl(Control control)\r
630                 {\r
631                         //dropdown_form.FormBorderStyle = FormBorderStyle.None;\r
632                         dropdown_form.Deactivate +=new EventHandler(dropdown_form_Deactivate);\r
633                         dropdown_form.Size = control.Size;\r
634                         control.Dock = DockStyle.Fill;\r
635                         dropdown_form.Controls.Clear();\r
636                         dropdown_form.Controls.Add(control);\r
637                         dropdown_form.Location = PointToScreen(new Point(grid_textbox.Location.X,grid_textbox.Location.Y+ROW_HEIGHT));\r
638                         dropdown_form.Width = grid_textbox.Width;\r
639 \r
640                         dropdown_form_showing = true;\r
641                         dropdown_form.Show();\r
642                         System.Windows.Forms.MSG msg = new MSG();\r
643                         while (XplatUI.GetMessage(ref msg, IntPtr.Zero, 0, 0) && dropdown_form_showing) \r
644                         {\r
645                                 XplatUI.TranslateMessage(ref msg);\r
646                                 XplatUI.DispatchMessage(ref msg);\r
647                         }\r
648                 }\r
649 \r
650                 public System.Windows.Forms.DialogResult ShowDialog(Form dialog)\r
651                 {\r
652                         return dialog.ShowDialog(this);\r
653                 }\r
654 \r
655                 #endregion\r
656 \r
657                 #region DropDownForm Class\r
658                 #endregion DropDownForm Class\r
659 \r
660                 #region Internal Classes\r
661                 internal class ITypeDescriptorContextImpl : System.ComponentModel.ITypeDescriptorContext\r
662                 {\r
663                         private PropertyGrid property_grid;\r
664                         public ITypeDescriptorContextImpl(PropertyGrid propertyGrid)\r
665                         {\r
666                                 property_grid = propertyGrid;\r
667                         }\r
668                         #region ITypeDescriptorContext Members\r
669 \r
670                         public void OnComponentChanged()\r
671                         {\r
672                                 // TODO:  Add SystemComp.OnComponentChanged implementation\r
673                         }\r
674 \r
675                         public IContainer Container\r
676                         {\r
677                                 get\r
678                                 {\r
679                                         return property_grid as IContainer;\r
680                                 }\r
681                         }\r
682 \r
683                         public bool OnComponentChanging()\r
684                         {\r
685                                 // TODO:  Add SystemComp.OnComponentChanging implementation\r
686                                 return false;\r
687                         }\r
688 \r
689                         public object Instance\r
690                         {\r
691                                 get\r
692                                 {\r
693                                         return property_grid.SelectedGridItem.Value;\r
694                                 }\r
695                         }\r
696 \r
697                         public PropertyDescriptor PropertyDescriptor\r
698                         {\r
699                                 get\r
700                                 {\r
701                                         return property_grid.SelectedGridItem.PropertyDescriptor;\r
702                                 }\r
703                         }\r
704 \r
705                         #endregion\r
706 \r
707                         #region IServiceProvider Members\r
708 \r
709                         public object GetService(Type serviceType)\r
710                         {\r
711                                 // TODO:  Add SystemComp.GetService implementation\r
712                                 return null;\r
713                         }\r
714 \r
715                         #endregion\r
716 \r
717                 }\r
718 \r
719 \r
720                 
721                 /*
722                         class ComboListBox
723                 */
724                 internal class PropertyGridDropDown : Form 
725                 {
726                         protected override CreateParams CreateParams
727                         {
728                                 get \r
729                                 {
730                                         CreateParams cp = base.CreateParams;                            
731                                         cp.Style = unchecked ((int)(WindowStyles.WS_POPUP | WindowStyles.WS_VISIBLE | WindowStyles.WS_CLIPSIBLINGS | WindowStyles.WS_CLIPCHILDREN));
732                                         cp.ExStyle |= (int)(WindowStyles.WS_EX_TOOLWINDOW | WindowStyles.WS_EX_TOPMOST);                                
733                                         return cp;
734                                 }
735                         }
736
737                 }\r
738                 #endregion\r
739 \r
740         }\r
741 }