+ 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);
+ }