BindingFlags.Public needed here as Exception.HResult is now public in .NET 4.5. This...
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolStripRenderer.cs
1 //
2 // ToolStripRenderer.cs
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 //
23 // Copyright (c) Jonathan Pobst
24 //
25 // Authors:
26 //      Jonathan Pobst (monkey@jpobst.com)
27 //
28
29 using System;
30 using System.ComponentModel;
31 using System.Drawing;
32 using System.Drawing.Imaging;
33 using System.Drawing.Drawing2D;
34
35 namespace System.Windows.Forms
36 {
37         public abstract class ToolStripRenderer
38         {
39                 private static ColorMatrix grayscale_matrix = new ColorMatrix (new float[][] {
40                                           new float[] {0.22f, 0.22f, 0.22f, 0, 0},
41                                           new float[] {0.27f, 0.27f, 0.27f, 0, 0},
42                                           new float[] {0.04f, 0.04f, 0.04f, 0, 0},
43                                           new float[] {0.365f, 0.365f, 0.365f, 0.7f, 0},
44                                           new float[] {0, 0, 0, 0, 1}
45                                   });
46
47                 protected ToolStripRenderer () 
48                 {
49                 }
50
51                 #region Public Methods
52                 public static Image CreateDisabledImage(Image normalImage)
53                 {
54                         if (normalImage == null)
55                                 return null;
56                                 
57                         // Code adapted from ThemeWin32Classic.cs
58                         ImageAttributes ia = new ImageAttributes();
59                         ia.SetColorMatrix (grayscale_matrix);
60                         
61                         Bitmap b = new Bitmap(normalImage.Width, normalImage.Height);
62                         using (Graphics g = Graphics.FromImage(b))
63                                 g.DrawImage(normalImage, new Rectangle (0, 0, normalImage.Width, normalImage.Height), 0, 0, normalImage.Width, normalImage.Height, GraphicsUnit.Pixel, ia);
64                         
65                         return b;
66                 }
67                 
68                 public void DrawArrow (ToolStripArrowRenderEventArgs e)
69                 { this.OnRenderArrow (e); }
70                 
71                 public void DrawButtonBackground (ToolStripItemRenderEventArgs e)
72                 { this.OnRenderButtonBackground (e); }
73
74                 public void DrawDropDownButtonBackground (ToolStripItemRenderEventArgs e)
75                 { this.OnRenderDropDownButtonBackground (e); }
76
77                 public void DrawGrip (ToolStripGripRenderEventArgs e)
78                 { this.OnRenderGrip (e); }
79
80                 public void DrawImageMargin (ToolStripRenderEventArgs e)
81                 { this.OnRenderImageMargin (e); }
82
83                 public void DrawItemBackground (ToolStripItemRenderEventArgs e)
84                 { this.OnRenderItemBackground (e); }
85
86                 public void DrawItemCheck (ToolStripItemImageRenderEventArgs e)
87                 { this.OnRenderItemCheck (e); }
88
89                 public void DrawItemImage (ToolStripItemImageRenderEventArgs e)
90                 { this.OnRenderItemImage (e); }
91
92                 public void DrawItemText (ToolStripItemTextRenderEventArgs e)
93                 { this.OnRenderItemText (e); }
94
95                 public void DrawLabelBackground (ToolStripItemRenderEventArgs e)
96                 { this.OnRenderLabelBackground (e); }
97
98                 public void DrawMenuItemBackground (ToolStripItemRenderEventArgs e)
99                 { this.OnRenderMenuItemBackground (e); }
100
101                 public void DrawOverflowButtonBackground (ToolStripItemRenderEventArgs e)
102                 { this.OnRenderOverflowButtonBackground (e); }
103
104                 public void DrawSeparator (ToolStripSeparatorRenderEventArgs e)
105                 { this.OnRenderSeparator (e); }
106
107                 public void DrawSplitButton (ToolStripItemRenderEventArgs e)
108                 { this.OnRenderSplitButtonBackground (e); }
109
110                 public void DrawStatusStripSizingGrip (ToolStripRenderEventArgs e)
111                 { this.OnRenderStatusStripSizingGrip (e); }
112
113                 public void DrawToolStripBackground (ToolStripRenderEventArgs e)
114                 { this.OnRenderToolStripBackground (e); }
115
116                 public void DrawToolStripBorder (ToolStripRenderEventArgs e)
117                 { this.OnRenderToolStripBorder (e); }
118
119                 public void DrawToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)
120                 { this.OnRenderToolStripContentPanelBackground (e); }
121
122                 public void DrawToolStripPanelBackground (ToolStripPanelRenderEventArgs e)
123                 { this.OnRenderToolStripPanelBackground (e); }
124
125                 public void DrawToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)
126                 { this.OnRenderToolStripStatusLabelBackground (e); }
127                 #endregion
128
129                 #region Protected Methods
130                 protected internal virtual void Initialize (ToolStrip toolStrip) {}
131                 protected internal virtual void InitializeContentPanel (ToolStripContentPanel contentPanel) {}
132                 protected internal virtual void InitializeItem (ToolStripItem item) {}
133                 protected internal virtual void InitializePanel (ToolStripPanel toolStripPanel) {}
134
135                 protected virtual void OnRenderArrow (ToolStripArrowRenderEventArgs e)
136                 {
137                         switch (e.Direction) {
138                                 case ArrowDirection.Down:
139                                         using (Pen p = new Pen (e.ArrowColor)) {
140                                                 int x = e.ArrowRectangle.Left + (e.ArrowRectangle.Width / 2) - 3;
141                                                 int y = e.ArrowRectangle.Top + (e.ArrowRectangle.Height / 2) - 2;
142
143                                                 DrawDownArrow (e.Graphics, p, x, y);
144                                         }
145                                         break;
146                                 case ArrowDirection.Left:
147                                         break;
148                                 case ArrowDirection.Right:
149                                         using (Pen p = new Pen (e.ArrowColor)) {
150                                                 int x = e.ArrowRectangle.Left + (e.ArrowRectangle.Width / 2) - 3;
151                                                 int y = e.ArrowRectangle.Top + (e.ArrowRectangle.Height / 2) - 4;
152
153                                                 DrawRightArrow (e.Graphics, p, x, y);
154                                         }
155                                         break;
156                                 case ArrowDirection.Up:
157                                         break;
158                         }
159                         
160                         ToolStripArrowRenderEventHandler eh = (ToolStripArrowRenderEventHandler)Events[RenderArrowEvent];
161                         if (eh != null)
162                                 eh (this, e);
163                 }
164
165                 protected virtual void OnRenderButtonBackground (ToolStripItemRenderEventArgs e)
166                 {
167                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderButtonBackgroundEvent];
168                         if (eh != null)
169                                 eh (this, e);
170                 }
171
172                 protected virtual void OnRenderDropDownButtonBackground (ToolStripItemRenderEventArgs e)
173                 {
174                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderDropDownButtonBackgroundEvent];
175                         if (eh != null)
176                                 eh (this, e);
177                 }
178                 
179                 protected virtual void OnRenderGrip (ToolStripGripRenderEventArgs e)
180                 {
181                         ToolStripGripRenderEventHandler eh = (ToolStripGripRenderEventHandler)Events [RenderGripEvent];
182                         if (eh != null)
183                                 eh (this, e);
184                 }
185
186                 protected virtual void OnRenderImageMargin (ToolStripRenderEventArgs e)
187                 {
188                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderImageMarginEvent];
189                         if (eh != null)
190                                 eh (this, e);
191                 }
192
193                 protected virtual void OnRenderItemBackground (ToolStripItemRenderEventArgs e)
194                 {
195                         if (e.Item.BackgroundImage != null) {
196                                 Rectangle item_bounds = new Rectangle (0, 0, e.Item.Width, e.Item.Height);
197                                 e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (e.Item.BackColor), item_bounds);
198                                 DrawBackground (e.Graphics, item_bounds, e.Item.BackgroundImage, e.Item.BackgroundImageLayout);
199                         }
200                                 
201                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderItemBackgroundEvent];
202                         if (eh != null)
203                                 eh (this, e);
204                 }
205
206                 protected virtual void OnRenderItemCheck (ToolStripItemImageRenderEventArgs e)
207                 {
208                         ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemCheckEvent];
209                         if (eh != null)
210                                 eh (this, e);
211                 }
212
213                 protected virtual void OnRenderItemImage (ToolStripItemImageRenderEventArgs e)
214                 {
215                         bool need_dispose = false;
216                         Image i = e.Image;
217                         
218                         if (e.Item.RightToLeft == RightToLeft.Yes && e.Item.RightToLeftAutoMirrorImage == true) {
219                                 i = CreateMirrorImage (i);
220                                 need_dispose = true;
221                         }
222                                 
223                         if (e.Item.ImageTransparentColor != Color.Empty) {
224                                 ImageAttributes ia = new ImageAttributes ();
225                                 ia.SetColorKey (e.Item.ImageTransparentColor, e.Item.ImageTransparentColor);
226                                 e.Graphics.DrawImage (i, e.ImageRectangle, 0, 0, i.Width, i.Height, GraphicsUnit.Pixel, ia);
227                                 ia.Dispose ();
228                         }
229                         else
230                                 e.Graphics.DrawImage (i, e.ImageRectangle);
231                         
232                         if (need_dispose)
233                                 i.Dispose ();
234                 
235                         ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemImageEvent];
236                         if (eh != null)
237                                 eh (this, e);
238                 }
239
240                 protected virtual void OnRenderItemText (ToolStripItemTextRenderEventArgs e)
241                 {
242                         if (e.TextDirection == ToolStripTextDirection.Vertical90) {
243                                 GraphicsState gs = e.Graphics.Save ();
244                                 PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
245                                 
246                                 e.Graphics.ResetTransform ();
247                                 e.Graphics.RotateTransform (90);
248                                 
249                                 RectangleF r = new RectangleF ((e.Item.Height - e.TextRectangle.Height) / 2, (e.TextRectangle.Width + p.X) * -1 - 18, e.TextRectangle.Height, e.TextRectangle.Width);
250                                 
251                                 StringFormat sf = new StringFormat ();
252                                 sf.Alignment = StringAlignment.Center;
253                                 
254                                 e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
255                                 
256                                 e.Graphics.Restore (gs);
257                         } else if (e.TextDirection == ToolStripTextDirection.Vertical270) {
258                                 GraphicsState gs = e.Graphics.Save ();
259                                 PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
260
261                                 e.Graphics.ResetTransform ();
262                                 e.Graphics.RotateTransform (270);
263
264                                 RectangleF r = new RectangleF (-e.TextRectangle.Height - (e.Item.Height - e.TextRectangle.Height) / 2, (e.TextRectangle.Width + p.X) + 4, e.TextRectangle.Height, e.TextRectangle.Width);
265
266                                 StringFormat sf = new StringFormat ();
267                                 sf.Alignment = StringAlignment.Center;
268
269                                 e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
270
271                                 e.Graphics.Restore (gs);
272                         } else
273                                 TextRenderer.DrawText (e.Graphics, e.Text, e.TextFont, e.TextRectangle, e.TextColor, e.TextFormat);
274
275                         ToolStripItemTextRenderEventHandler eh = (ToolStripItemTextRenderEventHandler)Events[RenderItemTextEvent];
276                         if (eh != null)
277                                 eh (this, e);
278                 }
279
280                 protected virtual void OnRenderLabelBackground (ToolStripItemRenderEventArgs e)
281                 {
282                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderLabelBackgroundEvent];
283                         if (eh != null)
284                                 eh (this, e);
285                 }
286
287                 protected virtual void OnRenderMenuItemBackground (ToolStripItemRenderEventArgs e)
288                 {
289                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderMenuItemBackgroundEvent];
290                         if (eh != null)
291                                 eh (this, e);
292                 }
293
294                 protected virtual void OnRenderOverflowButtonBackground (ToolStripItemRenderEventArgs e)
295                 {
296                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderOverflowButtonBackgroundEvent];
297                         if (eh != null)
298                                 eh (this, e);
299                 }
300
301                 protected virtual void OnRenderSeparator (ToolStripSeparatorRenderEventArgs e)
302                 {
303                         ToolStripSeparatorRenderEventHandler eh = (ToolStripSeparatorRenderEventHandler)Events [RenderSeparatorEvent];
304                         if (eh != null)
305                                 eh (this, e);
306                 }
307
308                 protected virtual void OnRenderSplitButtonBackground (ToolStripItemRenderEventArgs e)
309                 {
310                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderSplitButtonBackgroundEvent];
311                         if (eh != null)
312                                 eh (this, e);
313                 }
314
315                 protected virtual void OnRenderStatusStripSizingGrip (ToolStripRenderEventArgs e)
316                 {
317                         StatusStrip ss = (StatusStrip)e.ToolStrip;
318                         
319                         if (ss.SizingGrip == true)
320                                 DrawSizingGrip (e.Graphics, ss.SizeGripBounds);
321                         
322                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderStatusStripSizingGripEvent];
323                         if (eh != null)
324                                 eh (this, e);
325                 }
326
327                 protected virtual void OnRenderToolStripBackground (ToolStripRenderEventArgs e)
328                 {
329                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBackgroundEvent];
330                         if (eh != null)
331                                 eh (this, e);
332                 }
333
334                 protected virtual void OnRenderToolStripBorder (ToolStripRenderEventArgs e)
335                 {
336                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBorderEvent];
337                         if (eh != null)
338                                 eh (this, e);
339                 }
340
341                 protected virtual void OnRenderToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)
342                 {
343                         ToolStripContentPanelRenderEventHandler eh = (ToolStripContentPanelRenderEventHandler)Events [RenderToolStripContentPanelBackgroundEvent];
344                         if (eh != null)
345                                 eh (this, e);
346                 }
347
348                 protected virtual void OnRenderToolStripPanelBackground (ToolStripPanelRenderEventArgs e)
349                 {
350                         ToolStripPanelRenderEventHandler eh = (ToolStripPanelRenderEventHandler)Events [RenderToolStripPanelBackgroundEvent];
351                         if (eh != null)
352                                 eh (this, e);
353                 }
354
355                 protected virtual void OnRenderToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)
356                 {
357                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderToolStripStatusLabelBackgroundEvent];
358                         if (eh != null)
359                                 eh (this, e);
360                 }
361                 #endregion
362
363                 #region Public Events
364                 EventHandlerList events;
365
366                 EventHandlerList Events {
367                         get {
368                                 if (events == null)
369                                         events = new EventHandlerList ();
370                                 return events;
371                         }
372                 }
373
374                 static object RenderArrowEvent = new object ();
375                 static object RenderButtonBackgroundEvent = new object ();
376                 static object RenderDropDownButtonBackgroundEvent = new object ();
377                 static object RenderGripEvent = new object ();
378                 static object RenderImageMarginEvent = new object ();
379                 static object RenderItemBackgroundEvent = new object ();
380                 static object RenderItemCheckEvent = new object ();
381                 static object RenderItemImageEvent = new object ();
382                 static object RenderItemTextEvent = new object ();
383                 static object RenderLabelBackgroundEvent = new object ();
384                 static object RenderMenuItemBackgroundEvent = new object ();
385                 static object RenderOverflowButtonBackgroundEvent = new object ();
386                 static object RenderSeparatorEvent = new object ();
387                 static object RenderSplitButtonBackgroundEvent = new object ();
388                 static object RenderStatusStripSizingGripEvent = new object ();
389                 static object RenderToolStripBackgroundEvent = new object ();
390                 static object RenderToolStripBorderEvent = new object ();
391                 static object RenderToolStripContentPanelBackgroundEvent = new object ();
392                 static object RenderToolStripPanelBackgroundEvent = new object ();
393                 static object RenderToolStripStatusLabelBackgroundEvent = new object ();
394
395                 public event ToolStripArrowRenderEventHandler RenderArrow {
396                         add { Events.AddHandler (RenderArrowEvent, value); }
397                         remove {Events.RemoveHandler (RenderArrowEvent, value); }
398                 }
399                 public event ToolStripItemRenderEventHandler RenderButtonBackground {
400                         add { Events.AddHandler (RenderButtonBackgroundEvent, value); }
401                         remove {Events.RemoveHandler (RenderButtonBackgroundEvent, value); }
402                 }
403                 public event ToolStripItemRenderEventHandler RenderDropDownButtonBackground {
404                         add { Events.AddHandler (RenderDropDownButtonBackgroundEvent, value); }
405                         remove {Events.RemoveHandler (RenderDropDownButtonBackgroundEvent, value); }
406                 }
407                 public event ToolStripGripRenderEventHandler RenderGrip {
408                         add { Events.AddHandler (RenderGripEvent, value); }
409                         remove {Events.RemoveHandler (RenderGripEvent, value); }
410                 }
411                 public event ToolStripRenderEventHandler RenderImageMargin {
412                         add { Events.AddHandler (RenderImageMarginEvent, value); }
413                         remove {Events.RemoveHandler (RenderImageMarginEvent, value); }
414                 }
415                 public event ToolStripItemRenderEventHandler RenderItemBackground {
416                         add { Events.AddHandler (RenderItemBackgroundEvent, value); }
417                         remove {Events.RemoveHandler (RenderItemBackgroundEvent, value); }
418                 }
419                 public event ToolStripItemImageRenderEventHandler RenderItemCheck {
420                         add { Events.AddHandler (RenderItemCheckEvent, value); }
421                         remove {Events.RemoveHandler (RenderItemCheckEvent, value); }
422                 }
423                 public event ToolStripItemImageRenderEventHandler RenderItemImage {
424                         add { Events.AddHandler (RenderItemImageEvent, value); }
425                         remove {Events.RemoveHandler (RenderItemImageEvent, value); }
426                 }
427                 public event ToolStripItemTextRenderEventHandler RenderItemText {
428                         add { Events.AddHandler (RenderItemTextEvent, value); }
429                         remove {Events.RemoveHandler (RenderItemTextEvent, value); }
430                 }
431                 public event ToolStripItemRenderEventHandler RenderLabelBackground {
432                         add { Events.AddHandler (RenderLabelBackgroundEvent, value); }
433                         remove {Events.RemoveHandler (RenderLabelBackgroundEvent, value); }
434                 }
435                 public event ToolStripItemRenderEventHandler RenderMenuItemBackground {
436                         add { Events.AddHandler (RenderMenuItemBackgroundEvent, value); }
437                         remove {Events.RemoveHandler (RenderMenuItemBackgroundEvent, value); }
438                 }
439                 public event ToolStripItemRenderEventHandler RenderOverflowButtonBackground {
440                         add { Events.AddHandler (RenderOverflowButtonBackgroundEvent, value); }
441                         remove {Events.RemoveHandler (RenderOverflowButtonBackgroundEvent, value); }
442                 }
443                 public event ToolStripSeparatorRenderEventHandler RenderSeparator {
444                         add { Events.AddHandler (RenderSeparatorEvent, value); }
445                         remove {Events.RemoveHandler (RenderSeparatorEvent, value); }
446                 }
447                 public event ToolStripItemRenderEventHandler RenderSplitButtonBackground {
448                         add { Events.AddHandler (RenderSplitButtonBackgroundEvent, value); }
449                         remove {Events.RemoveHandler (RenderSplitButtonBackgroundEvent, value); }
450                 }
451                 public event ToolStripRenderEventHandler RenderStatusStripSizingGrip {
452                         add { Events.AddHandler (RenderStatusStripSizingGripEvent, value); }
453                         remove {Events.RemoveHandler (RenderStatusStripSizingGripEvent, value); }
454                 }
455                 public event ToolStripRenderEventHandler RenderToolStripBackground {
456                         add { Events.AddHandler (RenderToolStripBackgroundEvent, value); }
457                         remove {Events.RemoveHandler (RenderToolStripBackgroundEvent, value); }
458                 }
459                 public event ToolStripRenderEventHandler RenderToolStripBorder {
460                         add { Events.AddHandler (RenderToolStripBorderEvent, value); }
461                         remove {Events.RemoveHandler (RenderToolStripBorderEvent, value); }
462                 }
463                 public event ToolStripContentPanelRenderEventHandler RenderToolStripContentPanelBackground {
464                         add { Events.AddHandler (RenderToolStripContentPanelBackgroundEvent, value); }
465                         remove {Events.RemoveHandler (RenderToolStripContentPanelBackgroundEvent, value); }
466                 }
467                 public event ToolStripPanelRenderEventHandler RenderToolStripPanelBackground {
468                         add { Events.AddHandler (RenderToolStripPanelBackgroundEvent, value); }
469                         remove {Events.RemoveHandler (RenderToolStripPanelBackgroundEvent, value); }
470                 }
471                 public event ToolStripItemRenderEventHandler RenderToolStripStatusLabelBackground {
472                         add { Events.AddHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
473                         remove {Events.RemoveHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
474                 }
475                 #endregion
476                 
477                 #region Private Methods
478                 internal static Image CreateMirrorImage (Image normalImage)
479                 {
480                         if (normalImage == null)
481                                 return null;
482
483                         Bitmap b = new Bitmap (normalImage);
484                         b.RotateFlip (RotateFlipType.RotateNoneFlipX);
485
486                         return b;
487                 }
488
489                 private void DrawBackground (Graphics g, Rectangle bounds, Image image, ImageLayout layout)
490                 {
491                         // Center and Tile don't matter if the image is larger than the control
492                         if (layout == ImageLayout.Center || layout == ImageLayout.Tile)
493                                 if (image.Size.Width >= bounds.Size.Width && image.Size.Height >= bounds.Size.Height)
494                                         layout = ImageLayout.None;
495                                         
496                         switch (layout) {
497                                 case ImageLayout.None:
498                                         g.DrawImageUnscaledAndClipped (image, bounds);
499                                         break;
500                                 case ImageLayout.Tile:
501                                         int x = 0;
502                                         int y = 0;
503                                         
504                                         while (y < bounds.Height) {
505                                                 while (x < bounds.Width) {
506                                                         g.DrawImageUnscaledAndClipped (image, bounds);
507                                                         x += image.Width;       
508                                                 }
509                                                 x = 0;
510                                                 y += image.Height;
511                                         }
512                                         break;
513                                 case ImageLayout.Center:
514                                         Rectangle r = new Rectangle ((bounds.Size.Width - image.Size.Width) / 2, (bounds.Size.Height - image.Size.Height) / 2, image.Width, image.Height);
515                                         g.DrawImageUnscaledAndClipped (image, r);
516                                         break;
517                                 case ImageLayout.Stretch:
518                                         g.DrawImage (image, bounds);
519                                         break;
520                                 case ImageLayout.Zoom:
521                                         if (((float)image.Height / (float)image.Width) < ((float)bounds.Height / (float)bounds.Width)) {
522                                                 Rectangle rzoom = new Rectangle (0, 0, bounds.Width, (int)((float)bounds.Width * ((float)image.Height / (float)image.Width)));
523                                                 rzoom.Y = (bounds.Height - rzoom.Height)/ 2;
524                                                 g.DrawImage (image, rzoom);
525                                         } else {
526                                                 Rectangle rzoom = new Rectangle (0, 0, (int)((float)bounds.Height * ((float)image.Width / (float)image.Height)), bounds.Height);
527                                                 rzoom.X = (bounds.Width - rzoom.Width) / 2;
528                                                 g.DrawImage (image, rzoom);
529                                         }
530                                         break;
531                         }
532                 }
533
534                 internal static void DrawRightArrow (Graphics g, Pen p, int x, int y)
535                 {
536                         g.DrawLine (p, x, y, x, y + 6);
537                         g.DrawLine (p, x + 1, y + 1, x + 1, y + 5);
538                         g.DrawLine (p, x + 2, y + 2, x + 2, y + 4);
539                         g.DrawLine (p, x + 2, y + 3, x + 3, y + 3);
540                 }
541
542                 internal static void DrawDownArrow (Graphics g, Pen p, int x, int y)
543                 {
544                         g.DrawLine (p, x + 1, y, x + 5, y);
545                         g.DrawLine (p, x + 2, y + 1, x + 4, y + 1);
546                         g.DrawLine (p, x + 3, y + 1, x + 3, y + 2);
547                 }
548
549                 private void DrawSizingGrip (Graphics g, Rectangle rect)
550                 {
551                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 5);
552                         DrawGripBox (g, rect.Right - 9, rect.Bottom - 5);
553                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 9);
554                         DrawGripBox (g, rect.Right - 13, rect.Bottom - 5);
555                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 13);
556                         DrawGripBox (g, rect.Right - 9, rect.Bottom - 9);
557                 }
558                 
559                 private void DrawGripBox (Graphics g, int x, int y)
560                 {
561                         g.DrawRectangle (Pens.White, x + 1, y + 1, 1, 1);
562                         g.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.FromArgb (172, 168, 153)), x, y, 1, 1);
563                 }
564                 #endregion
565         }
566 }