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