Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolStripRenderer.cs
index d5130dfb879add52f1bf755cf62cd7774da06e82..d085afe6bc82a6bff055a68173d0aa854c68d35e 100644 (file)
-//\r
-// ToolStripRenderer.cs\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-// Copyright (c) Jonathan Pobst\r
-//\r
-// Authors:\r
-//     Jonathan Pobst (monkey@jpobst.com)\r
-//\r
-#if NET_2_0\r
-\r
-using System;\r
-using System.Drawing;\r
-using System.Drawing.Imaging;\r
-\r
-namespace System.Windows.Forms\r
-{\r
-       public abstract class ToolStripRenderer\r
-       {\r
-               private static ColorMatrix grayscale_matrix = new ColorMatrix (new float[][] {\r
-                                               new float[]{0.3f,0.3f,0.3f,0,0},\r
-                                               new float[]{0.59f,0.59f,0.59f,0,0},\r
-                                               new float[]{0.11f,0.11f,0.11f,0,0},\r
-                                               new float[]{0,0,0,1,0,0},\r
-                                               new float[]{0,0,0,0,1,0},\r
-                                               new float[]{0,0,0,0,0,1}\r
-                                 });\r
-\r
-               protected ToolStripRenderer () \r
-               {\r
-               }\r
-\r
-               #region Public Methods\r
-               public static Image CreateDisabledImage(Image normalImage)\r
-               {\r
-                       // Code adapted from ThemeWin32Classic.cs\r
-                       ImageAttributes ia = new ImageAttributes();\r
-                       ia.SetColorMatrix (grayscale_matrix);\r
-                       \r
-                       Bitmap b = new Bitmap(normalImage);\r
-                       Graphics.FromImage(b).DrawImage(normalImage, new Rectangle (0, 0, normalImage.Width, normalImage.Height), 0, 0, normalImage.Width, normalImage.Height, GraphicsUnit.Pixel, ia);\r
-                       \r
-                       return b;\r
-               }\r
-\r
-               public void DrawArrow (ToolStripArrowRenderEventArgs e)\r
-               { this.OnRenderArrow (e); }\r
-               \r
-               public void DrawButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderButtonBackground (e); }\r
-\r
-               public void DrawDropDownButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderDropDownButtonBackground (e); }\r
-\r
-               public void DrawGrip (ToolStripGripRenderEventArgs e)\r
-               { this.OnRenderGrip (e); }\r
-\r
-               public void DrawImageMargin (ToolStripRenderEventArgs e)\r
-               { this.OnRenderImageMargin (e); }\r
-\r
-               public void DrawItemBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderItemBackground (e); }\r
-\r
-               public void DrawItemCheck (ToolStripItemImageRenderEventArgs e)\r
-               { this.OnRenderItemCheck (e); }\r
-\r
-               public void DrawItemImage (ToolStripItemImageRenderEventArgs e)\r
-               { this.OnRenderItemImage (e); }\r
-\r
-               public void DrawItemText (ToolStripItemTextRenderEventArgs e)\r
-               { this.OnRenderItemText (e); }\r
-\r
-               public void DrawLabelBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderLabelBackground (e); }\r
-\r
-               public void DrawMenuItemBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderMenuItemBackground (e); }\r
-\r
-               public void DrawOverflowButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderOverflowButtonBackground (e); }\r
-\r
-               public void DrawSeparator (ToolStripSeparatorRenderEventArgs e)\r
-               { this.OnRenderSeparator (e); }\r
-\r
-               public void DrawSplitButton (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderSplitButtonBackground (e); }\r
-\r
-               public void DrawStatusStripSizingGrip (ToolStripRenderEventArgs e)\r
-               { this.OnRenderStatusStripSizingGrip (e); }\r
-\r
-               public void DrawToolStripBackground (ToolStripRenderEventArgs e)\r
-               { this.OnRenderToolStripBackground (e); }\r
-\r
-               public void DrawToolStripBorder (ToolStripRenderEventArgs e)\r
-               { this.OnRenderToolStripBorder (e); }\r
-\r
-               public void DrawToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)\r
-               { this.OnRenderToolStripContentPanelBackground (e); }\r
-\r
-               public void DrawToolStripPanelBackground (ToolStripPanelRenderEventArgs e)\r
-               { this.OnRenderToolStripPanelBackground (e); }\r
-\r
-               public void DrawToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)\r
-               { this.OnRenderToolStripStatusLabelBackground (e); }\r
-               #endregion\r
-\r
-               #region Protected Methods\r
-               protected internal virtual void Initialize (ToolStrip toolStrip) {}\r
-               protected internal virtual void InitializeContentPanel (ToolStripContentPanel contentPanel) {}\r
-               protected internal virtual void InitializeItem (ToolStripItem item) {}\r
-               protected internal virtual void InitializePanel (ToolStripPanel toolStripPanel) {}\r
-\r
-               protected virtual void OnRenderArrow (ToolStripArrowRenderEventArgs e)\r
-               { if (RenderArrow != null) RenderArrow (this, e); }\r
-\r
-               protected virtual void OnRenderButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderButtonBackground != null) RenderButtonBackground (this, e); }\r
-\r
-               protected virtual void OnRenderDropDownButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderDropDownButtonBackground != null) RenderDropDownButtonBackground (this, e); }\r
-               \r
-               protected virtual void OnRenderGrip (ToolStripGripRenderEventArgs e)\r
-               { if (RenderGrip != null) RenderGrip (this, e); }\r
-\r
-               protected virtual void OnRenderImageMargin (ToolStripRenderEventArgs e)\r
-               { if (RenderImageMargin != null) RenderImageMargin (this, e); }\r
-\r
-               protected virtual void OnRenderItemBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderItemBackground != null) RenderItemBackground (this, e); }\r
-\r
-               protected virtual void OnRenderItemCheck (ToolStripItemImageRenderEventArgs e)\r
-               { if (RenderItemCheck != null) RenderItemCheck (this, e); }\r
-\r
-               protected virtual void OnRenderItemImage (ToolStripItemImageRenderEventArgs e)\r
-               { if (RenderItemImage != null) RenderItemImage (this, e); }\r
-\r
-               protected virtual void OnRenderItemText (ToolStripItemTextRenderEventArgs e)\r
-               { if (RenderItemText != null) RenderItemText (this, e); }\r
-\r
-               protected virtual void OnRenderLabelBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderLabelBackground != null) RenderLabelBackground (this, e); }\r
-\r
-               protected virtual void OnRenderMenuItemBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderMenuItemBackground != null) RenderMenuItemBackground (this, e); }\r
-\r
-               protected virtual void OnRenderOverflowButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderOverflowButtonBackground != null) RenderOverflowButtonBackground (this, e); }\r
-\r
-               protected virtual void OnRenderSeparator (ToolStripSeparatorRenderEventArgs e)\r
-               { if (RenderSeparator != null) RenderSeparator (this, e); }\r
-\r
-               protected virtual void OnRenderSplitButtonBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderSplitButtonBackground != null) RenderSplitButtonBackground (this, e); }\r
-\r
-               protected virtual void OnRenderStatusStripSizingGrip (ToolStripRenderEventArgs e)\r
-               { if (RenderStatusStripSizingGrip != null) RenderStatusStripSizingGrip (this, e); }\r
-\r
-               protected virtual void OnRenderToolStripBackground (ToolStripRenderEventArgs e)\r
-               { if (RenderToolStripBackground != null) RenderToolStripBackground (this, e); }\r
-\r
-               protected virtual void OnRenderToolStripBorder (ToolStripRenderEventArgs e)\r
-               { if (RenderToolStripBorder != null) RenderToolStripBorder (this, e); }\r
-\r
-               protected virtual void OnRenderToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)\r
-               { if (RenderToolStripContentPanelBackground != null) RenderToolStripContentPanelBackground (this, e); }\r
-\r
-               protected virtual void OnRenderToolStripPanelBackground (ToolStripPanelRenderEventArgs e)\r
-               { if (RenderToolStripPanelBackground != null) RenderToolStripPanelBackground (this, e); }\r
-\r
-               protected virtual void OnRenderToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)\r
-               { if (RenderToolStripStatusLabelBackground != null) RenderToolStripStatusLabelBackground (this, e); }\r
-               #endregion\r
-\r
-               #region Public Events\r
-               public event ToolStripArrowRenderEventHandler RenderArrow;\r
-               public event ToolStripItemRenderEventHandler RenderButtonBackground;\r
-               public event ToolStripItemRenderEventHandler RenderDropDownButtonBackground;\r
-               public event ToolStripGripRenderEventHandler RenderGrip;\r
-               public event ToolStripRenderEventHandler RenderImageMargin;\r
-               public event ToolStripItemRenderEventHandler RenderItemBackground;\r
-               public event ToolStripItemImageRenderEventHandler RenderItemCheck;\r
-               public event ToolStripItemImageRenderEventHandler RenderItemImage;\r
-               public event ToolStripItemTextRenderEventHandler RenderItemText;\r
-               public event ToolStripItemRenderEventHandler RenderLabelBackground;\r
-               public event ToolStripItemRenderEventHandler RenderMenuItemBackground;\r
-               public event ToolStripItemRenderEventHandler RenderOverflowButtonBackground;\r
-               public event ToolStripSeparatorRenderEventHandler RenderSeparator;\r
-               public event ToolStripItemRenderEventHandler RenderSplitButtonBackground;\r
-               public event ToolStripRenderEventHandler RenderStatusStripSizingGrip;\r
-               public event ToolStripRenderEventHandler RenderToolStripBackground;\r
-               public event ToolStripRenderEventHandler RenderToolStripBorder;\r
-               public event ToolStripContentPanelRenderEventHandler RenderToolStripContentPanelBackground;\r
-               public event ToolStripPanelRenderEventHandler RenderToolStripPanelBackground;\r
-               public event ToolStripItemRenderEventHandler RenderToolStripStatusLabelBackground;\r
-               #endregion\r
-       }\r
-}\r
-#endif
\ No newline at end of file
+//
+// ToolStripRenderer.cs
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) Jonathan Pobst
+//
+// Authors:
+//     Jonathan Pobst (monkey@jpobst.com)
+//
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+
+namespace System.Windows.Forms
+{
+       public abstract class ToolStripRenderer
+       {
+               private static ColorMatrix grayscale_matrix = new ColorMatrix (new float[][] {
+                                         new float[] {0.22f, 0.22f, 0.22f, 0, 0},
+                                         new float[] {0.27f, 0.27f, 0.27f, 0, 0},
+                                         new float[] {0.04f, 0.04f, 0.04f, 0, 0},
+                                         new float[] {0.365f, 0.365f, 0.365f, 0.7f, 0},
+                                         new float[] {0, 0, 0, 0, 1}
+                                 });
+
+               protected ToolStripRenderer () 
+               {
+               }
+
+               #region Public Methods
+               public static Image CreateDisabledImage(Image normalImage)
+               {
+                       if (normalImage == null)
+                               return null;
+                               
+                       // Code adapted from ThemeWin32Classic.cs
+                       ImageAttributes ia = new ImageAttributes();
+                       ia.SetColorMatrix (grayscale_matrix);
+                       
+                       Bitmap b = new Bitmap(normalImage.Width, normalImage.Height);
+                       using (Graphics g = Graphics.FromImage(b))
+                               g.DrawImage(normalImage, new Rectangle (0, 0, normalImage.Width, normalImage.Height), 0, 0, normalImage.Width, normalImage.Height, GraphicsUnit.Pixel, ia);
+                       
+                       return b;
+               }
+               
+               public void DrawArrow (ToolStripArrowRenderEventArgs e)
+               { this.OnRenderArrow (e); }
+               
+               public void DrawButtonBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderButtonBackground (e); }
+
+               public void DrawDropDownButtonBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderDropDownButtonBackground (e); }
+
+               public void DrawGrip (ToolStripGripRenderEventArgs e)
+               { this.OnRenderGrip (e); }
+
+               public void DrawImageMargin (ToolStripRenderEventArgs e)
+               { this.OnRenderImageMargin (e); }
+
+               public void DrawItemBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderItemBackground (e); }
+
+               public void DrawItemCheck (ToolStripItemImageRenderEventArgs e)
+               { this.OnRenderItemCheck (e); }
+
+               public void DrawItemImage (ToolStripItemImageRenderEventArgs e)
+               { this.OnRenderItemImage (e); }
+
+               public void DrawItemText (ToolStripItemTextRenderEventArgs e)
+               { this.OnRenderItemText (e); }
+
+               public void DrawLabelBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderLabelBackground (e); }
+
+               public void DrawMenuItemBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderMenuItemBackground (e); }
+
+               public void DrawOverflowButtonBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderOverflowButtonBackground (e); }
+
+               public void DrawSeparator (ToolStripSeparatorRenderEventArgs e)
+               { this.OnRenderSeparator (e); }
+
+               public void DrawSplitButton (ToolStripItemRenderEventArgs e)
+               { this.OnRenderSplitButtonBackground (e); }
+
+               public void DrawStatusStripSizingGrip (ToolStripRenderEventArgs e)
+               { this.OnRenderStatusStripSizingGrip (e); }
+
+               public void DrawToolStripBackground (ToolStripRenderEventArgs e)
+               { this.OnRenderToolStripBackground (e); }
+
+               public void DrawToolStripBorder (ToolStripRenderEventArgs e)
+               { this.OnRenderToolStripBorder (e); }
+
+               public void DrawToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)
+               { this.OnRenderToolStripContentPanelBackground (e); }
+
+               public void DrawToolStripPanelBackground (ToolStripPanelRenderEventArgs e)
+               { this.OnRenderToolStripPanelBackground (e); }
+
+               public void DrawToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)
+               { this.OnRenderToolStripStatusLabelBackground (e); }
+               #endregion
+
+               #region Protected Methods
+               protected internal virtual void Initialize (ToolStrip toolStrip) {}
+               protected internal virtual void InitializeContentPanel (ToolStripContentPanel contentPanel) {}
+               protected internal virtual void InitializeItem (ToolStripItem item) {}
+               protected internal virtual void InitializePanel (ToolStripPanel toolStripPanel) {}
+
+               protected virtual void OnRenderArrow (ToolStripArrowRenderEventArgs e)
+               {
+                       switch (e.Direction) {
+                               case ArrowDirection.Down:
+                                       using (Pen p = new Pen (e.ArrowColor)) {
+                                               int x = e.ArrowRectangle.Left + (e.ArrowRectangle.Width / 2) - 3;
+                                               int y = e.ArrowRectangle.Top + (e.ArrowRectangle.Height / 2) - 2;
+
+                                               DrawDownArrow (e.Graphics, p, x, y);
+                                       }
+                                       break;
+                               case ArrowDirection.Left:
+                                       break;
+                               case ArrowDirection.Right:
+                                       using (Pen p = new Pen (e.ArrowColor)) {
+                                               int x = e.ArrowRectangle.Left + (e.ArrowRectangle.Width / 2) - 3;
+                                               int y = e.ArrowRectangle.Top + (e.ArrowRectangle.Height / 2) - 4;
+
+                                               DrawRightArrow (e.Graphics, p, x, y);
+                                       }
+                                       break;
+                               case ArrowDirection.Up:
+                                       break;
+                       }
+                       
+                       ToolStripArrowRenderEventHandler eh = (ToolStripArrowRenderEventHandler)Events[RenderArrowEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderButtonBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderButtonBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderDropDownButtonBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderDropDownButtonBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+               
+               protected virtual void OnRenderGrip (ToolStripGripRenderEventArgs e)
+               {
+                       ToolStripGripRenderEventHandler eh = (ToolStripGripRenderEventHandler)Events [RenderGripEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderImageMargin (ToolStripRenderEventArgs e)
+               {
+                       ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderImageMarginEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderItemBackground (ToolStripItemRenderEventArgs e)
+               {
+                       if (e.Item.BackColor != Control.DefaultBackColor) {
+                               // Only paint the BackColor if it's not the default one,
+                               // to avoid painting a solid background color over the parent ToolStrip gradient.
+                               Rectangle item_bounds = new Rectangle (0, 0, e.Item.Width, e.Item.Height);
+                               e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (e.Item.BackColor), item_bounds);
+                       }
+
+                       if (e.Item.BackgroundImage != null) {
+                               Rectangle item_bounds = new Rectangle (0, 0, e.Item.Width, e.Item.Height);
+                               DrawBackground (e.Graphics, item_bounds, e.Item.BackgroundImage, e.Item.BackgroundImageLayout);
+                       }
+
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderItemBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderItemCheck (ToolStripItemImageRenderEventArgs e)
+               {
+                       ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemCheckEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderItemImage (ToolStripItemImageRenderEventArgs e)
+               {
+                       bool need_dispose = false;
+                       Image i = e.Image;
+                       
+                       if (e.Item.RightToLeft == RightToLeft.Yes && e.Item.RightToLeftAutoMirrorImage == true) {
+                               i = CreateMirrorImage (i);
+                               need_dispose = true;
+                       }
+                               
+                       if (e.Item.ImageTransparentColor != Color.Empty) {
+                               ImageAttributes ia = new ImageAttributes ();
+                               ia.SetColorKey (e.Item.ImageTransparentColor, e.Item.ImageTransparentColor);
+                               e.Graphics.DrawImage (i, e.ImageRectangle, 0, 0, i.Width, i.Height, GraphicsUnit.Pixel, ia);
+                               ia.Dispose ();
+                       }
+                       else
+                               e.Graphics.DrawImage (i, e.ImageRectangle);
+                       
+                       if (need_dispose)
+                               i.Dispose ();
+               
+                       ToolStripItemImageRenderEventHandler eh = (ToolStripItemImageRenderEventHandler)Events [RenderItemImageEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderItemText (ToolStripItemTextRenderEventArgs e)
+               {
+                       if (e.TextDirection == ToolStripTextDirection.Vertical90) {
+                               GraphicsState gs = e.Graphics.Save ();
+                               PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
+                               
+                               e.Graphics.ResetTransform ();
+                               e.Graphics.RotateTransform (90);
+                               
+                               RectangleF r = new RectangleF ((e.Item.Height - e.TextRectangle.Height) / 2, (e.TextRectangle.Width + p.X) * -1 - 18, e.TextRectangle.Height, e.TextRectangle.Width);
+                               
+                               StringFormat sf = new StringFormat ();
+                               sf.Alignment = StringAlignment.Center;
+                               
+                               e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
+                               
+                               e.Graphics.Restore (gs);
+                       } else if (e.TextDirection == ToolStripTextDirection.Vertical270) {
+                               GraphicsState gs = e.Graphics.Save ();
+                               PointF p = new PointF (e.Graphics.Transform.OffsetX, e.Graphics.Transform.OffsetY);
+
+                               e.Graphics.ResetTransform ();
+                               e.Graphics.RotateTransform (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);
+
+                               StringFormat sf = new StringFormat ();
+                               sf.Alignment = StringAlignment.Center;
+
+                               e.Graphics.DrawString (e.Text, e.TextFont, ThemeEngine.Current.ResPool.GetSolidBrush (e.TextColor), r, sf);
+
+                               e.Graphics.Restore (gs);
+                       } else
+                               TextRenderer.DrawText (e.Graphics, e.Text, e.TextFont, e.TextRectangle, e.TextColor, e.TextFormat);
+
+                       ToolStripItemTextRenderEventHandler eh = (ToolStripItemTextRenderEventHandler)Events[RenderItemTextEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderLabelBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderLabelBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderMenuItemBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderMenuItemBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderOverflowButtonBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderOverflowButtonBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderSeparator (ToolStripSeparatorRenderEventArgs e)
+               {
+                       ToolStripSeparatorRenderEventHandler eh = (ToolStripSeparatorRenderEventHandler)Events [RenderSeparatorEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderSplitButtonBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderSplitButtonBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderStatusStripSizingGrip (ToolStripRenderEventArgs e)
+               {
+                       StatusStrip ss = (StatusStrip)e.ToolStrip;
+                       
+                       if (ss.SizingGrip == true)
+                               DrawSizingGrip (e.Graphics, ss.SizeGripBounds);
+                       
+                       ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderStatusStripSizingGripEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderToolStripBackground (ToolStripRenderEventArgs e)
+               {
+                       ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderToolStripBorder (ToolStripRenderEventArgs e)
+               {
+                       ToolStripRenderEventHandler eh = (ToolStripRenderEventHandler)Events [RenderToolStripBorderEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderToolStripContentPanelBackground (ToolStripContentPanelRenderEventArgs e)
+               {
+                       ToolStripContentPanelRenderEventHandler eh = (ToolStripContentPanelRenderEventHandler)Events [RenderToolStripContentPanelBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderToolStripPanelBackground (ToolStripPanelRenderEventArgs e)
+               {
+                       ToolStripPanelRenderEventHandler eh = (ToolStripPanelRenderEventHandler)Events [RenderToolStripPanelBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+
+               protected virtual void OnRenderToolStripStatusLabelBackground (ToolStripItemRenderEventArgs e)
+               {
+                       ToolStripItemRenderEventHandler eh = (ToolStripItemRenderEventHandler)Events [RenderToolStripStatusLabelBackgroundEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+               #endregion
+
+               #region Public Events
+               EventHandlerList events;
+
+               EventHandlerList Events {
+                       get {
+                               if (events == null)
+                                       events = new EventHandlerList ();
+                               return events;
+                       }
+               }
+
+               static object RenderArrowEvent = new object ();
+               static object RenderButtonBackgroundEvent = new object ();
+               static object RenderDropDownButtonBackgroundEvent = new object ();
+               static object RenderGripEvent = new object ();
+               static object RenderImageMarginEvent = new object ();
+               static object RenderItemBackgroundEvent = new object ();
+               static object RenderItemCheckEvent = new object ();
+               static object RenderItemImageEvent = new object ();
+               static object RenderItemTextEvent = new object ();
+               static object RenderLabelBackgroundEvent = new object ();
+               static object RenderMenuItemBackgroundEvent = new object ();
+               static object RenderOverflowButtonBackgroundEvent = new object ();
+               static object RenderSeparatorEvent = new object ();
+               static object RenderSplitButtonBackgroundEvent = new object ();
+               static object RenderStatusStripSizingGripEvent = new object ();
+               static object RenderToolStripBackgroundEvent = new object ();
+               static object RenderToolStripBorderEvent = new object ();
+               static object RenderToolStripContentPanelBackgroundEvent = new object ();
+               static object RenderToolStripPanelBackgroundEvent = new object ();
+               static object RenderToolStripStatusLabelBackgroundEvent = new object ();
+
+               public event ToolStripArrowRenderEventHandler RenderArrow {
+                       add { Events.AddHandler (RenderArrowEvent, value); }
+                       remove {Events.RemoveHandler (RenderArrowEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderButtonBackground {
+                       add { Events.AddHandler (RenderButtonBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderButtonBackgroundEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderDropDownButtonBackground {
+                       add { Events.AddHandler (RenderDropDownButtonBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderDropDownButtonBackgroundEvent, value); }
+               }
+               public event ToolStripGripRenderEventHandler RenderGrip {
+                       add { Events.AddHandler (RenderGripEvent, value); }
+                       remove {Events.RemoveHandler (RenderGripEvent, value); }
+               }
+               public event ToolStripRenderEventHandler RenderImageMargin {
+                       add { Events.AddHandler (RenderImageMarginEvent, value); }
+                       remove {Events.RemoveHandler (RenderImageMarginEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderItemBackground {
+                       add { Events.AddHandler (RenderItemBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderItemBackgroundEvent, value); }
+               }
+               public event ToolStripItemImageRenderEventHandler RenderItemCheck {
+                       add { Events.AddHandler (RenderItemCheckEvent, value); }
+                       remove {Events.RemoveHandler (RenderItemCheckEvent, value); }
+               }
+               public event ToolStripItemImageRenderEventHandler RenderItemImage {
+                       add { Events.AddHandler (RenderItemImageEvent, value); }
+                       remove {Events.RemoveHandler (RenderItemImageEvent, value); }
+               }
+               public event ToolStripItemTextRenderEventHandler RenderItemText {
+                       add { Events.AddHandler (RenderItemTextEvent, value); }
+                       remove {Events.RemoveHandler (RenderItemTextEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderLabelBackground {
+                       add { Events.AddHandler (RenderLabelBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderLabelBackgroundEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderMenuItemBackground {
+                       add { Events.AddHandler (RenderMenuItemBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderMenuItemBackgroundEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderOverflowButtonBackground {
+                       add { Events.AddHandler (RenderOverflowButtonBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderOverflowButtonBackgroundEvent, value); }
+               }
+               public event ToolStripSeparatorRenderEventHandler RenderSeparator {
+                       add { Events.AddHandler (RenderSeparatorEvent, value); }
+                       remove {Events.RemoveHandler (RenderSeparatorEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderSplitButtonBackground {
+                       add { Events.AddHandler (RenderSplitButtonBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderSplitButtonBackgroundEvent, value); }
+               }
+               public event ToolStripRenderEventHandler RenderStatusStripSizingGrip {
+                       add { Events.AddHandler (RenderStatusStripSizingGripEvent, value); }
+                       remove {Events.RemoveHandler (RenderStatusStripSizingGripEvent, value); }
+               }
+               public event ToolStripRenderEventHandler RenderToolStripBackground {
+                       add { Events.AddHandler (RenderToolStripBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderToolStripBackgroundEvent, value); }
+               }
+               public event ToolStripRenderEventHandler RenderToolStripBorder {
+                       add { Events.AddHandler (RenderToolStripBorderEvent, value); }
+                       remove {Events.RemoveHandler (RenderToolStripBorderEvent, value); }
+               }
+               public event ToolStripContentPanelRenderEventHandler RenderToolStripContentPanelBackground {
+                       add { Events.AddHandler (RenderToolStripContentPanelBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderToolStripContentPanelBackgroundEvent, value); }
+               }
+               public event ToolStripPanelRenderEventHandler RenderToolStripPanelBackground {
+                       add { Events.AddHandler (RenderToolStripPanelBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderToolStripPanelBackgroundEvent, value); }
+               }
+               public event ToolStripItemRenderEventHandler RenderToolStripStatusLabelBackground {
+                       add { Events.AddHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
+                       remove {Events.RemoveHandler (RenderToolStripStatusLabelBackgroundEvent, value); }
+               }
+               #endregion
+               
+               #region Private Methods
+               internal static Image CreateMirrorImage (Image normalImage)
+               {
+                       if (normalImage == null)
+                               return null;
+
+                       Bitmap b = new Bitmap (normalImage);
+                       b.RotateFlip (RotateFlipType.RotateNoneFlipX);
+
+                       return b;
+               }
+
+               private void DrawBackground (Graphics g, Rectangle bounds, Image image, ImageLayout layout)
+               {
+                       // Center and Tile don't matter if the image is larger than the control
+                       if (layout == ImageLayout.Center || layout == ImageLayout.Tile)
+                               if (image.Size.Width >= bounds.Size.Width && image.Size.Height >= bounds.Size.Height)
+                                       layout = ImageLayout.None;
+                                       
+                       switch (layout) {
+                               case ImageLayout.None:
+                                       g.DrawImageUnscaledAndClipped (image, bounds);
+                                       break;
+                               case ImageLayout.Tile:
+                                       int x = 0;
+                                       int y = 0;
+                                       
+                                       while (y < bounds.Height) {
+                                               while (x < bounds.Width) {
+                                                       g.DrawImageUnscaledAndClipped (image, bounds);
+                                                       x += image.Width;       
+                                               }
+                                               x = 0;
+                                               y += image.Height;
+                                       }
+                                       break;
+                               case ImageLayout.Center:
+                                       Rectangle r = new Rectangle ((bounds.Size.Width - image.Size.Width) / 2, (bounds.Size.Height - image.Size.Height) / 2, image.Width, image.Height);
+                                       g.DrawImageUnscaledAndClipped (image, r);
+                                       break;
+                               case ImageLayout.Stretch:
+                                       g.DrawImage (image, bounds);
+                                       break;
+                               case ImageLayout.Zoom:
+                                       if (((float)image.Height / (float)image.Width) < ((float)bounds.Height / (float)bounds.Width)) {
+                                               Rectangle rzoom = new Rectangle (0, 0, bounds.Width, (int)((float)bounds.Width * ((float)image.Height / (float)image.Width)));
+                                               rzoom.Y = (bounds.Height - rzoom.Height)/ 2;
+                                               g.DrawImage (image, rzoom);
+                                       } else {
+                                               Rectangle rzoom = new Rectangle (0, 0, (int)((float)bounds.Height * ((float)image.Width / (float)image.Height)), bounds.Height);
+                                               rzoom.X = (bounds.Width - rzoom.Width) / 2;
+                                               g.DrawImage (image, rzoom);
+                                       }
+                                       break;
+                       }
+               }
+
+               internal static void DrawRightArrow (Graphics g, Pen p, int x, int y)
+               {
+                       g.DrawLine (p, x, y, x, y + 6);
+                       g.DrawLine (p, x + 1, y + 1, x + 1, y + 5);
+                       g.DrawLine (p, x + 2, y + 2, x + 2, y + 4);
+                       g.DrawLine (p, x + 2, y + 3, x + 3, y + 3);
+               }
+
+               internal static void DrawDownArrow (Graphics g, Pen p, int x, int y)
+               {
+                       g.DrawLine (p, x + 1, y, x + 5, y);
+                       g.DrawLine (p, x + 2, y + 1, x + 4, y + 1);
+                       g.DrawLine (p, x + 3, y + 1, x + 3, y + 2);
+               }
+
+               private void DrawSizingGrip (Graphics g, Rectangle rect)
+               {
+                       DrawGripBox (g, rect.Right - 5, rect.Bottom - 5);
+                       DrawGripBox (g, rect.Right - 9, rect.Bottom - 5);
+                       DrawGripBox (g, rect.Right - 5, rect.Bottom - 9);
+                       DrawGripBox (g, rect.Right - 13, rect.Bottom - 5);
+                       DrawGripBox (g, rect.Right - 5, rect.Bottom - 13);
+                       DrawGripBox (g, rect.Right - 9, rect.Bottom - 9);
+               }
+               
+               private void DrawGripBox (Graphics g, int x, int y)
+               {
+                       g.DrawRectangle (Pens.White, x + 1, y + 1, 1, 1);
+                       g.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.FromArgb (172, 168, 153)), x, y, 1, 1);
+               }
+               #endregion
+       }
+}