1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2006 Novell, Inc.
23 // Jordi Mas i Hernandez, jordi@ximian.com
24 // Peter Bartok, pbartok@novell.com
25 // John BouAntoun, jba-mono@optusnet.com.au
26 // Marek Safar, marek.safar@seznam.cz
27 // Alexander Olk, alex.olk@googlemail.com
30 using System.ComponentModel;
33 using System.Drawing.Drawing2D;
34 using System.Drawing.Imaging;
35 using System.Drawing.Printing;
36 using System.Drawing.Text;
38 using System.Windows.Forms.Theming;
40 namespace System.Windows.Forms
43 internal class ThemeWin32Classic : Theme
45 public override Version Version {
47 return new Version(0, 1, 0, 0);
51 /* Hardcoded colour values not exposed in the API constants in all configurations */
52 protected static readonly Color arrow_color = Color.Black;
53 protected static readonly Color pen_ticks_color = Color.Black;
54 protected static readonly Color progressbarblock_color = Color.FromArgb (255, 0, 0, 128);
55 protected static StringFormat string_format_menu_text;
56 protected static StringFormat string_format_menu_shortcut;
57 protected static StringFormat string_format_menu_menubar_text;
58 static ImageAttributes imagedisabled_attributes = null;
59 const int SEPARATOR_HEIGHT = 6;
60 const int SEPARATOR_MIN_WIDTH = 20;
61 const int SM_CXBORDER = 1;
62 const int SM_CYBORDER = 1;
63 const int MENU_TAB_SPACE = 8; // Pixels added to the width of an item because of a tabd
64 const int MENU_BAR_ITEMS_SPACE = 8; // Space between menu bar items
66 #region Principal Theme Methods
67 public ThemeWin32Classic ()
69 defaultWindowBackColor = this.ColorWindow;
70 defaultWindowForeColor = this.ColorControlText;
71 window_border_font = new Font(FontFamily.GenericSansSerif, 8.25f, FontStyle.Bold);
73 /* Menu string formats */
74 string_format_menu_text = new StringFormat ();
75 string_format_menu_text.LineAlignment = StringAlignment.Center;
76 string_format_menu_text.Alignment = StringAlignment.Near;
77 string_format_menu_text.HotkeyPrefix = HotkeyPrefix.Show;
78 string_format_menu_text.SetTabStops (0f, new float [] { 50f });
79 string_format_menu_text.FormatFlags |= StringFormatFlags.NoWrap;
81 string_format_menu_shortcut = new StringFormat ();
82 string_format_menu_shortcut.LineAlignment = StringAlignment.Center;
83 string_format_menu_shortcut.Alignment = StringAlignment.Far;
85 string_format_menu_menubar_text = new StringFormat ();
86 string_format_menu_menubar_text.LineAlignment = StringAlignment.Center;
87 string_format_menu_menubar_text.Alignment = StringAlignment.Center;
88 string_format_menu_menubar_text.HotkeyPrefix = HotkeyPrefix.Show;
91 public override void ResetDefaults() {
92 Console.WriteLine("NOT IMPLEMENTED: ResetDefault()");
93 //throw new NotImplementedException("Need to implement ResetDefaults() for Win32 theme");
96 public override bool DoubleBufferingSupported {
100 public override int HorizontalScrollBarHeight {
102 return XplatUI.HorizontalScrollBarHeight;
106 public override int VerticalScrollBarWidth {
108 return XplatUI.VerticalScrollBarWidth;
112 #endregion // Principal Theme Methods
114 #region Internal Methods
115 protected Brush GetControlBackBrush (Color c) {
116 if (c.ToArgb () == DefaultControlBackColor.ToArgb ())
117 return SystemBrushes.Control;
118 return ResPool.GetSolidBrush (c);
121 protected Brush GetControlForeBrush (Color c) {
122 if (c.ToArgb () == DefaultControlForeColor.ToArgb ())
123 return SystemBrushes.ControlText;
124 return ResPool.GetSolidBrush (c);
126 #endregion // Internal Methods
129 public override Font GetLinkFont (Control control)
131 return new Font (control.Font.FontFamily, control.Font.Size, control.Font.Style | FontStyle.Underline, control.Font.Unit);
133 #endregion // Control
135 #region OwnerDraw Support
136 public override void DrawOwnerDrawBackground (DrawItemEventArgs e)
138 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
139 e.Graphics.FillRectangle (SystemBrushes.Highlight, e.Bounds);
143 e.Graphics.FillRectangle (ResPool.GetSolidBrush(e.BackColor), e.Bounds);
146 public override void DrawOwnerDrawFocusRectangle (DrawItemEventArgs e)
148 if (e.State == DrawItemState.Focus)
149 CPDrawFocusRectangle (e.Graphics, e.Bounds, e.ForeColor, e.BackColor);
151 #endregion // OwnerDraw Support
154 #region Standard Button Style
155 public override void DrawButton (Graphics g, Button b, Rectangle textBounds, Rectangle imageBounds, Rectangle clipRectangle)
157 // Draw Button Background
158 DrawButtonBackground (g, b, clipRectangle);
160 // If we have an image, draw it
161 if (imageBounds.Size != Size.Empty)
162 DrawButtonImage (g, b, imageBounds);
164 // If we're focused, draw a focus rectangle
165 if (b.Focused && b.Enabled && b.ShowFocusCues)
166 DrawButtonFocus (g, b);
168 // If we have text, draw it
169 if (textBounds != Rectangle.Empty)
170 DrawButtonText (g, b, textBounds);
173 public virtual void DrawButtonBackground (Graphics g, Button button, Rectangle clipArea)
176 ThemeElements.DrawButton (g, button.ClientRectangle, ButtonThemeState.Pressed, button.BackColor, button.ForeColor);
177 else if (button.InternalSelected)
178 ThemeElements.DrawButton (g, button.ClientRectangle, ButtonThemeState.Default, button.BackColor, button.ForeColor);
179 else if (button.Entered)
180 ThemeElements.DrawButton (g, button.ClientRectangle, ButtonThemeState.Entered, button.BackColor, button.ForeColor);
181 else if (!button.Enabled)
182 ThemeElements.DrawButton (g, button.ClientRectangle, ButtonThemeState.Disabled, button.BackColor, button.ForeColor);
184 ThemeElements.DrawButton (g, button.ClientRectangle, ButtonThemeState.Normal, button.BackColor, button.ForeColor);
187 public virtual void DrawButtonFocus (Graphics g, Button button)
189 ControlPaint.DrawFocusRectangle (g, Rectangle.Inflate (button.ClientRectangle, -4, -4));
192 public virtual void DrawButtonImage (Graphics g, ButtonBase button, Rectangle imageBounds)
195 g.DrawImage (button.Image, imageBounds);
197 CPDrawImageDisabled (g, button.Image, imageBounds.Left, imageBounds.Top, ColorControl);
200 public virtual void DrawButtonText (Graphics g, ButtonBase button, Rectangle textBounds)
202 // Ensure that at least one line is going to get displayed.
203 // Line limit does not ensure that despite its description.
204 textBounds.Height = Math.Max (textBounds.Height, button.Font.Height);
207 TextRenderer.DrawTextInternal (g, button.Text, button.Font, textBounds, button.ForeColor, button.TextFormatFlags, button.UseCompatibleTextRendering);
209 DrawStringDisabled20 (g, button.Text, button.Font, textBounds, button.BackColor, button.TextFormatFlags, button.UseCompatibleTextRendering);
213 #region FlatStyle Button Style
214 public override void DrawFlatButton (Graphics g, ButtonBase b, Rectangle textBounds, Rectangle imageBounds, Rectangle clipRectangle)
216 // Draw Button Background
217 if (b.BackgroundImage == null)
218 DrawFlatButtonBackground (g, b, clipRectangle);
220 // If we have an image, draw it
221 if (imageBounds.Size != Size.Empty)
222 DrawFlatButtonImage (g, b, imageBounds);
224 // If we're focused, draw a focus rectangle
225 if (b.Focused && b.Enabled && b.ShowFocusCues)
226 DrawFlatButtonFocus (g, b);
228 // If we have text, draw it
229 if (textBounds != Rectangle.Empty)
230 DrawFlatButtonText (g, b, textBounds);
233 public virtual void DrawFlatButtonBackground (Graphics g, ButtonBase button, Rectangle clipArea)
236 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Pressed, button.BackColor, button.ForeColor, button.FlatAppearance);
237 else if (button.InternalSelected) {
239 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Default | ButtonThemeState.Entered, button.BackColor, button.ForeColor, button.FlatAppearance);
241 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Default, button.BackColor, button.ForeColor, button.FlatAppearance);
243 else if (button.Entered)
244 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Entered, button.BackColor, button.ForeColor, button.FlatAppearance);
245 else if (!button.Enabled)
246 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Disabled, button.BackColor, button.ForeColor, button.FlatAppearance);
248 ThemeElements.DrawFlatButton (g, button.ClientRectangle, ButtonThemeState.Normal, button.BackColor, button.ForeColor, button.FlatAppearance);
251 public virtual void DrawFlatButtonFocus (Graphics g, ButtonBase button)
253 if (!button.Pressed) {
254 Color focus_color = ControlPaint.Dark (button.BackColor);
255 g.DrawRectangle (ResPool.GetPen (focus_color), new Rectangle (button.ClientRectangle.Left + 4, button.ClientRectangle.Top + 4, button.ClientRectangle.Width - 9, button.ClientRectangle.Height - 9));
259 public virtual void DrawFlatButtonImage (Graphics g, ButtonBase button, Rectangle imageBounds)
261 // No changes from Standard for image for this theme
262 DrawButtonImage (g, button, imageBounds);
265 public virtual void DrawFlatButtonText (Graphics g, ButtonBase button, Rectangle textBounds)
267 // No changes from Standard for text for this theme
268 DrawButtonText (g, button, textBounds);
272 #region Popup Button Style
273 public override void DrawPopupButton (Graphics g, Button b, Rectangle textBounds, Rectangle imageBounds, Rectangle clipRectangle)
275 // Draw Button Background
276 DrawPopupButtonBackground (g, b, clipRectangle);
278 // If we have an image, draw it
279 if (imageBounds.Size != Size.Empty)
280 DrawPopupButtonImage (g, b, imageBounds);
282 // If we're focused, draw a focus rectangle
283 if (b.Focused && b.Enabled && b.ShowFocusCues)
284 DrawPopupButtonFocus (g, b);
286 // If we have text, draw it
287 if (textBounds != Rectangle.Empty)
288 DrawPopupButtonText (g, b, textBounds);
291 public virtual void DrawPopupButtonBackground (Graphics g, Button button, Rectangle clipArea)
294 ThemeElements.DrawPopupButton (g, button.ClientRectangle, ButtonThemeState.Pressed, button.BackColor, button.ForeColor);
295 else if (button.Entered)
296 ThemeElements.DrawPopupButton (g, button.ClientRectangle, ButtonThemeState.Entered, button.BackColor, button.ForeColor);
297 else if (button.InternalSelected)
298 ThemeElements.DrawPopupButton (g, button.ClientRectangle, ButtonThemeState.Default, button.BackColor, button.ForeColor);
299 else if (!button.Enabled)
300 ThemeElements.DrawPopupButton (g, button.ClientRectangle, ButtonThemeState.Disabled, button.BackColor, button.ForeColor);
302 ThemeElements.DrawPopupButton (g, button.ClientRectangle, ButtonThemeState.Normal, button.BackColor, button.ForeColor);
305 public virtual void DrawPopupButtonFocus (Graphics g, Button button)
307 // No changes from Standard for image for this theme
308 DrawButtonFocus (g, button);
311 public virtual void DrawPopupButtonImage (Graphics g, Button button, Rectangle imageBounds)
313 // No changes from Standard for image for this theme
314 DrawButtonImage (g, button, imageBounds);
317 public virtual void DrawPopupButtonText (Graphics g, Button button, Rectangle textBounds)
319 // No changes from Standard for image for this theme
320 DrawButtonText (g, button, textBounds);
324 #region Button Layout Calculations
326 public override Size CalculateButtonAutoSize (Button button)
328 Size ret_size = Size.Empty;
329 Size text_size = TextRenderer.MeasureTextInternal (button.Text, button.Font, button.UseCompatibleTextRendering);
330 Size image_size = button.Image == null ? Size.Empty : button.Image.Size;
333 if (button.Text.Length != 0) {
334 text_size.Height += 4;
335 text_size.Width += 4;
338 switch (button.TextImageRelation) {
339 case TextImageRelation.Overlay:
340 ret_size.Height = Math.Max (button.Text.Length == 0 ? 0 : text_size.Height, image_size.Height);
341 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
343 case TextImageRelation.ImageAboveText:
344 case TextImageRelation.TextAboveImage:
345 ret_size.Height = text_size.Height + image_size.Height;
346 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
348 case TextImageRelation.ImageBeforeText:
349 case TextImageRelation.TextBeforeImage:
350 ret_size.Height = Math.Max (text_size.Height, image_size.Height);
351 ret_size.Width = text_size.Width + image_size.Width;
356 ret_size.Height += (button.Padding.Vertical + 6);
357 ret_size.Width += (button.Padding.Horizontal + 6);
363 public override void CalculateButtonTextAndImageLayout (ButtonBase button, out Rectangle textRectangle, out Rectangle imageRectangle)
365 Image image = button.Image;
366 string text = button.Text;
367 Rectangle content_rect = button.ClientRectangle;
368 Size text_size = TextRenderer.MeasureTextInternal (text, button.Font, content_rect.Size, button.TextFormatFlags, button.UseCompatibleTextRendering);
369 Size image_size = image == null ? Size.Empty : image.Size;
371 textRectangle = Rectangle.Empty;
372 imageRectangle = Rectangle.Empty;
374 switch (button.TextImageRelation) {
375 case TextImageRelation.Overlay:
376 // Overlay is easy, text always goes here
377 textRectangle = Rectangle.Inflate (content_rect, -4, -4);
380 textRectangle.Offset (1, 1);
382 // Image is dependent on ImageAlign
388 int image_height = image.Height;
389 int image_width = image.Width;
391 switch (button.ImageAlign) {
392 case System.Drawing.ContentAlignment.TopLeft:
396 case System.Drawing.ContentAlignment.TopCenter:
397 image_x = (content_rect.Width - image_width) / 2;
400 case System.Drawing.ContentAlignment.TopRight:
401 image_x = content_rect.Width - image_width - 5;
404 case System.Drawing.ContentAlignment.MiddleLeft:
406 image_y = (content_rect.Height - image_height) / 2;
408 case System.Drawing.ContentAlignment.MiddleCenter:
409 image_x = (content_rect.Width - image_width) / 2;
410 image_y = (content_rect.Height - image_height) / 2;
412 case System.Drawing.ContentAlignment.MiddleRight:
413 image_x = content_rect.Width - image_width - 4;
414 image_y = (content_rect.Height - image_height) / 2;
416 case System.Drawing.ContentAlignment.BottomLeft:
418 image_y = content_rect.Height - image_height - 4;
420 case System.Drawing.ContentAlignment.BottomCenter:
421 image_x = (content_rect.Width - image_width) / 2;
422 image_y = content_rect.Height - image_height - 4;
424 case System.Drawing.ContentAlignment.BottomRight:
425 image_x = content_rect.Width - image_width - 4;
426 image_y = content_rect.Height - image_height - 4;
434 imageRectangle = new Rectangle (image_x, image_y, image_width, image_height);
436 case TextImageRelation.ImageAboveText:
437 content_rect.Inflate (-4, -4);
438 LayoutTextAboveOrBelowImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
440 case TextImageRelation.TextAboveImage:
441 content_rect.Inflate (-4, -4);
442 LayoutTextAboveOrBelowImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
444 case TextImageRelation.ImageBeforeText:
445 content_rect.Inflate (-4, -4);
446 LayoutTextBeforeOrAfterImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
448 case TextImageRelation.TextBeforeImage:
449 content_rect.Inflate (-4, -4);
450 LayoutTextBeforeOrAfterImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
455 private void LayoutTextBeforeOrAfterImage (Rectangle totalArea, bool textFirst, Size textSize, Size imageSize, System.Drawing.ContentAlignment textAlign, System.Drawing.ContentAlignment imageAlign, out Rectangle textRect, out Rectangle imageRect)
457 int element_spacing = 0; // Spacing between the Text and the Image
458 int total_width = textSize.Width + element_spacing + imageSize.Width;
461 element_spacing += 2;
463 // If the text is too big, chop it down to the size we have available to it
464 if (total_width > totalArea.Width) {
465 textSize.Width = totalArea.Width - element_spacing - imageSize.Width;
466 total_width = totalArea.Width;
469 int excess_width = totalArea.Width - total_width;
472 Rectangle final_text_rect;
473 Rectangle final_image_rect;
475 HorizontalAlignment h_text = GetHorizontalAlignment (textAlign);
476 HorizontalAlignment h_image = GetHorizontalAlignment (imageAlign);
478 if (h_image == HorizontalAlignment.Left)
480 else if (h_image == HorizontalAlignment.Right && h_text == HorizontalAlignment.Right)
481 offset = excess_width;
482 else if (h_image == HorizontalAlignment.Center && (h_text == HorizontalAlignment.Left || h_text == HorizontalAlignment.Center))
483 offset += (int)(excess_width / 3);
485 offset += (int)(2 * (excess_width / 3));
488 final_text_rect = new Rectangle (totalArea.Left + offset, AlignInRectangle (totalArea, textSize, textAlign).Top, textSize.Width, textSize.Height);
489 final_image_rect = new Rectangle (final_text_rect.Right + element_spacing, AlignInRectangle (totalArea, imageSize, imageAlign).Top, imageSize.Width, imageSize.Height);
492 final_image_rect = new Rectangle (totalArea.Left + offset, AlignInRectangle (totalArea, imageSize, imageAlign).Top, imageSize.Width, imageSize.Height);
493 final_text_rect = new Rectangle (final_image_rect.Right + element_spacing, AlignInRectangle (totalArea, textSize, textAlign).Top, textSize.Width, textSize.Height);
496 textRect = final_text_rect;
497 imageRect = final_image_rect;
500 private void LayoutTextAboveOrBelowImage (Rectangle totalArea, bool textFirst, Size textSize, Size imageSize, System.Drawing.ContentAlignment textAlign, System.Drawing.ContentAlignment imageAlign, out Rectangle textRect, out Rectangle imageRect)
502 int element_spacing = 0; // Spacing between the Text and the Image
503 int total_height = textSize.Height + element_spacing + imageSize.Height;
506 element_spacing += 2;
508 if (textSize.Width > totalArea.Width)
509 textSize.Width = totalArea.Width;
511 // If the there isn't enough room and we're text first, cut out the image
512 if (total_height > totalArea.Height && textFirst) {
513 imageSize = Size.Empty;
514 total_height = totalArea.Height;
517 int excess_height = totalArea.Height - total_height;
520 Rectangle final_text_rect;
521 Rectangle final_image_rect;
523 VerticalAlignment v_text = GetVerticalAlignment (textAlign);
524 VerticalAlignment v_image = GetVerticalAlignment (imageAlign);
526 if (v_image == VerticalAlignment.Top)
528 else if (v_image == VerticalAlignment.Bottom && v_text == VerticalAlignment.Bottom)
529 offset = excess_height;
530 else if (v_image == VerticalAlignment.Center && (v_text == VerticalAlignment.Top || v_text == VerticalAlignment.Center))
531 offset += (int)(excess_height / 3);
533 offset += (int)(2 * (excess_height / 3));
536 final_text_rect = new Rectangle (AlignInRectangle (totalArea, textSize, textAlign).Left, totalArea.Top + offset, textSize.Width, textSize.Height);
537 final_image_rect = new Rectangle (AlignInRectangle (totalArea, imageSize, imageAlign).Left, final_text_rect.Bottom + element_spacing, imageSize.Width, imageSize.Height);
540 final_image_rect = new Rectangle (AlignInRectangle (totalArea, imageSize, imageAlign).Left, totalArea.Top + offset, imageSize.Width, imageSize.Height);
541 final_text_rect = new Rectangle (AlignInRectangle (totalArea, textSize, textAlign).Left, final_image_rect.Bottom + element_spacing, textSize.Width, textSize.Height);
543 if (final_text_rect.Bottom > totalArea.Bottom)
544 final_text_rect.Y = totalArea.Top;
547 textRect = final_text_rect;
548 imageRect = final_image_rect;
551 private HorizontalAlignment GetHorizontalAlignment (System.Drawing.ContentAlignment align)
554 case System.Drawing.ContentAlignment.BottomLeft:
555 case System.Drawing.ContentAlignment.MiddleLeft:
556 case System.Drawing.ContentAlignment.TopLeft:
557 return HorizontalAlignment.Left;
558 case System.Drawing.ContentAlignment.BottomCenter:
559 case System.Drawing.ContentAlignment.MiddleCenter:
560 case System.Drawing.ContentAlignment.TopCenter:
561 return HorizontalAlignment.Center;
562 case System.Drawing.ContentAlignment.BottomRight:
563 case System.Drawing.ContentAlignment.MiddleRight:
564 case System.Drawing.ContentAlignment.TopRight:
565 return HorizontalAlignment.Right;
568 return HorizontalAlignment.Left;
571 private enum VerticalAlignment
578 private VerticalAlignment GetVerticalAlignment (System.Drawing.ContentAlignment align)
581 case System.Drawing.ContentAlignment.TopLeft:
582 case System.Drawing.ContentAlignment.TopCenter:
583 case System.Drawing.ContentAlignment.TopRight:
584 return VerticalAlignment.Top;
585 case System.Drawing.ContentAlignment.MiddleLeft:
586 case System.Drawing.ContentAlignment.MiddleCenter:
587 case System.Drawing.ContentAlignment.MiddleRight:
588 return VerticalAlignment.Center;
589 case System.Drawing.ContentAlignment.BottomLeft:
590 case System.Drawing.ContentAlignment.BottomCenter:
591 case System.Drawing.ContentAlignment.BottomRight:
592 return VerticalAlignment.Bottom;
595 return VerticalAlignment.Top;
598 internal Rectangle AlignInRectangle (Rectangle outer, Size inner, System.Drawing.ContentAlignment align)
603 if (align == System.Drawing.ContentAlignment.BottomLeft || align == System.Drawing.ContentAlignment.MiddleLeft || align == System.Drawing.ContentAlignment.TopLeft)
605 else if (align == System.Drawing.ContentAlignment.BottomCenter || align == System.Drawing.ContentAlignment.MiddleCenter || align == System.Drawing.ContentAlignment.TopCenter)
606 x = Math.Max (outer.X + ((outer.Width - inner.Width) / 2), outer.Left);
607 else if (align == System.Drawing.ContentAlignment.BottomRight || align == System.Drawing.ContentAlignment.MiddleRight || align == System.Drawing.ContentAlignment.TopRight)
608 x = outer.Right - inner.Width;
609 if (align == System.Drawing.ContentAlignment.TopCenter || align == System.Drawing.ContentAlignment.TopLeft || align == System.Drawing.ContentAlignment.TopRight)
611 else if (align == System.Drawing.ContentAlignment.MiddleCenter || align == System.Drawing.ContentAlignment.MiddleLeft || align == System.Drawing.ContentAlignment.MiddleRight)
612 y = outer.Y + (outer.Height - inner.Height) / 2;
613 else if (align == System.Drawing.ContentAlignment.BottomCenter || align == System.Drawing.ContentAlignment.BottomRight || align == System.Drawing.ContentAlignment.BottomLeft)
614 y = outer.Bottom - inner.Height;
616 return new Rectangle (x, y, Math.Min (inner.Width, outer.Width), Math.Min (inner.Height, outer.Height));
622 public override void DrawButtonBase(Graphics dc, Rectangle clip_area, ButtonBase button)
624 // Draw the button: Draw border, etc.
625 ButtonBase_DrawButton(button, dc);
628 if (button.FlatStyle != FlatStyle.System && ((button.image != null) || (button.image_list != null)))
629 ButtonBase_DrawImage(button, dc);
631 // Draw the focus rectangle
632 if ((button.Focused || button.paint_as_acceptbutton) && button.Enabled && button.ShowFocusCues)
633 ButtonBase_DrawFocus(button, dc);
636 if (button.Text != null && button.Text != String.Empty)
637 ButtonBase_DrawText(button, dc);
640 protected virtual void ButtonBase_DrawButton (ButtonBase button, Graphics dc)
642 Rectangle borderRectangle;
643 bool check_or_radio = false;
644 bool check_or_radio_checked = false;
646 bool is_ColorControl = button.BackColor.ToArgb () == ColorControl.ToArgb () ? true : false;
648 CPColor cpcolor = is_ColorControl ? CPColor.Empty : ResPool.GetCPColor (button.BackColor);
650 if (button is CheckBox) {
651 check_or_radio = true;
652 check_or_radio_checked = ((CheckBox)button).Checked;
653 } else if (button is RadioButton) {
654 check_or_radio = true;
655 check_or_radio_checked = ((RadioButton)button).Checked;
658 if ((button.Focused || button.paint_as_acceptbutton) && button.Enabled && !check_or_radio) {
659 // shrink the rectangle for the normal button drawing inside the focus rectangle
660 borderRectangle = Rectangle.Inflate (button.ClientRectangle, -1, -1);
662 borderRectangle = button.ClientRectangle;
665 if (button.FlatStyle == FlatStyle.Popup) {
666 if (!button.is_pressed && !button.is_entered && !check_or_radio_checked)
667 Internal_DrawButton (dc, borderRectangle, 1, cpcolor, is_ColorControl, button.BackColor);
668 else if (!button.is_pressed && button.is_entered &&!check_or_radio_checked)
669 Internal_DrawButton (dc, borderRectangle, 2, cpcolor, is_ColorControl, button.BackColor);
670 else if (button.is_pressed || check_or_radio_checked)
671 Internal_DrawButton (dc, borderRectangle, 1, cpcolor, is_ColorControl, button.BackColor);
672 } else if (button.FlatStyle == FlatStyle.Flat) {
673 if (button.is_entered && !button.is_pressed && !check_or_radio_checked) {
674 if ((button.image == null) && (button.image_list == null)) {
675 Brush brush = is_ColorControl ? SystemBrushes.ControlDark : ResPool.GetSolidBrush (cpcolor.Dark);
676 dc.FillRectangle (brush, borderRectangle);
678 } else if (button.is_pressed || check_or_radio_checked) {
679 if ((button.image == null) && (button.image_list == null)) {
680 Brush brush = is_ColorControl ? SystemBrushes.ControlLightLight : ResPool.GetSolidBrush (cpcolor.LightLight);
681 dc.FillRectangle (brush, borderRectangle);
684 Pen pen = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
685 dc.DrawRectangle (pen, borderRectangle.X + 4, borderRectangle.Y + 4,
686 borderRectangle.Width - 9, borderRectangle.Height - 9);
689 Internal_DrawButton (dc, borderRectangle, 3, cpcolor, is_ColorControl, button.BackColor);
691 if ((!button.is_pressed || !button.Enabled) && !check_or_radio_checked)
692 Internal_DrawButton (dc, borderRectangle, 0, cpcolor, is_ColorControl, button.BackColor);
694 Internal_DrawButton (dc, borderRectangle, 1, cpcolor, is_ColorControl, button.BackColor);
698 private void Internal_DrawButton (Graphics dc, Rectangle rect, int state, CPColor cpcolor, bool is_ColorControl, Color backcolor)
701 case 0: // normal or normal disabled button
702 Pen pen = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
703 dc.DrawLine (pen, rect.X, rect.Y, rect.X, rect.Bottom - 2);
704 dc.DrawLine (pen, rect.X + 1, rect.Y, rect.Right - 2, rect.Y);
706 pen = is_ColorControl ? SystemPens.Control : ResPool.GetPen (backcolor);
707 dc.DrawLine (pen, rect.X + 1, rect.Y + 1, rect.X + 1, rect.Bottom - 3);
708 dc.DrawLine (pen, rect.X + 2, rect.Y + 1, rect.Right - 3, rect.Y + 1);
710 pen = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
711 dc.DrawLine (pen, rect.X + 1, rect.Bottom - 2, rect.Right - 2, rect.Bottom - 2);
712 dc.DrawLine (pen, rect.Right - 2, rect.Y + 1, rect.Right - 2, rect.Bottom - 3);
714 pen = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
715 dc.DrawLine (pen, rect.X, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
716 dc.DrawLine (pen, rect.Right - 1, rect.Y, rect.Right - 1, rect.Bottom - 2);
718 case 1: // popup button normal (or pressed normal or popup button)
719 pen = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
720 dc.DrawRectangle (pen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1);
722 case 2: // popup button poped up
723 pen = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
724 dc.DrawLine (pen, rect.X, rect.Y, rect.X, rect.Bottom - 2);
725 dc.DrawLine (pen, rect.X + 1, rect.Y, rect.Right - 2, rect.Y);
727 pen = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
728 dc.DrawLine (pen, rect.X, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
729 dc.DrawLine (pen, rect.Right - 1, rect.Y, rect.Right - 1, rect.Bottom - 2);
731 case 3: // flat button not entered
732 pen = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
733 dc.DrawRectangle (pen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1);
740 protected virtual void ButtonBase_DrawImage(ButtonBase button, Graphics dc)
742 // Need to draw a picture
749 int width = button.ClientSize.Width;
750 int height = button.ClientSize.Height;
752 if (button.ImageIndex != -1) { // We use ImageIndex instead of image_index since it will return -1 if image_list is null
753 i = button.image_list.Images[button.ImageIndex];
758 image_width = i.Width;
759 image_height = i.Height;
761 switch (button.ImageAlign) {
762 case ContentAlignment.TopLeft: {
768 case ContentAlignment.TopCenter: {
769 image_x = (width - image_width) / 2;
774 case ContentAlignment.TopRight: {
775 image_x = width - image_width - 5;
780 case ContentAlignment.MiddleLeft: {
782 image_y = (height - image_height) / 2;
786 case ContentAlignment.MiddleCenter: {
787 image_x = (width - image_width) / 2;
788 image_y = (height - image_height) / 2;
792 case ContentAlignment.MiddleRight: {
793 image_x = width - image_width - 4;
794 image_y = (height - image_height) / 2;
798 case ContentAlignment.BottomLeft: {
800 image_y = height - image_height - 4;
804 case ContentAlignment.BottomCenter: {
805 image_x = (width - image_width) / 2;
806 image_y = height - image_height - 4;
810 case ContentAlignment.BottomRight: {
811 image_x = width - image_width - 4;
812 image_y = height - image_height - 4;
823 dc.SetClip (new Rectangle(3, 3, width - 5, height - 5));
826 dc.DrawImage (i, image_x, image_y, image_width, image_height);
828 CPDrawImageDisabled (dc, i, image_x, image_y, ColorControl);
833 protected virtual void ButtonBase_DrawFocus(ButtonBase button, Graphics dc)
835 Color focus_color = button.ForeColor;
837 int inflate_value = -3;
839 if (!(button is CheckBox) && !(button is RadioButton)) {
842 if (button.FlatStyle == FlatStyle.Popup && !button.is_pressed)
843 focus_color = ControlPaint.Dark(button.BackColor);
845 dc.DrawRectangle (ResPool.GetPen (focus_color), button.ClientRectangle.X, button.ClientRectangle.Y,
846 button.ClientRectangle.Width - 1, button.ClientRectangle.Height - 1);
849 if (button.Focused) {
850 Rectangle rect = Rectangle.Inflate (button.ClientRectangle, inflate_value, inflate_value);
851 ControlPaint.DrawFocusRectangle (dc, rect);
855 protected virtual void ButtonBase_DrawText(ButtonBase button, Graphics dc)
857 Rectangle buttonRectangle = button.ClientRectangle;
858 Rectangle text_rect = Rectangle.Inflate(buttonRectangle, -4, -4);
860 if (button.is_pressed) {
865 // Ensure that at least one line is going to get displayed.
866 // Line limit does not ensure that despite its description.
867 text_rect.Height = Math.Max (button.Font.Height, text_rect.Height);
869 if (button.Enabled) {
870 dc.DrawString(button.Text, button.Font, ResPool.GetSolidBrush (button.ForeColor), text_rect, button.text_format);
872 if (button.FlatStyle == FlatStyle.Flat || button.FlatStyle == FlatStyle.Popup) {
873 dc.DrawString(button.Text, button.Font, ResPool.GetSolidBrush (ColorGrayText), text_rect, button.text_format);
875 CPDrawStringDisabled (dc, button.Text, button.Font, button.BackColor, text_rect, button.text_format);
880 public override Size ButtonBaseDefaultSize {
882 return new Size (75, 23);
885 #endregion // ButtonBase
889 public override void DrawCheckBox (Graphics g, CheckBox cb, Rectangle glyphArea, Rectangle textBounds, Rectangle imageBounds, Rectangle clipRectangle)
891 // Draw Button Background
892 if (cb.Appearance == Appearance.Button && cb.FlatStyle != FlatStyle.Flat)
893 ButtonBase_DrawButton (cb, g);
894 else if (cb.Appearance != Appearance.Button)
895 DrawCheckBoxGlyph (g, cb, glyphArea);
897 // Draw the borders and such for a Flat CheckBox Button
898 if (cb.Appearance == Appearance.Button && cb.FlatStyle == FlatStyle.Flat)
899 DrawFlatButton (g, cb, textBounds, imageBounds, clipRectangle);
901 // If we have an image, draw it
902 if (imageBounds.Size != Size.Empty)
903 DrawCheckBoxImage (g, cb, imageBounds);
905 if (cb.Focused && cb.Enabled && cb.ShowFocusCues && textBounds != Rectangle.Empty)
906 DrawCheckBoxFocus (g, cb, textBounds);
908 // If we have text, draw it
909 if (textBounds != Rectangle.Empty)
910 DrawCheckBoxText (g, cb, textBounds);
913 public virtual void DrawCheckBoxGlyph (Graphics g, CheckBox cb, Rectangle glyphArea)
916 ThemeElements.CurrentTheme.CheckBoxPainter.PaintCheckBox (g, glyphArea, cb.BackColor, cb.ForeColor, ElementState.Pressed, cb.FlatStyle, cb.CheckState);
917 else if (cb.InternalSelected)
918 ThemeElements.CurrentTheme.CheckBoxPainter.PaintCheckBox (g, glyphArea, cb.BackColor, cb.ForeColor, ElementState.Normal, cb.FlatStyle, cb.CheckState);
920 ThemeElements.CurrentTheme.CheckBoxPainter.PaintCheckBox (g, glyphArea, cb.BackColor, cb.ForeColor, ElementState.Hot, cb.FlatStyle, cb.CheckState);
921 else if (!cb.Enabled)
922 ThemeElements.CurrentTheme.CheckBoxPainter.PaintCheckBox (g, glyphArea, cb.BackColor, cb.ForeColor, ElementState.Disabled, cb.FlatStyle, cb.CheckState);
924 ThemeElements.CurrentTheme.CheckBoxPainter.PaintCheckBox (g, glyphArea, cb.BackColor, cb.ForeColor, ElementState.Normal, cb.FlatStyle, cb.CheckState);
927 public virtual void DrawCheckBoxFocus (Graphics g, CheckBox cb, Rectangle focusArea)
929 ControlPaint.DrawFocusRectangle (g, focusArea);
932 public virtual void DrawCheckBoxImage (Graphics g, CheckBox cb, Rectangle imageBounds)
935 g.DrawImage (cb.Image, imageBounds);
937 CPDrawImageDisabled (g, cb.Image, imageBounds.Left, imageBounds.Top, ColorControl);
940 public virtual void DrawCheckBoxText (Graphics g, CheckBox cb, Rectangle textBounds)
943 TextRenderer.DrawTextInternal (g, cb.Text, cb.Font, textBounds, cb.ForeColor, cb.TextFormatFlags, cb.UseCompatibleTextRendering);
945 DrawStringDisabled20 (g, cb.Text, cb.Font, textBounds, cb.BackColor, cb.TextFormatFlags, cb.UseCompatibleTextRendering);
948 public override void CalculateCheckBoxTextAndImageLayout (ButtonBase button, Point p, out Rectangle glyphArea, out Rectangle textRectangle, out Rectangle imageRectangle)
952 if (button is CheckBox)
953 check_size = (button as CheckBox).Appearance == Appearance.Normal ? 13 : 0;
955 glyphArea = new Rectangle (0, (button.Height - check_size) / 2, check_size, check_size);
957 Image image = button.Image;
958 string text = button.Text;
959 Rectangle content_rect = button.ClientRectangle;
960 content_rect.Width -= check_size;
961 content_rect.Offset (check_size, 0);
963 Size text_size = TextRenderer.MeasureTextInternal (text, button.Font, Size.Empty, button.TextFormatFlags, button.UseCompatibleTextRendering);
964 Size image_size = image == null ? Size.Empty : image.Size;
966 textRectangle = Rectangle.Empty;
967 imageRectangle = Rectangle.Empty;
969 switch (button.TextImageRelation) {
970 case TextImageRelation.Overlay:
971 // Text is centered vertically, and 2 pixels to the right
972 textRectangle.X = content_rect.Left + 2;
973 textRectangle.Y = ((content_rect.Height - text_size.Height) / 2) - 1;
974 textRectangle.Size = text_size;
976 // Image is dependent on ImageAlign
982 int image_height = image.Height;
983 int image_width = image.Width;
985 switch (button.ImageAlign) {
986 case System.Drawing.ContentAlignment.TopLeft:
990 case System.Drawing.ContentAlignment.TopCenter:
991 image_x = (content_rect.Width - image_width) / 2;
994 case System.Drawing.ContentAlignment.TopRight:
995 image_x = content_rect.Width - image_width - 5;
998 case System.Drawing.ContentAlignment.MiddleLeft:
1000 image_y = (content_rect.Height - image_height) / 2;
1002 case System.Drawing.ContentAlignment.MiddleCenter:
1003 image_x = (content_rect.Width - image_width) / 2;
1004 image_y = (content_rect.Height - image_height) / 2;
1006 case System.Drawing.ContentAlignment.MiddleRight:
1007 image_x = content_rect.Width - image_width - 4;
1008 image_y = (content_rect.Height - image_height) / 2;
1010 case System.Drawing.ContentAlignment.BottomLeft:
1012 image_y = content_rect.Height - image_height - 4;
1014 case System.Drawing.ContentAlignment.BottomCenter:
1015 image_x = (content_rect.Width - image_width) / 2;
1016 image_y = content_rect.Height - image_height - 4;
1018 case System.Drawing.ContentAlignment.BottomRight:
1019 image_x = content_rect.Width - image_width - 4;
1020 image_y = content_rect.Height - image_height - 4;
1028 imageRectangle = new Rectangle (image_x + check_size, image_y, image_width, image_height);
1030 case TextImageRelation.ImageAboveText:
1031 content_rect.Inflate (-4, -4);
1032 LayoutTextAboveOrBelowImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
1034 case TextImageRelation.TextAboveImage:
1035 content_rect.Inflate (-4, -4);
1036 LayoutTextAboveOrBelowImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
1038 case TextImageRelation.ImageBeforeText:
1039 content_rect.Inflate (-4, -4);
1040 LayoutTextBeforeOrAfterImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
1042 case TextImageRelation.TextBeforeImage:
1043 content_rect.Inflate (-4, -4);
1044 LayoutTextBeforeOrAfterImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
1049 public override Size CalculateCheckBoxAutoSize (CheckBox checkBox)
1051 Size ret_size = Size.Empty;
1052 Size text_size = TextRenderer.MeasureTextInternal (checkBox.Text, checkBox.Font, checkBox.UseCompatibleTextRendering);
1053 Size image_size = checkBox.Image == null ? Size.Empty : checkBox.Image.Size;
1055 // Pad the text size
1056 if (checkBox.Text.Length != 0) {
1057 text_size.Height += 4;
1058 text_size.Width += 4;
1061 switch (checkBox.TextImageRelation) {
1062 case TextImageRelation.Overlay:
1063 ret_size.Height = Math.Max (checkBox.Text.Length == 0 ? 0 : text_size.Height, image_size.Height);
1064 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
1066 case TextImageRelation.ImageAboveText:
1067 case TextImageRelation.TextAboveImage:
1068 ret_size.Height = text_size.Height + image_size.Height;
1069 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
1071 case TextImageRelation.ImageBeforeText:
1072 case TextImageRelation.TextBeforeImage:
1073 ret_size.Height = Math.Max (text_size.Height, image_size.Height);
1074 ret_size.Width = text_size.Width + image_size.Width;
1079 ret_size.Height += (checkBox.Padding.Vertical);
1080 ret_size.Width += (checkBox.Padding.Horizontal) + 15;
1082 // There seems to be a minimum height
1083 if (ret_size.Height == checkBox.Padding.Vertical)
1084 ret_size.Height += 14;
1090 public override void DrawCheckBox(Graphics dc, Rectangle clip_area, CheckBox checkbox) {
1091 StringFormat text_format;
1092 Rectangle client_rectangle;
1093 Rectangle text_rectangle;
1094 Rectangle checkbox_rectangle;
1095 int checkmark_size=13;
1096 int checkmark_space = 4;
1098 client_rectangle = checkbox.ClientRectangle;
1099 text_rectangle = client_rectangle;
1100 checkbox_rectangle = new Rectangle(text_rectangle.X, text_rectangle.Y, checkmark_size, checkmark_size);
1102 text_format = new StringFormat();
1103 text_format.Alignment = StringAlignment.Near;
1104 text_format.LineAlignment = StringAlignment.Center;
1105 if (checkbox.ShowKeyboardCuesInternal)
1106 text_format.HotkeyPrefix = HotkeyPrefix.Show;
1108 text_format.HotkeyPrefix = HotkeyPrefix.Hide;
1110 /* Calculate the position of text and checkbox rectangle */
1111 if (checkbox.appearance!=Appearance.Button) {
1112 switch(checkbox.check_alignment) {
1113 case ContentAlignment.BottomCenter: {
1114 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
1115 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
1116 text_rectangle.X=client_rectangle.X;
1117 text_rectangle.Width=client_rectangle.Width;
1118 text_rectangle.Height=client_rectangle.Height-checkbox_rectangle.Y-checkmark_space;
1122 case ContentAlignment.BottomLeft: {
1123 checkbox_rectangle.X=client_rectangle.Left;
1124 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
1125 text_rectangle.X=client_rectangle.X+checkmark_size+checkmark_space;
1126 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1130 case ContentAlignment.BottomRight: {
1131 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
1132 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
1133 text_rectangle.X=client_rectangle.X;
1134 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1138 case ContentAlignment.MiddleCenter: {
1139 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
1140 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
1141 text_rectangle.X=client_rectangle.X;
1142 text_rectangle.Width=client_rectangle.Width;
1147 case ContentAlignment.MiddleLeft: {
1148 checkbox_rectangle.X=client_rectangle.Left;
1149 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
1150 text_rectangle.X=client_rectangle.X+checkmark_size+checkmark_space;
1151 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1155 case ContentAlignment.MiddleRight: {
1156 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
1157 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
1158 text_rectangle.X=client_rectangle.X;
1159 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1163 case ContentAlignment.TopCenter: {
1164 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
1165 checkbox_rectangle.Y=client_rectangle.Top;
1166 text_rectangle.X=client_rectangle.X;
1167 text_rectangle.Width=client_rectangle.Width;
1168 text_rectangle.Y=checkmark_size+checkmark_space;
1169 text_rectangle.Height=client_rectangle.Height-checkmark_size-checkmark_space;
1173 case ContentAlignment.TopLeft: {
1174 checkbox_rectangle.X=client_rectangle.Left;
1175 text_rectangle.X=client_rectangle.X+checkmark_size+checkmark_space;
1176 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1180 case ContentAlignment.TopRight: {
1181 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
1182 text_rectangle.X=client_rectangle.X;
1183 text_rectangle.Width=client_rectangle.Width-checkmark_size-checkmark_space;
1188 text_rectangle.X=client_rectangle.X;
1189 text_rectangle.Width=client_rectangle.Width;
1192 /* Set the horizontal alignment of our text */
1193 switch(checkbox.text_alignment) {
1194 case ContentAlignment.BottomLeft:
1195 case ContentAlignment.MiddleLeft:
1196 case ContentAlignment.TopLeft: {
1197 text_format.Alignment=StringAlignment.Near;
1201 case ContentAlignment.BottomCenter:
1202 case ContentAlignment.MiddleCenter:
1203 case ContentAlignment.TopCenter: {
1204 text_format.Alignment=StringAlignment.Center;
1208 case ContentAlignment.BottomRight:
1209 case ContentAlignment.MiddleRight:
1210 case ContentAlignment.TopRight: {
1211 text_format.Alignment=StringAlignment.Far;
1216 /* Set the vertical alignment of our text */
1217 switch(checkbox.text_alignment) {
1218 case ContentAlignment.TopLeft:
1219 case ContentAlignment.TopCenter:
1220 case ContentAlignment.TopRight: {
1221 text_format.LineAlignment=StringAlignment.Near;
1225 case ContentAlignment.BottomLeft:
1226 case ContentAlignment.BottomCenter:
1227 case ContentAlignment.BottomRight: {
1228 text_format.LineAlignment=StringAlignment.Far;
1232 case ContentAlignment.MiddleLeft:
1233 case ContentAlignment.MiddleCenter:
1234 case ContentAlignment.MiddleRight: {
1235 text_format.LineAlignment=StringAlignment.Center;
1240 ButtonState state = ButtonState.Normal;
1241 if (checkbox.FlatStyle == FlatStyle.Flat) {
1242 state |= ButtonState.Flat;
1245 if (checkbox.Checked) {
1246 state |= ButtonState.Checked;
1249 if (checkbox.ThreeState && (checkbox.CheckState == CheckState.Indeterminate)) {
1250 state |= ButtonState.Checked;
1251 state |= ButtonState.Pushed;
1254 // finally make sure the pushed and inavtive states are rendered
1255 if (!checkbox.Enabled) {
1256 state |= ButtonState.Inactive;
1258 else if (checkbox.is_pressed) {
1259 state |= ButtonState.Pushed;
1264 CheckBox_DrawCheckBox(dc, checkbox, state, checkbox_rectangle);
1266 if ((checkbox.image != null) || (checkbox.image_list != null))
1267 ButtonBase_DrawImage(checkbox, dc);
1269 CheckBox_DrawText(checkbox, text_rectangle, dc, text_format);
1271 if (checkbox.Focused && checkbox.Enabled && checkbox.appearance != Appearance.Button && checkbox.Text != String.Empty && checkbox.ShowFocusCues) {
1272 SizeF text_size = dc.MeasureString (checkbox.Text, checkbox.Font);
1274 Rectangle focus_rect = Rectangle.Empty;
1275 focus_rect.X = text_rectangle.X;
1276 focus_rect.Y = (int)((text_rectangle.Height - text_size.Height) / 2);
1277 focus_rect.Size = text_size.ToSize ();
1278 CheckBox_DrawFocus (checkbox, dc, focus_rect);
1281 text_format.Dispose ();
1284 protected virtual void CheckBox_DrawCheckBox( Graphics dc, CheckBox checkbox, ButtonState state, Rectangle checkbox_rectangle )
1286 Brush brush = checkbox.BackColor.ToArgb () == ColorControl.ToArgb () ? SystemBrushes.Control : ResPool.GetSolidBrush (checkbox.BackColor);
1287 dc.FillRectangle (brush, checkbox.ClientRectangle);
1288 // render as per normal button
1289 if (checkbox.appearance==Appearance.Button) {
1290 ButtonBase_DrawButton (checkbox, dc);
1292 if ((checkbox.Focused) && checkbox.Enabled)
1293 ButtonBase_DrawFocus(checkbox, dc);
1295 // establish if we are rendering a flat style of some sort
1296 if (checkbox.FlatStyle == FlatStyle.Flat || checkbox.FlatStyle == FlatStyle.Popup) {
1297 DrawFlatStyleCheckBox (dc, checkbox_rectangle, checkbox);
1299 CPDrawCheckBox (dc, checkbox_rectangle, state);
1304 protected virtual void CheckBox_DrawText( CheckBox checkbox, Rectangle text_rectangle, Graphics dc, StringFormat text_format )
1306 DrawCheckBox_and_RadioButtonText (checkbox, text_rectangle, dc,
1307 text_format, checkbox.Appearance, checkbox.Checked);
1310 protected virtual void CheckBox_DrawFocus( CheckBox checkbox, Graphics dc, Rectangle text_rectangle )
1312 DrawInnerFocusRectangle (dc, text_rectangle, checkbox.BackColor);
1315 // renders a checkBox with the Flat and Popup FlatStyle
1316 protected virtual void DrawFlatStyleCheckBox (Graphics graphics, Rectangle rectangle, CheckBox checkbox)
1320 Rectangle checkbox_rectangle;
1321 Rectangle fill_rectangle;
1325 // set up our rectangles first
1326 if (checkbox.FlatStyle == FlatStyle.Popup && checkbox.is_entered) {
1327 // clip one pixel from bottom right for non popup rendered checkboxes
1328 checkbox_rectangle = new Rectangle(rectangle.X, rectangle.Y, Math.Max(rectangle.Width-1, 0), Math.Max(rectangle.Height-1,0));
1329 fill_rectangle = new Rectangle(checkbox_rectangle.X+1, checkbox_rectangle.Y+1, Math.Max(checkbox_rectangle.Width-3, 0), Math.Max(checkbox_rectangle.Height-3,0));
1331 // clip two pixels from bottom right for non popup rendered checkboxes
1332 checkbox_rectangle = new Rectangle(rectangle.X, rectangle.Y, Math.Max(rectangle.Width-2, 0), Math.Max(rectangle.Height-2,0));
1333 fill_rectangle = new Rectangle(checkbox_rectangle.X+1, checkbox_rectangle.Y+1, Math.Max(checkbox_rectangle.Width-2, 0), Math.Max(checkbox_rectangle.Height-2,0));
1337 // if disabled render in disabled state
1338 if (checkbox.Enabled) {
1339 // process the state of the checkbox
1340 if (checkbox.is_entered || checkbox.Capture) {
1341 // decide on which background color to use
1342 if (checkbox.FlatStyle == FlatStyle.Popup && checkbox.is_entered && checkbox.Capture) {
1343 graphics.FillRectangle(ResPool.GetSolidBrush (checkbox.BackColor), fill_rectangle);
1344 } else if (checkbox.FlatStyle == FlatStyle.Flat) {
1345 if (!checkbox.is_pressed) {
1346 graphics.FillRectangle(ResPool.GetSolidBrush (checkbox.BackColor), fill_rectangle);
1348 graphics.FillRectangle(ResPool.GetSolidBrush (ControlPaint.LightLight (checkbox.BackColor)), fill_rectangle);
1350 // use regular window background color
1351 graphics.FillRectangle(ResPool.GetSolidBrush (ControlPaint.LightLight (checkbox.BackColor)), fill_rectangle);
1354 // render the outer border
1355 if (checkbox.FlatStyle == FlatStyle.Flat) {
1356 ControlPaint.DrawBorder(graphics, checkbox_rectangle, checkbox.ForeColor, ButtonBorderStyle.Solid);
1358 // draw sunken effect
1359 CPDrawBorder3D (graphics, checkbox_rectangle, Border3DStyle.SunkenInner, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, checkbox.BackColor);
1362 graphics.FillRectangle(ResPool.GetSolidBrush (ControlPaint.LightLight (checkbox.BackColor)), fill_rectangle);
1364 if (checkbox.FlatStyle == FlatStyle.Flat) {
1365 ControlPaint.DrawBorder(graphics, checkbox_rectangle, checkbox.ForeColor, ButtonBorderStyle.Solid);
1367 // draw the outer border
1368 ControlPaint.DrawBorder(graphics, checkbox_rectangle, ControlPaint.DarkDark (checkbox.BackColor), ButtonBorderStyle.Solid);
1372 if (checkbox.FlatStyle == FlatStyle.Popup) {
1373 graphics.FillRectangle(SystemBrushes.Control, fill_rectangle);
1376 // draw disabled state,
1377 ControlPaint.DrawBorder(graphics, checkbox_rectangle, ColorControlDark, ButtonBorderStyle.Solid);
1380 if (checkbox.Checked) {
1381 /* Need to draw a check-mark */
1383 /* Make sure we've got at least a line width of 1 */
1384 lineWidth = Math.Max(3, fill_rectangle.Width/3);
1385 Scale=Math.Max(1, fill_rectangle.Width/9);
1387 // flat style check box is rendered inside a rectangle shifted down by one
1388 rect=new Rectangle(fill_rectangle.X, fill_rectangle.Y+1, fill_rectangle.Width, fill_rectangle.Height);
1389 if (checkbox.Enabled) {
1390 pen=ResPool.GetPen(checkbox.ForeColor);
1392 pen=SystemPens.ControlDark;
1395 for (int i=0; i<lineWidth; i++) {
1396 graphics.DrawLine(pen, rect.Left+lineWidth/2, rect.Top+lineWidth+i, rect.Left+lineWidth/2+2*Scale, rect.Top+lineWidth+2*Scale+i);
1397 graphics.DrawLine(pen, rect.Left+lineWidth/2+2*Scale, rect.Top+lineWidth+2*Scale+i, rect.Left+lineWidth/2+6*Scale, rect.Top+lineWidth-2*Scale+i);
1402 private void DrawCheckBox_and_RadioButtonText (ButtonBase button_base, Rectangle text_rectangle, Graphics dc,
1403 StringFormat text_format, Appearance appearance, bool ischecked)
1405 // offset the text if it's pressed and a button
1406 if (appearance == Appearance.Button) {
1407 if (ischecked || (button_base.Capture && button_base.FlatStyle != FlatStyle.Flat)) {
1408 text_rectangle.X ++;
1409 text_rectangle.Y ++;
1412 text_rectangle.Inflate (-4, -4);
1415 /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
1417 // Windows seems to not wrap text in certain situations, this matches as close as I could get it
1418 if ((float)(button_base.Font.Height * 1.5f) > text_rectangle.Height) {
1419 text_format.FormatFlags |= StringFormatFlags.NoWrap;
1421 if (button_base.Enabled) {
1422 dc.DrawString (button_base.Text, button_base.Font, ResPool.GetSolidBrush (button_base.ForeColor), text_rectangle, text_format);
1423 } else if (button_base.FlatStyle == FlatStyle.Flat || button_base.FlatStyle == FlatStyle.Popup) {
1424 dc.DrawString (button_base.Text, button_base.Font, SystemBrushes.ControlDarkDark, text_rectangle, text_format);
1426 CPDrawStringDisabled (dc, button_base.Text, button_base.Font, button_base.BackColor, text_rectangle, text_format);
1429 #endregion // CheckBox
1431 #region CheckedListBox
1433 public override void DrawCheckedListBoxItem (CheckedListBox ctrl, DrawItemEventArgs e)
1435 Color back_color, fore_color;
1436 Rectangle item_rect = e.Bounds;
1441 if ((e.State & DrawItemState.Checked) == DrawItemState.Checked) {
1442 state = ButtonState.Checked;
1443 if ((e.State & DrawItemState.Inactive) == DrawItemState.Inactive)
1444 state |= ButtonState.Inactive;
1446 state = ButtonState.Normal;
1448 if (ctrl.ThreeDCheckBoxes == false)
1449 state |= ButtonState.Flat;
1451 Rectangle checkbox_rect = new Rectangle (2, (item_rect.Height - 11) / 2, 13, 13);
1452 ControlPaint.DrawCheckBox (e.Graphics,
1453 item_rect.X + checkbox_rect.X, item_rect.Y + checkbox_rect.Y,
1454 checkbox_rect.Width, checkbox_rect.Height,
1457 item_rect.X += checkbox_rect.Right;
1458 item_rect.Width -= checkbox_rect.Right;
1461 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
1462 back_color = ColorHighlight;
1463 fore_color = ColorHighlightText;
1466 back_color = e.BackColor;
1467 fore_color = e.ForeColor;
1470 e.Graphics.FillRectangle (ResPool.GetSolidBrush
1471 (back_color), item_rect);
1473 e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
1474 ResPool.GetSolidBrush (fore_color),
1475 item_rect.X, item_rect.Y, ctrl.StringFormat);
1477 if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
1478 CPDrawFocusRectangle (e.Graphics, item_rect,
1479 fore_color, back_color);
1483 #endregion // CheckedListBox
1486 public override void DrawComboBoxItem (ComboBox ctrl, DrawItemEventArgs e)
1488 Color back_color, fore_color;
1489 Rectangle text_draw = e.Bounds;
1490 StringFormat string_format = new StringFormat ();
1491 string_format.FormatFlags = StringFormatFlags.LineLimit;
1493 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
1494 back_color = ColorHighlight;
1495 fore_color = ColorHighlightText;
1498 back_color = e.BackColor;
1499 fore_color = e.ForeColor;
1503 fore_color = ColorInactiveCaptionText;
1505 e.Graphics.FillRectangle (ResPool.GetSolidBrush (back_color), e.Bounds);
1507 if (e.Index != -1) {
1508 e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
1509 ResPool.GetSolidBrush (fore_color),
1510 text_draw, string_format);
1513 if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
1514 CPDrawFocusRectangle (e.Graphics, e.Bounds, fore_color, back_color);
1517 string_format.Dispose ();
1520 public override void DrawFlatStyleComboButton (Graphics graphics, Rectangle rectangle, ButtonState state)
1522 Point[] arrow = new Point[3];
1532 rect=new Rectangle(rectangle.X+rectangle.Width/4, rectangle.Y+rectangle.Height/4, rectangle.Width/2, rectangle.Height/2);
1533 centerX=rect.Left+rect.Width/2;
1534 centerY=rect.Top+rect.Height/2;
1535 shiftX=Math.Max(1, rect.Width/8);
1536 shiftY=Math.Max(1, rect.Height/8);
1538 if ((state & ButtonState.Pushed)!=0) {
1545 P1=new Point(rect.Left + 1, centerY);
1546 P2=new Point(rect.Right - 1, centerY);
1547 P3=new Point(centerX, rect.Bottom - 1);
1553 /* Draw the arrow */
1554 if ((state & ButtonState.Inactive)!=0) {
1555 /* Move away from the shadow */
1556 arrow[0].X += 1; arrow[0].Y += 1;
1557 arrow[1].X += 1; arrow[1].Y += 1;
1558 arrow[2].X += 1; arrow[2].Y += 1;
1560 graphics.FillPolygon(SystemBrushes.ControlLightLight, arrow, FillMode.Winding);
1566 graphics.FillPolygon(SystemBrushes.ControlDark, arrow, FillMode.Winding);
1568 graphics.FillPolygon(SystemBrushes.ControlText, arrow, FillMode.Winding);
1574 public override int DataGridPreferredColumnWidth { get { return 75;} }
1575 public override int DataGridMinimumColumnCheckBoxHeight { get { return 16;} }
1576 public override int DataGridMinimumColumnCheckBoxWidth { get { return 16;} }
1577 public override Color DataGridAlternatingBackColor { get { return ColorWindow;} }
1578 public override Color DataGridBackColor { get { return ColorWindow;} }
1579 public override Color DataGridBackgroundColor { get { return ColorAppWorkspace;} }
1580 public override Color DataGridCaptionBackColor { get { return ColorActiveCaption;} }
1581 public override Color DataGridCaptionForeColor { get { return ColorActiveCaptionText;} }
1582 public override Color DataGridGridLineColor { get { return ColorControl;} }
1583 public override Color DataGridHeaderBackColor { get { return ColorControl;} }
1584 public override Color DataGridHeaderForeColor { get { return ColorControlText;} }
1585 public override Color DataGridLinkColor { get { return ColorHotTrack;} }
1586 public override Color DataGridLinkHoverColor { get { return ColorHotTrack;} }
1587 public override Color DataGridParentRowsBackColor { get { return ColorControl;} }
1588 public override Color DataGridParentRowsForeColor { get { return ColorWindowText;} }
1589 public override Color DataGridSelectionBackColor { get { return ColorActiveCaption;} }
1590 public override Color DataGridSelectionForeColor { get { return ColorActiveCaptionText;} }
1592 public override void DataGridPaint (PaintEventArgs pe, DataGrid grid)
1594 DataGridPaintCaption (pe.Graphics, pe.ClipRectangle, grid);
1595 DataGridPaintParentRows (pe.Graphics, pe.ClipRectangle, grid);
1596 DataGridPaintColumnHeaders (pe.Graphics, pe.ClipRectangle, grid);
1597 DataGridPaintRows (pe.Graphics, grid.cells_area, pe.ClipRectangle, grid);
1599 // Paint scrollBar corner
1600 if (grid.VScrollBar.Visible && grid.HScrollBar.Visible) {
1602 Rectangle corner = new Rectangle (grid.ClientRectangle.X + grid.ClientRectangle.Width - grid.VScrollBar.Width,
1603 grid.ClientRectangle.Y + grid.ClientRectangle.Height - grid.HScrollBar.Height,
1604 grid.VScrollBar.Width, grid.HScrollBar.Height);
1606 if (pe.ClipRectangle.IntersectsWith (corner)) {
1607 pe.Graphics.FillRectangle (ResPool.GetSolidBrush (grid.ParentRowsBackColor),
1613 public override void DataGridPaintCaption (Graphics g, Rectangle clip, DataGrid grid)
1615 Rectangle modified_area = clip;
1616 modified_area.Intersect (grid.caption_area);
1618 g.FillRectangle (ResPool.GetSolidBrush (grid.CaptionBackColor),
1621 Rectangle text_rect = grid.caption_area;
1622 text_rect.Y += text_rect.Height / 2 - grid.CaptionFont.Height / 2;
1623 text_rect.Height = grid.CaptionFont.Height;
1625 g.DrawString (grid.CaptionText, grid.CaptionFont,
1626 ResPool.GetSolidBrush (grid.CaptionForeColor),
1629 if (modified_area.IntersectsWith (grid.back_button_rect)) {
1630 g.DrawImage (grid.back_button_image, grid.back_button_rect);
1631 if (grid.back_button_mouseover) {
1632 CPDrawBorder3D (g, grid.back_button_rect, grid.back_button_active ? Border3DStyle.Sunken : Border3DStyle.Raised, all_sides);
1635 if (modified_area.IntersectsWith (grid.parent_rows_button_rect)) {
1636 g.DrawImage (grid.parent_rows_button_image, grid.parent_rows_button_rect);
1637 if (grid.parent_rows_button_mouseover) {
1638 CPDrawBorder3D (g, grid.parent_rows_button_rect, grid.parent_rows_button_active ? Border3DStyle.Sunken : Border3DStyle.Raised, all_sides);
1643 public override void DataGridPaintColumnHeaders (Graphics g, Rectangle clip, DataGrid grid)
1645 Rectangle columns_area = grid.column_headers_area;
1647 if (grid.CurrentTableStyle.CurrentRowHeadersVisible) { // Paint corner shared between row and column header
1648 Rectangle rect_bloc = grid.column_headers_area;
1649 rect_bloc.Width = grid.RowHeaderWidth;
1650 if (clip.IntersectsWith (rect_bloc)) {
1651 if (grid.VisibleColumnCount > 0)
1652 g.FillRectangle (ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderBackColor), rect_bloc);
1654 g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), rect_bloc);
1657 columns_area.X += grid.RowHeaderWidth;
1658 columns_area.Width -= grid.RowHeaderWidth;
1662 Rectangle column_headers_area_complete = columns_area;
1663 column_headers_area_complete.Width = grid.column_headers_max_width;
1665 if (grid.CurrentTableStyle.CurrentRowHeadersVisible) {
1666 column_headers_area_complete.Width -= grid.RowHeaderWidth;
1669 // Set column painting
1670 Rectangle rect_columnhdr = new Rectangle ();
1672 Region current_clip;
1673 Region prev_clip = g.Clip;
1674 rect_columnhdr.Y = columns_area.Y;
1675 rect_columnhdr.Height = columns_area.Height;
1677 int column_cnt = grid.FirstVisibleColumn + grid.VisibleColumnCount;
1678 for (int column = grid.FirstVisibleColumn; column < column_cnt; column++) {
1679 if (grid.CurrentTableStyle.GridColumnStyles[column].bound == false)
1682 col_pixel = grid.GetColumnStartingPixel (column);
1683 rect_columnhdr.X = columns_area.X + col_pixel - grid.HorizPixelOffset;
1684 rect_columnhdr.Width = grid.CurrentTableStyle.GridColumnStyles[column].Width;
1686 if (clip.IntersectsWith (rect_columnhdr) == false)
1689 current_clip = new Region (rect_columnhdr);
1690 current_clip.Intersect (columns_area);
1691 current_clip.Intersect (prev_clip);
1692 g.Clip = current_clip;
1694 grid.CurrentTableStyle.GridColumnStyles[column].PaintHeader (g, rect_columnhdr, column);
1696 current_clip.Dispose ();
1701 Rectangle not_usedarea = column_headers_area_complete;
1702 not_usedarea.X = rect_columnhdr.X + rect_columnhdr.Width;
1703 not_usedarea.Width = grid.ClientRectangle.X + grid.ClientRectangle.Width - rect_columnhdr.X - rect_columnhdr.Height;
1704 g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), not_usedarea);
1708 public override void DataGridPaintParentRows (Graphics g, Rectangle clip, DataGrid grid)
1710 Rectangle rect_row = new Rectangle ();
1712 rect_row.X = grid.ParentRowsArea.X;
1713 rect_row.Width = grid.ParentRowsArea.Width;
1714 rect_row.Height = (grid.CaptionFont.Height + 3);
1716 object[] parentRows = grid.data_source_stack.ToArray();
1718 Region current_clip;
1719 Region prev_clip = g.Clip;
1720 for (int row = 0; row < parentRows.Length; row++) {
1721 rect_row.Y = grid.ParentRowsArea.Y + row * rect_row.Height;
1723 if (clip.IntersectsWith (rect_row) == false)
1726 current_clip = new Region (rect_row);
1727 current_clip.Intersect (prev_clip);
1728 g.Clip = current_clip;
1730 DataGridPaintParentRow (g, rect_row, (DataGridDataSource)parentRows[parentRows.Length - row - 1], grid);
1732 current_clip.Dispose ();
1738 public override void DataGridPaintParentRow (Graphics g, Rectangle bounds, DataGridDataSource row, DataGrid grid)
1740 //Console.WriteLine ("drawing parent row {0}", row);
1743 g.FillRectangle (ResPool.GetSolidBrush (grid.ParentRowsBackColor),
1746 Font bold_font = new Font (grid.Font.FontFamily, grid.Font.Size, grid.Font.Style | FontStyle.Bold);
1747 // set up some standard string formating variables
1748 StringFormat text_format = new StringFormat();
1749 text_format.LineAlignment = StringAlignment.Center;
1750 text_format.Alignment = StringAlignment.Near;
1752 string table_name = "";
1753 if (row.view is DataRowView)
1754 table_name = ((ITypedList)((DataRowView)row.view).DataView).GetListName (null) + ": ";
1757 Rectangle text_rect;
1760 text_size = g.MeasureString (table_name, bold_font).ToSize();
1761 text_rect = new Rectangle(new Point(bounds.X + 3, bounds.Y + bounds.Height - text_size.Height), text_size);
1763 //Console.WriteLine ("drawing text at {0}", text_rect);
1765 g.DrawString (table_name,
1766 bold_font, ResPool.GetSolidBrush (grid.ParentRowsForeColor), text_rect, text_format);
1768 foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)row.view).GetProperties()) {
1769 if (typeof(IBindingList).IsAssignableFrom (pd.PropertyType))
1772 text_rect.X += text_rect.Size.Width + 5;
1774 string text = String.Format ("{0}: {1}",
1776 pd.GetValue (row.view));
1778 text_rect.Size = g.MeasureString (text, grid.Font).ToSize();
1779 text_rect.Y = bounds.Y + bounds.Height - text_rect.Height; // XXX
1781 //Console.WriteLine ("drawing text at {0}", text_rect);
1784 grid.Font, ResPool.GetSolidBrush (grid.ParentRowsForeColor), text_rect, text_format);
1787 if (grid.FlatMode == false) {
1790 g.DrawLine (ResPool.GetPen (ColorControlLight),
1791 bounds.X, bounds.Y, bounds.X + bounds.Width, bounds.Y);
1793 g.DrawLine (ResPool.GetPen (ColorControlLight),
1794 bounds.X, bounds.Y + 1, bounds.X, bounds.Y + bounds.Height - 1);
1796 g.DrawLine (ResPool.GetPen (ColorControlDark),
1797 bounds.X + bounds.Width - 1, bounds.Y + 1 , bounds.X + bounds.Width - 1, bounds.Y + bounds.Height - 1);
1799 g.DrawLine (ResPool.GetPen (ColorControlDark),
1800 bounds.X, bounds.Y + bounds.Height -1, bounds.X + bounds.Width, bounds.Y + bounds.Height -1);
1804 public override void DataGridPaintRowHeaderArrow (Graphics g, Rectangle bounds, DataGrid grid)
1806 Point[] arrow = new Point[3];
1808 int centerX, centerY, shiftX;
1811 rect = new Rectangle (bounds.X + bounds.Width /4,
1812 bounds.Y + bounds.Height/4, bounds.Width / 2, bounds.Height / 2);
1814 centerX = rect.Left + rect.Width / 2;
1815 centerY = rect.Top + rect.Height / 2;
1816 shiftX = Math.Max (1, rect.Width / 8);
1819 P1 = new Point (centerX, rect.Top - 1);
1820 P2 = new Point (centerX, rect.Bottom);
1821 P3 = new Point (rect.Right, centerY);
1826 g.FillPolygon (ResPool.GetSolidBrush
1827 (grid.CurrentTableStyle.CurrentHeaderForeColor), arrow, FillMode.Winding);
1830 public override void DataGridPaintRowHeader (Graphics g, Rectangle bounds, int row, DataGrid grid)
1832 bool is_add_row = grid.ShowEditRow && row == grid.DataGridRows.Length - 1;
1833 bool is_current_row = row == grid.CurrentCell.RowNumber;
1836 g.FillRectangle (ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderBackColor),
1840 if (is_current_row) {
1841 if (grid.IsChanging) {
1842 g.DrawString ("...", grid.Font,
1843 ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderForeColor),
1846 Rectangle rect = new Rectangle (bounds.X - 2, bounds.Y, 18, 18);
1847 DataGridPaintRowHeaderArrow (g, rect, grid);
1850 else if (is_add_row) {
1851 g.DrawString ("*", grid.Font, ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderForeColor),
1855 if (grid.FlatMode == false && !is_add_row) {
1857 g.DrawLine (ResPool.GetPen (ColorControlLight),
1858 bounds.X, bounds.Y, bounds.X + bounds.Width, bounds.Y);
1860 g.DrawLine (ResPool.GetPen (ColorControlLight),
1861 bounds.X, bounds.Y + 1, bounds.X, bounds.Y + bounds.Height - 1);
1863 g.DrawLine (ResPool.GetPen (ColorControlDark),
1864 bounds.X + bounds.Width - 1, bounds.Y + 1 , bounds.X + bounds.Width - 1, bounds.Y + bounds.Height - 1);
1866 g.DrawLine (ResPool.GetPen (ColorControlDark),
1867 bounds.X, bounds.Y + bounds.Height -1, bounds.X + bounds.Width, bounds.Y + bounds.Height -1);
1871 public override void DataGridPaintRows (Graphics g, Rectangle cells, Rectangle clip, DataGrid grid)
1873 Rectangle rect_row = new Rectangle ();
1874 Rectangle not_usedarea = new Rectangle ();
1876 int rowcnt = grid.VisibleRowCount;
1878 bool showing_add_row = false;
1880 if (grid.RowsCount < grid.DataGridRows.Length) {
1881 /* the table has an add row */
1883 if (grid.FirstVisibleRow + grid.VisibleRowCount >= grid.DataGridRows.Length) {
1884 showing_add_row = true;
1888 rect_row.Width = cells.Width + grid.RowHeadersArea.Width;
1889 for (int r = 0; r < rowcnt; r++) {
1890 int row = grid.FirstVisibleRow + r;
1891 if (row == grid.DataGridRows.Length - 1)
1892 rect_row.Height = grid.DataGridRows[row].Height;
1894 rect_row.Height = grid.DataGridRows[row + 1].VerticalOffset - grid.DataGridRows[row].VerticalOffset;
1895 rect_row.Y = cells.Y + grid.DataGridRows[row].VerticalOffset - grid.DataGridRows[grid.FirstVisibleRow].VerticalOffset;
1896 if (clip.IntersectsWith (rect_row)) {
1897 if (grid.CurrentTableStyle.HasRelations
1898 && !(showing_add_row && row == grid.DataGridRows.Length - 1))
1899 DataGridPaintRelationRow (g, row, rect_row, false, clip, grid);
1901 DataGridPaintRow (g, row, rect_row, showing_add_row && row == grid.DataGridRows.Length - 1, clip, grid);
1906 // the rowcnt == 0 check is needed because
1907 // otherwise we'd draw over the caption on
1908 // empty datasources (since rect_row would be
1911 not_usedarea.Y = cells.Y;
1913 not_usedarea.Y = rect_row.Y + rect_row.Height;
1914 not_usedarea.Height = cells.Y + cells.Height - rect_row.Y - rect_row.Height;
1915 not_usedarea.Width = cells.Width + grid.RowHeadersArea.Width;
1917 g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), not_usedarea);
1920 public override void DataGridPaintRelationRow (Graphics g, int row, Rectangle row_rect, bool is_newrow,
1921 Rectangle clip, DataGrid grid)
1923 Rectangle rect_header;
1924 Rectangle icon_bounds = new Rectangle ();
1925 Pen pen = ThemeEngine.Current.ResPool.GetPen (grid.CurrentTableStyle.ForeColor);
1927 /* paint the header if it's visible and intersects the clip */
1928 if (grid.CurrentTableStyle.CurrentRowHeadersVisible) {
1929 rect_header = row_rect;
1930 rect_header.Width = grid.RowHeaderWidth;
1931 row_rect.X += grid.RowHeaderWidth;
1932 if (clip.IntersectsWith (rect_header)) {
1933 DataGridPaintRowHeader (g, rect_header, row, grid);
1936 icon_bounds = rect_header;
1937 icon_bounds.X += icon_bounds.Width / 2;
1939 icon_bounds.Width = 8;
1940 icon_bounds.Height = 8;
1942 g.DrawRectangle (pen, icon_bounds);
1944 /* the - part of the icon */
1946 icon_bounds.X + 2, icon_bounds.Y + icon_bounds.Height / 2,
1947 icon_bounds.X + icon_bounds.Width - 2, icon_bounds.Y + icon_bounds.Height / 2);
1949 if (!grid.IsExpanded (row)) {
1950 /* the | part of the icon */
1952 icon_bounds.X + icon_bounds.Width / 2, icon_bounds.Y + 2,
1953 icon_bounds.X + icon_bounds.Width / 2, icon_bounds.Y + icon_bounds.Height - 2);
1957 Rectangle nested_rect = row_rect;
1959 if (grid.DataGridRows[row].IsExpanded)
1960 nested_rect.Height -= grid.DataGridRows[row].RelationHeight;
1962 DataGridPaintRowContents (g, row, nested_rect, is_newrow, clip, grid);
1964 if (grid.DataGridRows[row].IsExpanded) {
1965 // XXX we should create this in the
1966 // datagrid and cache it for use by
1967 // the theme instead of doing it each
1968 // time through here
1969 string[] relations = grid.CurrentTableStyle.Relations;
1970 StringBuilder relation_builder = new StringBuilder ("");
1972 for (int i = 0; i < relations.Length; i ++) {
1974 relation_builder.Append ("\n");
1976 relation_builder.Append (relations[i]);
1978 string relation_text = relation_builder.ToString ();
1980 StringFormat string_format = new StringFormat ();
1981 string_format.FormatFlags |= StringFormatFlags.NoWrap;
1984 //Region prev_clip = g.Clip;
1985 //Region current_clip;
1986 Rectangle rect_cell = row_rect;
1988 rect_cell.X = nested_rect.X + grid.GetColumnStartingPixel (grid.FirstVisibleColumn) - grid.HorizPixelOffset;
1989 rect_cell.Y += nested_rect.Height;
1990 rect_cell.Height = grid.DataGridRows[row].RelationHeight;
1992 rect_cell.Width = 0;
1993 int column_cnt = grid.FirstVisibleColumn + grid.VisibleColumnCount;
1994 for (int column = grid.FirstVisibleColumn; column < column_cnt; column++) {
1995 if (grid.CurrentTableStyle.GridColumnStyles[column].bound == false)
1997 rect_cell.Width += grid.CurrentTableStyle.GridColumnStyles[column].Width;
1999 rect_cell.Width = Math.Max (rect_cell.Width, grid.DataGridRows[row].relation_area.Width);
2001 g.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (grid.CurrentTableStyle.BackColor),
2005 /* draw the line leading from the +/- to the relation area */
2006 Rectangle outline = grid.DataGridRows[row].relation_area;
2007 outline.Y = rect_cell.Y;
2011 icon_bounds.X + icon_bounds.Width / 2, icon_bounds.Y + icon_bounds.Height,
2012 icon_bounds.X + icon_bounds.Width / 2, outline.Y + outline.Height / 2);
2015 icon_bounds.X + icon_bounds.Width / 2, outline.Y + outline.Height / 2,
2016 outline.X, outline.Y + outline.Height / 2);
2018 g.DrawRectangle (pen, outline);
2020 g.DrawString (relation_text, grid.LinkFont, ResPool.GetSolidBrush (grid.LinkColor),
2021 outline, string_format);
2023 if (row_rect.X + row_rect.Width > rect_cell.X + rect_cell.Width) {
2024 Rectangle not_usedarea = new Rectangle ();
2025 not_usedarea.X = rect_cell.X + rect_cell.Width;
2026 not_usedarea.Width = row_rect.X + row_rect.Width - rect_cell.X - rect_cell.Width;
2027 not_usedarea.Y = row_rect.Y;
2028 not_usedarea.Height = row_rect.Height;
2029 if (clip.IntersectsWith (not_usedarea))
2030 g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor),
2036 public override void DataGridPaintRowContents (Graphics g, int row, Rectangle row_rect, bool is_newrow,
2037 Rectangle clip, DataGrid grid)
2039 Rectangle rect_cell = new Rectangle ();
2041 Color backcolor, forecolor;
2042 Brush backBrush, foreBrush;
2043 Rectangle not_usedarea = Rectangle.Empty;
2045 rect_cell.Y = row_rect.Y;
2046 rect_cell.Height = row_rect.Height;
2048 if (grid.IsSelected (row)) {
2049 backcolor = grid.SelectionBackColor;
2050 forecolor = grid.SelectionForeColor;
2053 backcolor = grid.BackColor;
2055 backcolor = grid.AlternatingBackColor;
2058 forecolor = grid.ForeColor;
2062 backBrush = ResPool.GetSolidBrush (backcolor);
2063 foreBrush = ResPool.GetSolidBrush (forecolor);
2065 // PaintCells at row, column
2066 int column_cnt = grid.FirstVisibleColumn + grid.VisibleColumnCount;
2068 if (column_cnt > 0) {
2069 Region prev_clip = g.Clip;
2070 Region current_clip;
2072 for (int column = grid.FirstVisibleColumn; column < column_cnt; column++) {
2073 if (grid.CurrentTableStyle.GridColumnStyles[column].bound == false)
2076 col_pixel = grid.GetColumnStartingPixel (column);
2078 rect_cell.X = row_rect.X + col_pixel - grid.HorizPixelOffset;
2079 rect_cell.Width = grid.CurrentTableStyle.GridColumnStyles[column].Width;
2081 if (clip.IntersectsWith (rect_cell)) {
2082 current_clip = new Region (rect_cell);
2083 current_clip.Intersect (row_rect);
2084 current_clip.Intersect (prev_clip);
2085 g.Clip = current_clip;
2088 grid.CurrentTableStyle.GridColumnStyles[column].PaintNewRow (g, rect_cell,
2092 grid.CurrentTableStyle.GridColumnStyles[column].Paint (g, rect_cell, grid.ListManager, row,
2095 grid.RightToLeft == RightToLeft.Yes);
2098 current_clip.Dispose ();
2104 if (row_rect.X + row_rect.Width > rect_cell.X + rect_cell.Width) {
2105 not_usedarea.X = rect_cell.X + rect_cell.Width;
2106 not_usedarea.Width = row_rect.X + row_rect.Width - rect_cell.X - rect_cell.Width;
2107 not_usedarea.Y = row_rect.Y;
2108 not_usedarea.Height = row_rect.Height;
2112 not_usedarea = row_rect;
2115 if (!not_usedarea.IsEmpty && clip.IntersectsWith (not_usedarea))
2116 g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor),
2120 public override void DataGridPaintRow (Graphics g, int row, Rectangle row_rect, bool is_newrow,
2121 Rectangle clip, DataGrid grid)
2123 /* paint the header if it's visible and intersects the clip */
2124 if (grid.CurrentTableStyle.CurrentRowHeadersVisible) {
2125 Rectangle rect_header = row_rect;
2126 rect_header.Width = grid.RowHeaderWidth;
2127 row_rect.X += grid.RowHeaderWidth;
2128 if (clip.IntersectsWith (rect_header)) {
2129 DataGridPaintRowHeader (g, rect_header, row, grid);
2133 DataGridPaintRowContents (g, row, row_rect, is_newrow, clip, grid);
2136 #endregion // Datagrid
2138 #region DateTimePicker
2140 public override void DrawDateTimePicker(Graphics dc, Rectangle clip_rectangle, DateTimePicker dtp)
2143 if (!clip_rectangle.IntersectsWith (dtp.ClientRectangle))
2146 // draw the outer border
2147 Rectangle button_bounds = dtp.ClientRectangle;
2148 this.CPDrawBorder3D (dc, button_bounds, Border3DStyle.Sunken, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, dtp.BackColor);
2150 // deflate by the border width
2151 if (clip_rectangle.IntersectsWith (dtp.drop_down_arrow_rect)) {
2152 button_bounds.Inflate (-2,-2);
2153 if (!dtp.ShowUpDown) {
2154 ButtonState state = dtp.is_drop_down_visible ? ButtonState.Pushed : ButtonState.Normal;
2155 dc.FillRectangle (ResPool.GetSolidBrush (ColorControl), dtp.drop_down_arrow_rect);
2156 this.CPDrawComboButton (
2158 dtp.drop_down_arrow_rect,
2161 ButtonState up_state = dtp.is_up_pressed ? ButtonState.Pushed : ButtonState.Normal;
2162 ButtonState down_state = dtp.is_down_pressed ? ButtonState.Pushed : ButtonState.Normal;
2163 Rectangle up_bounds = dtp.drop_down_arrow_rect;
2164 Rectangle down_bounds = dtp.drop_down_arrow_rect;
2166 up_bounds.Height = up_bounds.Height / 2;
2167 down_bounds.Y = up_bounds.Height;
2168 down_bounds.Height = dtp.Height - up_bounds.Height;
2169 if (down_bounds.Height > up_bounds.Height)
2172 down_bounds.Height -= 1;
2175 up_bounds.Inflate (-1, -1);
2176 down_bounds.Inflate (-1, -1);
2178 ControlPaint.DrawScrollButton (dc, up_bounds, ScrollButton.Up, up_state);
2179 ControlPaint.DrawScrollButton (dc, down_bounds, ScrollButton.Down, down_state);
2183 // render the date part
2184 if (!clip_rectangle.IntersectsWith (dtp.date_area_rect))
2187 // fill the background
2188 dc.FillRectangle (SystemBrushes.Window, dtp.date_area_rect);
2190 // Update date_area_rect if we are drawing the checkbox
2191 Rectangle date_area_rect = dtp.date_area_rect;
2192 if (dtp.ShowCheckBox) {
2193 Rectangle check_box_rect = dtp.CheckBoxRect;
2194 date_area_rect.X = date_area_rect.X + check_box_rect.Width + DateTimePicker.check_box_space * 2;
2195 date_area_rect.Width = date_area_rect.Width - check_box_rect.Width - DateTimePicker.check_box_space * 2;
2197 ButtonState bs = dtp.Checked ? ButtonState.Checked : ButtonState.Normal;
2198 CPDrawCheckBox(dc, check_box_rect, bs);
2200 if (dtp.is_checkbox_selected)
2201 CPDrawFocusRectangle (dc, check_box_rect, dtp.foreground_color, dtp.background_color);
2204 // render each text part
2205 using (StringFormat text_format = StringFormat.GenericTypographic)
2207 text_format.LineAlignment = StringAlignment.Near;
2208 text_format.Alignment = StringAlignment.Near;
2209 text_format.FormatFlags = text_format.FormatFlags | StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox;
2210 text_format.FormatFlags &= ~StringFormatFlags.NoClip;
2212 // Calculate the rectangles for each part
2213 if (dtp.part_data.Length > 0 && dtp.part_data[0].drawing_rectangle.IsEmpty)
2216 for (int i = 0; i < dtp.part_data.Length; i++)
2218 DateTimePicker.PartData fd = dtp.part_data[i];
2219 RectangleF text_rect = new RectangleF();
2220 string text = fd.GetText(dtp.Value);
2221 text_rect.Size = gr.MeasureString (text, dtp.Font, 250, text_format);
2223 text_rect.Width = Math.Max (dtp.CalculateMaxWidth(fd.value, gr, text_format), text_rect.Width);
2226 text_rect.X = dtp.part_data[i - 1].drawing_rectangle.Right;
2228 text_rect.X = date_area_rect.X;
2231 text_rect.Inflate (1, 0);
2232 fd.drawing_rectangle = text_rect;
2236 // draw the text part
2237 Brush text_brush = ResPool.GetSolidBrush (dtp.ShowCheckBox && dtp.Checked == false ?
2238 SystemColors.GrayText : dtp.ForeColor); // Use GrayText if Checked is false
2239 RectangleF clip_rectangleF = clip_rectangle;
2241 for (int i = 0; i < dtp.part_data.Length; i++)
2243 DateTimePicker.PartData fd = dtp.part_data [i];
2246 if (!clip_rectangleF.IntersectsWith (fd.drawing_rectangle))
2249 text = fd.GetText (dtp.Value);
2251 PointF text_position = new PointF ();
2253 RectangleF text_rect;
2255 text_size = dc.MeasureString (text, dtp.Font, 250, text_format);
2256 text_position.X = (fd.drawing_rectangle.Left + fd.drawing_rectangle.Width / 2) - text_size.Width / 2;
2257 text_position.Y = (fd.drawing_rectangle.Top + fd.drawing_rectangle.Height / 2) - text_size.Height / 2;
2258 text_rect = new RectangleF (text_position, text_size);
2259 text_rect = RectangleF.Intersect (text_rect, date_area_rect);
2261 if (text_rect.IsEmpty)
2264 if (text_rect.Right >= date_area_rect.Right)
2265 text_format.FormatFlags &= ~StringFormatFlags.NoClip;
2267 text_format.FormatFlags |= StringFormatFlags.NoClip;
2269 if (fd.is_selected) {
2270 dc.FillRectangle (SystemBrushes.Highlight, text_rect);
2271 dc.DrawString (text, dtp.Font, SystemBrushes.HighlightText, text_rect, text_format);
2274 dc.DrawString (text, dtp.Font, text_brush, text_rect, text_format);
2277 if (fd.drawing_rectangle.Right > date_area_rect.Right)
2278 break; // the next part would be not be visible, so don't draw anything more.
2283 #endregion // DateTimePicker
2286 public override void DrawGroupBox (Graphics dc, Rectangle area, GroupBox box) {
2287 StringFormat text_format;
2292 dc.FillRectangle (GetControlBackBrush (box.BackColor), box.ClientRectangle);
2294 text_format = new StringFormat();
2295 text_format.HotkeyPrefix = HotkeyPrefix.Show;
2297 size = dc.MeasureString (box.Text, box.Font);
2300 if (size.Width > 0) {
2301 width = ((int) size.Width) + 7;
2303 if (width > box.Width - 16)
2304 width = box.Width - 16;
2307 y = box.Font.Height / 2;
2309 // Clip the are that the text will be in
2310 Region prev_clip = dc.Clip;
2311 dc.SetClip (new Rectangle (10, 0, width, box.Font.Height), CombineMode.Exclude);
2313 CPDrawBorder3D (dc, new Rectangle (0, y, box.Width, box.Height - y), Border3DStyle.Etched, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, box.BackColor);
2314 dc.Clip = prev_clip;
2317 if (box.Text.Length != 0) {
2319 dc.DrawString (box.Text, box.Font, ResPool.GetSolidBrush (box.ForeColor), 10, 0, text_format);
2321 CPDrawStringDisabled (dc, box.Text, box.Font, box.BackColor,
2322 new RectangleF (10, 0, width, box.Font.Height), text_format);
2326 text_format.Dispose ();
2329 public override Size GroupBoxDefaultSize {
2331 return new Size (200,100);
2337 public override Size HScrollBarDefaultSize {
2339 return new Size (80, this.ScrollBarButtonSize);
2343 #endregion // HScrollBar
2347 public override void DrawListBoxItem (ListBox ctrl, DrawItemEventArgs e)
2349 Color back_color, fore_color;
2351 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
2352 back_color = ColorHighlight;
2353 fore_color = ColorHighlightText;
2355 back_color = e.BackColor;
2356 fore_color = e.ForeColor;
2359 e.Graphics.FillRectangle (ResPool.GetSolidBrush (back_color), e.Bounds);
2361 e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
2362 ResPool.GetSolidBrush (fore_color),
2363 e.Bounds.X, e.Bounds.Y, ctrl.StringFormat);
2365 if ((e.State & DrawItemState.Focus) == DrawItemState.Focus)
2366 CPDrawFocusRectangle (e.Graphics, e.Bounds, fore_color, back_color);
2373 public override void DrawListViewItems (Graphics dc, Rectangle clip, ListView control)
2375 bool details = control.View == View.Details;
2376 int first = control.FirstVisibleIndex;
2378 for (int i = first; i <= control.LastVisibleIndex; i ++) {
2379 if (clip.IntersectsWith (control.Items[i].GetBounds (ItemBoundsPortion.Entire))) {
2381 bool owner_draw = false;
2382 if (control.OwnerDraw)
2383 owner_draw = DrawListViewItemOwnerDraw (dc, control.Items [i], i);
2386 DrawListViewItem (dc, control, control.Items [i]);
2391 if (control.ShowGroups && control.View != View.List && control.Groups.Count > 0) {
2392 // Use InternalCount instead of Count to take into account Default Group as needed
2393 for (int i = 0; i < control.Groups.InternalCount; i++) {
2394 ListViewGroup group = control.Groups.GetInternalGroup (i);
2395 if (group.ItemCount > 0 && clip.IntersectsWith (group.HeaderBounds))
2396 DrawListViewGroupHeader (dc, control, group);
2400 ListViewInsertionMark insertion_mark = control.InsertionMark;
2401 int insertion_mark_index = insertion_mark.Index;
2402 if (insertion_mark.Bounds != Rectangle.Empty &&
2403 (control.View != View.Details && control.View != View.List) &&
2404 insertion_mark_index > -1 && insertion_mark_index < control.Items.Count) {
2406 Brush brush = ResPool.GetSolidBrush (insertion_mark.Color);
2407 dc.FillRectangle (brush, insertion_mark.Line);
2408 dc.FillPolygon (brush, insertion_mark.TopTriangle);
2409 dc.FillPolygon (brush, insertion_mark.BottomTriangle);
2413 // draw the gridlines
2414 if (details && control.GridLines) {
2415 int top = (control.HeaderStyle == ColumnHeaderStyle.None) ?
2416 2 : control.Font.Height + 2;
2418 // draw vertical gridlines
2419 foreach (ColumnHeader col in control.Columns)
2420 dc.DrawLine (SystemPens.Control,
2421 col.Rect.Right, top,
2422 col.Rect.Right, control.TotalHeight);
2423 // draw horizontal gridlines
2424 ListViewItem last_item = null;
2425 foreach (ListViewItem item in control.Items) {
2426 dc.DrawLine (SystemPens.Control,
2427 item.GetBounds (ItemBoundsPortion.Entire).Left, item.GetBounds (ItemBoundsPortion.Entire).Top,
2428 control.TotalWidth, item.GetBounds (ItemBoundsPortion.Entire).Top);
2432 // draw a line after at the bottom of the last item
2433 if (last_item != null) {
2434 dc.DrawLine (SystemPens.Control,
2435 last_item.GetBounds (ItemBoundsPortion.Entire).Left,
2436 last_item.GetBounds (ItemBoundsPortion.Entire).Bottom,
2438 last_item.GetBounds (ItemBoundsPortion.Entire).Bottom);
2442 // Draw corner between the two scrollbars
2443 if (control.h_scroll.Visible == true && control.v_scroll.Visible == true) {
2444 Rectangle rect = new Rectangle ();
2445 rect.X = control.h_scroll.Location.X + control.h_scroll.Width;
2446 rect.Width = control.v_scroll.Width;
2447 rect.Y = control.v_scroll.Location.Y + control.v_scroll.Height;
2448 rect.Height = control.h_scroll.Height;
2449 dc.FillRectangle (SystemBrushes.Control, rect);
2452 Rectangle box_select_rect = control.item_control.BoxSelectRectangle;
2453 if (!box_select_rect.Size.IsEmpty)
2454 dc.DrawRectangle (ResPool.GetDashPen (ColorControlText, DashStyle.Dot), box_select_rect);
2458 public override void DrawListViewHeader (Graphics dc, Rectangle clip, ListView control)
2460 bool details = (control.View == View.Details);
2462 // border is drawn directly in the Paint method
2463 if (details && control.HeaderStyle != ColumnHeaderStyle.None) {
2464 dc.FillRectangle (SystemBrushes.Control,
2465 0, 0, control.TotalWidth, control.Font.Height + 5);
2466 if (control.Columns.Count > 0) {
2467 foreach (ColumnHeader col in control.Columns) {
2468 Rectangle rect = col.Rect;
2469 rect.X -= control.h_marker;
2472 bool owner_draw = false;
2473 if (control.OwnerDraw)
2474 owner_draw = DrawListViewColumnHeaderOwnerDraw (dc, control, col, rect);
2480 if (control.HeaderStyle == ColumnHeaderStyle.Clickable)
2481 state = col.Pressed ? ButtonState.Pushed : ButtonState.Normal;
2483 state = ButtonState.Flat;
2484 CPDrawButton (dc, rect, state);
2487 if (rect.Width <= 0)
2490 dc.DrawString (col.Text, control.Font,
2491 SystemBrushes.ControlText,
2494 int right = control.GetReorderedColumn (control.Columns.Count - 1).Rect.Right - control.h_marker;
2495 if (right < control.Right) {
2496 Rectangle rect = control.Columns [0].Rect;
2498 rect.Width = control.Right - right;
2500 if (control.HeaderStyle == ColumnHeaderStyle.Clickable)
2501 state = ButtonState.Normal;
2503 state = ButtonState.Flat;
2504 CPDrawButton (dc, rect, state);
2510 public override void DrawListViewHeaderDragDetails (Graphics dc, ListView view, ColumnHeader col, int target_x)
2512 Rectangle rect = col.Rect;
2513 rect.X -= view.h_marker;
2514 Color color = Color.FromArgb (0x7f, ColorControlDark.R, ColorControlDark.G, ColorControlDark.B);
2515 dc.FillRectangle (ResPool.GetSolidBrush (color), rect);
2518 if (rect.Width <= 0)
2520 color = Color.FromArgb (0x7f, ColorControlText.R, ColorControlText.G, ColorControlText.B);
2521 dc.DrawString (col.Text, view.Font, ResPool.GetSolidBrush (color), rect, col.Format);
2522 dc.DrawLine (ResPool.GetSizedPen (ColorHighlight, 2), target_x, 0, target_x, col.Rect.Height);
2526 protected virtual bool DrawListViewColumnHeaderOwnerDraw (Graphics dc, ListView control, ColumnHeader column, Rectangle bounds)
2528 ListViewItemStates state = ListViewItemStates.ShowKeyboardCues;
2530 state |= ListViewItemStates.Selected;
2532 DrawListViewColumnHeaderEventArgs args = new DrawListViewColumnHeaderEventArgs (dc,
2533 bounds, column.Index, column, state, SystemColors.ControlText, ThemeEngine.Current.ColorControl, DefaultFont);
2534 control.OnDrawColumnHeader (args);
2536 return !args.DrawDefault;
2539 protected virtual bool DrawListViewItemOwnerDraw (Graphics dc, ListViewItem item, int index)
2541 ListViewItemStates item_state = ListViewItemStates.ShowKeyboardCues;
2543 item_state |= ListViewItemStates.Selected;
2545 item_state |= ListViewItemStates.Focused;
2547 DrawListViewItemEventArgs args = new DrawListViewItemEventArgs (dc,
2548 item, item.Bounds, index, item_state);
2549 item.ListView.OnDrawItem (args);
2551 if (args.DrawDefault)
2554 if (item.ListView.View == View.Details)
2555 for (int i = 0; i < item.SubItems.Count; i++) {
2556 int count = Math.Min (item.ListView.Columns.Count, item.SubItems.Count);
2558 // Do system drawing for subitems if no owner draw is done
2559 for (int j = 0; j < count; j++)
2560 if (!DrawListViewSubItemOwnerDraw (dc, item, item_state, j))
2561 DrawListViewSubItem (dc, item.ListView, item, j);
2568 protected virtual void DrawListViewItem (Graphics dc, ListView control, ListViewItem item)
2570 Rectangle rect_checkrect = item.CheckRectReal;
2571 Rectangle icon_rect = item.GetBounds (ItemBoundsPortion.Icon);
2572 Rectangle full_rect = item.GetBounds (ItemBoundsPortion.Entire);
2573 Rectangle text_rect = item.GetBounds (ItemBoundsPortion.Label);
2576 // Tile view doesn't support CheckBoxes
2577 if (control.CheckBoxes && control.View != View.Tile) {
2579 if (control.CheckBoxes) {
2581 if (control.StateImageList == null) {
2582 // Make sure we've got at least a line width of 1
2583 int check_wd = Math.Max (3, rect_checkrect.Width / 6);
2584 int scale = Math.Max (1, rect_checkrect.Width / 12);
2586 // set the checkbox background
2587 dc.FillRectangle (SystemBrushes.Window,
2589 // define a rectangle inside the border area
2590 Rectangle rect = new Rectangle (rect_checkrect.X + 2,
2591 rect_checkrect.Y + 2,
2592 rect_checkrect.Width - 4,
2593 rect_checkrect.Height - 4);
2594 Pen pen = ResPool.GetSizedPen (this.ColorWindowText, 2);
2595 dc.DrawRectangle (pen, rect);
2597 // Need to draw a check-mark
2599 Pen check_pen = ResPool.GetSizedPen (this.ColorWindowText, 1);
2600 // adjustments to get the check-mark at the right place
2601 rect.X ++; rect.Y ++;
2602 // following logic is taken from DrawFrameControl method
2603 int x_offset = rect.Width / 5;
2604 int y_offset = rect.Height / 3;
2605 for (int i = 0; i < check_wd; i++) {
2606 dc.DrawLine (check_pen, rect.Left + x_offset,
2607 rect.Top + y_offset + i,
2608 rect.Left + x_offset + 2 * scale,
2609 rect.Top + y_offset + 2 * scale + i);
2610 dc.DrawLine (check_pen,
2611 rect.Left + x_offset + 2 * scale,
2612 rect.Top + y_offset + 2 * scale + i,
2613 rect.Left + x_offset + 6 * scale,
2614 rect.Top + y_offset - 2 * scale + i);
2622 simage_idx = control.StateImageList.Images.Count > 1 ? 1 : -1;
2624 simage_idx = control.StateImageList.Images.Count > 1 ? 1 : 0;
2627 simage_idx = control.StateImageList.Images.Count > 0 ? 0 : -1;
2629 if (simage_idx > -1)
2630 control.StateImageList.Draw (dc, rect_checkrect.Location, simage_idx);
2634 ImageList image_list = control.View == View.LargeIcon
2636 || control.View == View.Tile
2638 ? control.LargeImageList : control.SmallImageList;
2639 if (image_list != null) {
2643 if (item.ImageKey != String.Empty)
2644 idx = image_list.Images.IndexOfKey (item.ImageKey);
2647 idx = item.ImageIndex;
2649 if (idx > -1 && idx < image_list.Images.Count)
2650 image_list.Draw (dc, icon_rect.Location, idx);
2653 // draw the item text
2654 // format for the item text
2655 StringFormat format = new StringFormat ();
2656 if (control.View == View.SmallIcon || control.View == View.LargeIcon)
2657 format.LineAlignment = StringAlignment.Near;
2659 format.LineAlignment = StringAlignment.Center;
2660 if (control.View == View.LargeIcon)
2661 format.Alignment = StringAlignment.Center;
2663 format.Alignment = StringAlignment.Near;
2665 if (control.LabelWrap)
2666 format.FormatFlags = StringFormatFlags.LineLimit;
2668 format.FormatFlags = StringFormatFlags.NoWrap;
2670 if ((control.View == View.LargeIcon && !item.Focused)
2671 || control.View == View.Details
2673 || control.View == View.Tile
2676 format.Trimming = StringTrimming.EllipsisCharacter;
2678 Rectangle highlight_rect = text_rect;
2679 if (control.View == View.Details) { // Adjustments for Details view
2680 Size text_size = Size.Ceiling (dc.MeasureString (item.Text, item.Font));
2682 if (!control.FullRowSelect) // Selection shouldn't be outside the item bounds
2683 highlight_rect.Width = Math.Min (text_size.Width + 4, text_rect.Width);
2686 if (item.Selected && control.Focused)
2687 dc.FillRectangle (SystemBrushes.Highlight, highlight_rect);
2688 else if (item.Selected && !control.HideSelection)
2689 dc.FillRectangle (SystemBrushes.Control, highlight_rect);
2691 dc.FillRectangle (ResPool.GetSolidBrush (item.BackColor), text_rect);
2694 !control.Enabled ? SystemBrushes.ControlLight :
2695 (item.Selected && control.Focused) ? SystemBrushes.HighlightText :
2696 this.ResPool.GetSolidBrush (item.ForeColor);
2699 // Tile view renders its Text in a different fashion
2700 if (control.View == View.Tile) {
2701 // Item.Text is drawn using its first subitem's bounds
2702 dc.DrawString (item.Text, item.Font, textBrush, item.SubItems [0].Bounds, format);
2704 int count = Math.Min (control.Columns.Count, item.SubItems.Count);
2705 for (int i = 1; i < count; i++) {
2706 ListViewItem.ListViewSubItem sub_item = item.SubItems [i];
2707 if (sub_item.Text == null || sub_item.Text.Length == 0)
2710 Brush itemBrush = item.Selected && control.Focused ?
2711 SystemBrushes.HighlightText : GetControlForeBrush (sub_item.ForeColor);
2712 dc.DrawString (sub_item.Text, sub_item.Font, itemBrush, sub_item.Bounds, format);
2717 if (item.Text != null && item.Text.Length > 0) {
2718 Font font = item.Font;
2720 if (control.HotTracking && item.Hot)
2721 font = item.HotFont;
2724 if (item.Selected && control.Focused)
2725 dc.DrawString (item.Text, font, textBrush, highlight_rect, format);
2727 dc.DrawString (item.Text, font, textBrush, text_rect, format);
2730 if (control.View == View.Details && control.Columns.Count > 0) {
2731 // draw subitems for details view
2732 ListViewItem.ListViewSubItemCollection subItems = item.SubItems;
2733 int count = (control.Columns.Count < subItems.Count ?
2734 control.Columns.Count : subItems.Count);
2737 // 0th subitem is the item already drawn
2738 for (int index = 1; index < count; index++)
2739 DrawListViewSubItem (dc, control, item, index);
2741 // Fill in selection for remaining columns if Column.Count > SubItems.Count
2743 Rectangle sub_item_rect = text_rect;
2744 if (item.Selected && (control.Focused || !control.HideSelection) && control.FullRowSelect) {
2745 for (int index = count; index < control.Columns.Count; index++) {
2746 col = control.Columns [index];
2747 sub_item_rect.X = col.Rect.X - control.h_marker;
2748 sub_item_rect.Width = col.Wd;
2749 if (control.Focused)
2750 dc.FillRectangle (SystemBrushes.Highlight, sub_item_rect);
2752 dc.FillRectangle (SystemBrushes.Control, sub_item_rect);
2758 if (item.Focused && control.Focused) {
2759 Rectangle focus_rect = highlight_rect;
2760 if (control.FullRowSelect && control.View == View.Details) {
2762 foreach (ColumnHeader col in control.Columns)
2764 focus_rect = new Rectangle (0, full_rect.Y, width, full_rect.Height);
2767 CPDrawFocusRectangle (dc, focus_rect, ColorHighlightText, ColorHighlight);
2769 CPDrawFocusRectangle (dc, focus_rect, control.ForeColor, control.BackColor);
2775 protected virtual void DrawListViewSubItem (Graphics dc, ListView control, ListViewItem item, int index)
2777 ListViewItem.ListViewSubItem subItem = item.SubItems [index];
2778 ColumnHeader col = control.Columns [index];
2779 StringFormat format = new StringFormat ();
2780 format.Alignment = col.Format.Alignment;
2781 format.FormatFlags = StringFormatFlags.NoWrap;
2782 format.Trimming = StringTrimming.EllipsisCharacter;
2784 Rectangle sub_item_rect = subItem.Bounds;
2785 Rectangle sub_item_text_rect = sub_item_rect;
2786 sub_item_text_rect.X += 3;
2787 sub_item_text_rect.Width -= ListViewItemPaddingWidth;
2789 SolidBrush sub_item_back_br = null;
2790 SolidBrush sub_item_fore_br = null;
2791 Font sub_item_font = null;
2793 if (item.UseItemStyleForSubItems) {
2794 sub_item_back_br = ResPool.GetSolidBrush (item.BackColor);
2795 sub_item_fore_br = ResPool.GetSolidBrush (item.ForeColor);
2797 // Hot tracking for subitems only applies when UseStyle is true
2798 if (control.HotTracking && item.Hot)
2799 sub_item_font = item.HotFont;
2802 sub_item_font = item.Font;
2804 sub_item_back_br = ResPool.GetSolidBrush (subItem.BackColor);
2805 sub_item_fore_br = ResPool.GetSolidBrush (subItem.ForeColor);
2806 sub_item_font = subItem.Font;
2809 if (item.Selected && (control.Focused || !control.HideSelection) && control.FullRowSelect) {
2811 if (control.Focused) {
2812 bg = SystemBrushes.Highlight;
2813 text = SystemBrushes.HighlightText;
2815 bg = SystemBrushes.Control;
2816 text = sub_item_fore_br;
2820 dc.FillRectangle (bg, sub_item_rect);
2821 if (subItem.Text != null && subItem.Text.Length > 0)
2822 dc.DrawString (subItem.Text, sub_item_font,
2823 text, sub_item_text_rect, format);
2825 dc.FillRectangle (sub_item_back_br, sub_item_rect);
2826 if (subItem.Text != null && subItem.Text.Length > 0)
2827 dc.DrawString (subItem.Text, sub_item_font,
2829 sub_item_text_rect, format);
2836 protected virtual bool DrawListViewSubItemOwnerDraw (Graphics dc, ListViewItem item, ListViewItemStates state, int index)
2838 ListView control = item.ListView;
2839 ListViewItem.ListViewSubItem subitem = item.SubItems [index];
2841 DrawListViewSubItemEventArgs args = new DrawListViewSubItemEventArgs (dc, subitem.Bounds, item,
2842 subitem, item.Index, index, control.Columns [index], state);
2843 control.OnDrawSubItem (args);
2845 return !args.DrawDefault;
2848 protected virtual void DrawListViewGroupHeader (Graphics dc, ListView control, ListViewGroup group)
2850 Rectangle text_bounds = group.HeaderBounds;
2851 Rectangle header_bounds = group.HeaderBounds;
2852 text_bounds.Offset (8, 0);
2853 text_bounds.Inflate (-8, 0);
2854 Size text_size = control.text_size;
2856 Font font = new Font (control.Font, control.Font.Style | FontStyle.Bold);
2857 Brush brush = new LinearGradientBrush (new Point (header_bounds.Left, 0), new Point (header_bounds.Left + ListViewGroupLineWidth, 0),
2858 SystemColors.Desktop, Color.White);
2859 Pen pen = new Pen (brush);
2861 StringFormat sformat = new StringFormat ();
2862 switch (group.HeaderAlignment) {
2863 case HorizontalAlignment.Left:
2864 sformat.Alignment = StringAlignment.Near;
2866 case HorizontalAlignment.Center:
2867 sformat.Alignment = StringAlignment.Center;
2869 case HorizontalAlignment.Right:
2870 sformat.Alignment = StringAlignment.Far;
2874 sformat.LineAlignment = StringAlignment.Near;
2875 dc.DrawString (group.Header, font, SystemBrushes.ControlText, text_bounds, sformat);
2876 dc.DrawLine (pen, header_bounds.Left, header_bounds.Top + text_size.Height, header_bounds.Left + ListViewGroupLineWidth,
2877 header_bounds.Top + text_size.Height);
2887 public override Size ListViewCheckBoxSize {
2888 get { return new Size (16, 16); }
2891 public override int ListViewColumnHeaderHeight {
2895 public override int ListViewDefaultColumnWidth {
2899 public override int ListViewVerticalSpacing {
2903 public override int ListViewEmptyColumnWidth {
2907 public override int ListViewHorizontalSpacing {
2911 public override int ListViewItemPaddingWidth {
2915 public override Size ListViewDefaultSize {
2916 get { return new Size (121, 97); }
2919 public override int ListViewGroupHeight {
2923 public int ListViewGroupLineWidth {
2927 public override int ListViewTileWidthFactor {
2931 public override int ListViewTileHeightFactor {
2934 #endregion // ListView
2938 public override void CalcItemSize (Graphics dc, MenuItem item, int y, int x, bool menuBar)
2943 if (item.Visible == false) {
2949 if (item.Separator == true) {
2950 item.Height = SEPARATOR_HEIGHT;
2951 item.Width = SEPARATOR_MIN_WIDTH;
2955 if (item.MeasureEventDefined) {
2956 MeasureItemEventArgs mi = new MeasureItemEventArgs (dc, item.Index);
2957 item.PerformMeasureItem (mi);
2958 item.Height = mi.ItemHeight;
2959 item.Width = mi.ItemWidth;
2963 size = dc.MeasureString (item.Text, MenuFont, int.MaxValue, string_format_menu_text);
2964 item.Width = (int) size.Width;
2965 item.Height = (int) size.Height;
2968 if (item.Shortcut != Shortcut.None && item.ShowShortcut) {
2969 item.XTab = MenuCheckSize.Width + MENU_TAB_SPACE + (int) size.Width;
2970 size = dc.MeasureString (" " + item.GetShortCutText (), MenuFont);
2971 item.Width += MENU_TAB_SPACE + (int) size.Width;
2974 item.Width += 4 + (MenuCheckSize.Width * 2);
2976 item.Width += MENU_BAR_ITEMS_SPACE;
2980 if (item.Height < MenuHeight)
2981 item.Height = MenuHeight;
2985 // Updates the menu rect and returns the height
2986 public override int CalcMenuBarSize (Graphics dc, Menu menu, int width)
2992 foreach (MenuItem item in menu.MenuItems) {
2994 CalcItemSize (dc, item, y, x, true);
2996 if (x + item.Width > width) {
3004 item.MenuBar = true;
3006 if (y + item.Height > menu.Height)
3007 menu.Height = item.Height + y;
3014 public override void CalcPopupMenuSize (Graphics dc, Menu menu)
3022 while (start < menu.MenuItems.Count) {
3025 for (i = start; i < menu.MenuItems.Count; i++) {
3026 MenuItem item = menu.MenuItems [i];
3028 if ((i != start) && (item.Break || item.BarBreak))
3031 CalcItemSize (dc, item, y, x, false);
3034 if (item.Width > max)
3038 // Replace the -1 by the menu width (separators)
3039 for (n = start; n < i; n++, start++)
3040 menu.MenuItems [n].Width = max;
3042 if (y > menu.Height)
3054 menu.Width += SM_CXBORDER;
3055 menu.Height += SM_CYBORDER;
3058 // Draws a menu bar in a window
3059 public override void DrawMenuBar (Graphics dc, Menu menu, Rectangle rect)
3061 if (menu.Height == 0)
3062 CalcMenuBarSize (dc, menu, rect.Width);
3064 bool keynav = (menu as MainMenu).tracker.hotkey_active;
3065 HotkeyPrefix hp = MenuAccessKeysUnderlined || keynav ? HotkeyPrefix.Show : HotkeyPrefix.Hide;
3066 string_format_menu_menubar_text.HotkeyPrefix = hp;
3067 string_format_menu_text.HotkeyPrefix = hp;
3069 rect.Height = menu.Height;
3070 dc.FillRectangle (SystemBrushes.Menu, rect);
3072 for (int i = 0; i < menu.MenuItems.Count; i++) {
3073 MenuItem item = menu.MenuItems [i];
3074 Rectangle item_rect = item.bounds;
3075 item_rect.X += rect.X;
3076 item_rect.Y += rect.Y;
3077 item.MenuHeight = menu.Height;
3078 item.PerformDrawItem (new DrawItemEventArgs (dc, MenuFont, item_rect, i, item.Status));
3082 protected Bitmap CreateGlyphBitmap (Size size, MenuGlyph glyph, Color color)
3085 if (color.R == 0 && color.G == 0 && color.B == 0)
3086 bg_color = Color.White;
3088 bg_color = Color.Black;
3090 Bitmap bmp = new Bitmap (size.Width, size.Height);
3091 Graphics gr = Graphics.FromImage (bmp);
3092 Rectangle rect = new Rectangle (Point.Empty, size);
3093 gr.FillRectangle (ResPool.GetSolidBrush (bg_color), rect);
3094 CPDrawMenuGlyph (gr, rect, glyph, color, Color.Empty);
3095 bmp.MakeTransparent (bg_color);
3101 public override void DrawMenuItem (MenuItem item, DrawItemEventArgs e)
3103 StringFormat string_format;
3104 Rectangle rect_text = e.Bounds;
3106 if (item.Visible == false)
3110 string_format = string_format_menu_menubar_text;
3112 string_format = string_format_menu_text;
3114 if (item.Separator == true) {
3115 int liney = e.Bounds.Y + (e.Bounds.Height / 2);
3117 e.Graphics.DrawLine (SystemPens.ControlDark,
3118 e.Bounds.X, liney, e.Bounds.X + e.Bounds.Width, liney);
3120 e.Graphics.DrawLine (SystemPens.ControlLight,
3121 e.Bounds.X, liney + 1, e.Bounds.X + e.Bounds.Width, liney + 1);
3127 rect_text.X += MenuCheckSize.Width;
3129 if (item.BarBreak) { /* Draw vertical break bar*/
3130 Rectangle rect = e.Bounds;
3133 rect.Height = item.MenuHeight - 6;
3135 e.Graphics.DrawLine (SystemPens.ControlDark,
3136 rect.X, rect.Y , rect.X, rect.Y + rect.Height);
3138 e.Graphics.DrawLine (SystemPens.ControlLight,
3139 rect.X + 1, rect.Y , rect.X +1, rect.Y + rect.Height);
3144 Brush brush_text = null;
3145 Brush brush_back = null;
3147 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected && !item.MenuBar) {
3148 color_text = ColorHighlightText;
3149 color_back = ColorHighlight;
3150 brush_text = SystemBrushes.HighlightText;
3151 brush_back = SystemBrushes.Highlight;
3153 color_text = ColorMenuText;
3154 color_back = ColorMenu;
3155 brush_text = ResPool.GetSolidBrush (ColorMenuText);
3156 brush_back = SystemBrushes.Menu;
3159 /* Draw background */
3161 e.Graphics.FillRectangle (brush_back, e.Bounds);
3164 e.Graphics.DrawString (item.Text, e.Font,
3166 rect_text, string_format);
3168 if (!item.MenuBar && item.Shortcut != Shortcut.None && item.ShowShortcut) {
3169 string str = item.GetShortCutText ();
3170 Rectangle rect = rect_text;
3172 rect.Width -= item.XTab;
3174 e.Graphics.DrawString (str, e.Font, brush_text,
3175 rect, string_format_menu_shortcut);
3179 Border3DStyle border_style = Border3DStyle.Adjust;
3180 if ((item.Status & DrawItemState.HotLight) != 0)
3181 border_style = Border3DStyle.RaisedInner;
3182 else if ((item.Status & DrawItemState.Selected) != 0)
3183 border_style = Border3DStyle.SunkenOuter;
3185 if (border_style != Border3DStyle.Adjust)
3186 CPDrawBorder3D(e.Graphics, e.Bounds, border_style, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, ColorMenu);
3189 if ((item.Status & DrawItemState.Selected) != DrawItemState.Selected) {
3190 e.Graphics.DrawString (item.Text, e.Font, Brushes.White,
3191 new RectangleF(rect_text.X + 1, rect_text.Y + 1, rect_text.Width, rect_text.Height),
3195 e.Graphics.DrawString (item.Text, e.Font, ResPool.GetSolidBrush(ColorGrayText), rect_text, string_format);
3199 if (item.MenuBar == false && (item.IsPopup || item.MdiList)) {
3201 int cx = MenuCheckSize.Width;
3202 int cy = MenuCheckSize.Height;
3203 Bitmap bmp = CreateGlyphBitmap (new Size (cx, cy), MenuGlyph.Arrow, color_text);
3206 e.Graphics.DrawImage (bmp, e.Bounds.X + e.Bounds.Width - cx,
3207 e.Bounds.Y + ((e.Bounds.Height - cy) /2));
3209 ControlPaint.DrawImageDisabled (e.Graphics, bmp, e.Bounds.X + e.Bounds.Width - cx,
3210 e.Bounds.Y + ((e.Bounds.Height - cy) /2), color_back);
3216 /* Draw checked or radio */
3217 if (item.MenuBar == false && item.Checked) {
3219 Rectangle area = e.Bounds;
3220 int cx = MenuCheckSize.Width;
3221 int cy = MenuCheckSize.Height;
3222 Bitmap bmp = CreateGlyphBitmap (new Size (cx, cy), item.RadioCheck ? MenuGlyph.Bullet : MenuGlyph.Checkmark, color_text);
3224 e.Graphics.DrawImage (bmp, area.X, e.Bounds.Y + ((e.Bounds.Height - cy) / 2));
3230 public override void DrawPopupMenu (Graphics dc, Menu menu, Rectangle cliparea, Rectangle rect)
3232 // Fill rectangle area
3233 dc.FillRectangle (SystemBrushes.Menu, cliparea);
3235 // Draw menu borders
3236 CPDrawBorder3D (dc, rect, Border3DStyle.Raised, all_sides);
3239 for (int i = 0; i < menu.MenuItems.Count; i++) {
3240 if (cliparea.IntersectsWith (menu.MenuItems [i].bounds)) {
3241 MenuItem item = menu.MenuItems [i];
3242 item.MenuHeight = menu.Height;
3243 item.PerformDrawItem (new DrawItemEventArgs (dc, MenuFont, item.bounds, i, item.Status));
3250 #region MonthCalendar
3252 // draw the month calendar
3253 public override void DrawMonthCalendar(Graphics dc, Rectangle clip_rectangle, MonthCalendar mc)
3255 Rectangle client_rectangle = mc.ClientRectangle;
3256 Size month_size = mc.SingleMonthSize;
3257 // cache local copies of Marshal-by-ref internal members (gets around error CS0197)
3258 Size calendar_spacing = (Size)((object)mc.calendar_spacing);
3259 Size date_cell_size = (Size)((object)mc.date_cell_size);
3261 // draw the singlecalendars
3264 // adjust for the position of the specific month
3265 for (int i=0; i < mc.CalendarDimensions.Height; i++)
3269 y_offset += month_size.Height + calendar_spacing.Height;
3271 // now adjust for x position
3272 for (int j=0; j < mc.CalendarDimensions.Width; j++)
3276 x_offset += month_size.Width + calendar_spacing.Width;
3283 Rectangle month_rect = new Rectangle (x_offset, y_offset, month_size.Width, month_size.Height);
3284 if (month_rect.IntersectsWith (clip_rectangle)) {
3296 Rectangle bottom_rect = new Rectangle (
3298 Math.Max(client_rectangle.Bottom - date_cell_size.Height - 3, 0),
3299 client_rectangle.Width,
3300 date_cell_size.Height + 2);
3301 // draw the today date if it's set
3302 if (mc.ShowToday && bottom_rect.IntersectsWith (clip_rectangle))
3304 dc.FillRectangle (GetControlBackBrush (mc.BackColor), bottom_rect);
3306 int today_offset = 5;
3307 if (mc.ShowTodayCircle)
3309 Rectangle today_circle_rect = new Rectangle (
3310 client_rectangle.X + 5,
3311 Math.Max(client_rectangle.Bottom - date_cell_size.Height - 2, 0),
3312 date_cell_size.Width,
3313 date_cell_size.Height);
3314 DrawTodayCircle (dc, today_circle_rect);
3315 today_offset += date_cell_size.Width + 5;
3317 // draw today's date
3318 StringFormat text_format = new StringFormat();
3319 text_format.LineAlignment = StringAlignment.Center;
3320 text_format.Alignment = StringAlignment.Near;
3321 Rectangle today_rect = new Rectangle (
3322 today_offset + client_rectangle.X,
3323 Math.Max(client_rectangle.Bottom - date_cell_size.Height, 0),
3324 Math.Max(client_rectangle.Width - today_offset, 0),
3325 date_cell_size.Height);
3326 dc.DrawString ("Today: " + DateTime.Now.ToShortDateString(), mc.bold_font, GetControlForeBrush (mc.ForeColor), today_rect, text_format);
3327 text_format.Dispose ();
3333 if (mc.owner == null)
3334 border_brush = GetControlBackBrush (mc.BackColor);
3336 border_brush = SystemBrushes.ControlDarkDark;
3338 // finally paint the borders of the calendars as required
3339 for (int i = 0; i <= mc.CalendarDimensions.Width; i++) {
3340 if (i == 0 && clip_rectangle.X == client_rectangle.X) {
3341 dc.FillRectangle (border_brush, client_rectangle.X, client_rectangle.Y, 1, client_rectangle.Height);
3342 } else if (i == mc.CalendarDimensions.Width && clip_rectangle.Right == client_rectangle.Right) {
3343 dc.FillRectangle (border_brush, client_rectangle.Right - 1, client_rectangle.Y, 1, client_rectangle.Height);
3345 Rectangle rect = new Rectangle (
3346 client_rectangle.X + (month_size.Width*i) + (calendar_spacing.Width * (i-1)) + 1,
3348 calendar_spacing.Width,
3349 client_rectangle.Height);
3350 if (i < mc.CalendarDimensions.Width && i > 0 && clip_rectangle.IntersectsWith (rect)) {
3351 dc.FillRectangle (border_brush, rect);
3355 for (int i = 0; i <= mc.CalendarDimensions.Height; i++) {
3356 if (i == 0 && clip_rectangle.Y == client_rectangle.Y) {
3357 dc.FillRectangle (border_brush, client_rectangle.X, client_rectangle.Y, client_rectangle.Width, 1);
3358 } else if (i == mc.CalendarDimensions.Height && clip_rectangle.Bottom == client_rectangle.Bottom) {
3359 dc.FillRectangle (border_brush, client_rectangle.X, client_rectangle.Bottom - 1, client_rectangle.Width, 1);
3361 Rectangle rect = new Rectangle (
3363 client_rectangle.Y + (month_size.Height*i) + (calendar_spacing.Height*(i-1)) + 1,
3364 client_rectangle.Width,
3365 calendar_spacing.Height);
3366 if (i < mc.CalendarDimensions.Height && i > 0 && clip_rectangle.IntersectsWith (rect)) {
3367 dc.FillRectangle (border_brush, rect);
3372 // draw the drop down border if need
3373 if (mc.owner != null) {
3374 Rectangle bounds = mc.ClientRectangle;
3375 if (clip_rectangle.Contains (mc.Location)) {
3376 // find out if top or left line to draw
3377 if(clip_rectangle.Contains (new Point (bounds.Left, bounds.Bottom))) {
3379 dc.DrawLine (SystemPens.ControlText, bounds.X, bounds.Y, bounds.X, bounds.Bottom-1);
3381 if(clip_rectangle.Contains (new Point (bounds.Right, bounds.Y))) {
3382 dc.DrawLine (SystemPens.ControlText, bounds.X, bounds.Y, bounds.Right-1, bounds.Y);
3385 if (clip_rectangle.Contains (new Point(bounds.Right, bounds.Bottom))) {
3386 // find out if bottom or right line to draw
3387 if(clip_rectangle.Contains (new Point (bounds.Left, bounds.Bottom))) {
3388 dc.DrawLine (SystemPens.ControlText, bounds.X, bounds.Bottom-1, bounds.Right-1, bounds.Bottom-1);
3390 if(clip_rectangle.Contains (new Point (bounds.Right, bounds.Y))) {
3391 dc.DrawLine (SystemPens.ControlText, bounds.Right-1, bounds.Y, bounds.Right-1, bounds.Bottom-1);
3397 // darws a single part of the month calendar (with one month)
3398 private void DrawSingleMonth(Graphics dc, Rectangle clip_rectangle, Rectangle rectangle, MonthCalendar mc, int row, int col)
3400 // cache local copies of Marshal-by-ref internal members (gets around error CS0197)
3401 Size title_size = (Size)((object)mc.title_size);
3402 Size date_cell_size = (Size)((object)mc.date_cell_size);
3403 DateTime current_month = (DateTime)((object)mc.current_month);
3404 DateTime sunday = new DateTime(2006, 10, 1);
3406 // draw the title back ground
3407 DateTime this_month = current_month.AddMonths (row*mc.CalendarDimensions.Width+col);
3408 Rectangle title_rect = new Rectangle(rectangle.X, rectangle.Y, title_size.Width, title_size.Height);
3409 if (title_rect.IntersectsWith (clip_rectangle)) {
3410 dc.FillRectangle (ResPool.GetSolidBrush (mc.TitleBackColor), title_rect);
3412 string title_text = this_month.ToString ("MMMM yyyy");
3413 dc.DrawString (title_text, mc.bold_font, ResPool.GetSolidBrush (mc.TitleForeColor), title_rect, mc.centered_format);
3415 if (mc.ShowYearUpDown) {
3416 Rectangle year_rect;
3417 Rectangle upRect, downRect;
3418 ButtonState upState, downState;
3420 mc.GetYearNameRectangles (title_rect, row * mc.CalendarDimensions.Width + col, out year_rect, out upRect, out downRect);
3421 dc.FillRectangle (ResPool.GetSolidBrush (SystemColors.Control), year_rect);
3422 dc.DrawString (this_month.ToString ("yyyy"), mc.bold_font, ResPool.GetSolidBrush (Color.Black), year_rect, mc.centered_format);
3424 upState = mc.IsYearGoingUp ? ButtonState.Pushed : ButtonState.Normal;
3425 downState = mc.IsYearGoingDown ? ButtonState.Pushed : ButtonState.Normal;
3427 ControlPaint.DrawScrollButton (dc, upRect, ScrollButton.Up, upState);
3428 ControlPaint.DrawScrollButton (dc, downRect, ScrollButton.Down, downState);
3431 // draw previous and next buttons if it's time
3432 if (row == 0 && col == 0)
3434 // draw previous button
3435 DrawMonthCalendarButton (
3441 (System.Drawing.Size)((object)mc.button_size),
3444 if (row == 0 && col == mc.CalendarDimensions.Width-1)
3447 DrawMonthCalendarButton (
3453 (System.Drawing.Size)((object)mc.button_size),
3458 // set the week offset and draw week nums if needed
3459 int col_offset = (mc.ShowWeekNumbers) ? 1 : 0;
3460 Rectangle day_name_rect = new Rectangle(
3462 rectangle.Y + title_size.Height,
3463 (7 + col_offset) * date_cell_size.Width,
3464 date_cell_size.Height);
3465 if (day_name_rect.IntersectsWith (clip_rectangle)) {
3466 dc.FillRectangle (GetControlBackBrush (mc.BackColor), day_name_rect);
3467 // draw the day names
3468 DayOfWeek first_day_of_week = mc.GetDayOfWeek(mc.FirstDayOfWeek);
3469 for (int i=0; i < 7; i++)
3471 int position = i - (int) first_day_of_week;
3474 position = 7 + position;
3477 Rectangle day_rect = new Rectangle(
3478 day_name_rect.X + ((i + col_offset)* date_cell_size.Width),
3480 date_cell_size.Width,
3481 date_cell_size.Height);
3482 dc.DrawString (sunday.AddDays (i + (int) first_day_of_week).ToString ("ddd"), mc.Font, ResPool.GetSolidBrush (mc.TitleBackColor), day_rect, mc.centered_format);
3485 // draw the vertical divider
3486 int vert_divider_y = Math.Max(title_size.Height+ date_cell_size.Height-1, 0);
3488 ResPool.GetPen (mc.ForeColor),
3489 rectangle.X + (col_offset * date_cell_size.Width) + mc.divider_line_offset,
3490 rectangle.Y + vert_divider_y,
3491 rectangle.Right - mc.divider_line_offset,
3492 rectangle.Y + vert_divider_y);
3496 // draw the actual date items in the grid (including the week numbers)
3497 Rectangle date_rect = new Rectangle (
3499 rectangle.Y + title_size.Height + date_cell_size.Height,
3500 date_cell_size.Width,
3501 date_cell_size.Height);
3502 int month_row_count = 0;
3503 bool draw_week_num_divider = false;
3504 DateTime current_date = mc.GetFirstDateInMonthGrid ( new DateTime (this_month.Year, this_month.Month, 1));
3505 for (int i=0; i < 6; i++)
3507 // establish if this row is in our clip_area
3508 Rectangle row_rect = new Rectangle (
3510 rectangle.Y + title_size.Height + (date_cell_size.Height * (i+1)),
3511 date_cell_size.Width * 7,
3512 date_cell_size.Height);
3513 if (mc.ShowWeekNumbers) {
3514 row_rect.Width += date_cell_size.Width;
3517 bool draw_row = row_rect.IntersectsWith (clip_rectangle);
3519 dc.FillRectangle (GetControlBackBrush (mc.BackColor), row_rect);
3521 // establish if this is a valid week to draw
3522 if (mc.IsValidWeekToDraw (this_month, current_date, row, col)) {
3523 month_row_count = i;
3526 // draw the week number if required
3527 if (mc.ShowWeekNumbers && month_row_count == i) {
3528 if (!draw_week_num_divider) {
3529 draw_week_num_divider = draw_row;
3531 // get the week for this row
3532 int week = mc.GetWeekOfYear (current_date);
3538 ResPool.GetSolidBrush (mc.TitleBackColor),
3540 mc.centered_format);
3542 date_rect.Offset(date_cell_size.Width, 0);
3545 // only draw the days if we have to
3546 if(month_row_count == i) {
3547 for (int j=0; j < 7; j++)
3550 DrawMonthCalendarDate (
3561 current_date = current_date.AddDays(1);
3562 date_rect.Offset(date_cell_size.Width, 0);
3565 // shift the rectangle down one row
3566 int offset = (mc.ShowWeekNumbers) ? -8 : -7;
3567 date_rect.Offset(offset*date_cell_size.Width, date_cell_size.Height);
3571 // month_row_count is zero based, so add one
3574 // draw week numbers if required
3575 if (draw_week_num_divider) {
3578 ResPool.GetPen (mc.ForeColor),
3579 rectangle.X + date_cell_size.Width - 1,
3580 rectangle.Y + title_size.Height + date_cell_size.Height + mc.divider_line_offset,
3581 rectangle.X + date_cell_size.Width - 1,
3582 rectangle.Y + title_size.Height + date_cell_size.Height + (month_row_count * date_cell_size.Height) - mc.divider_line_offset);
3586 // draws the pervious or next button
3587 private void DrawMonthCalendarButton (Graphics dc, Rectangle rectangle, MonthCalendar mc, Size title_size, int x_offset, Size button_size, bool is_previous)
3589 bool is_clicked = false;
3590 Rectangle button_rect;
3591 Rectangle arrow_rect = new Rectangle (rectangle.X, rectangle.Y, 4, 7);
3592 Point[] arrow_path = new Point[3];
3593 // prepare the button
3596 is_clicked = mc.is_previous_clicked;
3597 button_rect = new Rectangle (
3598 rectangle.X + 1 + x_offset,
3599 rectangle.Y + 1 + ((title_size.Height - button_size.Height)/2),
3600 Math.Max(button_size.Width - 1, 0),
3601 Math.Max(button_size.Height - 1, 0));
3602 arrow_rect.X = button_rect.X + ((button_rect.Width - arrow_rect.Width)/2);
3603 arrow_rect.Y = button_rect.Y + ((button_rect.Height - arrow_rect.Height)/2);
3605 arrow_rect.Offset(1,1);
3607 arrow_path[0] = new Point (arrow_rect.Right, arrow_rect.Y);
3608 arrow_path[1] = new Point (arrow_rect.X, arrow_rect.Y + arrow_rect.Height/2);
3609 arrow_path[2] = new Point (arrow_rect.Right, arrow_rect.Bottom);
3613 is_clicked = mc.is_next_clicked;
3614 button_rect = new Rectangle (
3615 rectangle.Right - 1 - x_offset - button_size.Width,
3616 rectangle.Y + 1 + ((title_size.Height - button_size.Height)/2),
3617 Math.Max(button_size.Width - 1, 0),
3618 Math.Max(button_size.Height - 1, 0));
3619 arrow_rect.X = button_rect.X + ((button_rect.Width - arrow_rect.Width)/2);
3620 arrow_rect.Y = button_rect.Y + ((button_rect.Height - arrow_rect.Height)/2);
3622 arrow_rect.Offset(1,1);
3624 arrow_path[0] = new Point (arrow_rect.X, arrow_rect.Y);
3625 arrow_path[1] = new Point (arrow_rect.Right, arrow_rect.Y + arrow_rect.Height/2);
3626 arrow_path[2] = new Point (arrow_rect.X, arrow_rect.Bottom);
3629 // fill the background
3630 dc.FillRectangle (SystemBrushes.Control, button_rect);
3633 dc.DrawRectangle (SystemPens.ControlDark, button_rect);
3636 CPDrawBorder3D (dc, button_rect, Border3DStyle.Raised, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom);
3639 dc.FillPolygon (SystemBrushes.ControlText, arrow_path);
3643 // draws one day in the calendar grid
3644 private void DrawMonthCalendarDate (Graphics dc, Rectangle rectangle, MonthCalendar mc, DateTime date, DateTime month, int row, int col) {
3645 Color date_color = mc.ForeColor;
3646 Rectangle interior = new Rectangle (rectangle.X, rectangle.Y, Math.Max(rectangle.Width - 1, 0), Math.Max(rectangle.Height - 1, 0));
3648 // find out if we are the lead of the first calendar or the trail of the last calendar
3649 if (date.Year != month.Year || date.Month != month.Month) {
3650 DateTime check_date = month.AddMonths (-1);
3651 // check if it's the month before
3652 if (check_date.Year == date.Year && check_date.Month == date.Month && row == 0 && col == 0) {
3653 date_color = mc.TrailingForeColor;
3655 // check if it's the month after
3656 check_date = month.AddMonths (1);
3657 if (check_date.Year == date.Year && check_date.Month == date.Month && row == mc.CalendarDimensions.Height-1 && col == mc.CalendarDimensions.Width-1) {
3658 date_color = mc.TrailingForeColor;
3664 date_color = mc.ForeColor;
3667 const int inflate = -1;
3669 if (date == mc.SelectionStart.Date && date == mc.SelectionEnd.Date) {
3670 // see if the date is in the start of selection
3671 date_color = mc.BackColor;
3672 // draw the left hand of the back ground
3673 Rectangle selection_rect = Rectangle.Inflate (rectangle, inflate, inflate);
3674 dc.FillPie (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect, 0, 360);
3675 } else if (date == mc.SelectionStart.Date) {
3676 // see if the date is in the start of selection
3677 date_color = mc.BackColor;
3678 // draw the left hand of the back ground
3679 Rectangle selection_rect = Rectangle.Inflate (rectangle, inflate, inflate);
3680 dc.FillPie (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect, 90, 180);
3681 // fill the other side as a straight rect
3682 if (date < mc.SelectionEnd.Date)
3684 // use rectangle instead of rectangle to go all the way to edge of rect
3685 selection_rect.X = (int) Math.Floor((double)(rectangle.X + rectangle.Width / 2));
3686 selection_rect.Width = Math.Max(rectangle.Right - selection_rect.X, 0);
3687 dc.FillRectangle (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect);
3689 } else if (date == mc.SelectionEnd.Date) {
3690 // see if it is the end of selection
3691 date_color = mc.BackColor;
3692 // draw the left hand of the back ground
3693 Rectangle selection_rect = Rectangle.Inflate (rectangle, inflate, inflate);
3694 dc.FillPie (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect, 270, 180);
3695 // fill the other side as a straight rect
3696 if (date > mc.SelectionStart.Date) {
3697 selection_rect.X = rectangle.X;
3698 selection_rect.Width = rectangle.Width - (rectangle.Width / 2);
3699 dc.FillRectangle (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect);
3701 } else if (date > mc.SelectionStart.Date && date < mc.SelectionEnd.Date) {
3702 // now see if it's in the middle
3703 date_color = mc.BackColor;
3704 // draw the left hand of the back ground
3705 Rectangle selection_rect = Rectangle.Inflate (rectangle, 0, inflate);
3706 dc.FillRectangle (ResPool.GetSolidBrush (mc.TitleBackColor), selection_rect);
3709 // establish if it's a bolded font
3710 Font font = mc.IsBoldedDate (date) ? mc.bold_font : mc.Font;
3712 // just draw the date now
3713 dc.DrawString (date.Day.ToString(), font, ResPool.GetSolidBrush (date_color), rectangle, mc.centered_format);
3715 // today circle if needed
3716 if (mc.ShowTodayCircle && date == DateTime.Now.Date) {
3717 DrawTodayCircle (dc, interior);
3720 // draw the selection grid
3721 if (mc.is_date_clicked && mc.clicked_date == date) {
3722 Pen pen = ResPool.GetDashPen (Color.Black, DashStyle.Dot);
3723 dc.DrawRectangle (pen, interior);
3727 private void DrawTodayCircle (Graphics dc, Rectangle rectangle) {
3728 Color circle_color = Color.FromArgb (248, 0, 0);
3729 // draw the left hand of the circle
3730 Rectangle lhs_circle_rect = new Rectangle (rectangle.X + 1, rectangle.Y + 4, Math.Max(rectangle.Width - 2, 0), Math.Max(rectangle.Height - 5, 0));
3731 Rectangle rhs_circle_rect = new Rectangle (rectangle.X + 1, rectangle.Y + 1, Math.Max(rectangle.Width - 2, 0), Math.Max(rectangle.Height - 2, 0));
3732 Point [] curve_points = new Point [3];
3733 curve_points [0] = new Point (lhs_circle_rect.X, rhs_circle_rect.Y + rhs_circle_rect.Height/12);
3734 curve_points [1] = new Point (lhs_circle_rect.X + lhs_circle_rect.Width/9, rhs_circle_rect.Y);
3735 curve_points [2] = new Point (lhs_circle_rect.X + lhs_circle_rect.Width/2 + 1, rhs_circle_rect.Y);
3737 Pen pen = ResPool.GetSizedPen(circle_color, 2);
3738 dc.DrawArc (pen, lhs_circle_rect, 90, 180);
3739 dc.DrawArc (pen, rhs_circle_rect, 270, 180);
3740 dc.DrawCurve (pen, curve_points);
3741 dc.DrawLine (ResPool.GetPen (circle_color), curve_points [2], new Point (curve_points [2].X, lhs_circle_rect.Y));
3744 #endregion // MonthCalendar
3747 public override Size PanelDefaultSize {
3749 return new Size (200, 100);
3755 public override void DrawPictureBox (Graphics dc, Rectangle clip, PictureBox pb) {
3756 Rectangle client = pb.ClientRectangle;
3758 // FIXME - instead of drawing the whole picturebox every time
3759 // intersect the clip rectangle with the drawn picture and only draw what's needed,
3760 // Also, we only need a background fill where no image goes
3761 if (pb.Image != null) {
3762 switch (pb.SizeMode) {
3763 case PictureBoxSizeMode.StretchImage:
3764 dc.DrawImage (pb.Image, 0, 0, client.Width, client.Height);
3767 case PictureBoxSizeMode.CenterImage:
3768 dc.DrawImage (pb.Image, (client.Width / 2) - (pb.Image.Width / 2), (client.Height / 2) - (pb.Image.Height / 2));
3771 case PictureBoxSizeMode.Zoom:
3774 if (((float)pb.Image.Width / (float)pb.Image.Height) >= ((float)client.Width / (float)client.Height))
3775 image_size = new Size (client.Width, (pb.Image.Height * client.Width) / pb.Image.Width);
3777 image_size = new Size ((pb.Image.Width * client.Height) / pb.Image.Height, client.Height);
3779 dc.DrawImage (pb.Image, (client.Width / 2) - (image_size.Width / 2), (client.Height / 2) - (image_size.Height / 2), image_size.Width, image_size.Height);
3784 dc.DrawImage(pb.Image, 0, 0, pb.Image.Width, pb.Image.Height);
3792 public override Size PictureBoxDefaultSize {
3794 return new Size (100, 50);
3797 #endregion // PictureBox
3799 #region PrintPreviewControl
3800 public override int PrintPreviewControlPadding {
3804 public override Size PrintPreviewControlGetPageSize (PrintPreviewControl preview)
3806 int page_width, page_height;
3807 int padding = PrintPreviewControlPadding;
3808 PreviewPageInfo[] pis = preview.page_infos;
3810 if (preview.AutoZoom) {
3811 int height_available = preview.ClientRectangle.Height - (preview.Rows) * padding - 2 * padding;
3812 int width_available = preview.ClientRectangle.Width - (preview.Columns - 1) * padding - 2 * padding;
3814 float image_ratio = (float)pis[0].Image.Width / pis[0].Image.Height;
3816 /* try to lay things out using the width to determine the size */
3817 page_width = width_available / preview.Columns;
3818 page_height = (int)(page_width / image_ratio);
3820 /* does the height fit? */
3821 if (page_height * (preview.Rows + 1) > height_available) {
3822 /* no, lay things out via the height */
3823 page_height = height_available / (preview.Rows + 1);
3824 page_width = (int)(page_height * image_ratio);
3828 page_width = (int)(pis[0].Image.Width * preview.Zoom);
3829 page_height = (int)(pis[0].Image.Height * preview.Zoom);
3832 return new Size (page_width, page_height);
3835 public override void PrintPreviewControlPaint (PaintEventArgs pe, PrintPreviewControl preview, Size page_size)
3838 PreviewPageInfo[] pis = preview.page_infos;
3844 int width = page_size.Width * preview.Columns + padding * (preview.Columns - 1) + 2 * padding;
3845 int height = page_size.Height * (preview.Rows + 1) + padding * preview.Rows + 2 * padding;
3847 Rectangle viewport = preview.ViewPort;
3849 pe.Graphics.Clip = new Region (viewport);
3851 /* center things if we can */
3852 int off_x = viewport.Width / 2 - width / 2;
3853 if (off_x < 0) off_x = 0;
3854 int off_y = viewport.Height / 2 - height / 2;
3855 if (off_y < 0) off_y = 0;
3857 page_y = off_y + padding - preview.vbar_value;
3859 if (preview.StartPage > 0) {
3860 int p = preview.StartPage - 1;
3861 for (int py = 0; py < preview.Rows + 1; py ++) {
3862 page_x = off_x + padding - preview.hbar_value;
3863 for (int px = 0; px < preview.Columns; px ++) {
3864 if (p >= pis.Length)
3866 Image image = preview.image_cache[p];
3868 image = pis[p].Image;
3869 Rectangle dest = new Rectangle (new Point (page_x, page_y), page_size);
3871 pe.Graphics.DrawImage (image, dest, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
3873 page_x += padding + page_size.Width;
3876 page_y += padding + page_size.Height;
3880 #endregion // PrintPreviewControl
3883 public override void DrawProgressBar (Graphics dc, Rectangle clip_rect, ProgressBar ctrl)
3885 Rectangle client_area = ctrl.client_area;
3888 CPDrawBorder3D (dc, ctrl.ClientRectangle, Border3DStyle.SunkenOuter, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom & ~Border3DSide.Middle, ColorControl);
3892 int max_blocks = int.MaxValue;
3893 int start_pixel = client_area.X;
3895 draw_mode = (int) ctrl.Style;
3897 switch (draw_mode) {
3899 case 1: { // Continuous
3901 pixels_to_draw = (int)(client_area.Width * ((double)(ctrl.Value - ctrl.Minimum) / (double)(Math.Max(ctrl.Maximum - ctrl.Minimum, 1))));
3902 dc.FillRectangle (ResPool.GetSolidBrush (progressbarblock_color), new Rectangle (client_area.X, client_area.Y, pixels_to_draw, client_area.Height));
3906 if (XplatUI.ThemesEnabled) {
3907 int ms_diff = (int) (DateTime.Now - ctrl.start).TotalMilliseconds;
3908 double percent_done = (double) ms_diff % (double)ctrl.MarqueeAnimationSpeed / (double)ctrl.MarqueeAnimationSpeed;
3910 start_pixel = client_area.X + (int) (client_area.Width * percent_done);
3917 Rectangle block_rect;
3918 int space_betweenblocks = 2;
3922 int block_count = 0;
3924 block_width = (client_area.Height * 2) / 3;
3925 barpos_pixels = ((ctrl.Value - ctrl.Minimum) * client_area.Width) / (Math.Max(ctrl.Maximum - ctrl.Minimum, 1));
3926 increment = block_width + space_betweenblocks;
3928 block_rect = new Rectangle (start_pixel, client_area.Y, block_width, client_area.Height);
3930 if (max_blocks != int.MaxValue) {
3931 if (block_count >= max_blocks)
3933 if (block_rect.X > client_area.Width)
3934 block_rect.X -= client_area.Width;
3936 if ((block_rect.X - client_area.X) >= barpos_pixels)
3940 if (clip_rect.IntersectsWith (block_rect) == true) {
3941 dc.FillRectangle (ResPool.GetSolidBrush (progressbarblock_color), block_rect);
3944 block_rect.X += increment;
3952 public override Size ProgressBarDefaultSize {
3954 return new Size (100, 23);
3958 #endregion // ProgressBar
3961 public override void DrawRadioButton (Graphics dc, Rectangle clip_rectangle, RadioButton radio_button) {
3962 StringFormat text_format;
3963 Rectangle client_rectangle;
3964 Rectangle text_rectangle;
3965 Rectangle radiobutton_rectangle;
3966 int radiobutton_size = 13;
3967 int radiobutton_space = 4;
3969 client_rectangle = radio_button.ClientRectangle;
3970 text_rectangle = client_rectangle;
3971 radiobutton_rectangle = new Rectangle(text_rectangle.X, text_rectangle.Y, radiobutton_size, radiobutton_size);
3973 text_format = new StringFormat();
3974 text_format.Alignment = StringAlignment.Near;
3975 text_format.LineAlignment = StringAlignment.Center;
3976 text_format.HotkeyPrefix = HotkeyPrefix.Show;
3978 /* Calculate the position of text and checkbox rectangle */
3979 if (radio_button.appearance!=Appearance.Button) {
3980 switch(radio_button.radiobutton_alignment) {
3981 case ContentAlignment.BottomCenter: {
3982 radiobutton_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-radiobutton_size/2;
3983 radiobutton_rectangle.Y=client_rectangle.Bottom-radiobutton_size;
3984 text_rectangle.X=client_rectangle.X;
3985 text_rectangle.Width=client_rectangle.Width;
3986 text_rectangle.Height=client_rectangle.Height-radiobutton_size-radiobutton_space;
3990 case ContentAlignment.BottomLeft: {
3991 radiobutton_rectangle.X=client_rectangle.Left;
3992 radiobutton_rectangle.Y=client_rectangle.Bottom-radiobutton_size;
3993 text_rectangle.X=client_rectangle.X+radiobutton_size+radiobutton_space;
3994 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
3998 case ContentAlignment.BottomRight: {
3999 radiobutton_rectangle.X=client_rectangle.Right-radiobutton_size;
4000 radiobutton_rectangle.Y=client_rectangle.Bottom-radiobutton_size;
4001 text_rectangle.X=client_rectangle.X;
4002 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
4006 case ContentAlignment.MiddleCenter: {
4007 radiobutton_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-radiobutton_size/2;
4008 radiobutton_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-radiobutton_size/2;
4009 text_rectangle.X=client_rectangle.X;
4010 text_rectangle.Width=client_rectangle.Width;
4015 case ContentAlignment.MiddleLeft: {
4016 radiobutton_rectangle.X=client_rectangle.Left;
4017 radiobutton_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-radiobutton_size/2;
4018 text_rectangle.X=client_rectangle.X+radiobutton_size+radiobutton_space;
4019 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
4023 case ContentAlignment.MiddleRight: {
4024 radiobutton_rectangle.X=client_rectangle.Right-radiobutton_size;
4025 radiobutton_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-radiobutton_size/2;
4026 text_rectangle.X=client_rectangle.X;
4027 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
4031 case ContentAlignment.TopCenter: {
4032 radiobutton_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-radiobutton_size/2;
4033 radiobutton_rectangle.Y=client_rectangle.Top;
4034 text_rectangle.X=client_rectangle.X;
4035 text_rectangle.Y=radiobutton_size+radiobutton_space;
4036 text_rectangle.Width=client_rectangle.Width;
4037 text_rectangle.Height=client_rectangle.Height-radiobutton_size-radiobutton_space;
4041 case ContentAlignment.TopLeft: {
4042 radiobutton_rectangle.X=client_rectangle.Left;
4043 radiobutton_rectangle.Y=client_rectangle.Top;
4044 text_rectangle.X=client_rectangle.X+radiobutton_size+radiobutton_space;
4045 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
4049 case ContentAlignment.TopRight: {
4050 radiobutton_rectangle.X=client_rectangle.Right-radiobutton_size;
4051 radiobutton_rectangle.Y=client_rectangle.Top;
4052 text_rectangle.X=client_rectangle.X;
4053 text_rectangle.Width=client_rectangle.Width-radiobutton_size-radiobutton_space;
4058 text_rectangle.X=client_rectangle.X;
4059 text_rectangle.Width=client_rectangle.Width;
4062 /* Set the horizontal alignment of our text */
4063 switch(radio_button.text_alignment) {
4064 case ContentAlignment.BottomLeft:
4065 case ContentAlignment.MiddleLeft:
4066 case ContentAlignment.TopLeft: {
4067 text_format.Alignment=StringAlignment.Near;
4071 case ContentAlignment.BottomCenter:
4072 case ContentAlignment.MiddleCenter:
4073 case ContentAlignment.TopCenter: {
4074 text_format.Alignment=StringAlignment.Center;
4078 case ContentAlignment.BottomRight:
4079 case ContentAlignment.MiddleRight:
4080 case ContentAlignment.TopRight: {
4081 text_format.Alignment=StringAlignment.Far;
4086 /* Set the vertical alignment of our text */
4087 switch(radio_button.text_alignment) {
4088 case ContentAlignment.TopLeft:
4089 case ContentAlignment.TopCenter:
4090 case ContentAlignment.TopRight: {
4091 text_format.LineAlignment=StringAlignment.Near;
4095 case ContentAlignment.BottomLeft:
4096 case ContentAlignment.BottomCenter:
4097 case ContentAlignment.BottomRight: {
4098 text_format.LineAlignment=StringAlignment.Far;
4102 case ContentAlignment.MiddleLeft:
4103 case ContentAlignment.MiddleCenter:
4104 case ContentAlignment.MiddleRight: {
4105 text_format.LineAlignment=StringAlignment.Center;
4110 ButtonState state = ButtonState.Normal;
4111 if (radio_button.FlatStyle == FlatStyle.Flat) {
4112 state |= ButtonState.Flat;
4115 if (radio_button.Checked) {
4116 state |= ButtonState.Checked;
4119 if (!radio_button.Enabled) {
4120 state |= ButtonState.Inactive;
4124 RadioButton_DrawButton(radio_button, dc, state, radiobutton_rectangle);
4126 if ((radio_button.image != null) || (radio_button.image_list != null))
4127 ButtonBase_DrawImage(radio_button, dc);
4129 RadioButton_DrawText(radio_button, text_rectangle, dc, text_format);
4131 if (radio_button.Focused && radio_button.Enabled && radio_button.appearance != Appearance.Button && radio_button.Text != String.Empty && radio_button.ShowFocusCues) {
4132 SizeF text_size = dc.MeasureString (radio_button.Text, radio_button.Font);
4134 Rectangle focus_rect = Rectangle.Empty;
4135 focus_rect.X = text_rectangle.X;
4136 focus_rect.Y = (int)((text_rectangle.Height - text_size.Height) / 2);
4137 focus_rect.Size = text_size.ToSize ();
4139 RadioButton_DrawFocus (radio_button, dc, focus_rect);
4142 text_format.Dispose ();
4145 protected virtual void RadioButton_DrawButton(RadioButton radio_button, Graphics dc, ButtonState state, Rectangle radiobutton_rectangle)
4147 dc.FillRectangle(GetControlBackBrush (radio_button.BackColor), radio_button.ClientRectangle);
4149 if (radio_button.appearance==Appearance.Button) {
4150 ButtonBase_DrawButton (radio_button, dc);
4152 if ((radio_button.Focused) && radio_button.Enabled)
4153 ButtonBase_DrawFocus(radio_button, dc);
4155 // establish if we are rendering a flat style of some sort
4156 if (radio_button.FlatStyle == FlatStyle.Flat || radio_button.FlatStyle == FlatStyle.Popup) {
4157 DrawFlatStyleRadioButton (dc, radiobutton_rectangle, radio_button);
4159 CPDrawRadioButton(dc, radiobutton_rectangle, state);
4164 protected virtual void RadioButton_DrawText(RadioButton radio_button, Rectangle text_rectangle, Graphics dc, StringFormat text_format)
4166 DrawCheckBox_and_RadioButtonText (radio_button, text_rectangle, dc,
4167 text_format, radio_button.Appearance, radio_button.Checked);
4170 protected virtual void RadioButton_DrawFocus(RadioButton radio_button, Graphics dc, Rectangle text_rectangle)
4172 DrawInnerFocusRectangle (dc, text_rectangle, radio_button.BackColor);
4176 // renders a radio button with the Flat and Popup FlatStyle
4177 protected virtual void DrawFlatStyleRadioButton (Graphics graphics, Rectangle rectangle, RadioButton radio_button)
4181 if (radio_button.Enabled) {
4183 // draw the outer flatstyle arcs
4184 if (radio_button.FlatStyle == FlatStyle.Flat) {
4185 graphics.DrawArc (SystemPens.ControlDarkDark, rectangle, 0, 359);
4187 // fill in the area depending on whether or not the mouse is hovering
4188 if ((radio_button.is_entered || radio_button.Capture) && !radio_button.is_pressed) {
4189 graphics.FillPie (SystemBrushes.ControlLight, rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2, 0, 359);
4191 graphics.FillPie (SystemBrushes.ControlLightLight, rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2, 0, 359);
4194 // must be a popup radio button
4196 graphics.FillPie (SystemBrushes.ControlLightLight, rectangle, 0, 359);
4198 if (radio_button.is_entered || radio_button.Capture) {
4199 // draw the popup 3d button knob
4200 graphics.DrawArc (SystemPens.ControlLight, rectangle.X+1, rectangle.Y+1, rectangle.Width-2, rectangle.Height-2, 0, 359);
4202 graphics.DrawArc (SystemPens.ControlDark, rectangle, 135, 180);
4203 graphics.DrawArc (SystemPens.ControlLightLight, rectangle, 315, 180);
4206 // just draw lighter flatstyle outer circle
4207 graphics.DrawArc (SystemPens.ControlDark, rectangle, 0, 359);
4212 // fill control background color regardless of actual backcolor
4213 graphics.FillPie (SystemBrushes.Control, rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2, 0, 359);
4214 // draw the ark as control dark
4215 graphics.DrawArc (SystemPens.ControlDark, rectangle, 0, 359);
4219 if (radio_button.Checked) {
4220 lineWidth = Math.Max (1, Math.Min(rectangle.Width, rectangle.Height)/3);
4222 Pen dot_pen = SystemPens.ControlDarkDark;
4223 Brush dot_brush = SystemBrushes.ControlDarkDark;
4225 if (!radio_button.Enabled || ((radio_button.FlatStyle == FlatStyle.Popup) && radio_button.is_pressed)) {
4226 dot_pen = SystemPens.ControlDark;
4227 dot_brush = SystemBrushes.ControlDark;
4230 if (rectangle.Height > 13) {
4231 graphics.FillPie (dot_brush, rectangle.X + lineWidth, rectangle.Y + lineWidth, rectangle.Width - lineWidth * 2, rectangle.Height - lineWidth * 2, 0, 359);
4233 int x_half_pos = (rectangle.Width / 2) + rectangle.X;
4234 int y_half_pos = (rectangle.Height / 2) + rectangle.Y;
4236 graphics.DrawLine (dot_pen, x_half_pos - 1, y_half_pos, x_half_pos + 2, y_half_pos);
4237 graphics.DrawLine (dot_pen, x_half_pos - 1, y_half_pos + 1, x_half_pos + 2, y_half_pos + 1);
4239 graphics.DrawLine (dot_pen, x_half_pos, y_half_pos - 1, x_half_pos, y_half_pos + 2);
4240 graphics.DrawLine (dot_pen, x_half_pos + 1, y_half_pos - 1, x_half_pos + 1, y_half_pos + 2);
4245 public override Size RadioButtonDefaultSize {
4247 return new Size (104,24);
4252 public override void DrawRadioButton (Graphics g, RadioButton rb, Rectangle glyphArea, Rectangle textBounds, Rectangle imageBounds, Rectangle clipRectangle)
4254 // Draw Button Background
4255 if (rb.FlatStyle == FlatStyle.Flat || rb.FlatStyle == FlatStyle.Popup) {
4256 glyphArea.Height -= 2;
4257 glyphArea.Width -= 2;
4260 DrawRadioButtonGlyph (g, rb, glyphArea);
4262 // If we have an image, draw it
4263 if (imageBounds.Size != Size.Empty)
4264 DrawRadioButtonImage (g, rb, imageBounds);
4266 if (rb.Focused && rb.Enabled && rb.ShowFocusCues && textBounds.Size != Size.Empty)
4267 DrawRadioButtonFocus (g, rb, textBounds);
4269 // If we have text, draw it
4270 if (textBounds != Rectangle.Empty)
4271 DrawRadioButtonText (g, rb, textBounds);
4274 public virtual void DrawRadioButtonGlyph (Graphics g, RadioButton rb, Rectangle glyphArea)
4277 ThemeElements.CurrentTheme.RadioButtonPainter.PaintRadioButton (g, glyphArea, rb.BackColor, rb.ForeColor, ElementState.Pressed, rb.FlatStyle, rb.Checked);
4278 else if (rb.InternalSelected)
4279 ThemeElements.CurrentTheme.RadioButtonPainter.PaintRadioButton (g, glyphArea, rb.BackColor, rb.ForeColor, ElementState.Normal, rb.FlatStyle, rb.Checked);
4280 else if (rb.Entered)
4281 ThemeElements.CurrentTheme.RadioButtonPainter.PaintRadioButton (g, glyphArea, rb.BackColor, rb.ForeColor, ElementState.Hot, rb.FlatStyle, rb.Checked);
4282 else if (!rb.Enabled)
4283 ThemeElements.CurrentTheme.RadioButtonPainter.PaintRadioButton (g, glyphArea, rb.BackColor, rb.ForeColor, ElementState.Disabled, rb.FlatStyle, rb.Checked);
4285 ThemeElements.CurrentTheme.RadioButtonPainter.PaintRadioButton (g, glyphArea, rb.BackColor, rb.ForeColor, ElementState.Normal, rb.FlatStyle, rb.Checked);
4288 public virtual void DrawRadioButtonFocus (Graphics g, RadioButton rb, Rectangle focusArea)
4290 ControlPaint.DrawFocusRectangle (g, focusArea);
4293 public virtual void DrawRadioButtonImage (Graphics g, RadioButton rb, Rectangle imageBounds)
4296 g.DrawImage (rb.Image, imageBounds);
4298 CPDrawImageDisabled (g, rb.Image, imageBounds.Left, imageBounds.Top, ColorControl);
4301 public virtual void DrawRadioButtonText (Graphics g, RadioButton rb, Rectangle textBounds)
4304 TextRenderer.DrawTextInternal (g, rb.Text, rb.Font, textBounds, rb.ForeColor, rb.TextFormatFlags, rb.UseCompatibleTextRendering);
4306 DrawStringDisabled20 (g, rb.Text, rb.Font, textBounds, rb.BackColor, rb.TextFormatFlags, rb.UseCompatibleTextRendering);
4309 public override Size CalculateRadioButtonAutoSize (RadioButton rb)
4311 Size ret_size = Size.Empty;
4312 Size text_size = TextRenderer.MeasureTextInternal (rb.Text, rb.Font, rb.UseCompatibleTextRendering);
4313 Size image_size = rb.Image == null ? Size.Empty : rb.Image.Size;
4315 // Pad the text size
4316 if (rb.Text.Length != 0) {
4317 text_size.Height += 4;
4318 text_size.Width += 4;
4321 switch (rb.TextImageRelation) {
4322 case TextImageRelation.Overlay:
4323 ret_size.Height = Math.Max (rb.Text.Length == 0 ? 0 : text_size.Height, image_size.Height);
4324 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
4326 case TextImageRelation.ImageAboveText:
4327 case TextImageRelation.TextAboveImage:
4328 ret_size.Height = text_size.Height + image_size.Height;
4329 ret_size.Width = Math.Max (text_size.Width, image_size.Width);
4331 case TextImageRelation.ImageBeforeText:
4332 case TextImageRelation.TextBeforeImage:
4333 ret_size.Height = Math.Max (text_size.Height, image_size.Height);
4334 ret_size.Width = text_size.Width + image_size.Width;
4339 ret_size.Height += (rb.Padding.Vertical);
4340 ret_size.Width += (rb.Padding.Horizontal) + 15;
4342 // There seems to be a minimum height
4343 if (ret_size.Height == rb.Padding.Vertical)
4344 ret_size.Height += 14;
4349 public override void CalculateRadioButtonTextAndImageLayout (ButtonBase b, Point offset, out Rectangle glyphArea, out Rectangle textRectangle, out Rectangle imageRectangle)
4351 CalculateCheckBoxTextAndImageLayout (b, offset, out glyphArea, out textRectangle, out imageRectangle);
4354 #endregion // RadioButton
4357 public override void DrawScrollBar (Graphics dc, Rectangle clip, ScrollBar bar)
4359 int scrollbutton_width = bar.scrollbutton_width;
4360 int scrollbutton_height = bar.scrollbutton_height;
4361 Rectangle first_arrow_area;
4362 Rectangle second_arrow_area;
4363 Rectangle thumb_pos;
4365 thumb_pos = bar.ThumbPos;
4368 first_arrow_area = new Rectangle(0, 0, bar.Width, scrollbutton_height);
4369 bar.FirstArrowArea = first_arrow_area;
4371 second_arrow_area = new Rectangle(0, bar.ClientRectangle.Height - scrollbutton_height, bar.Width, scrollbutton_height);
4372 bar.SecondArrowArea = second_arrow_area;
4374 thumb_pos.Width = bar.Width;
4375 bar.ThumbPos = thumb_pos;
4378 if (clip.IntersectsWith (first_arrow_area))
4379 CPDrawScrollButton (dc, first_arrow_area, ScrollButton.Up, bar.firstbutton_state);
4380 if (clip.IntersectsWith (second_arrow_area))
4381 CPDrawScrollButton (dc, second_arrow_area, ScrollButton.Down, bar.secondbutton_state);
4384 switch (bar.thumb_moving) {
4385 case ScrollBar.ThumbMoving.None: {
4386 ScrollBar_Vertical_Draw_ThumbMoving_None(scrollbutton_height, bar, clip, dc);
4389 case ScrollBar.ThumbMoving.Forward: {
4390 ScrollBar_Vertical_Draw_ThumbMoving_Forward(scrollbutton_height, bar, thumb_pos, clip, dc);
4394 case ScrollBar.ThumbMoving.Backwards: {
4395 ScrollBar_Vertical_Draw_ThumbMoving_Backwards(scrollbutton_height, bar, thumb_pos, clip, dc);
4403 first_arrow_area = new Rectangle(0, 0, scrollbutton_width, bar.Height);
4404 bar.FirstArrowArea = first_arrow_area;
4406 second_arrow_area = new Rectangle (bar.ClientRectangle.Width - scrollbutton_width, 0, scrollbutton_width, bar.Height);
4407 bar.SecondArrowArea = second_arrow_area;
4409 thumb_pos.Height = bar.Height;
4410 bar.ThumbPos = thumb_pos;
4413 if (clip.IntersectsWith (first_arrow_area))
4414 CPDrawScrollButton (dc, first_arrow_area, ScrollButton.Left, bar.firstbutton_state);
4415 if (clip.IntersectsWith (second_arrow_area))
4416 CPDrawScrollButton (dc, second_arrow_area, ScrollButton.Right, bar.secondbutton_state);
4419 switch (bar.thumb_moving) {
4420 case ScrollBar.ThumbMoving.None: {
4421 ScrollBar_Horizontal_Draw_ThumbMoving_None(scrollbutton_width, bar, clip, dc);
4425 case ScrollBar.ThumbMoving.Forward: {
4426 ScrollBar_Horizontal_Draw_ThumbMoving_Forward(scrollbutton_width, thumb_pos, bar, clip, dc);
4430 case ScrollBar.ThumbMoving.Backwards: {
4431 ScrollBar_Horizontal_Draw_ThumbMoving_Backwards(scrollbutton_width, thumb_pos, bar, clip, dc);
4438 ScrollBar_DrawThumb(bar, thumb_pos, clip, dc);
4441 protected virtual void ScrollBar_DrawThumb(ScrollBar bar, Rectangle thumb_pos, Rectangle clip, Graphics dc)
4443 if (bar.Enabled && thumb_pos.Width > 0 && thumb_pos.Height > 0 && clip.IntersectsWith(thumb_pos))
4444 DrawScrollButtonPrimitive(dc, thumb_pos, ButtonState.Normal);
4447 protected virtual void ScrollBar_Vertical_Draw_ThumbMoving_None( int scrollbutton_height, ScrollBar bar, Rectangle clip, Graphics dc )
4449 Rectangle r = new Rectangle( 0,
4450 scrollbutton_height, bar.ClientRectangle.Width, bar.ClientRectangle.Height - ( scrollbutton_height * 2 ) );
4451 Rectangle intersect = Rectangle.Intersect( clip, r );
4453 if ( intersect != Rectangle.Empty )
4455 Brush h = ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White);
4456 dc.FillRectangle( h, intersect );
4460 protected virtual void ScrollBar_Vertical_Draw_ThumbMoving_Forward( int scrollbutton_height, ScrollBar bar, Rectangle thumb_pos, Rectangle clip, Graphics dc )
4462 Rectangle r = new Rectangle( 0, scrollbutton_height,
4463 bar.ClientRectangle.Width, thumb_pos.Y - scrollbutton_height );
4464 Rectangle intersect = Rectangle.Intersect( clip, r );
4466 if ( intersect != Rectangle.Empty )
4467 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White ), intersect );
4470 r.Y = thumb_pos.Y + thumb_pos.Height;
4471 r.Width = bar.ClientRectangle.Width;
4472 r.Height = bar.ClientRectangle.Height - ( thumb_pos.Y + thumb_pos.Height ) - scrollbutton_height;
4474 intersect = Rectangle.Intersect( clip, r );
4475 if ( intersect != Rectangle.Empty )
4476 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, Color.FromArgb( 255, 63, 63, 63 ), Color.Black ), intersect );
4479 protected virtual void ScrollBar_Vertical_Draw_ThumbMoving_Backwards( int scrollbutton_height, ScrollBar bar, Rectangle thumb_pos, Rectangle clip, Graphics dc )
4481 Rectangle r = new Rectangle( 0, scrollbutton_height,
4482 bar.ClientRectangle.Width, thumb_pos.Y - scrollbutton_height );
4483 Rectangle intersect = Rectangle.Intersect( clip, r );
4485 if ( intersect != Rectangle.Empty )
4486 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, Color.FromArgb( 255, 63, 63, 63 ), Color.Black ), intersect );
4489 r.Y = thumb_pos.Y + thumb_pos.Height;
4490 r.Width = bar.ClientRectangle.Width;
4491 r.Height = bar.ClientRectangle.Height - ( thumb_pos.Y + thumb_pos.Height ) - scrollbutton_height;
4493 intersect = Rectangle.Intersect( clip, r );
4494 if ( intersect != Rectangle.Empty )
4495 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White), intersect );
4498 protected virtual void ScrollBar_Horizontal_Draw_ThumbMoving_None( int scrollbutton_width, ScrollBar bar, Rectangle clip, Graphics dc )
4500 Rectangle r = new Rectangle( scrollbutton_width,
4501 0, bar.ClientRectangle.Width - ( scrollbutton_width * 2 ), bar.ClientRectangle.Height );
4502 Rectangle intersect = Rectangle.Intersect( clip, r );
4504 if ( intersect != Rectangle.Empty )
4505 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White), intersect );
4508 protected virtual void ScrollBar_Horizontal_Draw_ThumbMoving_Forward( int scrollbutton_width, Rectangle thumb_pos, ScrollBar bar, Rectangle clip, Graphics dc )
4510 Rectangle r = new Rectangle( scrollbutton_width, 0,
4511 thumb_pos.X - scrollbutton_width, bar.ClientRectangle.Height );
4512 Rectangle intersect = Rectangle.Intersect( clip, r );
4514 if ( intersect != Rectangle.Empty )
4515 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White), intersect );
4517 r.X = thumb_pos.X + thumb_pos.Width;
4519 r.Width = bar.ClientRectangle.Width - ( thumb_pos.X + thumb_pos.Width ) - scrollbutton_width;
4520 r.Height = bar.ClientRectangle.Height;
4522 intersect = Rectangle.Intersect( clip, r );
4523 if ( intersect != Rectangle.Empty )
4524 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, Color.FromArgb( 255, 63, 63, 63 ), Color.Black ), intersect );
4527 protected virtual void ScrollBar_Horizontal_Draw_ThumbMoving_Backwards( int scrollbutton_width, Rectangle thumb_pos, ScrollBar bar, Rectangle clip, Graphics dc )
4529 Rectangle r = new Rectangle( scrollbutton_width, 0,
4530 thumb_pos.X - scrollbutton_width, bar.ClientRectangle.Height );
4531 Rectangle intersect = Rectangle.Intersect( clip, r );
4533 if ( intersect != Rectangle.Empty )
4534 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, Color.FromArgb( 255, 63, 63, 63 ), Color.Black ), intersect );
4536 r.X = thumb_pos.X + thumb_pos.Width;
4538 r.Width = bar.ClientRectangle.Width - ( thumb_pos.X + thumb_pos.Width ) - scrollbutton_width;
4539 r.Height = bar.ClientRectangle.Height;
4541 intersect = Rectangle.Intersect( clip, r );
4542 if ( intersect != Rectangle.Empty )
4543 dc.FillRectangle( ResPool.GetHatchBrush( HatchStyle.Percent50, ColorScrollBar, Color.White), intersect );
4546 public override int ScrollBarButtonSize {
4549 #endregion // ScrollBar
4552 public override void DrawStatusBar (Graphics real_dc, Rectangle clip, StatusBar sb) {
4553 Rectangle area = sb.ClientRectangle;
4554 int horz_border = 2;
4555 int vert_border = 2;
4557 Image backbuffer = new Bitmap (sb.ClientSize.Width, sb.ClientSize.Height, real_dc);
4558 Graphics dc = Graphics.FromImage (backbuffer);
4560 bool is_color_control = sb.BackColor.ToArgb () == ColorControl.ToArgb ();
4562 Brush brush = is_color_control ? SystemBrushes.Control : ResPool.GetSolidBrush (sb.BackColor);
4563 dc.FillRectangle (brush, clip);
4565 if (!sb.ShowPanels && sb.Text != String.Empty) {
4566 string text = sb.Text;
4567 StringFormat string_format = new StringFormat ();
4568 string_format.Trimming = StringTrimming.Character;
4569 string_format.FormatFlags = StringFormatFlags.NoWrap;
4571 if (text.Length > 127)
4572 text = text.Substring (0, 127);
4574 if (text [0] == '\t') {
4575 string_format.Alignment = StringAlignment.Center;
4576 text = text.Substring (1);
4577 if (text [0] == '\t') {
4578 string_format.Alignment = StringAlignment.Far;
4579 text = text.Substring (1);
4583 dc.DrawString (text, sb.Font, ResPool.GetSolidBrush (sb.ForeColor),
4584 new Rectangle(area.X + 2, area.Y + 2, area.Width - 4, area.Height - 4), string_format);
4585 string_format.Dispose ();
4586 } else if (sb.ShowPanels) {
4587 Brush br_forecolor = GetControlForeBrush (sb.ForeColor);
4588 int prev_x = area.X + horz_border;
4589 int y = area.Y + vert_border;
4590 for (int i = 0; i < sb.Panels.Count; i++) {
4591 Rectangle pr = new Rectangle (prev_x, y,
4592 sb.Panels [i].Width, area.Height);
4593 prev_x += pr.Width + StatusBarHorzGapWidth;
4594 if (pr.IntersectsWith (clip))
4595 DrawStatusBarPanel (dc, pr, i, br_forecolor, sb.Panels [i]);
4599 if (sb.SizingGrip) {
4600 area = new Rectangle (area.Right - 16 - 2, area.Bottom - 12 - 1, 16, 16);
4601 CPDrawSizeGrip (dc, ColorControl, area);
4604 real_dc.DrawImage (backbuffer, 0, 0);
4606 backbuffer.Dispose ();
4611 protected virtual void DrawStatusBarPanel (Graphics dc, Rectangle area, int index,
4612 Brush br_forecolor, StatusBarPanel panel) {
4613 int border_size = 3; // this is actually const, even if the border style is none
4614 int icon_width = 16;
4616 area.Height -= border_size;
4618 if (panel.BorderStyle != StatusBarPanelBorderStyle.None) {
4619 Border3DStyle border_style = Border3DStyle.SunkenOuter;
4620 if (panel.BorderStyle == StatusBarPanelBorderStyle.Raised)
4621 border_style = Border3DStyle.RaisedInner;
4623 CPDrawBorder3D(dc, area, border_style, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, panel.Parent.BackColor);
4626 if (panel.Style == StatusBarPanelStyle.OwnerDraw) {
4627 StatusBarDrawItemEventArgs e = new StatusBarDrawItemEventArgs (
4628 dc, panel.Parent.Font, area, index, DrawItemState.Default,
4629 panel, panel.Parent.ForeColor, panel.Parent.BackColor);
4630 panel.Parent.OnDrawItemInternal (e);
4634 if (panel.Text == String.Empty)
4637 string text = panel.Text;
4638 StringFormat string_format = new StringFormat ();
4639 string_format.Trimming = StringTrimming.Character;
4640 string_format.FormatFlags = StringFormatFlags.NoWrap;
4643 if (text [0] == '\t') {
4644 string_format.Alignment = StringAlignment.Center;
4645 text = text.Substring (1);
4646 if (text [0] == '\t') {
4647 string_format.Alignment = StringAlignment.Far;
4648 text = text.Substring (1);
4652 Rectangle string_rect = Rectangle.Empty;
4656 int y = (area.Height / 2 - (int) panel.Parent.Font.Size / 2) - 1;
4658 switch (panel.Alignment) {
4659 case HorizontalAlignment.Right:
4660 len = (int) dc.MeasureString (text, panel.Parent.Font).Width;
4661 x = area.Right - len - 4;
4662 string_rect = new Rectangle (x, y,
4663 area.Right - x - border_size,
4664 area.Bottom - y - border_size);
4665 if (panel.Icon != null) {
4666 icon_x = x - icon_width - 2;
4669 case HorizontalAlignment.Center:
4670 len = (int) dc.MeasureString (text, panel.Parent.Font).Width;
4671 x = (panel.Width / 2) + (len / 2);
4672 string_rect = new Rectangle (x, y,
4673 area.Right - x - border_size,
4674 area.Bottom - y - border_size);
4676 if (panel.Icon != null) {
4677 icon_x = x - icon_width - 2;
4683 int left = area.Left + border_size;;
4684 if (panel.Icon != null) {
4685 icon_x = area.Left + 2;
4686 left = icon_x + icon_width + 2;
4690 string_rect = new Rectangle (x, y,
4691 area.Right - x - border_size,
4692 area.Bottom - y - border_size);
4696 RectangleF clip_bounds = dc.ClipBounds;
4698 dc.DrawString (text, panel.Parent.Font, br_forecolor, string_rect, string_format);
4699 dc.SetClip (clip_bounds);
4701 if (panel.Icon != null) {
4702 dc.DrawIcon (panel.Icon, new Rectangle (icon_x, y, icon_width, icon_width));
4706 public override int StatusBarSizeGripWidth {
4710 public override int StatusBarHorzGapWidth {
4714 public override Size StatusBarDefaultSize {
4716 return new Size (100, 22);
4719 #endregion // StatusBar
4723 #region TabControl settings
4725 public override Size TabControlDefaultItemSize {
4726 get { return ThemeElements.CurrentTheme.TabControlPainter.DefaultItemSize; }
4729 public override Point TabControlDefaultPadding {
4730 get { return ThemeElements.CurrentTheme.TabControlPainter.DefaultPadding; }
4733 public override int TabControlMinimumTabWidth {
4734 get { return ThemeElements.CurrentTheme.TabControlPainter.MinimumTabWidth; }
4737 public override Rectangle TabControlSelectedDelta {
4738 get { return ThemeElements.CurrentTheme.TabControlPainter.SelectedTabDelta; }
4741 public override int TabControlSelectedSpacing {
4742 get { return ThemeElements.CurrentTheme.TabControlPainter.SelectedSpacing; }
4745 public override int TabPanelOffsetX {
4746 get { return ThemeElements.CurrentTheme.TabControlPainter.TabPanelOffset.X; }
4749 public override int TabPanelOffsetY {
4750 get { return ThemeElements.CurrentTheme.TabControlPainter.TabPanelOffset.Y; }
4753 public override int TabControlColSpacing {
4754 get { return ThemeElements.CurrentTheme.TabControlPainter.ColSpacing; }
4757 public override Point TabControlImagePadding {
4758 get { return ThemeElements.CurrentTheme.TabControlPainter.ImagePadding; }
4761 public override int TabControlScrollerWidth {
4762 get {return ThemeElements.CurrentTheme.TabControlPainter.ScrollerWidth; }
4766 public override Size TabControlGetSpacing (TabControl tab)
4769 return ThemeElements.CurrentTheme.TabControlPainter.RowSpacing (tab);
4771 throw new Exception ("Invalid Appearance value: " + tab.Appearance);
4776 public override void DrawTabControl (Graphics dc, Rectangle area, TabControl tab)
4778 ThemeElements.CurrentTheme.TabControlPainter.Draw (dc, area, tab);
4781 public override Rectangle TabControlGetLeftScrollRect (TabControl tab)
4783 return ThemeElements.CurrentTheme.TabControlPainter.GetLeftScrollRect (tab);
4786 public override Rectangle TabControlGetRightScrollRect (TabControl tab)
4788 return ThemeElements.CurrentTheme.TabControlPainter.GetRightScrollRect (tab);
4791 public override Rectangle TabControlGetDisplayRectangle (TabControl tab)
4793 return ThemeElements.CurrentTheme.TabControlPainter.GetDisplayRectangle (tab);
4796 public override Rectangle TabControlGetPanelRect (TabControl tab)
4798 return ThemeElements.CurrentTheme.TabControlPainter.GetTabPanelRect (tab);
4804 public override void DrawToolBar (Graphics dc, Rectangle clip_rectangle, ToolBar control)
4806 StringFormat format = new StringFormat ();
4807 format.Trimming = StringTrimming.EllipsisCharacter;
4808 format.LineAlignment = StringAlignment.Center;
4809 if (control.ShowKeyboardCuesInternal)
4810 format.HotkeyPrefix = HotkeyPrefix.Show;
4812 format.HotkeyPrefix = HotkeyPrefix.Hide;
4814 if (control.TextAlign == ToolBarTextAlign.Underneath)
4815 format.Alignment = StringAlignment.Center;
4817 format.Alignment = StringAlignment.Near;
4819 if (control is PropertyGrid.PropertyToolBar) {
4820 dc.FillRectangle (ResPool.GetSolidBrush(control.BackColor), clip_rectangle);
4822 if (clip_rectangle.X == 0) {
4823 dc.DrawLine (SystemPens.ControlLightLight, clip_rectangle.X, 1, clip_rectangle.X, control.Bottom);
4826 if (clip_rectangle.Y < 2) {
4827 dc.DrawLine (SystemPens.ControlLightLight, clip_rectangle.X, 1, clip_rectangle.Right, 1);
4830 if (clip_rectangle.Bottom == control.Bottom) {
4831 dc.DrawLine (SystemPens.ControlDark, clip_rectangle.X, clip_rectangle.Bottom - 1, clip_rectangle.Right, clip_rectangle.Bottom - 1);
4834 if (clip_rectangle.Right == control.Right) {
4835 dc.DrawLine (SystemPens.ControlDark, clip_rectangle.Right - 1, 1, clip_rectangle.Right - 1, control.Bottom - 1);
4839 if (control.Appearance != ToolBarAppearance.Flat || control.Parent == null) {
4840 dc.FillRectangle (SystemBrushes.Control, clip_rectangle);
4843 if (control.Divider && clip_rectangle.Y < 2) {
4844 if (clip_rectangle.Y < 1) {
4845 dc.DrawLine (SystemPens.ControlDark, clip_rectangle.X, 0, clip_rectangle.Right, 0);
4847 dc.DrawLine (SystemPens.ControlLightLight, clip_rectangle.X, 1, clip_rectangle.Right, 1);
4853 foreach (ToolBarItem item in control.items)
4854 if (item.Button.Visible && clip_rectangle.IntersectsWith (item.Rectangle))
4855 DrawToolBarButton (dc, control, item, format);
4860 protected virtual void DrawToolBarButton (Graphics dc, ToolBar control, ToolBarItem item, StringFormat format)
4862 bool is_flat = (control.Appearance == ToolBarAppearance.Flat);
4864 DrawToolBarButtonBorder (dc, item, is_flat);
4866 switch (item.Button.Style) {
4867 case ToolBarButtonStyle.DropDownButton:
4868 if (control.DropDownArrows)
4869 DrawToolBarDropDownArrow (dc, item, is_flat);
4870 DrawToolBarButtonContents (dc, control, item, format);
4873 case ToolBarButtonStyle.Separator:
4875 DrawToolBarSeparator (dc, item);
4878 case ToolBarButtonStyle.ToggleButton:
4879 DrawToolBarToggleButtonBackground (dc, item);
4880 DrawToolBarButtonContents (dc, control, item, format);
4884 DrawToolBarButtonContents (dc, control, item, format);
4889 const Border3DSide all_sides = Border3DSide.Left | Border3DSide.Top | Border3DSide.Right | Border3DSide.Bottom;
4891 protected virtual void DrawToolBarButtonBorder (Graphics dc, ToolBarItem item, bool is_flat)
4893 if (item.Button.Style == ToolBarButtonStyle.Separator)
4896 Border3DStyle style;
4899 if (item.Button.Pushed || item.Pressed)
4900 style = Border3DStyle.SunkenOuter;
4901 else if (item.Hilight)
4902 style = Border3DStyle.RaisedInner;
4907 if (item.Button.Pushed || item.Pressed)
4908 style = Border3DStyle.Sunken;
4910 style = Border3DStyle.Raised;
4913 Rectangle rect = item.Rectangle;
4914 if ((item.Button.Style == ToolBarButtonStyle.DropDownButton) && (item.Button.Parent.DropDownArrows) && is_flat)
4915 rect.Width -= ToolBarDropDownWidth;
4917 CPDrawBorder3D (dc, rect, style, all_sides);
4920 protected virtual void DrawToolBarSeparator (Graphics dc, ToolBarItem item)
4922 Rectangle area = item.Rectangle;
4923 int offset = (int) SystemPens.Control.Width + 1;
4924 dc.DrawLine (SystemPens.ControlDark, area.X + 1, area.Y, area.X + 1, area.Bottom);
4925 dc.DrawLine (SystemPens.ControlLight, area.X + offset, area.Y, area.X + offset, area.Bottom);
4928 protected virtual void DrawToolBarToggleButtonBackground (Graphics dc, ToolBarItem item)
4931 Rectangle area = item.Rectangle;
4932 area.X += ToolBarImageGripWidth;
4933 area.Y += ToolBarImageGripWidth;
4934 area.Width -= 2 * ToolBarImageGripWidth;
4935 area.Height -= 2 * ToolBarImageGripWidth;
4937 if (item.Button.Pushed)
4938 brush = (Brush) ResPool.GetHatchBrush (HatchStyle.Percent50, ColorScrollBar, ColorControlLightLight);
4939 else if (item.Button.PartialPush)
4940 brush = SystemBrushes.ControlLight;
4942 brush = SystemBrushes.Control;
4944 dc.FillRectangle (brush, area);
4947 protected virtual void DrawToolBarDropDownArrow (Graphics dc, ToolBarItem item, bool is_flat)
4949 Rectangle rect = item.Rectangle;
4950 rect.X = item.Rectangle.Right - ToolBarDropDownWidth;
4951 rect.Width = ToolBarDropDownWidth;
4955 CPDrawBorder3D (dc, rect, Border3DStyle.SunkenOuter, all_sides);
4956 else if (item.Button.Pushed || item.Pressed)
4957 CPDrawBorder3D (dc, rect, Border3DStyle.SunkenOuter, all_sides);
4958 else if (item.Hilight)
4959 CPDrawBorder3D (dc, rect, Border3DStyle.RaisedInner, all_sides);
4962 CPDrawBorder3D (dc, rect, Border3DStyle.Flat, all_sides);
4963 else if (item.Button.Pushed || item.Pressed)
4964 CPDrawBorder3D (dc, Rectangle.Inflate(rect, -1, -1), Border3DStyle.SunkenOuter, all_sides);
4966 CPDrawBorder3D (dc, rect, Border3DStyle.Raised, all_sides);
4969 PointF [] vertices = new PointF [3];
4970 PointF ddCenter = new PointF (rect.X + (rect.Width/2.0f), rect.Y + (rect.Height / 2));
4972 // Increase vertical and horizontal position by 1 when button is pressed
4973 if (item.Pressed || item.Button.Pushed || item.DDPressed) {
4978 vertices [0].X = ddCenter.X - ToolBarDropDownArrowWidth / 2.0f + 0.5f;
4979 vertices [0].Y = ddCenter.Y;
4980 vertices [1].X = ddCenter.X + ToolBarDropDownArrowWidth / 2.0f + 0.5f;
4981 vertices [1].Y = ddCenter.Y;
4982 vertices [2].X = ddCenter.X + 0.5f; // 0.5 is added for adjustment
4983 vertices [2].Y = ddCenter.Y + ToolBarDropDownArrowHeight;
4984 dc.FillPolygon (SystemBrushes.ControlText, vertices);
4987 protected virtual void DrawToolBarButtonContents (Graphics dc, ToolBar control, ToolBarItem item, StringFormat format)
4989 if (item.Button.Image != null) {
4990 int x = item.ImageRectangle.X + ToolBarImageGripWidth;
4991 int y = item.ImageRectangle.Y + ToolBarImageGripWidth;
4993 // Increase vertical and horizontal position by 1 when button is pressed
4994 if (item.Pressed || item.Button.Pushed) {
4999 if (item.Button.Enabled)
5000 dc.DrawImage (item.Button.Image, x, y);
5002 CPDrawImageDisabled (dc, item.Button.Image, x, y, ColorControl);
5005 Rectangle text_rect = item.TextRectangle;
5006 if (text_rect.Width <= 0 || text_rect.Height <= 0)
5009 if (item.Pressed || item.Button.Pushed) {
5014 if (item.Button.Enabled)
5015 dc.DrawString (item.Button.Text, control.Font, SystemBrushes.ControlText, text_rect, format);
5017 CPDrawStringDisabled (dc, item.Button.Text, control.Font, control.BackColor, text_rect, format);
5020 // Grip width for the ToolBar
5021 public override int ToolBarGripWidth {
5025 // Grip width for the Image on the ToolBarButton
5026 public override int ToolBarImageGripWidth {
5030 // width of the separator
5031 public override int ToolBarSeparatorWidth {
5035 // width of the dropdown arrow rect
5036 public override int ToolBarDropDownWidth {
5040 // width for the dropdown arrow on the ToolBarButton
5041 public override int ToolBarDropDownArrowWidth {
5045 // height for the dropdown arrow on the ToolBarButton
5046 public override int ToolBarDropDownArrowHeight {
5050 public override Size ToolBarDefaultSize {
5052 return new Size (100, 42);
5056 #endregion // ToolBar
5059 public override void DrawToolTip(Graphics dc, Rectangle clip_rectangle, ToolTip.ToolTipWindow control)
5061 Rectangle text_rect = Rectangle.Inflate (control.ClientRectangle, -2, -1);
5064 Brush back_brush = ResPool.GetSolidBrush (control.BackColor);;
5065 Color foreground = control.ForeColor;
5067 Brush back_brush = SystemBrushes.Info;
5068 Color foreground = this.ColorInfoText;
5071 dc.FillRectangle (back_brush, control.ClientRectangle);
5072 dc.DrawRectangle (SystemPens.WindowFrame, 0, 0, control.Width - 1, control.Height - 1);
5074 TextFormatFlags flags = TextFormatFlags.HidePrefix | TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter;
5075 TextRenderer.DrawTextInternal (dc, control.Text, control.Font, text_rect, foreground, flags, false);
5078 public override Size ToolTipSize(ToolTip.ToolTipWindow tt, string text)
5080 Size size = TextRenderer.MeasureTextInternal (text, tt.Font, false);
5087 #endregion // ToolTip
5089 #region BalloonWindow
5091 NotifyIcon.BalloonWindow balloon_window;
5093 public override void ShowBalloonWindow (IntPtr handle, int timeout, string title, string text, ToolTipIcon icon)
5095 Control control = Control.FromHandle(handle);
5097 if (control == null)
5100 if (balloon_window != null) {
5101 balloon_window.Close ();
5102 balloon_window.Dispose ();
5105 balloon_window = new NotifyIcon.BalloonWindow (handle);
5106 balloon_window.Title = title;
5107 balloon_window.Text = text;
5108 balloon_window.Icon = icon;
5109 balloon_window.Timeout = timeout;
5110 balloon_window.Show ();
5113 private const int balloon_iconsize = 16;
5114 private const int balloon_bordersize = 8;
5116 public override void DrawBalloonWindow (Graphics dc, Rectangle clip, NotifyIcon.BalloonWindow control)
5118 Brush solidbrush = ResPool.GetSolidBrush (this.ColorInfoText);
5119 Rectangle rect = control.ClientRectangle;
5120 int iconsize = (control.Icon == ToolTipIcon.None) ? 0 : balloon_iconsize;
5122 // Rectangle borders and background.
5123 dc.FillRectangle (ResPool.GetSolidBrush (ColorInfo), rect);
5124 dc.DrawRectangle (ResPool.GetPen (ColorWindowFrame), 0, 0, rect.Width - 1, rect.Height - 1);
5128 switch (control.Icon) {
5129 case ToolTipIcon.Info: {
5130 image = ThemeEngine.Current.Images(UIIcon.MessageBoxInfo, balloon_iconsize);
5134 case ToolTipIcon.Warning: {
5135 image = ThemeEngine.Current.Images(UIIcon.MessageBoxError, balloon_iconsize);
5139 case ToolTipIcon.Error: {
5140 image = ThemeEngine.Current.Images(UIIcon.MessageBoxWarning, balloon_iconsize);
5150 if (control.Icon != ToolTipIcon.None)
5151 dc.DrawImage (image, new Rectangle (balloon_bordersize, balloon_bordersize, iconsize, iconsize));
5154 Rectangle titlerect = new Rectangle (rect.X + balloon_bordersize + iconsize + (iconsize > 0 ? balloon_bordersize : 0),
5155 rect.Y + balloon_bordersize,
5156 rect.Width - ((3 * balloon_bordersize) + iconsize),
5157 rect.Height - (2 * balloon_bordersize));
5159 Font titlefont = new Font (control.Font.FontFamily, control.Font.Size, control.Font.Style | FontStyle.Bold, control.Font.Unit);
5160 dc.DrawString (control.Title, titlefont, solidbrush, titlerect, control.Format);
5163 Rectangle textrect = new Rectangle (rect.X + balloon_bordersize,
5164 rect.Y + balloon_bordersize,
5165 rect.Width - (2 * balloon_bordersize),
5166 rect.Height - (2 * balloon_bordersize));
5168 StringFormat textformat = control.Format;
5169 textformat.LineAlignment = StringAlignment.Far;
5170 dc.DrawString (control.Text, control.Font, solidbrush, textrect, textformat);
5173 public override Rectangle BalloonWindowRect (NotifyIcon.BalloonWindow control)
5175 Rectangle deskrect = Screen.GetWorkingArea (control);
5176 SizeF maxsize = new SizeF (250, 200);
5178 SizeF titlesize = TextRenderer.MeasureString (control.Title, control.Font, maxsize, control.Format);
5179 SizeF textsize = TextRenderer.MeasureString (control.Text, control.Font, maxsize, control.Format);
5181 if (titlesize.Height < balloon_iconsize)
5182 titlesize.Height = balloon_iconsize;
5184 Rectangle rect = new Rectangle ();
5185 rect.Height = (int) (titlesize.Height + textsize.Height + (3 * balloon_bordersize));
5186 rect.Width = (int) ((titlesize.Width > textsize.Width) ? titlesize.Width : textsize.Width) + (2 * balloon_bordersize);
5187 rect.X = deskrect.Width - rect.Width - 2;
5188 rect.Y = deskrect.Height - rect.Height - 2;
5193 #endregion // BalloonWindow
5196 public override int TrackBarValueFromMousePosition (int x, int y, TrackBar tb)
5198 int result = tb.Value;
5199 int value_pos = tb.Value;
5200 float pixels_betweenticks;
5201 Rectangle thumb_pos = Rectangle.Empty, thumb_area = Rectangle.Empty;
5202 Point channel_startpoint = Point.Empty, na_point = Point.Empty;
5204 GetTrackBarDrawingInfo (tb, out pixels_betweenticks, out thumb_area, out thumb_pos, out channel_startpoint, out na_point, out na_point);
5206 /* Convert thumb position from mouse position to value*/
5207 if (tb.Orientation == Orientation.Vertical) {
5208 value_pos = (int)Math.Round (((thumb_area.Bottom - y - (float)thumb_pos.Height / 2) / (float)pixels_betweenticks), 0);
5210 if (value_pos + tb.Minimum > tb.Maximum)
5211 value_pos = tb.Maximum - tb.Minimum;
5212 else if (value_pos + tb.Minimum < tb.Minimum)
5215 result = value_pos + tb.Minimum;
5217 value_pos = (int)Math.Round (((x - channel_startpoint.X - (float)thumb_pos.Width / 2) / (float) pixels_betweenticks), 0);
5219 if (value_pos + tb.Minimum > tb.Maximum)
5220 value_pos = tb.Maximum - tb.Minimum;
5221 else if (value_pos + tb.Minimum < tb.Minimum)
5224 result = value_pos + tb.Minimum;
5230 private void GetTrackBarDrawingInfo (TrackBar tb, out float pixels_betweenticks, out Rectangle thumb_area, out Rectangle thumb_pos, out Point channel_startpoint, out Point bottomtick_startpoint, out Point toptick_startpoint)
5232 thumb_area = Rectangle.Empty;
5233 thumb_pos = Rectangle.Empty;
5235 if (tb.Orientation == Orientation.Vertical) {
5236 toptick_startpoint = new Point ();
5237 bottomtick_startpoint = new Point ();
5238 channel_startpoint = new Point ();
5240 const int space_from_right = 8;
5241 const int space_from_left = 8;
5242 const int space_from_bottom = 11;
5243 Rectangle area = tb.ClientRectangle;
5245 switch (tb.TickStyle) {
5246 case TickStyle.BottomRight:
5247 case TickStyle.None:
5248 channel_startpoint.Y = 8;
5249 channel_startpoint.X = 9;
5250 bottomtick_startpoint.Y = 13;
5251 bottomtick_startpoint.X = 24;
5253 case TickStyle.TopLeft:
5254 channel_startpoint.Y = 8;
5255 channel_startpoint.X = 19;
5256 toptick_startpoint.Y = 13;
5257 toptick_startpoint.X = 8;
5259 case TickStyle.Both:
5260 channel_startpoint.Y = 8;
5261 channel_startpoint.X = 18;
5262 bottomtick_startpoint.Y = 13;
5263 bottomtick_startpoint.X = 32;
5264 toptick_startpoint.Y = 13;
5265 toptick_startpoint.X = 8;
5271 thumb_area.X = area.X + channel_startpoint.X;
5272 thumb_area.Y = area.Y + channel_startpoint.Y;
5273 thumb_area.Height = area.Height - space_from_right - space_from_left;
5274 thumb_area.Width = 4;
5276 pixel_len = thumb_area.Height - 11;
5277 if (tb.Maximum == tb.Minimum) {
5278 pixels_betweenticks = 0;
5280 pixels_betweenticks = pixel_len / (tb.Maximum - tb.Minimum);
5283 thumb_pos.Y = thumb_area.Bottom - space_from_bottom - (int)(pixels_betweenticks * (float)(tb.Value - tb.Minimum));
5285 /* Draw thumb fixed 10x22 size */
5286 thumb_pos.Width = 10;
5287 thumb_pos.Height = 22;
5289 toptick_startpoint = new Point ();
5290 bottomtick_startpoint = new Point ();
5291 channel_startpoint = new Point ();
5293 const int space_from_right = 8;
5294 const int space_from_left = 8;
5295 Rectangle area = tb.ClientRectangle;
5297 switch (tb.TickStyle) {
5298 case TickStyle.BottomRight:
5299 case TickStyle.None:
5300 channel_startpoint.X = 8;
5301 channel_startpoint.Y = 9;
5302 bottomtick_startpoint.X = 13;
5303 bottomtick_startpoint.Y = 24;
5305 case TickStyle.TopLeft:
5306 channel_startpoint.X = 8;
5307 channel_startpoint.Y = 19;
5308 toptick_startpoint.X = 13;
5309 toptick_startpoint.Y = 8;
5311 case TickStyle.Both:
5312 channel_startpoint.X = 8;
5313 channel_startpoint.Y = 18;
5314 bottomtick_startpoint.X = 13;
5315 bottomtick_startpoint.Y = 32;
5316 toptick_startpoint.X = 13;
5317 toptick_startpoint.Y = 8;
5323 thumb_area.X = area.X + channel_startpoint.X;
5324 thumb_area.Y = area.Y + channel_startpoint.Y;
5325 thumb_area.Width = area.Width - space_from_right - space_from_left;
5326 thumb_area.Height = 4;
5328 pixel_len = thumb_area.Width - 11;
5329 if (tb.Maximum == tb.Minimum) {
5330 pixels_betweenticks = 0;
5332 pixels_betweenticks = pixel_len / (tb.Maximum - tb.Minimum);
5335 thumb_pos.X = channel_startpoint.X + (int)(pixels_betweenticks * (float) (tb.Value - tb.Minimum));
5337 /* Draw thumb fixed 10x22 size */
5338 thumb_pos.Width = 10;
5339 thumb_pos.Height = 22;
5343 private void DrawTrackBar_Vertical (Graphics dc, Rectangle clip_rectangle, TrackBar tb,
5344 ref Rectangle thumb_pos, ref Rectangle thumb_area, Brush br_thumb,
5345 float ticks, int value_pos, bool mouse_value) {
5347 Point toptick_startpoint = new Point ();
5348 Point bottomtick_startpoint = new Point ();
5349 Point channel_startpoint = new Point ();
5351 float pixels_betweenticks;
5352 Rectangle area = tb.ClientRectangle;
5354 GetTrackBarDrawingInfo (tb, out pixels_betweenticks, out thumb_area, out thumb_pos, out channel_startpoint, out bottomtick_startpoint, out toptick_startpoint);
5357 dc.FillRectangle (SystemBrushes.ControlDark, channel_startpoint.X, channel_startpoint.Y,
5358 1, thumb_area.Height);
5360 dc.FillRectangle (SystemBrushes.ControlDarkDark, channel_startpoint.X + 1, channel_startpoint.Y,
5361 1, thumb_area.Height);
5363 dc.FillRectangle (SystemBrushes.ControlLight, channel_startpoint.X + 3, channel_startpoint.Y,
5364 1, thumb_area.Height);
5366 switch (tb.TickStyle) {
5367 case TickStyle.BottomRight:
5368 case TickStyle.None: {
5369 thumb_pos.X = channel_startpoint.X - 8;
5371 Pen pen = SystemPens.ControlLightLight;
5372 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X , thumb_pos.Y + 10);
5373 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X + 16, thumb_pos.Y);
5374 dc.DrawLine (pen, thumb_pos.X + 16, thumb_pos.Y, thumb_pos.X + 16 + 4, thumb_pos.Y + 4);
5376 pen = SystemPens.ControlDark;
5377 dc.DrawLine (pen, thumb_pos.X +1, thumb_pos.Y + 9, thumb_pos.X +15, thumb_pos.Y +9);
5378 dc.DrawLine (pen, thumb_pos.X + 16, thumb_pos.Y + 9, thumb_pos.X +16 + 4, thumb_pos.Y +9 - 4);
5380 pen = SystemPens.ControlDarkDark;
5381 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 10, thumb_pos.X +16, thumb_pos.Y +10);
5382 dc.DrawLine (pen, thumb_pos.X + 16, thumb_pos.Y + 10, thumb_pos.X +16 + 5, thumb_pos.Y +10 - 5);
5384 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 1, 16, 8);
5385 dc.FillRectangle (br_thumb, thumb_pos.X + 17, thumb_pos.Y + 2, 1, 6);
5386 dc.FillRectangle (br_thumb, thumb_pos.X + 18, thumb_pos.Y + 3, 1, 4);
5387 dc.FillRectangle (br_thumb, thumb_pos.X + 19, thumb_pos.Y + 4, 1, 2);
5391 case TickStyle.TopLeft: {
5392 thumb_pos.X = channel_startpoint.X - 10;
5394 Pen pen = SystemPens.ControlLightLight;
5395 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y, thumb_pos.X + 4 + 16, thumb_pos.Y);
5396 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y, thumb_pos.X, thumb_pos.Y + 4);
5398 pen = SystemPens.ControlDark;
5399 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y + 9, thumb_pos.X + 4 + 16 , thumb_pos.Y+ 9);
5400 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y + 9, thumb_pos.X, thumb_pos.Y + 5);
5401 dc.DrawLine (pen, thumb_pos.X + 19, thumb_pos.Y + 9, thumb_pos.X +19 , thumb_pos.Y+ 1);
5403 pen = SystemPens.ControlDarkDark;
5404 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y+ 10, thumb_pos.X + 4 + 16, thumb_pos.Y+ 10);
5405 dc.DrawLine (pen, thumb_pos.X + 4, thumb_pos.Y + 10, thumb_pos.X -1, thumb_pos.Y+ 5);
5406 dc.DrawLine (pen, thumb_pos.X + 20, thumb_pos.Y, thumb_pos.X+ 20, thumb_pos.Y + 10);
5408 dc.FillRectangle (br_thumb, thumb_pos.X + 4, thumb_pos.Y + 1, 15, 8);
5409 dc.FillRectangle (br_thumb, thumb_pos.X + 3, thumb_pos.Y + 2, 1, 6);
5410 dc.FillRectangle (br_thumb, thumb_pos.X + 2, thumb_pos.Y + 3, 1, 4);
5411 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 4, 1, 2);
5416 case TickStyle.Both: {
5417 thumb_pos.X = area.X + 10;
5419 Pen pen = SystemPens.ControlLightLight;
5420 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X, thumb_pos.Y + 9);
5421 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X + 19, thumb_pos.Y);
5423 pen = SystemPens.ControlDark;
5424 dc.DrawLine (pen, thumb_pos.X + 1, thumb_pos.Y + 9, thumb_pos.X+ 19, thumb_pos.Y + 9);
5425 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y+ 1, thumb_pos.X + 19, thumb_pos.Y + 8);
5427 pen = SystemPens.ControlDarkDark;
5428 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 10, thumb_pos.X+ 20, thumb_pos.Y +10);
5429 dc.DrawLine (pen, thumb_pos.X + 20, thumb_pos.Y, thumb_pos.X + 20, thumb_pos.Y+ 9);
5431 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 1, 18, 8);
5440 pixel_len = thumb_area.Height - 11;
5441 pixels_betweenticks = pixel_len / ticks;
5443 thumb_area.X = thumb_pos.X;
5444 thumb_area.Y = channel_startpoint.Y;
5445 thumb_area.Width = thumb_pos.Height;
5448 Region outside = new Region (area);
5449 outside.Exclude (thumb_area);
5451 if (outside.IsVisible (clip_rectangle)) {
5452 if (pixels_betweenticks > 0 && ((tb.TickStyle & TickStyle.BottomRight) == TickStyle.BottomRight ||
5453 ((tb.TickStyle & TickStyle.Both) == TickStyle.Both))) {
5455 for (float inc = 0; inc < (pixel_len + 1); inc += pixels_betweenticks) {
5456 if (inc == 0 || (inc + pixels_betweenticks) >= pixel_len +1)
5457 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + bottomtick_startpoint.X , area.Y + bottomtick_startpoint.Y + inc,
5458 area.X + bottomtick_startpoint.X + 3, area.Y + bottomtick_startpoint.Y + inc);
5460 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + bottomtick_startpoint.X, area.Y + bottomtick_startpoint.Y + inc,
5461 area.X + bottomtick_startpoint.X + 2, area.Y + bottomtick_startpoint.Y + inc);
5465 if (pixels_betweenticks > 0 && ((tb.TickStyle & TickStyle.TopLeft) == TickStyle.TopLeft ||
5466 ((tb.TickStyle & TickStyle.Both) == TickStyle.Both))) {
5468 pixel_len = thumb_area.Height - 11;
5469 pixels_betweenticks = pixel_len / ticks;
5471 for (float inc = 0; inc < (pixel_len + 1); inc += pixels_betweenticks) {
5472 if (inc == 0 || (inc + pixels_betweenticks) >= pixel_len +1)
5473 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + toptick_startpoint.X - 3 , area.Y + toptick_startpoint.Y + inc,
5474 area.X + toptick_startpoint.X, area.Y + toptick_startpoint.Y + inc);
5476 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + toptick_startpoint.X - 2, area.Y + toptick_startpoint.Y + inc,
5477 area.X + toptick_startpoint.X, area.Y + toptick_startpoint.Y + inc);
5489 Does not matter the size of the control, Win32 always draws:
5490 - Ticks starting from pixel 13, 8
5491 - Channel starting at pos 8, 19 and ends at Width - 8
5492 - Autosize makes always the control 45 pixels high
5493 - Ticks are draw at (channel.Witdh - 10) / (Maximum - Minimum)
5496 private void DrawTrackBar_Horizontal (Graphics dc, Rectangle clip_rectangle, TrackBar tb,
5497 ref Rectangle thumb_pos, ref Rectangle thumb_area, Brush br_thumb,
5498 float ticks, int value_pos, bool mouse_value) {
5499 Point toptick_startpoint = new Point ();
5500 Point bottomtick_startpoint = new Point ();
5501 Point channel_startpoint = new Point ();
5503 float pixels_betweenticks;
5504 Rectangle area = tb.ClientRectangle;
5506 GetTrackBarDrawingInfo (tb , out pixels_betweenticks, out thumb_area, out thumb_pos, out channel_startpoint, out bottomtick_startpoint, out toptick_startpoint);
5509 dc.FillRectangle (SystemBrushes.ControlDark, channel_startpoint.X, channel_startpoint.Y,
5510 thumb_area.Width, 1);
5512 dc.FillRectangle (SystemBrushes.ControlDarkDark, channel_startpoint.X, channel_startpoint.Y + 1,
5513 thumb_area.Width, 1);
5515 dc.FillRectangle (SystemBrushes.ControlLight, channel_startpoint.X, channel_startpoint.Y +3,
5516 thumb_area.Width, 1);
5518 switch (tb.TickStyle) {
5519 case TickStyle.BottomRight:
5520 case TickStyle.None: {
5521 thumb_pos.Y = channel_startpoint.Y - 8;
5523 Pen pen = SystemPens.ControlLightLight;
5524 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X + 10, thumb_pos.Y);
5525 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X, thumb_pos.Y + 16);
5526 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 16, thumb_pos.X + 4, thumb_pos.Y + 16 + 4);
5528 pen = SystemPens.ControlDark;
5529 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 1, thumb_pos.X +9, thumb_pos.Y +15);
5530 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 16, thumb_pos.X +9 - 4, thumb_pos.Y +16 + 4);
5532 pen = SystemPens.ControlDarkDark;
5533 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y, thumb_pos.X +10, thumb_pos.Y +16);
5534 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y + 16, thumb_pos.X +10 - 5, thumb_pos.Y +16 + 5);
5536 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 1, 8, 16);
5537 dc.FillRectangle (br_thumb, thumb_pos.X + 2, thumb_pos.Y + 17, 6, 1);
5538 dc.FillRectangle (br_thumb, thumb_pos.X + 3, thumb_pos.Y + 18, 4, 1);
5539 dc.FillRectangle (br_thumb, thumb_pos.X + 4, thumb_pos.Y + 19, 2, 1);
5542 case TickStyle.TopLeft: {
5543 thumb_pos.Y = channel_startpoint.Y - 10;
5545 Pen pen = SystemPens.ControlLightLight;
5546 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 4, thumb_pos.X, thumb_pos.Y + 4 + 16);
5547 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 4, thumb_pos.X + 4, thumb_pos.Y);
5549 pen = SystemPens.ControlDark;
5550 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 4, thumb_pos.X + 9, thumb_pos.Y + 4 + 16);
5551 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 4, thumb_pos.X + 5, thumb_pos.Y);
5552 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 19, thumb_pos.X + 1 , thumb_pos.Y +19);
5554 pen = SystemPens.ControlDarkDark;
5555 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y + 4, thumb_pos.X + 10, thumb_pos.Y + 4 + 16);
5556 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y + 4, thumb_pos.X + 5, thumb_pos.Y -1);
5557 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 20, thumb_pos.X + 10, thumb_pos.Y + 20);
5559 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 4, 8, 15);
5560 dc.FillRectangle (br_thumb, thumb_pos.X + 2, thumb_pos.Y + 3, 6, 1);
5561 dc.FillRectangle (br_thumb, thumb_pos.X + 3, thumb_pos.Y + 2, 4, 1);
5562 dc.FillRectangle (br_thumb, thumb_pos.X + 4, thumb_pos.Y + 1, 2, 1);
5566 case TickStyle.Both: {
5567 thumb_pos.Y = area.Y + 10;
5569 Pen pen = SystemPens.ControlLightLight;
5570 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X + 9, thumb_pos.Y);
5571 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y, thumb_pos.X, thumb_pos.Y + 19);
5573 pen = SystemPens.ControlDark;
5574 dc.DrawLine (pen, thumb_pos.X + 9, thumb_pos.Y + 1, thumb_pos.X + 9, thumb_pos.Y + 19);
5575 dc.DrawLine (pen, thumb_pos.X + 1, thumb_pos.Y + 10, thumb_pos.X + 8, thumb_pos.Y + 19);
5577 pen = SystemPens.ControlDarkDark;
5578 dc.DrawLine (pen, thumb_pos.X + 10, thumb_pos.Y, thumb_pos.X +10, thumb_pos.Y + 20);
5579 dc.DrawLine (pen, thumb_pos.X, thumb_pos.Y + 20, thumb_pos.X + 9, thumb_pos.Y + 20);
5581 dc.FillRectangle (br_thumb, thumb_pos.X + 1, thumb_pos.Y + 1, 8, 18);
5590 pixel_len = thumb_area.Width - 11;
5591 pixels_betweenticks = pixel_len / ticks;
5594 thumb_area.Y = thumb_pos.Y;
5595 thumb_area.X = channel_startpoint.X;
5596 thumb_area.Height = thumb_pos.Height;
5597 Region outside = new Region (area);
5598 outside.Exclude (thumb_area);
5600 if (outside.IsVisible (clip_rectangle)) {
5601 if (pixels_betweenticks > 0 && ((tb.TickStyle & TickStyle.BottomRight) == TickStyle.BottomRight ||
5602 ((tb.TickStyle & TickStyle.Both) == TickStyle.Both))) {
5604 for (float inc = 0; inc < (pixel_len + 1); inc += pixels_betweenticks) {
5605 if (inc == 0 || (inc + pixels_betweenticks) >= pixel_len +1)
5606 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + bottomtick_startpoint.X + inc , area.Y + bottomtick_startpoint.Y,
5607 area.X + bottomtick_startpoint.X + inc , area.Y + bottomtick_startpoint.Y + 3);
5609 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + bottomtick_startpoint.X + inc, area.Y + bottomtick_startpoint.Y,
5610 area.X + bottomtick_startpoint.X + inc, area.Y + bottomtick_startpoint.Y + 2);
5614 if (pixels_betweenticks > 0 && ((tb.TickStyle & TickStyle.TopLeft) == TickStyle.TopLeft ||
5615 ((tb.TickStyle & TickStyle.Both) == TickStyle.Both))) {
5617 for (float inc = 0; inc < (pixel_len + 1); inc += pixels_betweenticks) {
5618 if (inc == 0 || (inc + pixels_betweenticks) >= pixel_len +1)
5619 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + toptick_startpoint.X + inc , area.Y + toptick_startpoint.Y - 3,
5620 area.X + toptick_startpoint.X + inc , area.Y + toptick_startpoint.Y);
5622 dc.DrawLine (ResPool.GetPen (pen_ticks_color), area.X + toptick_startpoint.X + inc, area.Y + toptick_startpoint.Y - 2,
5623 area.X + toptick_startpoint.X + inc, area.Y + toptick_startpoint.Y );
5631 public override void DrawTrackBar (Graphics dc, Rectangle clip_rectangle, TrackBar tb)
5636 float ticks = (tb.Maximum - tb.Minimum) / tb.tickFrequency; /* N of ticks draw*/
5638 Rectangle thumb_pos = tb.ThumbPos;
5639 Rectangle thumb_area = tb.ThumbArea;
5641 if (tb.thumb_pressed) {
5642 value_pos = tb.thumb_mouseclick;
5645 value_pos = tb.Value - tb.Minimum;
5646 mouse_value = false;
5649 area = tb.ClientRectangle;
5652 br_thumb = (Brush) ResPool.GetHatchBrush (HatchStyle.Percent50, ColorControlLightLight, ColorControlLight);
5653 } else if (tb.thumb_pressed == true) {
5654 br_thumb = (Brush) ResPool.GetHatchBrush (HatchStyle.Percent50, ColorControlLight, ColorControl);
5656 br_thumb = SystemBrushes.Control;
5660 /* Control Background */
5661 if (tb.BackColor.ToArgb () == DefaultControlBackColor.ToArgb ()) {
5662 dc.FillRectangle (SystemBrushes.Control, clip_rectangle);
5664 dc.FillRectangle (ResPool.GetSolidBrush (tb.BackColor), clip_rectangle);
5668 CPDrawFocusRectangle(dc, area, tb.ForeColor, tb.BackColor);
5671 if (tb.Orientation == Orientation.Vertical) {
5672 DrawTrackBar_Vertical (dc, clip_rectangle, tb, ref thumb_pos, ref thumb_area,
5673 br_thumb, ticks, value_pos, mouse_value);
5676 DrawTrackBar_Horizontal (dc, clip_rectangle, tb, ref thumb_pos, ref thumb_area,
5677 br_thumb, ticks, value_pos, mouse_value);
5680 tb.ThumbPos = thumb_pos;
5681 tb.ThumbArea = thumb_area;
5684 public override Size TrackBarDefaultSize {
5686 return new Size (104, 42);
5690 #endregion // TrackBar
5693 public override Size VScrollBarDefaultSize {
5695 return new Size (this.ScrollBarButtonSize, 80);
5698 #endregion // VScrollBar
5701 public override Size TreeViewDefaultSize {
5703 return new Size (121, 97);
5709 public override int ManagedWindowTitleBarHeight (InternalWindowManager wm)
5711 if (wm.IsToolWindow && !wm.IsMinimized)
5712 return SystemInformation.ToolWindowCaptionHeight;
5713 if (wm.Form.FormBorderStyle == FormBorderStyle.None)
5715 return SystemInformation.CaptionHeight;
5718 public override int ManagedWindowBorderWidth (InternalWindowManager wm)
5720 if (wm is ToolWindowManager && wm.form.FormBorderStyle == FormBorderStyle.FixedToolWindow)
5726 public override int ManagedWindowIconWidth (InternalWindowManager wm)
5728 return ManagedWindowTitleBarHeight (wm) - 5;
5731 public override void ManagedWindowSetButtonLocations (InternalWindowManager wm)
5733 TitleButtons buttons = wm.TitleButtons;
5734 Form form = wm.form;
5736 buttons.HelpButton.Visible = form.HelpButton;
5738 foreach (TitleButton button in buttons) {
5739 button.Visible = false;
5742 switch (form.FormBorderStyle) {
5743 case FormBorderStyle.None:
5744 if (form.WindowState != FormWindowState.Normal)
5745 goto case FormBorderStyle.Sizable;
5747 case FormBorderStyle.FixedToolWindow:
5748 case FormBorderStyle.SizableToolWindow:
5749 buttons.CloseButton.Visible = true;
5750 if (form.WindowState != FormWindowState.Normal)
5751 goto case FormBorderStyle.Sizable;
5753 case FormBorderStyle.FixedSingle:
5754 case FormBorderStyle.Fixed3D:
5755 case FormBorderStyle.FixedDialog:
5756 case FormBorderStyle.Sizable:
5757 switch (form.WindowState) {
5758 case FormWindowState.Normal:
5759 buttons.MinimizeButton.Visible = true;
5760 buttons.MaximizeButton.Visible = true;
5761 buttons.RestoreButton.Visible = false;
5763 case FormWindowState.Maximized:
5764 buttons.MinimizeButton.Visible = true;
5765 buttons.MaximizeButton.Visible = false;
5766 buttons.RestoreButton.Visible = true;
5768 case FormWindowState.Minimized:
5769 buttons.MinimizeButton.Visible = false;
5770 buttons.MaximizeButton.Visible = true;
5771 buttons.RestoreButton.Visible = true;
5774 buttons.CloseButton.Visible = true;
5778 int bw = ManagedWindowBorderWidth (wm);
5779 Size btsize = ManagedWindowButtonSize (wm);
5780 int btw = btsize.Width;
5781 int bth = btsize.Height;
5783 int left = form.Width - bw - btw - 2;
5785 if ((!wm.IsToolWindow || wm.IsMinimized) && wm.HasBorders) {
5786 buttons.CloseButton.Rectangle = new Rectangle (left, top, btw, bth);
5789 if (buttons.MaximizeButton.Visible) {
5790 buttons.MaximizeButton.Rectangle = new Rectangle (left, top, btw, bth);
5793 if (buttons.RestoreButton.Visible) {
5794 buttons.RestoreButton.Rectangle = new Rectangle (left, top, btw, bth);
5798 buttons.MinimizeButton.Rectangle = new Rectangle (left, top, btw, bth);
5800 } else if (wm.IsToolWindow) {
5801 buttons.CloseButton.Rectangle = new Rectangle (left, top, btw, bth);
5806 public override void DrawManagedWindowDecorations (Graphics dc, Rectangle clip, InternalWindowManager wm)
5808 Form form = wm.Form;
5809 int tbheight = ManagedWindowTitleBarHeight (wm);
5810 int bdwidth = ManagedWindowBorderWidth (wm);
5811 Color titlebar_color = Color.FromArgb (255, 10, 36, 106);
5812 Color titlebar_color2 = Color.FromArgb (255, 166, 202, 240);
5813 Color color = ThemeEngine.Current.ColorControlDark;
5814 Color color2 = Color.FromArgb (255, 192, 192, 192);
5817 Console.WriteLine (DateTime.Now.ToLongTimeString () + " DrawManagedWindowDecorations");
5818 dc.FillRectangle (Brushes.Black, clip);
5821 if (wm.HasBorders) {
5822 Pen pen = ResPool.GetPen (ColorControl);
5823 Rectangle borders = new Rectangle (0, 0, form.Width, form.Height);
5824 ControlPaint.DrawBorder3D (dc, borders, Border3DStyle.Raised);
5825 // The 3d border is only 2 pixels wide, so we draw the innermost pixels ourselves
5826 borders = new Rectangle (2, 2, form.Width - 5, form.Height - 5);
5827 for (int i = 2; i < bdwidth; i++) {
5828 dc.DrawRectangle (pen, borders);
5829 borders.Inflate (-1, -1);
5834 bool draw_titlebar_enabled = false;
5835 if (wm.Form.Parent != null && wm.Form.Parent is Form) {
5836 draw_titlebar_enabled = false;
5837 } else if (wm.IsActive && !wm.IsMaximized) {
5838 draw_titlebar_enabled = true;
5840 if (draw_titlebar_enabled) {
5841 color = titlebar_color;
5842 color2 = titlebar_color2;
5845 Rectangle tb = new Rectangle (bdwidth, bdwidth, form.Width - (bdwidth * 2), tbheight - 1);
5847 // HACK: For now always draw the titlebar until we get updates better
5848 if (tb.Width > 0 && tb.Height > 0) {
5849 using (System.Drawing.Drawing2D.LinearGradientBrush gradient = new LinearGradientBrush (tb, color, color2, LinearGradientMode.Horizontal))
5851 dc.FillRectangle (gradient, tb);
5855 // Draw the line just beneath the title bar
5856 dc.DrawLine (ResPool.GetPen (SystemColors.Control), bdwidth,
5857 tbheight + bdwidth - 1, form.Width - bdwidth - 1,
5858 tbheight + bdwidth - 1);
5860 if (!wm.IsToolWindow) {
5861 tb.X += 18; // Room for the icon and the buttons
5862 tb.Width = (form.Width - 62) - tb.X;
5865 string window_caption = form.Text;
5866 window_caption = window_caption.Replace (Environment.NewLine, string.Empty);
5868 if (window_caption != null && window_caption != string.Empty) {
5869 StringFormat format = new StringFormat ();
5870 format.FormatFlags = StringFormatFlags.NoWrap;
5871 format.Trimming = StringTrimming.EllipsisCharacter;
5872 format.LineAlignment = StringAlignment.Center;
5874 if (tb.IntersectsWith (clip))
5875 dc.DrawString (window_caption, WindowBorderFont,
5876 ThemeEngine.Current.ResPool.GetSolidBrush (Color.White),
5880 if (wm.HasBorders) {
5881 bool draw_icon = false;
5883 draw_icon = !wm.IsToolWindow && form.Icon != null && form.ShowIcon;
5885 draw_icon = !wm.IsToolWindow && form.Icon != null;
5888 Rectangle icon = new Rectangle (bdwidth + 3,
5889 bdwidth + 2, wm.IconWidth, wm.IconWidth);
5890 if (icon.IntersectsWith (clip))
5891 dc.DrawIcon (form.Icon, icon);
5894 foreach (TitleButton button in wm.TitleButtons.AllButtons) {
5895 DrawTitleButton (dc, button, clip);
5900 public override Size ManagedWindowButtonSize (InternalWindowManager wm)
5902 int height = ManagedWindowTitleBarHeight (wm);
5903 if (!wm.IsMaximized && !wm.IsMinimized) {
5904 if (wm.IsToolWindow)
5905 return new Size (SystemInformation.ToolWindowCaptionButtonSize.Width - 2,
5907 if (wm.Form.FormBorderStyle == FormBorderStyle.None)
5910 height = SystemInformation.CaptionHeight;
5912 return new Size (SystemInformation.CaptionButtonSize.Width - 2,
5916 private void DrawTitleButton (Graphics dc, TitleButton button, Rectangle clip)
5918 if (!button.Visible) {
5922 if (!button.Rectangle.IntersectsWith (clip))
5925 dc.FillRectangle (SystemBrushes.Control, button.Rectangle);
5927 ControlPaint.DrawCaptionButton (dc, button.Rectangle,
5928 button.Caption, button.State);
5931 #region ControlPaint
5932 public override void CPDrawBorder (Graphics graphics, Rectangle bounds, Color leftColor, int leftWidth,
5933 ButtonBorderStyle leftStyle, Color topColor, int topWidth, ButtonBorderStyle topStyle,
5934 Color rightColor, int rightWidth, ButtonBorderStyle rightStyle, Color bottomColor,
5935 int bottomWidth, ButtonBorderStyle bottomStyle) {
5936 DrawBorderInternal(graphics, bounds.Left, bounds.Top, bounds.Left, bounds.Bottom-1, leftWidth, leftColor, leftStyle, Border3DSide.Left);
5937 DrawBorderInternal(graphics, bounds.Left, bounds.Top, bounds.Right-1, bounds.Top, topWidth, topColor, topStyle, Border3DSide.Top);
5938 DrawBorderInternal(graphics, bounds.Right-1, bounds.Top, bounds.Right-1, bounds.Bottom-1, rightWidth, rightColor, rightStyle, Border3DSide.Right);
5939 DrawBorderInternal(graphics, bounds.Left, bounds.Bottom-1, bounds.Right-1, bounds.Bottom-1, bottomWidth, bottomColor, bottomStyle, Border3DSide.Bottom);
5942 public override void CPDrawBorder (Graphics graphics, RectangleF bounds, Color leftColor, int leftWidth,
5943 ButtonBorderStyle leftStyle, Color topColor, int topWidth, ButtonBorderStyle topStyle,
5944 Color rightColor, int rightWidth, ButtonBorderStyle rightStyle, Color bottomColor,
5945 int bottomWidth, ButtonBorderStyle bottomStyle) {
5946 DrawBorderInternal(graphics, bounds.Left, bounds.Top, bounds.Left, bounds.Bottom-1, leftWidth, leftColor, leftStyle, Border3DSide.Left);
5947 DrawBorderInternal(graphics, bounds.Left, bounds.Top, bounds.Right-1, bounds.Top, topWidth, topColor, topStyle, Border3DSide.Top);
5948 DrawBorderInternal(graphics, bounds.Right-1, bounds.Top, bounds.Right-1, bounds.Bottom-1, rightWidth, rightColor, rightStyle, Border3DSide.Right);
5949 DrawBorderInternal(graphics, bounds.Left, bounds.Bottom-1, bounds.Right-1, bounds.Bottom-1, bottomWidth, bottomColor, bottomStyle, Border3DSide.Bottom);
5952 public override void CPDrawBorder3D (Graphics graphics, Rectangle rectangle, Border3DStyle style, Border3DSide sides) {
5953 CPDrawBorder3D(graphics, rectangle, style, sides, ColorControl);
5956 public override void CPDrawBorder3D (Graphics graphics, Rectangle rectangle, Border3DStyle style, Border3DSide sides, Color control_color)
5959 Pen penTopLeftInner;
5961 Pen penBottomRightInner;
5962 Rectangle rect= new Rectangle (rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
5963 bool is_ColorControl = control_color.ToArgb () == ColorControl.ToArgb () ? true : false;
5965 if ((style & Border3DStyle.Adjust) != 0) {
5972 penTopLeft = penTopLeftInner = penBottomRight = penBottomRightInner = is_ColorControl ? SystemPens.Control : ResPool.GetPen (control_color);
5974 CPColor cpcolor = CPColor.Empty;
5976 if (!is_ColorControl)
5977 cpcolor = ResPool.GetCPColor (control_color);
5980 case Border3DStyle.Raised:
5981 penTopLeftInner = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
5982 penBottomRight = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
5983 penBottomRightInner = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
5985 case Border3DStyle.Sunken:
5986 penTopLeft = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
5987 penTopLeftInner = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
5988 penBottomRight = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
5990 case Border3DStyle.Etched:
5991 penTopLeft = penBottomRightInner = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
5992 penTopLeftInner = penBottomRight = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
5994 case Border3DStyle.RaisedOuter:
5995 penBottomRight = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
5997 case Border3DStyle.SunkenOuter:
5998 penTopLeft = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
5999 penBottomRight = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
6001 case Border3DStyle.RaisedInner:
6002 penTopLeft = is_ColorControl ? SystemPens.ControlLightLight : ResPool.GetPen (cpcolor.LightLight);
6003 penBottomRight = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
6005 case Border3DStyle.SunkenInner:
6006 penTopLeft = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
6008 case Border3DStyle.Flat:
6009 penTopLeft = penBottomRight = is_ColorControl ? SystemPens.ControlDark : ResPool.GetPen (cpcolor.Dark);
6011 case Border3DStyle.Bump:
6012 penTopLeftInner = penBottomRight = is_ColorControl ? SystemPens.ControlDarkDark : ResPool.GetPen (cpcolor.DarkDark);
6018 bool inner = ((style != Border3DStyle.RaisedOuter) && (style != Border3DStyle.SunkenOuter));
6020 if ((sides & Border3DSide.Middle) != 0) {
6021 Brush brush = is_ColorControl ? SystemBrushes.Control : ResPool.GetSolidBrush (control_color);
6022 graphics.FillRectangle (brush, rect);
6025 if ((sides & Border3DSide.Left) != 0) {
6026 graphics.DrawLine (penTopLeft, rect.Left, rect.Bottom - 2, rect.Left, rect.Top);
6027 if ((rect.Width > 2) && inner)
6028 graphics.DrawLine (penTopLeftInner, rect.Left + 1, rect.Bottom - 2, rect.Left + 1, rect.Top);
6031 if ((sides & Border3DSide.Top) != 0) {
6032 graphics.DrawLine (penTopLeft, rect.Left, rect.Top, rect.Right - 2, rect.Top);
6033 if ((rect.Height > 2) && inner)
6034 graphics.DrawLine (penTopLeftInner, rect.Left + 1, rect.Top + 1, rect.Right - 3, rect.Top + 1);
6037 if ((sides & Border3DSide.Right) != 0) {
6038 graphics.DrawLine (penBottomRight, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom - 1);
6039 if ((rect.Width > 3) && inner)
6040 graphics.DrawLine (penBottomRightInner, rect.Right - 2, rect.Top + 1, rect.Right - 2, rect.Bottom - 2);
6043 if ((sides & Border3DSide.Bottom) != 0) {
6044 graphics.DrawLine (penBottomRight, rect.Left, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
6045 if ((rect.Height > 3) && inner)
6046 graphics.DrawLine (penBottomRightInner, rect.Left + 1, rect.Bottom - 2, rect.Right - 2, rect.Bottom - 2);
6050 public override void CPDrawButton (Graphics dc, Rectangle rectangle, ButtonState state)
6052 CPDrawButtonInternal (dc, rectangle, state, SystemPens.ControlDarkDark, SystemPens.ControlDark, SystemPens.ControlLight);
6055 private void CPDrawButtonInternal (Graphics dc, Rectangle rectangle, ButtonState state, Pen DarkPen, Pen NormalPen, Pen LightPen)
6057 // sadly enough, the rectangle gets always filled with a hatchbrush
6058 dc.FillRectangle (ResPool.GetHatchBrush (HatchStyle.Percent50,
6059 Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255),
6060 ColorControl.G, ColorControl.B),
6062 rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2);
6064 if ((state & ButtonState.All) == ButtonState.All || ((state & ButtonState.Checked) == ButtonState.Checked && (state & ButtonState.Flat) == ButtonState.Flat)) {
6065 dc.FillRectangle (ResPool.GetHatchBrush (HatchStyle.Percent50, ColorControlLight, ColorControl), rectangle.X + 2, rectangle.Y + 2, rectangle.Width - 4, rectangle.Height - 4);
6067 dc.DrawRectangle (SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.Width - 1, rectangle.Height - 1);
6069 if ((state & ButtonState.Flat) == ButtonState.Flat) {
6070 dc.DrawRectangle (SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.Width - 1, rectangle.Height - 1);
6072 if ((state & ButtonState.Checked) == ButtonState.Checked) {
6073 dc.FillRectangle (ResPool.GetHatchBrush (HatchStyle.Percent50, ColorControlLight, ColorControl), rectangle.X + 2, rectangle.Y + 2, rectangle.Width - 4, rectangle.Height - 4);
6076 dc.DrawLine (pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
6077 dc.DrawLine (pen, rectangle.X + 1, rectangle.Y, rectangle.Right - 2, rectangle.Y);
6080 dc.DrawLine (pen, rectangle.X + 1, rectangle.Y + 1, rectangle.X + 1, rectangle.Bottom - 3);
6081 dc.DrawLine (pen, rectangle.X + 2, rectangle.Y + 1, rectangle.Right - 3, rectangle.Y + 1);
6084 dc.DrawLine (pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 2, rectangle.Bottom - 1);
6085 dc.DrawLine (pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 1);
6087 if (((state & ButtonState.Pushed) == ButtonState.Pushed) && ((state & ButtonState.Normal) == ButtonState.Normal)) {
6089 dc.DrawLine (pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
6090 dc.DrawLine (pen, rectangle.X + 1, rectangle.Y, rectangle.Right - 2, rectangle.Y);
6093 dc.DrawLine (pen, rectangle.X + 1, rectangle.Y + 1, rectangle.X + 1, rectangle.Bottom - 3);
6094 dc.DrawLine (pen, rectangle.X + 2, rectangle.Y + 1, rectangle.Right - 3, rectangle.Y + 1);
6097 dc.DrawLine (pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 2, rectangle.Bottom - 1);
6098 dc.DrawLine (pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 1);
6100 if (((state & ButtonState.Inactive) == ButtonState.Inactive) || ((state & ButtonState.Normal) == ButtonState.Normal)) {
6102 dc.DrawLine (pen, rectangle.X, rectangle.Y, rectangle.Right - 2, rectangle.Y);
6103 dc.DrawLine (pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
6106 dc.DrawLine (pen, rectangle.X + 1, rectangle.Bottom - 2, rectangle.Right - 2, rectangle.Bottom - 2);
6107 dc.DrawLine (pen, rectangle.Right - 2, rectangle.Y + 1, rectangle.Right - 2, rectangle.Bottom - 3);
6110 dc.DrawLine (pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 1, rectangle.Bottom - 1);
6111 dc.DrawLine (pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 2);
6116 public override void CPDrawCaptionButton (Graphics graphics, Rectangle rectangle, CaptionButton button, ButtonState state) {
6117 Rectangle captionRect;
6120 CPDrawButtonInternal (graphics, rectangle, state, SystemPens.ControlDarkDark, SystemPens.ControlDark, SystemPens.ControlLightLight);
6122 if (rectangle.Width<rectangle.Height) {
6123 captionRect=new Rectangle(rectangle.X+1, rectangle.Y+rectangle.Height/2-rectangle.Width/2+1, rectangle.Width-4, rectangle.Width-4);
6125 captionRect=new Rectangle(rectangle.X+rectangle.Width/2-rectangle.Height/2+1, rectangle.Y+1, rectangle.Height-4, rectangle.Height-4);
6128 if ((state & ButtonState.Pushed)!=0) {
6129 captionRect=new Rectangle(rectangle.X+2, rectangle.Y+2, rectangle.Width-3, rectangle.Height-3);
6132 /* Make sure we've got at least a line width of 1 */
6133 lineWidth=Math.Max(1, captionRect.Width/7);
6136 case CaptionButton.Close: {
6139 if ((state & ButtonState.Inactive)!=0) {
6140 pen = ResPool.GetSizedPen (ColorControlLight, lineWidth);
6141 DrawCaptionHelper(graphics, ColorControlLight, pen, lineWidth, 1, captionRect, button);
6143 pen = ResPool.GetSizedPen (ColorControlDark, lineWidth);
6144 DrawCaptionHelper(graphics, ColorControlDark, pen, lineWidth, 0, captionRect, button);
6147 pen = ResPool.GetSizedPen (ColorControlText, lineWidth);
6148 DrawCaptionHelper(graphics, ColorControlText, pen, lineWidth, 0, captionRect, button);
6153 case CaptionButton.Help:
6154 case CaptionButton.Maximize:
6155 case CaptionButton.Minimize:
6156 case CaptionButton.Restore: {
6157 if ((state & ButtonState.Inactive)!=0) {
6158 DrawCaptionHelper(graphics, ColorControlLight, SystemPens.ControlLightLight, lineWidth, 1, captionRect, button);
6160 DrawCaptionHelper(graphics, ColorControlDark, SystemPens.ControlDark, lineWidth, 0, captionRect, button);
6163 DrawCaptionHelper(graphics, ColorControlText, SystemPens.ControlText, lineWidth, 0, captionRect, button);
6170 public override void CPDrawCheckBox (Graphics dc, Rectangle rectangle, ButtonState state)
6172 Pen check_pen = Pens.Black;
6174 Rectangle cb_rect = new Rectangle (rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
6176 if ((state & ButtonState.All) == ButtonState.All) {
6178 cb_rect.Height -= 2;
6180 dc.FillRectangle (SystemBrushes.Control, cb_rect.X, cb_rect.Y, cb_rect.Width - 1, cb_rect.Height - 1);
6181 dc.DrawRectangle (SystemPens.ControlDark, cb_rect.X, cb_rect.Y, cb_rect.Width - 1, cb_rect.Height - 1);
6183 check_pen = SystemPens.ControlDark;
6185 if ((state & ButtonState.Flat) == ButtonState.Flat) {
6187 cb_rect.Height -= 2;
6189 if ((state & ButtonState.Inactive) == ButtonState.Inactive)
6190 dc.FillRectangle (SystemBrushes.ControlLight, cb_rect.X, cb_rect.Y, cb_rect.Width - 1, cb_rect.Height - 1);
6192 dc.FillRectangle (Brushes.White, cb_rect.X, cb_rect.Y, cb_rect.Width - 1, cb_rect.Height - 1);
6193 dc.DrawRectangle (SystemPens.ControlDark, cb_rect.X, cb_rect.Y, cb_rect.Width - 1, cb_rect.Height - 1);
6196 cb_rect.Height -= 1;
6198 int check_box_visible_size = (cb_rect.Height > cb_rect.Width) ? cb_rect.Width : cb_rect.Height;
6200 int x_pos = Math.Max (0, cb_rect.X + (cb_rect.Width / 2) - check_box_visible_size / 2);
6201 int y_pos = Math.Max (0, cb_rect.Y + (cb_rect.Height / 2) - check_box_visible_size / 2);
6203 Rectangle rect = new Rectangle (x_pos, y_pos, check_box_visible_size, check_box_visible_size);
6205 if (((state & ButtonState.Pushed) == ButtonState.Pushed) || ((state & ButtonState.Inactive) == ButtonState.Inactive)) {
6206 dc.FillRectangle (ResPool.GetHatchBrush (HatchStyle.Percent50,
6207 Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255),
6208 ColorControl.G, ColorControl.B),
6209 ColorControl), rect.X + 2, rect.Y + 2, rect.Width - 3, rect.Height - 3);
6211 dc.FillRectangle (SystemBrushes.ControlLightLight, rect.X + 2, rect.Y + 2, rect.Width - 3, rect.Height - 3);
6213 Pen pen = SystemPens.ControlDark;
6214 dc.DrawLine (pen, rect.X, rect.Y, rect.X, rect.Bottom - 1);
6215 dc.DrawLine (pen, rect.X + 1, rect.Y, rect.Right - 1, rect.Y);
6217 pen = SystemPens.ControlDarkDark;
6218 dc.DrawLine (pen, rect.X + 1, rect.Y + 1, rect.X + 1, rect.Bottom - 2);
6219 dc.DrawLine (pen, rect.X + 2, rect.Y + 1, rect.Right - 2, rect.Y + 1);
6221 pen = SystemPens.ControlLightLight;
6222 dc.DrawLine (pen, rect.Right, rect.Y, rect.Right, rect.Bottom);
6223 dc.DrawLine (pen, rect.X, rect.Bottom, rect.Right, rect.Bottom);
6225 // oh boy, matching ms is like fighting against windmills
6226 using (Pen h_pen = new Pen (ResPool.GetHatchBrush (HatchStyle.Percent50,
6227 Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255),
6228 ColorControl.G, ColorControl.B), ColorControl))) {
6229 dc.DrawLine (h_pen, rect.X + 1, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
6230 dc.DrawLine (h_pen, rect.Right - 1, rect.Y + 1, rect.Right - 1, rect.Bottom - 1);
6233 if ((state & ButtonState.Inactive) == ButtonState.Inactive)
6234 check_pen = SystemPens.ControlDark;
6237 if ((state & ButtonState.Checked) == ButtonState.Checked) {
6238 int check_size = (cb_rect.Height > cb_rect.Width) ? cb_rect.Width / 2: cb_rect.Height / 2;
6240 if (check_size < 7) {
6241 int lineWidth = Math.Max (3, check_size / 3);
6242 int Scale = Math.Max (1, check_size / 9);
6244 Rectangle rect = new Rectangle (cb_rect.X + (cb_rect.Width / 2) - (int)Math.Ceiling ((float)check_size / 2) - 1, cb_rect.Y + (cb_rect.Height / 2) - (check_size / 2) - 1,
6245 check_size, check_size);
6247 for (int i = 0; i < lineWidth; i++) {
6248 dc.DrawLine (check_pen, rect.Left + lineWidth / 2, rect.Top + lineWidth + i, rect.Left + lineWidth / 2 + 2 * Scale, rect.Top + lineWidth + 2 * Scale + i);
6249 dc.DrawLine (check_pen, rect.Left + lineWidth / 2 + 2 * Scale, rect.Top + lineWidth + 2 * Scale + i, rect.Left + lineWidth / 2 + 6 * Scale, rect.Top + lineWidth - 2 * Scale + i);
6252 int lineWidth = Math.Max (3, check_size / 3) + 1;
6254 int x_half = cb_rect.Width / 2;
6255 int y_half = cb_rect.Height / 2;
6257 Rectangle rect = new Rectangle (cb_rect.X + x_half - (check_size / 2) - 1, cb_rect.Y + y_half - (check_size / 2),
6258 check_size, check_size);
6260 int gradient_left = check_size / 3;
6261 int gradient_right = check_size - gradient_left - 1;
6264 for (int i = 0; i < lineWidth; i++) {
6265 dc.DrawLine (check_pen, rect.X, rect.Bottom - 1 - gradient_left - i, rect.X + gradient_left, rect.Bottom - 1 - i);
6266 dc.DrawLine (check_pen, rect.X + gradient_left, rect.Bottom - 1 - i, rect.Right - 1, rect.Bottom - i - 1 - gradient_right);
6272 public override void CPDrawComboButton (Graphics graphics, Rectangle rectangle, ButtonState state) {
6273 Point[] arrow = new Point[3];
6283 if ((state & ButtonState.Checked)!=0) {
6284 graphics.FillRectangle(ResPool.GetHatchBrush (HatchStyle.Percent50, ColorControlLightLight, ColorControlLight),rectangle);
6287 if ((state & ButtonState.Flat)!=0) {
6288 ControlPaint.DrawBorder(graphics, rectangle, ColorControlDark, ButtonBorderStyle.Solid);
6290 if ((state & (ButtonState.Pushed | ButtonState.Checked))!=0) {
6291 // this needs to render like a pushed button - jba
6292 // CPDrawBorder3D(graphics, rectangle, Border3DStyle.Sunken, Border3DSide.Left | Border3DSide.Top | Border3DSide.Right | Border3DSide.Bottom, ColorControl);
6293 Rectangle trace_rectangle = new Rectangle(rectangle.X, rectangle.Y, Math.Max (rectangle.Width-1, 0), Math.Max (rectangle.Height-1, 0));
6294 graphics.DrawRectangle (SystemPens.ControlDark, trace_rectangle);
6296 CPDrawBorder3D(graphics, rectangle, Border3DStyle.Raised, Border3DSide.Left | Border3DSide.Top | Border3DSide.Right | Border3DSide.Bottom, ColorControl);
6300 rect=new Rectangle(rectangle.X+rectangle.Width/4, rectangle.Y+rectangle.Height/4, rectangle.Width/2, rectangle.Height/2);
6301 centerX=rect.Left+rect.Width/2;
6302 centerY=rect.Top+rect.Height/2;
6303 shiftX=Math.Max(1, rect.Width/8);
6304 shiftY=Math.Max(1, rect.Height/8);
6306 if ((state & ButtonState.Pushed)!=0) {
6313 P1=new Point(rect.Left, centerY);
6314 P2=new Point(rect.Right, centerY);
6315 P3=new Point(centerX, rect.Bottom);
6321 /* Draw the arrow */
6322 if ((state & ButtonState.Inactive)!=0) {
6323 /* Move away from the shadow */
6324 arrow[0].X += 1; arrow[0].Y += 1;
6325 arrow[1].X += 1; arrow[1].Y += 1;
6326 arrow[2].X += 1; arrow[2].Y += 1;
6328 graphics.FillPolygon(SystemBrushes.ControlLightLight, arrow, FillMode.Winding);
6334 graphics.FillPolygon(SystemBrushes.ControlDark, arrow, FillMode.Winding);
6336 graphics.FillPolygon(SystemBrushes.ControlText, arrow, FillMode.Winding);
6341 public override void CPDrawContainerGrabHandle (Graphics graphics, Rectangle bounds)
6343 Pen pen = Pens.Black;
6344 Rectangle rect = new Rectangle (bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); // Dunno why, but MS does it that way, too
6348 graphics.FillRectangle (SystemBrushes.ControlLightLight, rect);
6349 graphics.DrawRectangle (pen, rect);
6351 X = rect.X + rect.Width / 2;
6352 Y = rect.Y + rect.Height / 2;
6354 /* Draw the cross */
6355 graphics.DrawLine (pen, X, rect.Y + 2, X, rect.Bottom - 2);
6356 graphics.DrawLine (pen, rect.X + 2, Y, rect.Right - 2, Y);
6358 /* Draw 'arrows' for vertical lines */
6359 graphics.DrawLine (pen, X - 1, rect.Y + 3, X + 1, rect.Y + 3);
6360 graphics.DrawLine (pen, X - 1, rect.Bottom - 3, X + 1, rect.Bottom - 3);
6362 /* Draw 'arrows' for horizontal lines */
6363 graphics.DrawLine (pen, rect.X + 3, Y - 1, rect.X + 3, Y + 1);
6364 graphics.DrawLine (pen, rect.Right - 3, Y - 1, rect.Right - 3, Y + 1);
6367 public virtual void DrawFlatStyleFocusRectangle (Graphics graphics, Rectangle rectangle, ButtonBase button, Color foreColor, Color backColor) {
6368 // make a rectange to trace around border of the button
6369 Rectangle trace_rectangle = new Rectangle(rectangle.X, rectangle.Y, Math.Max (rectangle.Width-1, 0), Math.Max (rectangle.Height-1, 0));
6371 Color outerColor = foreColor;
6372 // adjust focus color according to the flatstyle
6373 if (button.FlatStyle == FlatStyle.Popup && !button.is_pressed) {
6374 outerColor = (backColor.ToArgb () == ColorControl.ToArgb ()) ? ControlPaint.Dark(ColorControl) : ColorControlText;
6377 // draw the outer rectangle
6378 graphics.DrawRectangle (ResPool.GetPen (outerColor), trace_rectangle);
6380 // draw the inner rectangle
6381 if (button.FlatStyle == FlatStyle.Popup) {
6382 DrawInnerFocusRectangle (graphics, Rectangle.Inflate (rectangle, -4, -4), backColor);
6384 // draw a flat inner rectangle
6385 Pen pen = ResPool.GetPen (ControlPaint.LightLight (backColor));
6386 graphics.DrawRectangle(pen, Rectangle.Inflate (trace_rectangle, -4, -4));
6390 public virtual void DrawInnerFocusRectangle(Graphics graphics, Rectangle rectangle, Color backColor)
6392 // make a rectange to trace around border of the button
6393 Rectangle trace_rectangle = new Rectangle(rectangle.X, rectangle.Y, Math.Max (rectangle.Width-1, 0), Math.Max (rectangle.Height-1, 0));
6395 #if NotUntilCairoIsFixed
6396 Color colorBackInverted = Color.FromArgb (Math.Abs (backColor.R-255), Math.Abs (backColor.G-255), Math.Abs (backColor.B-255));
6397 DashStyle oldStyle; // used for caching old penstyle
6398 Pen pen = ResPool.GetPen (colorBackInverted);
6400 oldStyle = pen.DashStyle;
6401 pen.DashStyle = DashStyle.Dot;
6403 graphics.DrawRectangle (pen, trace_rectangle);
6404 pen.DashStyle = oldStyle;
6406 CPDrawFocusRectangle(graphics, trace_rectangle, Color.Wheat, backColor);
6411 public override void CPDrawFocusRectangle (Graphics graphics, Rectangle rectangle, Color foreColor, Color backColor)
6413 Rectangle rect = rectangle;
6417 if (backColor.GetBrightness () >= 0.5) {
6418 foreColor = Color.Transparent;
6419 backColor = Color.Black;
6422 backColor = Color.FromArgb (Math.Abs (backColor.R-255), Math.Abs (backColor.G-255), Math.Abs (backColor.B-255));
6423 foreColor = Color.Black;
6426 brush = ResPool.GetHatchBrush (HatchStyle.Percent50, backColor, foreColor);
6427 pen = new Pen (brush, 1);
6432 graphics.DrawRectangle (pen, rect);
6436 public override void CPDrawGrabHandle (Graphics graphics, Rectangle rectangle, bool primary, bool enabled)
6441 if (primary == true) {
6443 if (enabled == true) {
6446 sb = SystemBrushes.Control;
6450 if (enabled == true) {
6453 sb = SystemBrushes.Control;
6456 graphics.FillRectangle (sb, rectangle);
6457 graphics.DrawRectangle (pen, rectangle);
6461 public override void CPDrawGrid (Graphics graphics, Rectangle area, Size pixelsBetweenDots, Color backColor) {
6467 ControlPaint.Color2HBS(backColor, out h, out b, out s);
6470 foreColor=Color.Black;
6472 foreColor=Color.White;
6475 // still not perfect. it seems that ms calculates the position of the first dot or line
6477 using (Pen pen = new Pen (foreColor)) {
6478 pen.DashPattern = new float [] {1.0f, pixelsBetweenDots.Width - 1};
6480 for (int y = area.Top; y < area.Bottom; y += pixelsBetweenDots.Height)
6481 graphics.DrawLine (pen, area.X, y, area.Right - 1, y);
6485 public override void CPDrawImageDisabled (Graphics graphics, Image image, int x, int y, Color background) {
6487 Microsoft seems to ignore the background and simply make
6488 the image grayscale. At least when having > 256 colors on
6492 if (imagedisabled_attributes == null) {
6493 imagedisabled_attributes = new ImageAttributes ();
6494 ColorMatrix colorMatrix=new ColorMatrix(new float[][] {
6495 // This table would create a perfect grayscale image, based on luminance
6496 // new float[]{0.3f,0.3f,0.3f,0,0},
6497 // new float[]{0.59f,0.59f,0.59f,0,0},
6498 // new float[]{0.11f,0.11f,0.11f,0,0},
6499 // new float[]{0,0,0,1,0,0},
6500 // new float[]{0,0,0,0,1,0},
6501 // new float[]{0,0,0,0,0,1}
6503 // This table generates a image that is grayscaled and then
6504 // brightened up. Seems to match MS close enough.
6505 new float[]{0.2f,0.2f,0.2f,0,0},
6506 new float[]{0.41f,0.41f,0.41f,0,0},
6507 new float[]{0.11f,0.11f,0.11f,0,0},
6508 new float[]{0.15f,0.15f,0.15f,1,0,0},
6509 new float[]{0.15f,0.15f,0.15f,0,1,0},
6510 new float[]{0.15f,0.15f,0.15f,0,0,1}
6513 imagedisabled_attributes.SetColorMatrix (colorMatrix);
6516 graphics.DrawImage(image, new Rectangle(x, y, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imagedisabled_attributes);
6521 public override void CPDrawLockedFrame (Graphics graphics, Rectangle rectangle, bool primary) {
6526 penBorder = ResPool.GetSizedPen (Color.White, 2);
6527 penInside = ResPool.GetPen (Color.Black);
6529 penBorder = ResPool.GetSizedPen (Color.Black, 2);
6530 penInside = ResPool.GetPen (Color.White);
6532 penBorder.Alignment=PenAlignment.Inset;
6533 penInside.Alignment=PenAlignment.Inset;
6535 graphics.DrawRectangle(penBorder, rectangle);
6536 graphics.DrawRectangle(penInside, rectangle.X+2, rectangle.Y+2, rectangle.Width-5, rectangle.Height-5);
6540 public override void CPDrawMenuGlyph (Graphics graphics, Rectangle rectangle, MenuGlyph glyph, Color color, Color backColor) {
6544 if (backColor != Color.Empty)
6545 graphics.FillRectangle (ResPool.GetSolidBrush (backColor), rectangle);
6547 Brush brush = ResPool.GetSolidBrush (color);
6550 case MenuGlyph.Arrow: {
6551 float height = rectangle.Height * 0.7f;
6552 float width = height / 2.0f;
6554 PointF ddCenter = new PointF (rectangle.X + ((rectangle.Width-width) / 2.0f), rectangle.Y + (rectangle.Height / 2.0f));
6556 PointF [] vertices = new PointF [3];
6557 vertices [0].X = ddCenter.X;
6558 vertices [0].Y = ddCenter.Y - (height / 2.0f);
6559 vertices [1].X = ddCenter.X;
6560 vertices [1].Y = ddCenter.Y + (height / 2.0f);
6561 vertices [2].X = ddCenter.X + width + 0.1f;
6562 vertices [2].Y = ddCenter.Y;
6564 graphics.FillPolygon (brush, vertices);
6569 case MenuGlyph.Bullet: {
6571 lineWidth=Math.Max(2, rectangle.Width/3);
6572 rect=new Rectangle(rectangle.X+lineWidth, rectangle.Y+lineWidth, rectangle.Width-lineWidth*2, rectangle.Height-lineWidth*2);
6574 graphics.FillEllipse(brush, rect);
6579 case MenuGlyph.Checkmark: {
6581 Pen pen = ResPool.GetPen (color);
6582 lineWidth = Math.Max (2, rectangle.Width / 6);
6583 rect = new Rectangle(rectangle.X + lineWidth, rectangle.Y + lineWidth, rectangle.Width - lineWidth * 2, rectangle.Height- lineWidth * 2);
6585 int Scale = Math.Max (1, rectangle.Width / 12);
6586 int top = (rect.Y + lineWidth + ((rect.Height - ((2 * Scale) + lineWidth)) / 2));
6588 for (int i=0; i<lineWidth; i++) {
6589 graphics.DrawLine (pen, rect.Left+lineWidth/2, top+i, rect.Left+lineWidth/2+2*Scale, top+2*Scale+i);
6590 graphics.DrawLine (pen, rect.Left+lineWidth/2+2*Scale, top+2*Scale+i, rect.Left+lineWidth/2+6*Scale, top-2*Scale+i);
6598 public override void CPDrawRadioButton (Graphics dc, Rectangle rectangle, ButtonState state)
6600 CPColor cpcolor = ResPool.GetCPColor (ColorControl);
6602 Color dot_color = Color.Black;
6604 Color top_left_outer = Color.Black;
6605 Color top_left_inner = Color.Black;
6606 Color bottom_right_outer = Color.Black;
6607 Color bottom_right_inner = Color.Black;
6609 int ellipse_diameter = (rectangle.Width > rectangle.Height) ? (int)(rectangle.Height * 0.9f) : (int)(rectangle.Width * 0.9f);
6610 int radius = ellipse_diameter / 2;
6612 Rectangle rb_rect = new Rectangle (rectangle.X + (rectangle.Width / 2) - radius, rectangle.Y + (rectangle.Height / 2) - radius, ellipse_diameter, ellipse_diameter);
6616 if ((state & ButtonState.All) == ButtonState.All) {
6617 brush = ResPool.GetHatchBrush (HatchStyle.Percent50, Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255),
6618 ColorControl.G, ColorControl.B), ColorControl);
6619 dot_color = cpcolor.Dark;
6621 if ((state & ButtonState.Flat) == ButtonState.Flat) {
6622 if (((state & ButtonState.Inactive) == ButtonState.Inactive) || ((state & ButtonState.Pushed) == ButtonState.Pushed))
6623 brush = ResPool.GetHatchBrush (HatchStyle.Percent50, Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255), ColorControl.G, ColorControl.B), ColorControl);
6625 brush = SystemBrushes.ControlLightLight;
6627 if (((state & ButtonState.Inactive) == ButtonState.Inactive) || ((state & ButtonState.Pushed) == ButtonState.Pushed))
6628 brush = ResPool.GetHatchBrush (HatchStyle.Percent50, Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255), ColorControl.G, ColorControl.B), ColorControl);
6630 brush = SystemBrushes.ControlLightLight;
6632 top_left_outer = cpcolor.Dark;
6633 top_left_inner = cpcolor.DarkDark;
6634 bottom_right_outer = cpcolor.Light;
6635 bottom_right_inner = Color.Transparent;
6637 if ((state & ButtonState.Inactive) == ButtonState.Inactive)
6638 dot_color = cpcolor.Dark;
6641 dc.FillEllipse (brush, rb_rect.X + 1, rb_rect.Y + 1, ellipse_diameter - 1, ellipse_diameter - 1);
6643 int line_width = Math.Max (1, (int)(ellipse_diameter * 0.08f));
6645 dc.DrawArc (ResPool.GetSizedPen (top_left_outer, line_width), rb_rect, 135.0f, 180.0f);
6646 dc.DrawArc (ResPool.GetSizedPen (top_left_inner, line_width), Rectangle.Inflate (rb_rect, -line_width, -line_width), 135.0f, 180.0f);
6647 dc.DrawArc (ResPool.GetSizedPen (bottom_right_outer, line_width), rb_rect, 315.0f, 180.0f);
6649 if (bottom_right_inner != Color.Transparent)
6650 dc.DrawArc (ResPool.GetSizedPen (bottom_right_inner, line_width), Rectangle.Inflate (rb_rect, -line_width, -line_width), 315.0f, 180.0f);
6652 using (Pen h_pen = new Pen (ResPool.GetHatchBrush (HatchStyle.Percent50, Color.FromArgb (Clamp (ColorControl.R + 3, 0, 255), ColorControl.G, ColorControl.B), ColorControl), line_width)) {
6653 dc.DrawArc (h_pen, Rectangle.Inflate (rb_rect, -line_width, -line_width), 315.0f, 180.0f);
6656 if ((state & ButtonState.Checked) == ButtonState.Checked) {
6657 int inflate = line_width * 4;
6658 Rectangle tmp = Rectangle.Inflate (rb_rect, -inflate, -inflate);
6659 if (rectangle.Height > 13) {
6663 dc.FillEllipse (ResPool.GetSolidBrush (dot_color), tmp);
6665 Pen pen = ResPool.GetPen (dot_color);
6666 dc.DrawLine (pen, tmp.X, tmp.Y + (tmp.Height / 2), tmp.Right, tmp.Y + (tmp.Height / 2));
6667 dc.DrawLine (pen, tmp.X, tmp.Y + (tmp.Height / 2) + 1, tmp.Right, tmp.Y + (tmp.Height / 2) + 1);
6669 dc.DrawLine (pen, tmp.X + (tmp.Width / 2), tmp.Y, tmp.X + (tmp.Width / 2), tmp.Bottom);
6670 dc.DrawLine (pen, tmp.X + (tmp.Width / 2) + 1, tmp.Y, tmp.X + (tmp.Width / 2) + 1, tmp.Bottom);
6675 public override void CPDrawReversibleFrame (Rectangle rectangle, Color backColor, FrameStyle style) {
6680 public override void CPDrawReversibleLine (Point start, Point end, Color backColor) {
6685 /* Scroll button: regular button + direction arrow */
6686 public override void CPDrawScrollButton (Graphics dc, Rectangle area, ScrollButton type, ButtonState state)
6688 DrawScrollButtonPrimitive (dc, area, state);
6690 bool fill_rect = true;
6693 if ((state & ButtonState.Pushed) != 0)
6697 Rectangle rect = new Rectangle (area.X + 2 + offset, area.Y + 2 + offset, area.Width - 4, area.Height - 4);
6699 Point [] arrow = new Point [3];
6700 for (int i = 0; i < 3; i++)
6701 arrow [i] = new Point ();
6703 Pen pen = SystemPens.ControlText;
6705 if ((state & ButtonState.Inactive) != 0) {
6706 pen = SystemPens.ControlDark;
6711 case ScrollButton.Down:
6712 int x_middle = (int)Math.Round (rect.Width / 2.0f) - 1;
6713 int y_middle = (int)Math.Round (rect.Height / 2.0f) - 1;
6717 int triangle_height;
6719 if (rect.Height < 8) {
6720 triangle_height = 2;
6722 } else if (rect.Height == 11) {
6723 triangle_height = 3;
6725 triangle_height = (int)Math.Round (rect.Height / 3.0f);
6728 arrow [0].X = rect.X + x_middle;
6729 arrow [0].Y = rect.Y + y_middle + triangle_height / 2;
6731 arrow [1].X = arrow [0].X + triangle_height - 1;
6732 arrow [1].Y = arrow [0].Y - triangle_height + 1;
6733 arrow [2].X = arrow [0].X - triangle_height + 1;
6734 arrow [2].Y = arrow [1].Y;
6736 dc.DrawPolygon (pen, arrow);
6738 if ((state & ButtonState.Inactive) != 0) {
6739 dc.DrawLine (SystemPens.ControlLightLight, arrow [1].X + 1, arrow [1].Y + 1, arrow [0].X + 1, arrow [0].Y + 1);
6740 dc.DrawLine (SystemPens.ControlLightLight, arrow [1].X, arrow [1].Y + 1, arrow [0].X + 1, arrow [0].Y);
6744 for (int i = 0; i < arrow [0].Y - arrow [1].Y; i++) {
6745 dc.DrawLine (pen, arrow [1].X, arrow [1].Y + i, arrow [2].X, arrow [1].Y + i);
6752 case ScrollButton.Up:
6753 x_middle = (int)Math.Round (rect.Width / 2.0f) - 1;
6754 y_middle = (int)Math.Round (rect.Height / 2.0f);
6761 if (rect.Height < 8) {
6762 triangle_height = 2;
6764 } else if (rect.Height == 11) {
6765 triangle_height = 3;
6767 triangle_height = (int)Math.Round (rect.Height / 3.0f);
6770 arrow [0].X = rect.X + x_middle;
6771 arrow [0].Y = rect.Y + y_middle - triangle_height / 2;
6773 arrow [1].X = arrow [0].X + triangle_height - 1;
6774 arrow [1].Y = arrow [0].Y + triangle_height - 1;
6775 arrow [2].X = arrow [0].X - triangle_height + 1;
6776 arrow [2].Y = arrow [1].Y;
6778 dc.DrawPolygon (pen, arrow);
6780 if ((state & ButtonState.Inactive) != 0) {
6781 dc.DrawLine (SystemPens.ControlLightLight, arrow [1].X + 1, arrow [1].Y + 1, arrow [2].X + 1, arrow [1].Y + 1);
6785 for (int i = 0; i < arrow [1].Y - arrow [0].Y; i++) {
6786 dc.DrawLine (pen, arrow [2].X, arrow [1].Y - i, arrow [1].X, arrow [1].Y - i);
6793 case ScrollButton.Left:
6794 y_middle = (int)Math.Round (rect.Height / 2.0f) - 1;
6800 if (rect.Width < 8) {
6803 } else if (rect.Width == 11) {
6806 triangle_width = (int)Math.Round (rect.Width / 3.0f);
6809 arrow [0].X = rect.Left + triangle_width - 1;
6810 arrow [0].Y = rect.Y + y_middle;
6812 if (arrow [0].X - 1 == rect.X)
6815 arrow [1].X = arrow [0].X + triangle_width - 1;
6816 arrow [1].Y = arrow [0].Y - triangle_width + 1;
6817 arrow [2].X = arrow [1].X;
6818 arrow [2].Y = arrow [0].Y + triangle_width - 1;
6820 dc.DrawPolygon (pen, arrow);
6822 if ((state & ButtonState.Inactive) != 0) {
6823 dc.DrawLine (SystemPens.ControlLightLight, arrow [1].X + 1, arrow [1].Y + 1, arrow [2].X + 1, arrow [2].Y + 1);
6827 for (int i = 0; i < arrow [2].X - arrow [0].X; i++) {
6828 dc.DrawLine (pen, arrow [2].X - i, arrow [1].Y, arrow [2].X - i, arrow [2].Y);
6835 case ScrollButton.Right:
6836 y_middle = (int)Math.Round (rect.Height / 2.0f) - 1;
6840 if (rect.Width < 8) {
6843 } else if (rect.Width == 11) {
6846 triangle_width = (int)Math.Round (rect.Width / 3.0f);
6849 arrow [0].X = rect.Right - triangle_width - 1;
6850 arrow [0].Y = rect.Y + y_middle;
6852 if (arrow [0].X - 1 == rect.X)
6855 arrow [1].X = arrow [0].X - triangle_width + 1;
6856 arrow [1].Y = arrow [0].Y - triangle_width + 1;
6857 arrow [2].X = arrow [1].X;
6858 arrow [2].Y = arrow [0].Y + triangle_width - 1;
6860 dc.DrawPolygon (pen, arrow);
6862 if ((state & ButtonState.Inactive) != 0) {
6863 dc.DrawLine (SystemPens.ControlLightLight, arrow [0].X + 1, arrow [0].Y + 1, arrow [2].X + 1, arrow [2].Y + 1);
6864 dc.DrawLine (SystemPens.ControlLightLight, arrow [0].X, arrow [0].Y + 1, arrow [2].X + 1, arrow [2].Y);
6868 for (int i = 0; i < arrow [0].X - arrow [1].X; i++) {
6869 dc.DrawLine (pen, arrow [2].X + i, arrow [1].Y, arrow [2].X + i, arrow [2].Y);
6878 public override void CPDrawSelectionFrame (Graphics graphics, bool active, Rectangle outsideRect, Rectangle insideRect,
6884 public override void CPDrawSizeGrip (Graphics dc, Color backColor, Rectangle bounds)
6886 Pen pen_dark = ResPool.GetPen(ControlPaint.Dark(backColor));
6887 Pen pen_light_light = ResPool.GetPen(ControlPaint.LightLight(backColor));
6889 for (int i = 2; i < bounds.Width - 2; i += 4) {
6890 dc.DrawLine (pen_light_light, bounds.X + i, bounds.Bottom - 2, bounds.Right - 1, bounds.Y + i - 1);
6891 dc.DrawLine (pen_dark, bounds.X + i + 1, bounds.Bottom - 2, bounds.Right - 1, bounds.Y + i);
6892 dc.DrawLine (pen_dark, bounds.X + i + 2, bounds.Bottom - 2, bounds.Right - 1, bounds.Y + i + 1);
6896 private void DrawStringDisabled20 (Graphics g, string s, Font font, Rectangle layoutRectangle, Color color, TextFormatFlags flags, bool useDrawString)
6898 CPColor cpcolor = ResPool.GetCPColor (color);
6900 layoutRectangle.Offset (1, 1);
6901 TextRenderer.DrawTextInternal (g, s, font, layoutRectangle, cpcolor.LightLight, flags, useDrawString);
6903 layoutRectangle.Offset (-1, -1);
6904 TextRenderer.DrawTextInternal (g, s, font, layoutRectangle, cpcolor.Dark, flags, useDrawString);
6907 public override void CPDrawStringDisabled (Graphics dc, string s, Font font, Color color, RectangleF layoutRectangle, StringFormat format)
6909 CPColor cpcolor = ResPool.GetCPColor (color);
6911 dc.DrawString (s, font, ResPool.GetSolidBrush(cpcolor.LightLight),
6912 new RectangleF(layoutRectangle.X + 1, layoutRectangle.Y + 1, layoutRectangle.Width, layoutRectangle.Height),
6914 dc.DrawString (s, font, ResPool.GetSolidBrush (cpcolor.Dark), layoutRectangle, format);
6918 public override void CPDrawStringDisabled (IDeviceContext dc, string s, Font font, Color color, Rectangle layoutRectangle, TextFormatFlags format)
6920 CPColor cpcolor = ResPool.GetCPColor (color);
6922 layoutRectangle.Offset (1, 1);
6923 TextRenderer.DrawText (dc, s, font, layoutRectangle, cpcolor.LightLight, format);
6925 layoutRectangle.Offset (-1, -1);
6926 TextRenderer.DrawText (dc, s, font, layoutRectangle, cpcolor.Dark, format);
6929 public override void CPDrawVisualStyleBorder (Graphics graphics, Rectangle bounds)
6931 graphics.DrawRectangle (SystemPens.ControlDarkDark, bounds);
6935 private static void DrawBorderInternal (Graphics graphics, int startX, int startY, int endX, int endY,
6936 int width, Color color, ButtonBorderStyle style, Border3DSide side)
6938 DrawBorderInternal (graphics, (float) startX, (float) startY, (float) endX, (float) endY,
6939 width, color, style, side);
6942 private static void DrawBorderInternal (Graphics graphics, float startX, float startY, float endX, float endY,
6943 int width, Color color, ButtonBorderStyle style, Border3DSide side) {
6948 case ButtonBorderStyle.Solid:
6949 case ButtonBorderStyle.Inset:
6950 case ButtonBorderStyle.Outset:
6951 pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Solid);
6953 case ButtonBorderStyle.Dashed:
6954 pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Dash);
6956 case ButtonBorderStyle.Dotted:
6957 pen = ThemeEngine.Current.ResPool.GetDashPen (color, DashStyle.Dot);
6960 case ButtonBorderStyle.None:
6965 case ButtonBorderStyle.Outset: {
6967 int hue, brightness, saturation;
6968 int brightnessSteps;
6969 int brightnessDownSteps;
6971 ControlPaint.Color2HBS(color, out hue, out brightness, out saturation);
6973 brightnessDownSteps=brightness/width;
6974 if (brightness>127) {
6975 brightnessSteps=Math.Max(6, (160-brightness)/width);
6977 brightnessSteps=(127-brightness)/width;
6980 for (int i=0; i<width; i++) {
6982 case Border3DSide.Left: {
6983 colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
6984 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
6985 graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
6989 case Border3DSide.Right: {
6990 colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
6991 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
6992 graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
6996 case Border3DSide.Top: {
6997 colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
6998 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
6999 graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
7003 case Border3DSide.Bottom: {
7004 colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
7005 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
7006 graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
7014 case ButtonBorderStyle.Inset: {
7016 int hue, brightness, saturation;
7017 int brightnessSteps;
7018 int brightnessDownSteps;
7020 ControlPaint.Color2HBS(color, out hue, out brightness, out saturation);
7022 brightnessDownSteps=brightness/width;
7023 if (brightness>127) {
7024 brightnessSteps=Math.Max(6, (160-brightness)/width);
7026 brightnessSteps=(127-brightness)/width;
7029 for (int i=0; i<width; i++) {
7031 case Border3DSide.Left: {
7032 colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
7033 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
7034 graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
7038 case Border3DSide.Right: {
7039 colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
7040 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
7041 graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
7045 case Border3DSide.Top: {
7046 colorGrade=ControlPaint.HBS2Color(hue, Math.Max(0, brightness-brightnessDownSteps*(width-i)), saturation);
7047 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
7048 graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
7052 case Border3DSide.Bottom: {
7053 colorGrade=ControlPaint.HBS2Color(hue, Math.Min(255, brightness+brightnessSteps*(width-i)), saturation);
7054 pen = ThemeEngine.Current.ResPool.GetPen (colorGrade);
7055 graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
7064 I decided to have the for-loop duplicated for speed reasons;
7065 that way we only have to switch once (as opposed to have the
7066 for-loop around the switch)
7070 case Border3DSide.Left: {
7071 for (int i=0; i<width; i++) {
7072 graphics.DrawLine(pen, startX+i, startY+i, endX+i, endY-i);
7077 case Border3DSide.Right: {
7078 for (int i=0; i<width; i++) {
7079 graphics.DrawLine(pen, startX-i, startY+i, endX-i, endY-i);
7084 case Border3DSide.Top: {
7085 for (int i=0; i<width; i++) {
7086 graphics.DrawLine(pen, startX+i, startY+i, endX-i, endY+i);
7091 case Border3DSide.Bottom: {
7092 for (int i=0; i<width; i++) {
7093 graphics.DrawLine(pen, startX+i, startY-i, endX-i, endY-i);
7104 This function actually draws the various caption elements.
7105 This way we can scale them nicely, no matter what size, and they
7106 still look like MS's scaled caption buttons. (as opposed to scaling a bitmap)
7109 private void DrawCaptionHelper(Graphics graphics, Color color, Pen pen, int lineWidth, int shift, Rectangle captionRect, CaptionButton button) {
7111 case CaptionButton.Close: {
7113 graphics.DrawLine(pen, captionRect.Left+2*lineWidth+1+shift, captionRect.Top+2*lineWidth+shift, captionRect.Right-2*lineWidth+1+shift, captionRect.Bottom-2*lineWidth+shift);
7114 graphics.DrawLine(pen, captionRect.Right-2*lineWidth+1+shift, captionRect.Top+2*lineWidth+shift, captionRect.Left+2*lineWidth+1+shift, captionRect.Bottom-2*lineWidth+shift);
7117 graphics.DrawLine(pen, captionRect.Left+2*lineWidth+shift, captionRect.Top+2*lineWidth+shift, captionRect.Right-2*lineWidth+shift, captionRect.Bottom-2*lineWidth+shift);
7118 graphics.DrawLine(pen, captionRect.Right-2*lineWidth+shift, captionRect.Top+2*lineWidth+shift, captionRect.Left+2*lineWidth+shift, captionRect.Bottom-2*lineWidth+shift);
7122 case CaptionButton.Help: {
7123 StringFormat sf = new StringFormat();
7124 Font font = new Font("Microsoft Sans Serif", captionRect.Height, FontStyle.Bold, GraphicsUnit.Pixel);
7126 sf.Alignment=StringAlignment.Center;
7127 sf.LineAlignment=StringAlignment.Center;
7130 graphics.DrawString("?", font, ResPool.GetSolidBrush (color), captionRect.X+captionRect.Width/2+shift, captionRect.Y+captionRect.Height/2+shift+lineWidth/2, sf);
7138 case CaptionButton.Maximize: {
7139 /* Top 'caption bar' line */
7140 for (int i=0; i<Math.Max(2, lineWidth); i++) {
7141 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift, captionRect.Top+2*lineWidth+shift+i, captionRect.Right-lineWidth-lineWidth/2+shift, captionRect.Top+2*lineWidth+shift+i);
7144 /* Left side line */
7145 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7146 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift+i, captionRect.Top+2*lineWidth+shift, captionRect.Left+lineWidth+shift+i, captionRect.Bottom-lineWidth+shift);
7149 /* Right side line */
7150 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7151 graphics.DrawLine(pen, captionRect.Right-lineWidth-lineWidth/2+shift+i, captionRect.Top+2*lineWidth+shift, captionRect.Right-lineWidth-lineWidth/2+shift+i, captionRect.Bottom-lineWidth+shift);
7155 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7156 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift, captionRect.Bottom-lineWidth+shift-i, captionRect.Right-lineWidth-lineWidth/2+shift, captionRect.Bottom-lineWidth+shift-i);
7161 case CaptionButton.Minimize: {
7163 for (int i=0; i<Math.Max(2, lineWidth); i++) {
7164 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift, captionRect.Bottom-lineWidth+shift-i, captionRect.Right-3*lineWidth+shift, captionRect.Bottom-lineWidth+shift-i);
7169 case CaptionButton.Restore: {
7170 /** First 'window' **/
7171 /* Top 'caption bar' line */
7172 for (int i=0; i<Math.Max(2, lineWidth); i++) {
7173 graphics.DrawLine(pen, captionRect.Left+3*lineWidth+shift, captionRect.Top+2*lineWidth+shift-i, captionRect.Right-lineWidth-lineWidth/2+shift, captionRect.Top+2*lineWidth+shift-i);
7176 /* Left side line */
7177 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7178 graphics.DrawLine(pen, captionRect.Left+3*lineWidth+shift+i, captionRect.Top+2*lineWidth+shift, captionRect.Left+3*lineWidth+shift+i, captionRect.Top+4*lineWidth+shift);
7181 /* Right side line */
7182 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7183 graphics.DrawLine(pen, captionRect.Right-lineWidth-lineWidth/2+shift-i, captionRect.Top+2*lineWidth+shift, captionRect.Right-lineWidth-lineWidth/2+shift-i, captionRect.Top+5*lineWidth-lineWidth/2+shift);
7187 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7188 graphics.DrawLine(pen, captionRect.Right-3*lineWidth-lineWidth/2+shift, captionRect.Top+5*lineWidth-lineWidth/2+shift+1+i, captionRect.Right-lineWidth-lineWidth/2+shift, captionRect.Top+5*lineWidth-lineWidth/2+shift+1+i);
7191 /** Second 'window' **/
7192 /* Top 'caption bar' line */
7193 for (int i=0; i<Math.Max(2, lineWidth); i++) {
7194 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift, captionRect.Top+4*lineWidth+shift+1-i, captionRect.Right-3*lineWidth-lineWidth/2+shift, captionRect.Top+4*lineWidth+shift+1-i);
7197 /* Left side line */
7198 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7199 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift+i, captionRect.Top+4*lineWidth+shift+1, captionRect.Left+lineWidth+shift+i, captionRect.Bottom-lineWidth+shift);
7202 /* Right side line */
7203 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7204 graphics.DrawLine(pen, captionRect.Right-3*lineWidth-lineWidth/2+shift-i, captionRect.Top+4*lineWidth+shift+1, captionRect.Right-3*lineWidth-lineWidth/2+shift-i, captionRect.Bottom-lineWidth+shift);
7208 for (int i=0; i<Math.Max(1, lineWidth/2); i++) {
7209 graphics.DrawLine(pen, captionRect.Left+lineWidth+shift, captionRect.Bottom-lineWidth+shift-i, captionRect.Right-3*lineWidth-lineWidth/2+shift, captionRect.Bottom-lineWidth+shift-i);
7218 /* Generic scroll button */
7219 public void DrawScrollButtonPrimitive (Graphics dc, Rectangle area, ButtonState state) {
7220 if ((state & ButtonState.Pushed) == ButtonState.Pushed) {
7221 dc.FillRectangle (SystemBrushes.Control, area.X + 1,
7222 area.Y + 1, area.Width - 2 , area.Height - 2);
7224 dc.DrawRectangle (SystemPens.ControlDark, area.X,
7225 area.Y, area.Width, area.Height);
7230 Brush sb_control = SystemBrushes.Control;
7231 Brush sb_lightlight = SystemBrushes.ControlLightLight;
7232 Brush sb_dark = SystemBrushes.ControlDark;
7233 Brush sb_darkdark = SystemBrushes.ControlDarkDark;
7235 dc.FillRectangle (sb_control, area.X, area.Y, area.Width, 1);
7236 dc.FillRectangle (sb_control, area.X, area.Y, 1, area.Height);
7238 dc.FillRectangle (sb_lightlight, area.X + 1, area.Y + 1, area.Width - 1, 1);
7239 dc.FillRectangle (sb_lightlight, area.X + 1, area.Y + 2, 1,
7242 dc.FillRectangle (sb_dark, area.X + 1, area.Y + area.Height - 2,
7245 dc.FillRectangle (sb_darkdark, area.X, area.Y + area.Height -1,
7248 dc.FillRectangle (sb_dark, area.X + area.Width - 2,
7249 area.Y + 1, 1, area.Height -3);
7251 dc.FillRectangle (sb_darkdark, area.X + area.Width -1,
7252 area.Y, 1, area.Height - 1);
7254 dc.FillRectangle (sb_control, area.X + 2,
7255 area.Y + 2, area.Width - 4, area.Height - 4);
7259 public override void CPDrawBorderStyle (Graphics dc, Rectangle area, BorderStyle border_style) {
7260 switch (border_style){
7261 case BorderStyle.Fixed3D:
7262 dc.DrawLine (ResPool.GetPen (ColorControlDark), area.X, area.Y, area.X +area.Width, area.Y);
7263 dc.DrawLine (ResPool.GetPen (ColorControlDark), area.X, area.Y, area.X, area.Y + area.Height);
7264 dc.DrawLine (ResPool.GetPen (ColorControlLight), area.X , area.Y + area.Height - 1, area.X + area.Width ,
7265 area.Y + area.Height - 1);
7266 dc.DrawLine (ResPool.GetPen (ColorControlLight), area.X + area.Width -1 , area.Y, area.X + area.Width -1,
7267 area.Y + area.Height);
7269 dc.DrawLine (ResPool.GetPen (ColorActiveBorder), area.X + 1, area.Bottom - 2, area.Right - 2, area.Bottom - 2);
7270 dc.DrawLine (ResPool.GetPen (ColorActiveBorder), area.Right - 2, area.Top + 1, area.Right - 2, area.Bottom - 2);
7271 dc.DrawLine (ResPool.GetPen (ColorControlDarkDark), area.X + 1, area.Top + 1, area.X + 1, area.Bottom - 3);
7272 dc.DrawLine (ResPool.GetPen (ColorControlDarkDark), area.X + 1, area.Top + 1, area.Right - 3, area.Top + 1);
7274 case BorderStyle.FixedSingle:
7275 dc.DrawRectangle (ResPool.GetPen (ColorWindowFrame), area.X, area.Y, area.Width - 1, area.Height - 1);
7277 case BorderStyle.None:
7283 #endregion // ControlPaint