[jit] Enable partial generic sharing when not using AOT as an experiment.
[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.BackColor != Control.DefaultBackColor) {
196                                 // Only paint the BackColor if it's not the default one,
197                                 // to avoid painting a solid background color over the parent ToolStrip gradient.
198                                 Rectangle item_bounds = new Rectangle (0, 0, e.Item.Width, e.Item.Height);
199                                 e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (e.Item.BackColor), item_bounds);
200                         }
201
202                         if (e.Item.BackgroundImage != null) {
203                                 Rectangle item_bounds = new Rectangle (0, 0, e.Item.Width, e.Item.Height);
204                                 DrawBackground (e.Graphics, item_bounds, e.Item.BackgroundImage, e.Item.BackgroundImageLayout);
205                         }
206
207                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderItemBackgroundEvent];
208                         if (eh != null)
209                                 eh (this, e);
210                 }
211
212                 protected virtual void OnRenderItemCheck (ToolStripItemImageRenderEventArgs e)
213                 {
214                         ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemCheckEvent];
215                         if (eh != null)
216                                 eh (this, e);
217                 }
218
219                 protected virtual void OnRenderItemImage (ToolStripItemImageRenderEventArgs e)
220                 {
221                         bool need_dispose = false;
222                         Image i = e.Image;
223                         
224                         if (e.Item.RightToLeft == RightToLeft.Yes && e.Item.RightToLeftAutoMirrorImage == true) {
225                                 i = CreateMirrorImage (i);
226                                 need_dispose = true;
227                         }
228                                 
229                         if (e.Item.ImageTransparentColor != Color.Empty) {
230                                 ImageAttributes ia = new ImageAttributes ();
231                                 ia.SetColorKey (e.Item.ImageTransparentColor, e.Item.ImageTransparentColor);
232                                 e.Graphics.DrawImage (i, e.ImageRectangle, 0, 0, i.Width, i.Height, GraphicsUnit.Pixel, ia);
233                                 ia.Dispose ();
234                         }
235                         else
236                                 e.Graphics.DrawImage (i, e.ImageRectangle);
237                         
238                         if (need_dispose)
239                                 i.Dispose ();
240                 
241                         ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemImageEvent];
242                         if (eh != null)
243                                 eh (this, e);
244                 }
245
246                 protected virtual void OnRenderItemText (ToolStripItemTextRenderEventArgs e)
247                 {
248                         if (e.TextDirection == ToolStripTextDirection.Vertical90) {
249                                 GraphicsState gs = e.Graphics.Save ();
250                                 PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
251                                 
252                                 e.Graphics.ResetTransform ();
253                                 e.Graphics.RotateTransform (90);
254                                 
255                                 RectangleF r = new RectangleF ((e.Item.Height - e.TextRectangle.Height) / 2, (e.TextRectangle.Width + p.X) * -1 - 18, e.TextRectangle.Height, e.TextRectangle.Width);
256                                 
257                                 StringFormat sf = new StringFormat ();
258                                 sf.Alignment = StringAlignment.Center;
259                                 
260                                 e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
261                                 
262                                 e.Graphics.Restore (gs);
263                         } else if (e.TextDirection == ToolStripTextDirection.Vertical270) {
264                                 GraphicsState gs = e.Graphics.Save ();
265                                 PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
266
267                                 e.Graphics.ResetTransform ();
268                                 e.Graphics.RotateTransform (270);
269
270                                 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);
271
272                                 StringFormat sf = new StringFormat ();
273                                 sf.Alignment = StringAlignment.Center;
274
275                                 e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
276
277                                 e.Graphics.Restore (gs);
278                         } else
279                                 TextRenderer.DrawText (e.Graphics, e.Text, e.TextFont, e.TextRectangle, e.TextColor, e.TextFormat);
280
281                         ToolStripItemTextRenderEventHandler eh = (ToolStripItemTextRenderEventHandler)Events[RenderItemTextEvent];
282                         if (eh != null)
283                                 eh (this, e);
284                 }
285
286                 protected virtual void OnRenderLabelBackground (ToolStripItemRenderEventArgs e)
287                 {
288                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderLabelBackgroundEvent];
289                         if (eh != null)
290                                 eh (this, e);
291                 }
292
293                 protected virtual void OnRenderMenuItemBackground (ToolStripItemRenderEventArgs e)
294                 {
295                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderMenuItemBackgroundEvent];
296                         if (eh != null)
297                                 eh (this, e);
298                 }
299
300                 protected virtual void OnRenderOverflowButtonBackground (ToolStripItemRenderEventArgs e)
301                 {
302                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderOverflowButtonBackgroundEvent];
303                         if (eh != null)
304                                 eh (this, e);
305                 }
306
307                 protected virtual void OnRenderSeparator (ToolStripSeparatorRenderEventArgs e)
308                 {
309                         ToolStripSeparatorRenderEventHandler eh = (ToolStripSeparatorRenderEventHandler)Events [RenderSeparatorEvent];
310                         if (eh != null)
311                                 eh (this, e);
312                 }
313
314                 protected virtual void OnRenderSplitButtonBackground (ToolStripItemRenderEventArgs e)
315                 {
316                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderSplitButtonBackgroundEvent];
317                         if (eh != null)
318                                 eh (this, e);
319                 }
320
321                 protected virtual void OnRenderStatusStripSizingGrip (ToolStripRenderEventArgs e)
322                 {
323                         StatusStrip ss = (StatusStrip)e.ToolStrip;
324                         
325                         if (ss.SizingGrip == true)
326                                 DrawSizingGrip (e.Graphics, ss.SizeGripBounds);
327                         
328                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderStatusStripSizingGripEvent];
329                         if (eh != null)
330                                 eh (this, e);
331                 }
332
333                 protected virtual void OnRenderToolStripBackground (ToolStripRenderEventArgs e)
334                 {
335                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBackgroundEvent];
336                         if (eh != null)
337                                 eh (this, e);
338                 }
339
340                 protected virtual void OnRenderToolStripBorder (ToolStripRenderEventArgs e)
341                 {
342                         ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBorderEvent];
343                         if (eh != null)
344                                 eh (this, e);
345                 }
346
347                 protected virtual void OnRenderToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)
348                 {
349                         ToolStripContentPanelRenderEventHandler eh = (ToolStripContentPanelRenderEventHandler)Events [RenderToolStripContentPanelBackgroundEvent];
350                         if (eh != null)
351                                 eh (this, e);
352                 }
353
354                 protected virtual void OnRenderToolStripPanelBackground (ToolStripPanelRenderEventArgs e)
355                 {
356                         ToolStripPanelRenderEventHandler eh = (ToolStripPanelRenderEventHandler)Events [RenderToolStripPanelBackgroundEvent];
357                         if (eh != null)
358                                 eh (this, e);
359                 }
360
361                 protected virtual void OnRenderToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)
362                 {
363                         ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderToolStripStatusLabelBackgroundEvent];
364                         if (eh != null)
365                                 eh (this, e);
366                 }
367                 #endregion
368
369                 #region Public Events
370                 EventHandlerList events;
371
372                 EventHandlerList Events {
373                         get {
374                                 if (events == null)
375                                         events = new EventHandlerList ();
376                                 return events;
377                         }
378                 }
379
380                 static object RenderArrowEvent = new object ();
381                 static object RenderButtonBackgroundEvent = new object ();
382                 static object RenderDropDownButtonBackgroundEvent = new object ();
383                 static object RenderGripEvent = new object ();
384                 static object RenderImageMarginEvent = new object ();
385                 static object RenderItemBackgroundEvent = new object ();
386                 static object RenderItemCheckEvent = new object ();
387                 static object RenderItemImageEvent = new object ();
388                 static object RenderItemTextEvent = new object ();
389                 static object RenderLabelBackgroundEvent = new object ();
390                 static object RenderMenuItemBackgroundEvent = new object ();
391                 static object RenderOverflowButtonBackgroundEvent = new object ();
392                 static object RenderSeparatorEvent = new object ();
393                 static object RenderSplitButtonBackgroundEvent = new object ();
394                 static object RenderStatusStripSizingGripEvent = new object ();
395                 static object RenderToolStripBackgroundEvent = new object ();
396                 static object RenderToolStripBorderEvent = new object ();
397                 static object RenderToolStripContentPanelBackgroundEvent = new object ();
398                 static object RenderToolStripPanelBackgroundEvent = new object ();
399                 static object RenderToolStripStatusLabelBackgroundEvent = new object ();
400
401                 public event ToolStripArrowRenderEventHandler RenderArrow {
402                         add { Events.AddHandler (RenderArrowEvent, value); }
403                         remove {Events.RemoveHandler (RenderArrowEvent, value); }
404                 }
405                 public event ToolStripItemRenderEventHandler RenderButtonBackground {
406                         add { Events.AddHandler (RenderButtonBackgroundEvent, value); }
407                         remove {Events.RemoveHandler (RenderButtonBackgroundEvent, value); }
408                 }
409                 public event ToolStripItemRenderEventHandler RenderDropDownButtonBackground {
410                         add { Events.AddHandler (RenderDropDownButtonBackgroundEvent, value); }
411                         remove {Events.RemoveHandler (RenderDropDownButtonBackgroundEvent, value); }
412                 }
413                 public event ToolStripGripRenderEventHandler RenderGrip {
414                         add { Events.AddHandler (RenderGripEvent, value); }
415                         remove {Events.RemoveHandler (RenderGripEvent, value); }
416                 }
417                 public event ToolStripRenderEventHandler RenderImageMargin {
418                         add { Events.AddHandler (RenderImageMarginEvent, value); }
419                         remove {Events.RemoveHandler (RenderImageMarginEvent, value); }
420                 }
421                 public event ToolStripItemRenderEventHandler RenderItemBackground {
422                         add { Events.AddHandler (RenderItemBackgroundEvent, value); }
423                         remove {Events.RemoveHandler (RenderItemBackgroundEvent, value); }
424                 }
425                 public event ToolStripItemImageRenderEventHandler RenderItemCheck {
426                         add { Events.AddHandler (RenderItemCheckEvent, value); }
427                         remove {Events.RemoveHandler (RenderItemCheckEvent, value); }
428                 }
429                 public event ToolStripItemImageRenderEventHandler RenderItemImage {
430                         add { Events.AddHandler (RenderItemImageEvent, value); }
431                         remove {Events.RemoveHandler (RenderItemImageEvent, value); }
432                 }
433                 public event ToolStripItemTextRenderEventHandler RenderItemText {
434                         add { Events.AddHandler (RenderItemTextEvent, value); }
435                         remove {Events.RemoveHandler (RenderItemTextEvent, value); }
436                 }
437                 public event ToolStripItemRenderEventHandler RenderLabelBackground {
438                         add { Events.AddHandler (RenderLabelBackgroundEvent, value); }
439                         remove {Events.RemoveHandler (RenderLabelBackgroundEvent, value); }
440                 }
441                 public event ToolStripItemRenderEventHandler RenderMenuItemBackground {
442                         add { Events.AddHandler (RenderMenuItemBackgroundEvent, value); }
443                         remove {Events.RemoveHandler (RenderMenuItemBackgroundEvent, value); }
444                 }
445                 public event ToolStripItemRenderEventHandler RenderOverflowButtonBackground {
446                         add { Events.AddHandler (RenderOverflowButtonBackgroundEvent, value); }
447                         remove {Events.RemoveHandler (RenderOverflowButtonBackgroundEvent, value); }
448                 }
449                 public event ToolStripSeparatorRenderEventHandler RenderSeparator {
450                         add { Events.AddHandler (RenderSeparatorEvent, value); }
451                         remove {Events.RemoveHandler (RenderSeparatorEvent, value); }
452                 }
453                 public event ToolStripItemRenderEventHandler RenderSplitButtonBackground {
454                         add { Events.AddHandler (RenderSplitButtonBackgroundEvent, value); }
455                         remove {Events.RemoveHandler (RenderSplitButtonBackgroundEvent, value); }
456                 }
457                 public event ToolStripRenderEventHandler RenderStatusStripSizingGrip {
458                         add { Events.AddHandler (RenderStatusStripSizingGripEvent, value); }
459                         remove {Events.RemoveHandler (RenderStatusStripSizingGripEvent, value); }
460                 }
461                 public event ToolStripRenderEventHandler RenderToolStripBackground {
462                         add { Events.AddHandler (RenderToolStripBackgroundEvent, value); }
463                         remove {Events.RemoveHandler (RenderToolStripBackgroundEvent, value); }
464                 }
465                 public event ToolStripRenderEventHandler RenderToolStripBorder {
466                         add { Events.AddHandler (RenderToolStripBorderEvent, value); }
467                         remove {Events.RemoveHandler (RenderToolStripBorderEvent, value); }
468                 }
469                 public event ToolStripContentPanelRenderEventHandler RenderToolStripContentPanelBackground {
470                         add { Events.AddHandler (RenderToolStripContentPanelBackgroundEvent, value); }
471                         remove {Events.RemoveHandler (RenderToolStripContentPanelBackgroundEvent, value); }
472                 }
473                 public event ToolStripPanelRenderEventHandler RenderToolStripPanelBackground {
474                         add { Events.AddHandler (RenderToolStripPanelBackgroundEvent, value); }
475                         remove {Events.RemoveHandler (RenderToolStripPanelBackgroundEvent, value); }
476                 }
477                 public event ToolStripItemRenderEventHandler RenderToolStripStatusLabelBackground {
478                         add { Events.AddHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
479                         remove {Events.RemoveHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
480                 }
481                 #endregion
482                 
483                 #region Private Methods
484                 internal static Image CreateMirrorImage (Image normalImage)
485                 {
486                         if (normalImage == null)
487                                 return null;
488
489                         Bitmap b = new Bitmap (normalImage);
490                         b.RotateFlip (RotateFlipType.RotateNoneFlipX);
491
492                         return b;
493                 }
494
495                 private void DrawBackground (Graphics g, Rectangle bounds, Image image, ImageLayout layout)
496                 {
497                         // Center and Tile don't matter if the image is larger than the control
498                         if (layout == ImageLayout.Center || layout == ImageLayout.Tile)
499                                 if (image.Size.Width >= bounds.Size.Width && image.Size.Height >= bounds.Size.Height)
500                                         layout = ImageLayout.None;
501                                         
502                         switch (layout) {
503                                 case ImageLayout.None:
504                                         g.DrawImageUnscaledAndClipped (image, bounds);
505                                         break;
506                                 case ImageLayout.Tile:
507                                         int x = 0;
508                                         int y = 0;
509                                         
510                                         while (y < bounds.Height) {
511                                                 while (x < bounds.Width) {
512                                                         g.DrawImageUnscaledAndClipped (image, bounds);
513                                                         x += image.Width;       
514                                                 }
515                                                 x = 0;
516                                                 y += image.Height;
517                                         }
518                                         break;
519                                 case ImageLayout.Center:
520                                         Rectangle r = new Rectangle ((bounds.Size.Width - image.Size.Width) / 2, (bounds.Size.Height - image.Size.Height) / 2, image.Width, image.Height);
521                                         g.DrawImageUnscaledAndClipped (image, r);
522                                         break;
523                                 case ImageLayout.Stretch:
524                                         g.DrawImage (image, bounds);
525                                         break;
526                                 case ImageLayout.Zoom:
527                                         if (((float)image.Height / (float)image.Width) < ((float)bounds.Height / (float)bounds.Width)) {
528                                                 Rectangle rzoom = new Rectangle (0, 0, bounds.Width, (int)((float)bounds.Width * ((float)image.Height / (float)image.Width)));
529                                                 rzoom.Y = (bounds.Height - rzoom.Height)/ 2;
530                                                 g.DrawImage (image, rzoom);
531                                         } else {
532                                                 Rectangle rzoom = new Rectangle (0, 0, (int)((float)bounds.Height * ((float)image.Width / (float)image.Height)), bounds.Height);
533                                                 rzoom.X = (bounds.Width - rzoom.Width) / 2;
534                                                 g.DrawImage (image, rzoom);
535                                         }
536                                         break;
537                         }
538                 }
539
540                 internal static void DrawRightArrow (Graphics g, Pen p, int x, int y)
541                 {
542                         g.DrawLine (p, x, y, x, y + 6);
543                         g.DrawLine (p, x + 1, y + 1, x + 1, y + 5);
544                         g.DrawLine (p, x + 2, y + 2, x + 2, y + 4);
545                         g.DrawLine (p, x + 2, y + 3, x + 3, y + 3);
546                 }
547
548                 internal static void DrawDownArrow (Graphics g, Pen p, int x, int y)
549                 {
550                         g.DrawLine (p, x + 1, y, x + 5, y);
551                         g.DrawLine (p, x + 2, y + 1, x + 4, y + 1);
552                         g.DrawLine (p, x + 3, y + 1, x + 3, y + 2);
553                 }
554
555                 private void DrawSizingGrip (Graphics g, Rectangle rect)
556                 {
557                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 5);
558                         DrawGripBox (g, rect.Right - 9, rect.Bottom - 5);
559                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 9);
560                         DrawGripBox (g, rect.Right - 13, rect.Bottom - 5);
561                         DrawGripBox (g, rect.Right - 5, rect.Bottom - 13);
562                         DrawGripBox (g, rect.Right - 9, rect.Bottom - 9);
563                 }
564                 
565                 private void DrawGripBox (Graphics g, int x, int y)
566                 {
567                         g.DrawRectangle (Pens.White, x + 1, y + 1, 1, 1);
568                         g.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.FromArgb (172, 168, 153)), x, y, 1, 1);
569                 }
570                 #endregion
571         }
572 }