Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

2161 lines
86 KiB
C#

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// Copyright (c) 2008 George Giolfan
// Copyright (c) 2004-2006 Novell, Inc.
//
// Authors:
// George Giolfan, georgegiolfan@yahoo.com
// Ernesto Carrea, equistango@gmail.com
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms.VisualStyles;
namespace System.Windows.Forms
{
/// <summary>
/// VisualStyles theme.
/// </summary>
/// <remarks>
/// This theme uses only the managed VisualStyles API.
/// To select it, set MONO_THEME to VisualStyles and call <see cref="Application.EnableVisualStyles"/>.
/// </remarks>
class ThemeVisualStyles : ThemeWin32Classic
{
static bool render_client_areas;
static bool render_non_client_areas;
public ThemeVisualStyles ()
{
Update ();
}
public override void ResetDefaults ()
{
base.ResetDefaults ();
Update ();
}
static void Update ()
{
bool visual_styles_is_enabled_by_user = VisualStyleInformation.IsEnabledByUser;
render_client_areas =
visual_styles_is_enabled_by_user &&
(Application.VisualStyleState == VisualStyleState.ClientAndNonClientAreasEnabled ||
Application.VisualStyleState == VisualStyleState.ClientAreaEnabled);
render_non_client_areas =
visual_styles_is_enabled_by_user &&
(Application.VisualStyleState == VisualStyleState.ClientAndNonClientAreasEnabled/* ||
Application.VisualStyleState == VisualStyleState.NonClientAreaEnabled*/);
}
public static bool RenderClientAreas {
get { return render_client_areas; }
}
#region Controls
#region ButtonBase
public override void DrawButtonBase (Graphics dc, Rectangle clip_area, ButtonBase button)
{
if (button.FlatStyle == FlatStyle.System) {
ButtonRenderer.DrawButton (
dc,
new Rectangle (Point.Empty, button.Size),
button.Text,
button.Font,
button.TextFormatFlags,
null,
Rectangle.Empty,
ShouldPaintFocusRectagle (button),
GetPushButtonState (button)
);
return;
}
base.DrawButtonBase (dc, clip_area, button);
}
static PushButtonState GetPushButtonState (ButtonBase button)
{
if (!button.Enabled)
return PushButtonState.Disabled;
if (button.Pressed)
return PushButtonState.Pressed;
if (button.Entered)
return PushButtonState.Hot;
if (button.IsDefault || button.Focused || button.paint_as_acceptbutton)
return PushButtonState.Default;
return PushButtonState.Normal;
}
#endregion
#region Button 2.0
public override void DrawButtonBackground (Graphics g, Button button, Rectangle clipArea)
{
if (!RenderClientAreas ||
!button.UseVisualStyleBackColor) {
base.DrawButtonBackground (g, button, clipArea);
return;
}
ButtonRenderer.GetPushButtonRenderer (GetPushButtonState (button)).DrawBackground (g, new Rectangle (Point.Empty, button.Size));
}
#endregion
#region CheckBox
protected override void CheckBox_DrawCheckBox (Graphics dc, CheckBox checkbox, ButtonState state, Rectangle checkbox_rectangle)
{
if (checkbox.Appearance == Appearance.Normal && checkbox.FlatStyle == FlatStyle.System) {
CheckBoxRenderer.DrawCheckBox (
dc,
new Point (checkbox_rectangle.Left, checkbox_rectangle.Top),
GetCheckBoxState (checkbox)
);
return;
}
base.CheckBox_DrawCheckBox(dc, checkbox, state, checkbox_rectangle);
}
static CheckBoxState GetCheckBoxState (CheckBox checkBox)
{
switch (checkBox.CheckState) {
case CheckState.Checked:
if (!checkBox.Enabled)
return CheckBoxState.CheckedDisabled;
else if (checkBox.Pressed)
return CheckBoxState.CheckedPressed;
else if (checkBox.Entered)
return CheckBoxState.CheckedHot;
return CheckBoxState.CheckedNormal;
case CheckState.Indeterminate:
if (!checkBox.Enabled)
return CheckBoxState.MixedDisabled;
else if (checkBox.Pressed)
return CheckBoxState.MixedPressed;
else if (checkBox.Entered)
return CheckBoxState.MixedHot;
return CheckBoxState.MixedNormal;
default:
if (!checkBox.Enabled)
return CheckBoxState.UncheckedDisabled;
else if (checkBox.Pressed)
return CheckBoxState.UncheckedPressed;
else if (checkBox.Entered)
return CheckBoxState.UncheckedHot;
return CheckBoxState.UncheckedNormal;
}
}
#endregion
#region ComboBox
static VisualStyleElement ComboBoxGetVisualStyleElement (ComboBox comboBox, ButtonState state)
{
if (state == ButtonState.Inactive)
return VisualStyleElement.ComboBox.DropDownButton.Disabled;
if (state == ButtonState.Pushed)
return VisualStyleElement.ComboBox.DropDownButton.Pressed;
if (comboBox.DropDownButtonEntered)
return VisualStyleElement.ComboBox.DropDownButton.Hot;
return VisualStyleElement.ComboBox.DropDownButton.Normal;
}
public override void ComboBoxDrawNormalDropDownButton (ComboBox comboBox, Graphics g, Rectangle clippingArea, Rectangle area, ButtonState state)
{
if (!RenderClientAreas) {
base.ComboBoxDrawNormalDropDownButton (comboBox, g, clippingArea, area, state);
return;
}
VisualStyleElement element = ComboBoxGetVisualStyleElement (comboBox, state);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ComboBoxDrawNormalDropDownButton (comboBox, g, clippingArea, area, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, area, clippingArea);
}
public override bool ComboBoxNormalDropDownButtonHasTransparentBackground (ComboBox comboBox, ButtonState state)
{
if (!RenderClientAreas)
return base.ComboBoxNormalDropDownButtonHasTransparentBackground (comboBox, state);
VisualStyleElement element = ComboBoxGetVisualStyleElement (comboBox, state);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.ComboBoxNormalDropDownButtonHasTransparentBackground (comboBox, state);
return new VisualStyleRenderer (element).IsBackgroundPartiallyTransparent ();
}
public override bool ComboBoxDropDownButtonHasHotElementStyle (ComboBox comboBox)
{
if (!RenderClientAreas)
return base.ComboBoxDropDownButtonHasHotElementStyle (comboBox);
switch (comboBox.FlatStyle) {
case FlatStyle.Flat:
case FlatStyle.Popup:
return base.ComboBoxDropDownButtonHasHotElementStyle (comboBox);
}
return true;
}
static bool ComboBoxShouldPaintBackground (ComboBox comboBox)
{
if (comboBox.DropDownStyle == ComboBoxStyle.Simple)
return false;
switch (comboBox.FlatStyle) {
case FlatStyle.Flat:
case FlatStyle.Popup:
return false;
}
return true;
}
public override void ComboBoxDrawBackground (ComboBox comboBox, Graphics g, Rectangle clippingArea, FlatStyle style)
{
if (!RenderClientAreas || !ComboBoxShouldPaintBackground (comboBox)) {
base.ComboBoxDrawBackground (comboBox, g, clippingArea, style);
return;
}
VisualStyleElement element;
if (!comboBox.Enabled)
element = VisualStyleElement.ComboBox.Border.Disabled;
else if (comboBox.Entered)
element = VisualStyleElement.ComboBox.Border.Hot;
else if (comboBox.Focused)
element = VisualStyleElement.ComboBox.Border.Focused;
else
element = VisualStyleElement.ComboBox.Border.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ComboBoxDrawBackground (comboBox, g, clippingArea, style);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, new Rectangle (Point.Empty, comboBox.Size), clippingArea);
}
public override bool CombBoxBackgroundHasHotElementStyle (ComboBox comboBox)
{
if (RenderClientAreas &&
ComboBoxShouldPaintBackground (comboBox) &&
comboBox.Enabled &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ComboBox.Border.Hot))
return true;
return base.CombBoxBackgroundHasHotElementStyle (comboBox);
}
#endregion
#region ControlPaint
#region DrawButton
public override void CPDrawButton (Graphics dc, Rectangle rectangle, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat ||
(state & ButtonState.Checked) == ButtonState.Checked) {
base.CPDrawButton (dc, rectangle, state);
return;
}
VisualStyleElement element;
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.PushButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.PushButton.Pressed;
else
element = VisualStyleElement.Button.PushButton.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawButton (dc, rectangle, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, rectangle);
}
#endregion
#region DrawCaptionButton
public override void CPDrawCaptionButton (Graphics graphics, Rectangle rectangle, CaptionButton button, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat ||
(state & ButtonState.Checked) == ButtonState.Checked) {
base.CPDrawCaptionButton (graphics, rectangle, button, state);
return;
}
VisualStyleElement element = GetCaptionButtonVisualStyleElement (button, state);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawCaptionButton (graphics, rectangle, button, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (graphics, rectangle);
}
static VisualStyleElement GetCaptionButtonVisualStyleElement (CaptionButton button, ButtonState state)
{
switch (button) {
case CaptionButton.Minimize:
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
return VisualStyleElement.Window.MinButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
return VisualStyleElement.Window.MinButton.Pressed;
else
return VisualStyleElement.Window.MinButton.Normal;
case CaptionButton.Maximize:
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
return VisualStyleElement.Window.MaxButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
return VisualStyleElement.Window.MaxButton.Pressed;
else
return VisualStyleElement.Window.MaxButton.Normal;
case CaptionButton.Close:
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
return VisualStyleElement.Window.CloseButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
return VisualStyleElement.Window.CloseButton.Pressed;
else
return VisualStyleElement.Window.CloseButton.Normal;
case CaptionButton.Restore:
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
return VisualStyleElement.Window.RestoreButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
return VisualStyleElement.Window.RestoreButton.Pressed;
else
return VisualStyleElement.Window.RestoreButton.Normal;
default:
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
return VisualStyleElement.Window.HelpButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
return VisualStyleElement.Window.HelpButton.Pressed;
else
return VisualStyleElement.Window.HelpButton.Normal;
}
}
#endregion
#region DrawCheckBox
public override void CPDrawCheckBox (Graphics dc, Rectangle rectangle, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat) {
base.CPDrawCheckBox (dc, rectangle, state);
return;
}
VisualStyleElement element;
if ((state & ButtonState.Checked) == ButtonState.Checked)
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.CheckBox.CheckedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.CheckBox.CheckedPressed;
else
element = VisualStyleElement.Button.CheckBox.CheckedNormal;
else
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.CheckBox.UncheckedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.CheckBox.UncheckedPressed;
else
element = VisualStyleElement.Button.CheckBox.UncheckedNormal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawCheckBox (dc, rectangle, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, rectangle);
}
#endregion
#region DrawComboButton
public override void CPDrawComboButton (Graphics graphics, Rectangle rectangle, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat ||
(state & ButtonState.Checked) == ButtonState.Checked) {
base.CPDrawComboButton (graphics, rectangle, state);
return;
}
VisualStyleElement element;
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.ComboBox.DropDownButton.Disabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.ComboBox.DropDownButton.Pressed;
else
element = VisualStyleElement.ComboBox.DropDownButton.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawComboButton (graphics, rectangle, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (graphics, rectangle);
}
#endregion
#region DrawMixedCheckBox
public override void CPDrawMixedCheckBox (Graphics dc, Rectangle rectangle, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat) {
base.CPDrawMixedCheckBox (dc, rectangle, state);
return;
}
VisualStyleElement element;
if ((state & ButtonState.Checked) == ButtonState.Checked)
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.CheckBox.MixedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.CheckBox.MixedPressed;
else
element = VisualStyleElement.Button.CheckBox.MixedNormal;
else
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.CheckBox.UncheckedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.CheckBox.UncheckedPressed;
else
element = VisualStyleElement.Button.CheckBox.UncheckedNormal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawMixedCheckBox (dc, rectangle, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, rectangle);
}
#endregion
#region DrawRadioButton
public override void CPDrawRadioButton (Graphics dc, Rectangle rectangle, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat) {
base.CPDrawRadioButton (dc, rectangle, state);
return;
}
VisualStyleElement element;
if ((state & ButtonState.Checked) == ButtonState.Checked)
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.RadioButton.CheckedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.RadioButton.CheckedPressed;
else
element = VisualStyleElement.Button.RadioButton.CheckedNormal;
else
if ((state & ButtonState.Inactive) == ButtonState.Inactive)
element = VisualStyleElement.Button.RadioButton.UncheckedDisabled;
else if ((state & ButtonState.Pushed) == ButtonState.Pushed)
element = VisualStyleElement.Button.RadioButton.UncheckedPressed;
else
element = VisualStyleElement.Button.RadioButton.UncheckedNormal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawRadioButton (dc, rectangle, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, rectangle);
}
#endregion
#region DrawScrollButton
public override void CPDrawScrollButton (Graphics dc, Rectangle area, ScrollButton type, ButtonState state)
{
if (!RenderClientAreas ||
(state & ButtonState.Flat) == ButtonState.Flat ||
(state & ButtonState.Checked) == ButtonState.Checked) {
base.CPDrawScrollButton (dc, area, type, state);
return;
}
VisualStyleElement element = GetScrollButtonVisualStyleElement (type, state);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.CPDrawScrollButton (dc, area, type, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, area);
}
static VisualStyleElement GetScrollButtonVisualStyleElement (ScrollButton type, ButtonState state)
{
switch (type) {
case ScrollButton.Left:
if (IsDisabled (state))
return VisualStyleElement.ScrollBar.ArrowButton.LeftDisabled;
else if (IsPressed (state))
return VisualStyleElement.ScrollBar.ArrowButton.LeftPressed;
else
return VisualStyleElement.ScrollBar.ArrowButton.LeftNormal;
case ScrollButton.Right:
if (IsDisabled (state))
return VisualStyleElement.ScrollBar.ArrowButton.RightDisabled;
else if (IsPressed (state))
return VisualStyleElement.ScrollBar.ArrowButton.RightPressed;
else
return VisualStyleElement.ScrollBar.ArrowButton.RightNormal;
case ScrollButton.Up:
if (IsDisabled (state))
return VisualStyleElement.ScrollBar.ArrowButton.UpDisabled;
else if (IsPressed (state))
return VisualStyleElement.ScrollBar.ArrowButton.UpPressed;
else
return VisualStyleElement.ScrollBar.ArrowButton.UpNormal;
default:
if (IsDisabled (state))
return VisualStyleElement.ScrollBar.ArrowButton.DownDisabled;
else if (IsPressed (state))
return VisualStyleElement.ScrollBar.ArrowButton.DownPressed;
else
return VisualStyleElement.ScrollBar.ArrowButton.DownNormal;
}
}
static bool IsDisabled (ButtonState state)
{
return (state & ButtonState.Inactive) == ButtonState.Inactive;
}
static bool IsPressed (ButtonState state)
{
return (state & ButtonState.Pushed) == ButtonState.Pushed;
}
#endregion
#endregion
#region DataGridView
#region DataGridViewHeaderCell
#region DataGridViewRowHeaderCell
public override bool DataGridViewRowHeaderCellDrawBackground (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds)
{
if (!RenderClientAreas ||
!cell.DataGridView.EnableHeadersVisualStyles)
return base.DataGridViewRowHeaderCellDrawBackground (cell, g, bounds);
VisualStyleElement element = DataGridViewRowHeaderCellGetVisualStyleElement (cell);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.DataGridViewRowHeaderCellDrawBackground (cell, g, bounds);
bounds.Width--;
Bitmap bitmap = new Bitmap (bounds.Height, bounds.Width);
Graphics bitmap_g = Graphics.FromImage (bitmap);
Rectangle bitmap_rectangle = new Rectangle (Point.Empty, bitmap.Size);
VisualStyleRenderer renderer = new VisualStyleRenderer (element);
if (!AreEqual (element, VisualStyleElement.Header.Item.Normal) && renderer.IsBackgroundPartiallyTransparent ())
new VisualStyleRenderer (VisualStyleElement.Header.Item.Normal).DrawBackground (bitmap_g, bitmap_rectangle);
renderer.DrawBackground (bitmap_g, bitmap_rectangle);
bitmap_g.Dispose ();
g.Transform = new Matrix(0, 1, 1, 0, 0, 0);
g.DrawImage (bitmap, bounds.Y, bounds.X);
bitmap.Dispose ();
g.ResetTransform ();
return true;
}
public override bool DataGridViewRowHeaderCellDrawSelectionBackground (DataGridViewRowHeaderCell cell)
{
if (!RenderClientAreas ||
!cell.DataGridView.EnableHeadersVisualStyles || !VisualStyleRenderer.IsElementDefined (DataGridViewRowHeaderCellGetVisualStyleElement (cell)))
return base.DataGridViewRowHeaderCellDrawSelectionBackground (cell);
return true;
}
public override bool DataGridViewRowHeaderCellDrawBorder (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds)
{
if (!RenderClientAreas ||
!cell.DataGridView.EnableHeadersVisualStyles || !VisualStyleRenderer.IsElementDefined (DataGridViewRowHeaderCellGetVisualStyleElement (cell)))
return base.DataGridViewRowHeaderCellDrawBorder (cell, g, bounds);
g.DrawLine (cell.GetBorderPen (), bounds.Right - 1, bounds.Top, bounds.Right - 1, bounds.Bottom - 1);
return true;
}
static VisualStyleElement DataGridViewRowHeaderCellGetVisualStyleElement (DataGridViewRowHeaderCell cell)
{
if (cell.DataGridView.PressedHeaderCell == cell)
return VisualStyleElement.Header.Item.Pressed;
if (cell.DataGridView.EnteredHeaderCell == cell)
return VisualStyleElement.Header.Item.Hot;
if (cell.OwningRow.SelectedInternal)
return VisualStyleElement.Header.Item.Pressed;
return VisualStyleElement.Header.Item.Normal;
}
#endregion
#region DataGridViewColumnHeaderCell
public override bool DataGridViewColumnHeaderCellDrawBackground (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds)
{
if (!RenderClientAreas ||
!cell.DataGridView.EnableHeadersVisualStyles || cell is DataGridViewTopLeftHeaderCell)
return base.DataGridViewColumnHeaderCellDrawBackground (cell, g, bounds);
VisualStyleElement element = DataGridViewColumnHeaderCellGetVisualStyleElement (cell);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.DataGridViewColumnHeaderCellDrawBackground (cell, g, bounds);
bounds.Height--;
VisualStyleRenderer renderer = new VisualStyleRenderer (element);
if (!AreEqual (element, VisualStyleElement.Header.Item.Normal) && renderer.IsBackgroundPartiallyTransparent ())
new VisualStyleRenderer (VisualStyleElement.Header.Item.Normal).DrawBackground (g, bounds);
renderer.DrawBackground (g, bounds);
return true;
}
public override bool DataGridViewColumnHeaderCellDrawBorder (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds)
{
if (!RenderClientAreas ||
!cell.DataGridView.EnableHeadersVisualStyles ||
cell is DataGridViewTopLeftHeaderCell ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.Header.Item.Normal))
return base.DataGridViewColumnHeaderCellDrawBorder (cell, g, bounds);
g.DrawLine (cell.GetBorderPen (), bounds.Left, bounds.Bottom - 1, bounds.Right - 1, bounds.Bottom - 1);
return true;
}
static VisualStyleElement DataGridViewColumnHeaderCellGetVisualStyleElement (DataGridViewColumnHeaderCell cell)
{
if (cell.DataGridView.PressedHeaderCell == cell)
return VisualStyleElement.Header.Item.Pressed;
if (cell.DataGridView.EnteredHeaderCell == cell)
return VisualStyleElement.Header.Item.Hot;
return VisualStyleElement.Header.Item.Normal;
}
#endregion
public override bool DataGridViewHeaderCellHasPressedStyle (DataGridView dataGridView)
{
if (!RenderClientAreas ||
!dataGridView.EnableHeadersVisualStyles ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.Header.Item.Pressed))
return base.DataGridViewHeaderCellHasPressedStyle (dataGridView);
return true;
}
public override bool DataGridViewHeaderCellHasHotStyle (DataGridView dataGridView)
{
if (!RenderClientAreas ||
!dataGridView.EnableHeadersVisualStyles ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.Header.Item.Hot))
return base.DataGridViewHeaderCellHasHotStyle (dataGridView);
return true;
}
#endregion
#endregion
#region DateTimePicker
#region Border
protected override void DateTimePickerDrawBorder (DateTimePicker dateTimePicker, Graphics g, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.DateTimePickerDrawBorder (dateTimePicker, g, clippingArea);
return;
}
VisualStyleElement element;
if (!dateTimePicker.Enabled)
element = VisualStyleElement.DatePicker.DateBorder.Disabled;
else if (dateTimePicker.Entered)
element = VisualStyleElement.DatePicker.DateBorder.Hot;
else if (dateTimePicker.Focused)
element = VisualStyleElement.DatePicker.DateBorder.Focused;
else
element = VisualStyleElement.DatePicker.DateBorder.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DateTimePickerDrawBorder (dateTimePicker, g, clippingArea);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, new Rectangle (Point.Empty, dateTimePicker.Size), clippingArea);
}
public override bool DateTimePickerBorderHasHotElementStyle {
get {
if (RenderClientAreas &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.DatePicker.DateBorder.Hot))
return true;
return base.DateTimePickerBorderHasHotElementStyle;
}
}
#endregion
#region Drop down button
protected override void DateTimePickerDrawDropDownButton (DateTimePicker dateTimePicker, Graphics g, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.DateTimePickerDrawDropDownButton (dateTimePicker, g, clippingArea);
return;
}
VisualStyleElement element;
if (!dateTimePicker.Enabled)
element = VisualStyleElement.DatePicker.ShowCalendarButtonRight.Disabled;
else if (dateTimePicker.is_drop_down_visible)
element = VisualStyleElement.DatePicker.ShowCalendarButtonRight.Pressed;
else if (dateTimePicker.DropDownButtonEntered)
element = VisualStyleElement.DatePicker.ShowCalendarButtonRight.Hot;
else
element = VisualStyleElement.DatePicker.ShowCalendarButtonRight.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DateTimePickerDrawDropDownButton (dateTimePicker, g, clippingArea);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, dateTimePicker.drop_down_arrow_rect, clippingArea);
}
//TODO: Until somebody figures out how to obtain the proper width this will need to be updated when new Windows versions/themes are released.
const int DateTimePickerDropDownWidthOnWindowsVista = 34;
const int DateTimePickerDropDownHeightOnWindowsVista = 20;
public override Rectangle DateTimePickerGetDropDownButtonArea (DateTimePicker dateTimePicker)
{
if (!RenderClientAreas)
return base.DateTimePickerGetDropDownButtonArea (dateTimePicker);
VisualStyleElement element = VisualStyleElement.DatePicker.ShowCalendarButtonRight.Pressed;
if (!VisualStyleRenderer.IsElementDefined (element))
return base.DateTimePickerGetDropDownButtonArea (dateTimePicker);
Size size = new Size (DateTimePickerDropDownWidthOnWindowsVista, DateTimePickerDropDownHeightOnWindowsVista);
return new Rectangle (dateTimePicker.Width - size.Width, 0, size.Width, size.Height);
}
public override Rectangle DateTimePickerGetDateArea (DateTimePicker dateTimePicker)
{
if (!RenderClientAreas ||
dateTimePicker.ShowUpDown)
return base.DateTimePickerGetDateArea (dateTimePicker);
VisualStyleElement element = VisualStyleElement.DatePicker.DateBorder.Normal;
if (!VisualStyleRenderer.IsElementDefined (element))
return base.DateTimePickerGetDateArea (dateTimePicker);
Graphics g = dateTimePicker.CreateGraphics ();
Rectangle result = new VisualStyleRenderer (element).GetBackgroundContentRectangle (g, dateTimePicker.ClientRectangle);
g.Dispose ();
result.Width -= DateTimePickerDropDownWidthOnWindowsVista;
return result;
}
public override bool DateTimePickerDropDownButtonHasHotElementStyle {
get {
if (RenderClientAreas &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.DatePicker.ShowCalendarButtonRight.Hot))
return true;
return base.DateTimePickerDropDownButtonHasHotElementStyle;
}
}
#endregion
#endregion
#region ListView
protected override void ListViewDrawColumnHeaderBackground (ListView listView, ColumnHeader columnHeader, Graphics g, Rectangle area, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.ListViewDrawColumnHeaderBackground (listView, columnHeader, g, area, clippingArea);
return;
}
VisualStyleElement element;
if (listView.HeaderStyle == ColumnHeaderStyle.Clickable)
if (columnHeader.Pressed)
element = VisualStyleElement.Header.Item.Pressed;
else if (columnHeader == listView.EnteredColumnHeader)
element = VisualStyleElement.Header.Item.Hot;
else
element = VisualStyleElement.Header.Item.Normal;
else
element = VisualStyleElement.Header.Item.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ListViewDrawColumnHeaderBackground (listView, columnHeader, g, area, clippingArea);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, area, clippingArea);
}
protected override void ListViewDrawUnusedHeaderBackground (ListView listView, Graphics g, Rectangle area, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.ListViewDrawUnusedHeaderBackground (listView, g, area, clippingArea);
return;
}
VisualStyleElement element = VisualStyleElement.Header.Item.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ListViewDrawUnusedHeaderBackground (listView, g, area, clippingArea);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, area, clippingArea);
}
public override bool ListViewHasHotHeaderStyle {
get {
if (!RenderClientAreas ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.Header.Item.Hot))
return base.ListViewHasHotHeaderStyle;
return true;
}
}
public override int ListViewGetHeaderHeight (ListView listView, Font font)
{
if (!RenderClientAreas)
return base.ListViewGetHeaderHeight (listView, font);
VisualStyleElement element = VisualStyleElement.Header.Item.Normal;
if (!VisualStyleRenderer.IsElementDefined (element))
return base.ListViewGetHeaderHeight (listView, font);
Control control = null;
Graphics g;
if (listView == null) {
control = new Control ();
g = control.CreateGraphics ();
} else
g = listView.CreateGraphics ();
int result = new VisualStyleRenderer (element).GetPartSize (g, ThemeSizeType.True).Height;
g.Dispose ();
if (listView == null)
control.Dispose ();
return result;
}
#endregion
#region GroupBox
public override void DrawGroupBox (Graphics dc, Rectangle area, GroupBox box)
{
GroupBoxRenderer.DrawGroupBox (
dc,
new Rectangle (Point.Empty, box.Size),
box.Text,
box.Font,
box.ForeColor == GroupBox.DefaultForeColor ? Color.Empty : box.ForeColor,
box.Enabled ? GroupBoxState.Normal : GroupBoxState.Disabled);
}
#endregion
#region Managed window
Rectangle ManagedWindowGetTitleBarRectangle (InternalWindowManager wm)
{
return new Rectangle (0, 0, wm.Form.Width, ManagedWindowTitleBarHeight (wm) + ManagedWindowBorderWidth (wm) * (wm.IsMinimized ? 2 : 1));
}
Region ManagedWindowGetWindowRegion (Form form)
{
if (form.WindowManager is MdiWindowManager && form.WindowManager.IsMaximized)
return null;
VisualStyleElement title_bar_element = ManagedWindowGetTitleBarVisualStyleElement (form.WindowManager);
if (!VisualStyleRenderer.IsElementDefined (title_bar_element))
return null;
VisualStyleRenderer renderer = new VisualStyleRenderer (title_bar_element);
if (!renderer.IsBackgroundPartiallyTransparent ())
return null;
IDeviceContext dc = GetMeasurementDeviceContext ();
Rectangle title_bar_rectangle = ManagedWindowGetTitleBarRectangle (form.WindowManager);
Region region = renderer.GetBackgroundRegion (dc, title_bar_rectangle);
ReleaseMeasurementDeviceContext (dc);
region.Union (new Rectangle (0, title_bar_rectangle.Bottom, form.Width, form.Height));
return region;
}
public override void ManagedWindowOnSizeInitializedOrChanged (Form form)
{
base.ManagedWindowOnSizeInitializedOrChanged (form);
if (!render_non_client_areas)
return;
form.Region = ManagedWindowGetWindowRegion (form);
}
protected override Rectangle ManagedWindowDrawTitleBarAndBorders (Graphics dc, Rectangle clip, InternalWindowManager wm)
{
if (!render_non_client_areas)
return base.ManagedWindowDrawTitleBarAndBorders (dc, clip, wm);
VisualStyleElement title_bar_element = ManagedWindowGetTitleBarVisualStyleElement (wm);
VisualStyleElement left_border_element;
VisualStyleElement right_border_element;
VisualStyleElement bottom_border_element;
ManagedWindowGetBorderVisualStyleElements (wm, out left_border_element, out right_border_element, out bottom_border_element);
if (!VisualStyleRenderer.IsElementDefined (title_bar_element) ||
(!wm.IsMinimized && (
!VisualStyleRenderer.IsElementDefined (left_border_element) ||
!VisualStyleRenderer.IsElementDefined (right_border_element) ||
!VisualStyleRenderer.IsElementDefined (bottom_border_element))))
return base.ManagedWindowDrawTitleBarAndBorders (dc, clip, wm);
VisualStyleRenderer renderer = new VisualStyleRenderer (title_bar_element);
Rectangle title_bar_rectangle = ManagedWindowGetTitleBarRectangle (wm);
renderer.DrawBackground (dc, title_bar_rectangle, clip);
if (!wm.IsMinimized) {
int border_width = ManagedWindowBorderWidth (wm);
renderer.SetParameters (left_border_element);
renderer.DrawBackground (dc, new Rectangle (
0,
title_bar_rectangle.Bottom,
border_width,
wm.Form.Height - title_bar_rectangle.Bottom
), clip);
renderer.SetParameters (right_border_element);
renderer.DrawBackground (dc, new Rectangle (
wm.Form.Width - border_width,
title_bar_rectangle.Bottom,
border_width,
wm.Form.Height - title_bar_rectangle.Bottom
), clip);
renderer.SetParameters (bottom_border_element);
renderer.DrawBackground (dc, new Rectangle (
0,
wm.Form.Height - border_width,
wm.Form.Width,
border_width
), clip);
}
return title_bar_rectangle;
}
static FormWindowState ManagedWindowGetWindowState (InternalWindowManager wm)
{
return wm.GetWindowState ();
}
static bool ManagedWindowIsDisabled (InternalWindowManager wm)
{
return !wm.Form.Enabled;
}
static bool ManagedWindowIsActive (InternalWindowManager wm)
{
return wm.IsActive;
}
static VisualStyleElement ManagedWindowGetTitleBarVisualStyleElement (InternalWindowManager wm)
{
if (wm.IsToolWindow)
#region Small window
switch (ManagedWindowGetWindowState (wm)) {
case FormWindowState.Minimized:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.SmallMinCaption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.SmallMinCaption.Active;
return VisualStyleElement.Window.SmallMinCaption.Inactive;
case FormWindowState.Maximized:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.SmallMaxCaption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.SmallMaxCaption.Active;
return VisualStyleElement.Window.SmallMaxCaption.Inactive;
default:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.SmallCaption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.SmallCaption.Active;
return VisualStyleElement.Window.SmallCaption.Inactive;
}
#endregion
else
#region Normal window
switch (ManagedWindowGetWindowState (wm)) {
case FormWindowState.Minimized:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.MinCaption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.MinCaption.Active;
return VisualStyleElement.Window.MinCaption.Inactive;
case FormWindowState.Maximized:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.MaxCaption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.MaxCaption.Active;
return VisualStyleElement.Window.MaxCaption.Inactive;
default:
if (ManagedWindowIsDisabled (wm))
return VisualStyleElement.Window.Caption.Disabled;
else if (ManagedWindowIsActive (wm))
return VisualStyleElement.Window.Caption.Active;
return VisualStyleElement.Window.Caption.Inactive;
}
#endregion
}
static void ManagedWindowGetBorderVisualStyleElements (InternalWindowManager wm, out VisualStyleElement left, out VisualStyleElement right, out VisualStyleElement bottom)
{
bool active = !ManagedWindowIsDisabled (wm) && ManagedWindowIsActive (wm);
if (wm.IsToolWindow) {
if (active) {
left = VisualStyleElement.Window.SmallFrameLeft.Active;
right = VisualStyleElement.Window.SmallFrameRight.Active;
bottom = VisualStyleElement.Window.SmallFrameBottom.Active;
} else {
left = VisualStyleElement.Window.SmallFrameLeft.Inactive;
right = VisualStyleElement.Window.SmallFrameRight.Inactive;
bottom = VisualStyleElement.Window.SmallFrameBottom.Inactive;
}
} else {
if (active) {
left = VisualStyleElement.Window.FrameLeft.Active;
right = VisualStyleElement.Window.FrameRight.Active;
bottom = VisualStyleElement.Window.FrameBottom.Active;
} else {
left = VisualStyleElement.Window.FrameLeft.Inactive;
right = VisualStyleElement.Window.FrameRight.Inactive;
bottom = VisualStyleElement.Window.FrameBottom.Inactive;
}
}
}
public override bool ManagedWindowTitleButtonHasHotElementStyle (TitleButton button, Form form)
{
if (render_non_client_areas && (button.State & ButtonState.Inactive) != ButtonState.Inactive) {
VisualStyleElement element;
if (ManagedWindowIsMaximizedMdiChild (form))
switch (button.Caption) {
case CaptionButton.Close:
element = VisualStyleElement.Window.MdiCloseButton.Hot;
break;
case CaptionButton.Help:
element = VisualStyleElement.Window.MdiHelpButton.Hot;
break;
case CaptionButton.Minimize:
element = VisualStyleElement.Window.MdiMinButton.Hot;
break;
default:
element = VisualStyleElement.Window.MdiRestoreButton.Hot;
break;
}
else if (form.WindowManager.IsToolWindow)
element = VisualStyleElement.Window.SmallCloseButton.Hot;
else
switch (button.Caption) {
case CaptionButton.Close:
element = VisualStyleElement.Window.CloseButton.Hot;
break;
case CaptionButton.Help:
element = VisualStyleElement.Window.HelpButton.Hot;
break;
case CaptionButton.Maximize:
element = VisualStyleElement.Window.MaxButton.Hot;
break;
case CaptionButton.Minimize:
element = VisualStyleElement.Window.MinButton.Hot;
break;
default:
element = VisualStyleElement.Window.RestoreButton.Hot;
break;
}
if (VisualStyleRenderer.IsElementDefined (element))
return true;
}
return base.ManagedWindowTitleButtonHasHotElementStyle (button, form);
}
static bool ManagedWindowIsMaximizedMdiChild (Form form)
{
return form.WindowManager is MdiWindowManager &&
ManagedWindowGetWindowState (form.WindowManager) == FormWindowState.Maximized;
}
static bool ManagedWindowTitleButtonIsDisabled (TitleButton button, InternalWindowManager wm)
{
return (button.State & ButtonState.Inactive) == ButtonState.Inactive;
}
static bool ManagedWindowTitleButtonIsPressed (TitleButton button)
{
return (button.State & ButtonState.Pushed) == ButtonState.Pushed;
}
static VisualStyleElement ManagedWindowGetTitleButtonVisualStyleElement (TitleButton button, Form form)
{
if (form.WindowManager.IsToolWindow) {
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.SmallCloseButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.SmallCloseButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.SmallCloseButton.Hot;
return VisualStyleElement.Window.SmallCloseButton.Normal;
}
switch (button.Caption) {
case CaptionButton.Close:
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.CloseButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.CloseButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.CloseButton.Hot;
return VisualStyleElement.Window.CloseButton.Normal;
case CaptionButton.Help:
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.HelpButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.HelpButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.HelpButton.Hot;
return VisualStyleElement.Window.HelpButton.Normal;
case CaptionButton.Maximize:
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.MaxButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MaxButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MaxButton.Hot;
return VisualStyleElement.Window.MaxButton.Normal;
case CaptionButton.Minimize:
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.MinButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MinButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MinButton.Hot;
return VisualStyleElement.Window.MinButton.Normal;
default:
if (ManagedWindowTitleButtonIsDisabled (button, form.WindowManager))
return VisualStyleElement.Window.RestoreButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.RestoreButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.RestoreButton.Hot;
return VisualStyleElement.Window.RestoreButton.Normal;
}
}
protected override void ManagedWindowDrawTitleButton (Graphics dc, TitleButton button, Rectangle clip, Form form)
{
if (!render_non_client_areas) {
base.ManagedWindowDrawTitleButton (dc, button, clip, form);
return;
}
VisualStyleElement element = ManagedWindowGetTitleButtonVisualStyleElement (button, form);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ManagedWindowDrawTitleButton (dc, button, clip, form);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, button.Rectangle, clip);
}
public override Size ManagedWindowButtonSize (InternalWindowManager wm)
{
if (!render_non_client_areas)
return base.ManagedWindowButtonSize (wm);
VisualStyleElement element = wm.IsToolWindow && !wm.IsMinimized ?
VisualStyleElement.Window.SmallCloseButton.Normal :
VisualStyleElement.Window.CloseButton.Normal;
if (!VisualStyleRenderer.IsElementDefined (element))
return base.ManagedWindowButtonSize (wm);
IDeviceContext dc = GetMeasurementDeviceContext ();
Size result = new VisualStyleRenderer (element).GetPartSize (dc, ThemeSizeType.True);
ReleaseMeasurementDeviceContext (dc);
return result;
}
public override void ManagedWindowDrawMenuButton (Graphics dc, TitleButton button, Rectangle clip, InternalWindowManager wm)
{
if (!render_non_client_areas) {
base.ManagedWindowDrawMenuButton (dc, button, clip, wm);
return;
}
VisualStyleElement element = ManagedWindowGetMenuButtonVisualStyleElement (button, wm);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ManagedWindowDrawMenuButton (dc, button, clip, wm);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, button.Rectangle, clip);
}
static VisualStyleElement ManagedWindowGetMenuButtonVisualStyleElement (TitleButton button, InternalWindowManager wm)
{
switch (button.Caption) {
case CaptionButton.Close:
if (ManagedWindowTitleButtonIsDisabled (button, wm))
return VisualStyleElement.Window.MdiCloseButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MdiCloseButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MdiCloseButton.Hot;
return VisualStyleElement.Window.MdiCloseButton.Normal;
case CaptionButton.Help:
if (ManagedWindowTitleButtonIsDisabled (button, wm))
return VisualStyleElement.Window.MdiHelpButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MdiHelpButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MdiHelpButton.Hot;
return VisualStyleElement.Window.MdiHelpButton.Normal;
case CaptionButton.Minimize:
if (ManagedWindowTitleButtonIsDisabled (button, wm))
return VisualStyleElement.Window.MdiMinButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MdiMinButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MdiMinButton.Hot;
return VisualStyleElement.Window.MdiMinButton.Normal;
default:
if (ManagedWindowTitleButtonIsDisabled (button, wm))
return VisualStyleElement.Window.MdiRestoreButton.Disabled;
if (ManagedWindowTitleButtonIsPressed (button))
return VisualStyleElement.Window.MdiRestoreButton.Pressed;
if (button.Entered)
return VisualStyleElement.Window.MdiRestoreButton.Hot;
return VisualStyleElement.Window.MdiRestoreButton.Normal;
}
}
#endregion
#region ProgressBar
public override void DrawProgressBar (Graphics dc, Rectangle clip_rect, ProgressBar ctrl)
{
if (!RenderClientAreas ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.ProgressBar.Bar.Normal) ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.ProgressBar.Chunk.Normal)) {
base.DrawProgressBar (dc, clip_rect, ctrl);
return;
}
VisualStyleRenderer renderer = new VisualStyleRenderer (VisualStyleElement.ProgressBar.Bar.Normal);
renderer.DrawBackground (dc, ctrl.ClientRectangle, clip_rect);
Rectangle client_area = renderer.GetBackgroundContentRectangle (dc, new Rectangle (Point.Empty, ctrl.Size));
renderer = new VisualStyleRenderer (VisualStyleElement.ProgressBar.Chunk.Normal);
/* Draw Blocks */
int draw_mode = 0;
int max_blocks = int.MaxValue;
int start_pixel = client_area.X;
draw_mode = (int)ctrl.Style;
switch (draw_mode) {
case 1: // Continuous
client_area.Width = (int)(client_area.Width * ((double)(ctrl.Value - ctrl.Minimum) / (double)(Math.Max (ctrl.Maximum - ctrl.Minimum, 1))));
renderer.DrawBackground (dc, client_area, clip_rect);
break;
case 2: // Marquee
int ms_diff = (int)(DateTime.Now - ctrl.start).TotalMilliseconds;
double percent_done = (double) ms_diff / ProgressBarMarqueeSpeedScaling
% (double)ctrl.MarqueeAnimationSpeed / (double)ctrl.MarqueeAnimationSpeed;
max_blocks = 5;
start_pixel = client_area.X + (int)(client_area.Width * percent_done);
goto default;
default: // Blocks
int block_width = renderer.GetInteger (IntegerProperty.ProgressChunkSize);
block_width = Math.Max (block_width, 0); // block_width is used to break out the loop below, it must be >= 0!
int first_pixel_outside_filled_area = (int)(((double)(ctrl.Value - ctrl.Minimum) * client_area.Width) / (Math.Max (ctrl.Maximum - ctrl.Minimum, 1))) + client_area.X;
int block_count = 0;
int increment = block_width + renderer.GetInteger (IntegerProperty.ProgressSpaceSize);
Rectangle block_rect = new Rectangle (start_pixel, client_area.Y, block_width, client_area.Height);
while (true) {
if (max_blocks != int.MaxValue) {
if (block_count == max_blocks)
break;
if (block_rect.Right >= client_area.Width)
block_rect.X -= client_area.Width;
} else {
if (block_rect.X >= first_pixel_outside_filled_area)
break;
if (block_rect.Right >= first_pixel_outside_filled_area)
if (first_pixel_outside_filled_area == client_area.Right)
block_rect.Width = first_pixel_outside_filled_area - block_rect.X;
else
break;
}
if (clip_rect.IntersectsWith (block_rect))
renderer.DrawBackground (dc, block_rect, clip_rect);
block_rect.X += increment;
block_count++;
}
break;
}
}
#endregion
#region RadioButton
protected override void RadioButton_DrawButton (RadioButton radio_button, Graphics dc, ButtonState state, Rectangle radiobutton_rectangle) {
if (radio_button.Appearance == Appearance.Normal && radio_button.FlatStyle == FlatStyle.System) {
RadioButtonRenderer.DrawRadioButton (
dc,
new Point (radiobutton_rectangle.Left, radiobutton_rectangle.Top),
GetRadioButtonState (radio_button)
);
return;
}
base.RadioButton_DrawButton(radio_button, dc, state, radiobutton_rectangle);
}
static RadioButtonState GetRadioButtonState (RadioButton checkBox)
{
if (checkBox.Checked) {
if (!checkBox.Enabled)
return RadioButtonState.CheckedDisabled;
else if (checkBox.Pressed)
return RadioButtonState.CheckedPressed;
else if (checkBox.Entered)
return RadioButtonState.CheckedHot;
return RadioButtonState.CheckedNormal;
} else {
if (!checkBox.Enabled)
return RadioButtonState.UncheckedDisabled;
else if (checkBox.Pressed)
return RadioButtonState.UncheckedPressed;
else if (checkBox.Entered)
return RadioButtonState.UncheckedHot;
return RadioButtonState.UncheckedNormal;
}
}
#endregion
#region ScrollBar
public override void DrawScrollBar (Graphics dc, Rectangle clip, ScrollBar bar)
{
if (!RenderClientAreas ||
!ScrollBarAreElementsDefined) {
base.DrawScrollBar (dc, clip, bar);
return;
}
VisualStyleElement element;
VisualStyleRenderer renderer;
int scroll_button_width = bar.scrollbutton_width;
int scroll_button_height = bar.scrollbutton_height;
if (bar.vert) {
bar.FirstArrowArea = new Rectangle (0, 0, bar.Width, scroll_button_height);
bar.SecondArrowArea = new Rectangle (
0,
bar.ClientRectangle.Height - scroll_button_height,
bar.Width,
scroll_button_height);
Rectangle thumb_pos = bar.ThumbPos;
thumb_pos.Width = bar.Width;
bar.ThumbPos = thumb_pos;
#region Background, upper track
if (bar.thumb_moving == ScrollBar.ThumbMoving.Backwards)
element = VisualStyleElement.ScrollBar.LowerTrackVertical.Pressed;
else
element = bar.Enabled ?
VisualStyleElement.ScrollBar.LowerTrackVertical.Normal :
VisualStyleElement.ScrollBar.LowerTrackVertical.Disabled;
renderer = new VisualStyleRenderer (element);
Rectangle upper_track_rect = new Rectangle (
0,
0,
bar.ClientRectangle.Width,
bar.ThumbPos.Top);
if (clip.IntersectsWith (upper_track_rect))
renderer.DrawBackground (dc, upper_track_rect, clip);
#endregion
#region Background, lower track
if (bar.thumb_moving == ScrollBar.ThumbMoving.Forward)
element = VisualStyles.VisualStyleElement.ScrollBar.LowerTrackVertical.Pressed;
else
element = bar.Enabled ?
VisualStyleElement.ScrollBar.LowerTrackVertical.Normal :
VisualStyleElement.ScrollBar.LowerTrackVertical.Disabled;
renderer = new VisualStyleRenderer (element);
Rectangle lower_track_rect = new Rectangle (
0,
bar.ThumbPos.Bottom,
bar.ClientRectangle.Width,
bar.ClientRectangle.Height - bar.ThumbPos.Bottom);
if (clip.IntersectsWith (lower_track_rect))
renderer.DrawBackground (dc, lower_track_rect, clip);
#endregion
#region Buttons
if (clip.IntersectsWith (bar.FirstArrowArea)) {
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.ArrowButton.UpDisabled;
else if (bar.firstbutton_state == ButtonState.Pushed)
element = VisualStyleElement.ScrollBar.ArrowButton.UpPressed;
else if (bar.FirstButtonEntered)
element = VisualStyleElement.ScrollBar.ArrowButton.UpHot;
else if (ScrollBarHasHoverArrowButtonStyleVisualStyles && bar.Entered)
element = VisualStyleElement.ScrollBar.ArrowButton.UpHover;
else
element = VisualStyleElement.ScrollBar.ArrowButton.UpNormal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.FirstArrowArea);
}
if (clip.IntersectsWith (bar.SecondArrowArea)) {
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.ArrowButton.DownDisabled;
else if (bar.secondbutton_state == ButtonState.Pushed)
element = VisualStyleElement.ScrollBar.ArrowButton.DownPressed;
else if (bar.SecondButtonEntered)
element = VisualStyleElement.ScrollBar.ArrowButton.DownHot;
else if (ScrollBarHasHoverArrowButtonStyleVisualStyles && bar.Entered)
element = VisualStyleElement.ScrollBar.ArrowButton.DownHover;
else
element = VisualStyleElement.ScrollBar.ArrowButton.DownNormal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.SecondArrowArea);
}
#endregion
#region Thumb and grip
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.LowerTrackVertical.Disabled;
else if (bar.ThumbPressed)
element = VisualStyleElement.ScrollBar.ThumbButtonVertical.Pressed;
else if (bar.ThumbEntered)
element = VisualStyleElement.ScrollBar.ThumbButtonVertical.Hot;
else
element = VisualStyleElement.ScrollBar.ThumbButtonVertical.Normal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.ThumbPos, clip);
if (bar.Enabled && bar.ThumbPos.Height >= 20) {
element = VisualStyleElement.ScrollBar.GripperVertical.Normal;
if (VisualStyleRenderer.IsElementDefined (element)) {
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.ThumbPos, clip);
}
}
#endregion
} else {
bar.FirstArrowArea = new Rectangle (0, 0, scroll_button_width, bar.Height);
bar.SecondArrowArea = new Rectangle (
bar.ClientRectangle.Width - scroll_button_width,
0,
scroll_button_width,
bar.Height);
Rectangle thumb_pos = bar.ThumbPos;
thumb_pos.Height = bar.Height;
bar.ThumbPos = thumb_pos;
#region Background, left track
if (bar.thumb_moving == ScrollBar.ThumbMoving.Backwards)
element = VisualStyleElement.ScrollBar.LeftTrackHorizontal.Pressed;
else
element = bar.Enabled ?
VisualStyleElement.ScrollBar.LeftTrackHorizontal.Normal :
VisualStyleElement.ScrollBar.LeftTrackHorizontal.Disabled;
renderer = new VisualStyleRenderer (element);
Rectangle left_track_rect = new Rectangle (
0,
0,
bar.ThumbPos.Left,
bar.ClientRectangle.Height);
if (clip.IntersectsWith (left_track_rect))
renderer.DrawBackground (dc, left_track_rect, clip);
#endregion
#region Background, right track
if (bar.thumb_moving == ScrollBar.ThumbMoving.Forward)
element = VisualStyleElement.ScrollBar.RightTrackHorizontal.Pressed;
else
element = bar.Enabled ?
VisualStyleElement.ScrollBar.RightTrackHorizontal.Normal :
VisualStyleElement.ScrollBar.RightTrackHorizontal.Disabled;
renderer = new VisualStyleRenderer (element);
Rectangle right_track_rect = new Rectangle (
bar.ThumbPos.Right,
0,
bar.ClientRectangle.Width - bar.ThumbPos.Right,
bar.ClientRectangle.Height);
if (clip.IntersectsWith (right_track_rect))
renderer.DrawBackground (dc, right_track_rect, clip);
#endregion
#region Buttons
if (clip.IntersectsWith (bar.FirstArrowArea)) {
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.ArrowButton.LeftDisabled;
else if (bar.firstbutton_state == ButtonState.Pushed)
element = VisualStyleElement.ScrollBar.ArrowButton.LeftPressed;
else if (bar.FirstButtonEntered)
element = VisualStyleElement.ScrollBar.ArrowButton.LeftHot;
else if (ScrollBarHasHoverArrowButtonStyleVisualStyles && bar.Entered)
element = VisualStyleElement.ScrollBar.ArrowButton.LeftHover;
else
element = VisualStyleElement.ScrollBar.ArrowButton.LeftNormal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.FirstArrowArea);
}
if (clip.IntersectsWith (bar.SecondArrowArea)) {
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.ArrowButton.RightDisabled;
else if (bar.secondbutton_state == ButtonState.Pushed)
element = VisualStyleElement.ScrollBar.ArrowButton.RightPressed;
else if (bar.SecondButtonEntered)
element = VisualStyleElement.ScrollBar.ArrowButton.RightHot;
else if (ScrollBarHasHoverArrowButtonStyleVisualStyles && bar.Entered)
element = VisualStyleElement.ScrollBar.ArrowButton.RightHover;
else
element = VisualStyleElement.ScrollBar.ArrowButton.RightNormal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.SecondArrowArea);
}
#endregion
#region Thumb and grip
if (!bar.Enabled)
element = VisualStyleElement.ScrollBar.RightTrackHorizontal.Disabled;
else if (bar.ThumbPressed)
element = VisualStyleElement.ScrollBar.ThumbButtonHorizontal.Pressed;
else if (bar.ThumbEntered)
element = VisualStyleElement.ScrollBar.ThumbButtonHorizontal.Hot;
else
element = VisualStyleElement.ScrollBar.ThumbButtonHorizontal.Normal;
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.ThumbPos, clip);
if (bar.Enabled && bar.ThumbPos.Height >= 20) {
element = VisualStyleElement.ScrollBar.GripperHorizontal.Normal;
if (VisualStyleRenderer.IsElementDefined (element)) {
renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, bar.ThumbPos, clip);
}
}
#endregion
}
}
public override bool ScrollBarHasHotElementStyles {
get {
if (!RenderClientAreas)
return base.ScrollBarHasHotElementStyles;
return ScrollBarAreElementsDefined;
}
}
public override bool ScrollBarHasPressedThumbStyle {
get {
if (!RenderClientAreas)
return base.ScrollBarHasPressedThumbStyle;
return ScrollBarAreElementsDefined;
}
}
const int WindowsVistaMajorVersion = 6;
static bool ScrollBarHasHoverArrowButtonStyleVisualStyles =
Environment.OSVersion.Version.Major >= WindowsVistaMajorVersion;
public override bool ScrollBarHasHoverArrowButtonStyle {
get {
if (RenderClientAreas &&
ScrollBarHasHoverArrowButtonStyleVisualStyles)
return ScrollBarAreElementsDefined;
return base.ScrollBarHasHoverArrowButtonStyle;
}
}
static bool ScrollBarAreElementsDefined {
get {
return
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.ArrowButton.DownDisabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.LeftTrackHorizontal.Disabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.LowerTrackVertical.Disabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.RightTrackHorizontal.Disabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.ThumbButtonHorizontal.Disabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.ThumbButtonVertical.Disabled) &&
VisualStyleRenderer.IsElementDefined (VisualStyleElement.ScrollBar.UpperTrackVertical.Disabled);
}
}
#endregion
#region StatusBar
protected override void DrawStatusBarBackground(Graphics dc, Rectangle clip, StatusBar sb) {
if (!RenderClientAreas) {
base.DrawStatusBarBackground (dc, clip, sb);
return;
}
VisualStyleElement element = VisualStyleElement.Status.Bar.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawStatusBarBackground (dc, clip, sb);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, sb.ClientRectangle, clip);
}
protected override void DrawStatusBarSizingGrip (Graphics dc, Rectangle clip, StatusBar sb, Rectangle area)
{
if (!RenderClientAreas) {
base.DrawStatusBarSizingGrip (dc, clip, sb, area);
return;
}
VisualStyleElement element = VisualStyleElement.Status.Gripper.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawStatusBarSizingGrip (dc, clip, sb, area);
return;
}
VisualStyleRenderer renderer = new VisualStyleRenderer (element);
Rectangle sizing_grip_rectangle = new Rectangle (Point.Empty, renderer.GetPartSize (dc, ThemeSizeType.True));
sizing_grip_rectangle.X = sb.Width - sizing_grip_rectangle.Width;
sizing_grip_rectangle.Y = sb.Height - sizing_grip_rectangle.Height;
renderer.DrawBackground (dc, sizing_grip_rectangle, clip);
}
protected override void DrawStatusBarPanelBackground (Graphics dc, Rectangle area, StatusBarPanel panel)
{
if (!RenderClientAreas) {
base.DrawStatusBarPanelBackground (dc, area, panel);
return;
}
VisualStyleElement element = VisualStyleElement.Status.Pane.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawStatusBarPanelBackground (dc, area, panel);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, area);
}
#endregion
#region TextBoxBase
static bool TextBoxBaseShouldPaint (TextBoxBase textBoxBase)
{
return textBoxBase.BorderStyle == BorderStyle.Fixed3D;
}
static VisualStyleElement TextBoxBaseGetVisualStyleElement (TextBoxBase textBoxBase)
{
if (!textBoxBase.Enabled)
return VisualStyleElement.TextBox.TextEdit.Disabled;
if (textBoxBase.ReadOnly)
return VisualStyleElement.TextBox.TextEdit.ReadOnly;
if (textBoxBase.Entered)
return VisualStyleElement.TextBox.TextEdit.Hot;
if (textBoxBase.Focused)
return VisualStyleElement.TextBox.TextEdit.Focused;
return VisualStyleElement.TextBox.TextEdit.Normal;
}
public override void TextBoxBaseFillBackground (TextBoxBase textBoxBase, Graphics g, Rectangle clippingArea)
{
if (!RenderClientAreas ||
!TextBoxBaseShouldPaint (textBoxBase)) {
base.TextBoxBaseFillBackground (textBoxBase, g, clippingArea);
return;
}
VisualStyleElement element = TextBoxBaseGetVisualStyleElement (textBoxBase);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TextBoxBaseFillBackground (textBoxBase, g, clippingArea);
return;
}
Rectangle bounds = new Rectangle(Point.Empty, textBoxBase.Size);
bounds.X -= (bounds.Width - textBoxBase.ClientSize.Width) / 2;
bounds.Y -= (bounds.Height - textBoxBase.ClientSize.Height) / 2;
new VisualStyleRenderer (element).DrawBackground (g, bounds, clippingArea);
}
public override bool TextBoxBaseHandleWmNcPaint (TextBoxBase textBoxBase, ref Message m)
{
if (!RenderClientAreas ||
!TextBoxBaseShouldPaint (textBoxBase))
return base.TextBoxBaseHandleWmNcPaint (textBoxBase, ref m);
VisualStyleElement element = TextBoxBaseGetVisualStyleElement (textBoxBase);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.TextBoxBaseHandleWmNcPaint (textBoxBase, ref m);
PaintEventArgs e = XplatUI.PaintEventStart (ref m, textBoxBase.Handle, false);
new VisualStyleRenderer (element).DrawBackgroundExcludingArea (
e.Graphics,
new Rectangle (Point.Empty, textBoxBase.Size),
new Rectangle (new Point ((textBoxBase.Width - textBoxBase.ClientSize.Width) / 2,
(textBoxBase.Height - textBoxBase.ClientSize.Height) / 2),
textBoxBase.ClientSize));
XplatUI.PaintEventEnd (ref m, textBoxBase.Handle, false);
return true;
}
public override bool TextBoxBaseShouldPaintBackground (TextBoxBase textBoxBase)
{
if (!RenderClientAreas ||
!TextBoxBaseShouldPaint (textBoxBase))
return base.TextBoxBaseShouldPaintBackground (textBoxBase);
VisualStyleElement element = TextBoxBaseGetVisualStyleElement (textBoxBase);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.TextBoxBaseShouldPaintBackground (textBoxBase);
return new VisualStyleRenderer (element).IsBackgroundPartiallyTransparent ();
}
#endregion
#region ToolBar
static bool ToolBarIsDisabled (ToolBarItem item)
{
return !item.Button.Enabled;
}
static bool ToolBarIsPressed (ToolBarItem item)
{
return item.Pressed;
}
static bool ToolBarIsChecked (ToolBarItem item)
{
return item.Button.Pushed;
}
static bool ToolBarIsHot (ToolBarItem item)
{
return item.Hilight;
}
#region Border
protected override void DrawToolBarButtonBorder (Graphics dc, ToolBarItem item, bool is_flat)
{
if (!RenderClientAreas) {
base.DrawToolBarButtonBorder (dc, item, is_flat);
return;
}
if (item.Button.Style == ToolBarButtonStyle.Separator)
return;
VisualStyleElement element;
if (item.Button.Style == ToolBarButtonStyle.DropDownButton)
element = ToolBarGetDropDownButtonVisualStyleElement (item);
else
element = ToolBarGetButtonVisualStyleElement (item);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawToolBarButtonBorder (dc, item, is_flat);
return;
}
Rectangle rectangle = item.Rectangle;
if (item.Button.Style == ToolBarButtonStyle.DropDownButton && item.Button.Parent.DropDownArrows)
rectangle.Width -= ToolBarDropDownWidth;
new VisualStyleRenderer (element).DrawBackground (dc, rectangle);
}
private static VisualStyleElement ToolBarGetDropDownButtonVisualStyleElement (ToolBarItem item)
{
if (item.Button.Parent.DropDownArrows) {
if (ToolBarIsDisabled (item))
return VisualStyleElement.ToolBar.SplitButton.Disabled;
if (ToolBarIsPressed (item))
return VisualStyleElement.ToolBar.SplitButton.Pressed;
if (ToolBarIsChecked (item))
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.SplitButton.HotChecked;
else
return VisualStyleElement.ToolBar.SplitButton.Checked;
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.SplitButton.Hot;
return VisualStyleElement.ToolBar.SplitButton.Normal;
} else {
if (ToolBarIsDisabled (item))
return VisualStyleElement.ToolBar.DropDownButton.Disabled;
if (ToolBarIsPressed (item))
return VisualStyleElement.ToolBar.DropDownButton.Pressed;
if (ToolBarIsChecked (item))
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.DropDownButton.HotChecked;
else
return VisualStyleElement.ToolBar.DropDownButton.Checked;
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.DropDownButton.Hot;
return VisualStyleElement.ToolBar.DropDownButton.Normal;
}
}
private static VisualStyleElement ToolBarGetButtonVisualStyleElement (ToolBarItem item)
{
if (ToolBarIsDisabled (item))
return VisualStyleElement.ToolBar.Button.Disabled;
if (ToolBarIsPressed (item))
return VisualStyleElement.ToolBar.Button.Pressed;
if (ToolBarIsChecked (item))
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.Button.HotChecked;
else
return VisualStyleElement.ToolBar.Button.Checked;
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.Button.Hot;
return VisualStyleElement.ToolBar.Button.Normal;
}
#endregion
#region Separator
protected override void DrawToolBarSeparator (Graphics dc, ToolBarItem item)
{
if (!RenderClientAreas) {
base.DrawToolBarSeparator (dc, item);
return;
}
VisualStyleElement element = ToolBarGetSeparatorVisualStyleElement (item);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawToolBarSeparator (dc, item);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, item.Rectangle);
}
static VisualStyleElement ToolBarGetSeparatorVisualStyleElement (ToolBarItem toolBarItem)
{
return toolBarItem.Button.Parent.Vertical ?
VisualStyleElement.ToolBar.SeparatorVertical.Normal :
VisualStyleElement.ToolBar.SeparatorHorizontal.Normal;
}
#endregion
#region Toggle button background
protected override void DrawToolBarToggleButtonBackground (Graphics dc, ToolBarItem item)
{
if (!RenderClientAreas ||
!VisualStyleRenderer.IsElementDefined (ToolBarGetButtonVisualStyleElement (item)))
base.DrawToolBarToggleButtonBackground (dc, item);
}
#endregion
#region Drop down arrow
protected override void DrawToolBarDropDownArrow (Graphics dc, ToolBarItem item, bool is_flat)
{
if (!RenderClientAreas) {
base.DrawToolBarDropDownArrow (dc, item, is_flat);
return;
}
VisualStyleElement element = ToolBarGetDropDownArrowVisualStyleElement (item);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.DrawToolBarDropDownArrow (dc, item, is_flat);
return;
}
Rectangle rect = item.Rectangle;
rect.X = item.Rectangle.Right - ToolBarDropDownWidth;
rect.Width = ToolBarDropDownWidth;
new VisualStyleRenderer (element).DrawBackground (dc, rect);
}
private static VisualStyleElement ToolBarGetDropDownArrowVisualStyleElement (ToolBarItem item)
{
if (ToolBarIsDisabled (item))
return VisualStyleElement.ToolBar.SplitButtonDropDown.Disabled;
if (ToolBarIsPressed (item))
return VisualStyleElement.ToolBar.SplitButtonDropDown.Pressed;
if (ToolBarIsChecked (item))
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.SplitButtonDropDown.HotChecked;
else
return VisualStyleElement.ToolBar.SplitButtonDropDown.Checked;
if (ToolBarIsHot (item))
return VisualStyleElement.ToolBar.SplitButtonDropDown.Hot;
return VisualStyleElement.ToolBar.SplitButtonDropDown.Normal;
}
#endregion
public override bool ToolBarHasHotElementStyles (ToolBar toolBar)
{
if (!RenderClientAreas)
return base.ToolBarHasHotElementStyles (toolBar);
return true;
}
public override bool ToolBarHasHotCheckedElementStyles {
get {
if (!RenderClientAreas)
return base.ToolBarHasHotCheckedElementStyles;
return true;
}
}
#endregion
#region ToolTip
protected override void ToolTipDrawBackground (Graphics dc, Rectangle clip_rectangle, ToolTip.ToolTipWindow control)
{
if (!RenderClientAreas) {
base.ToolTipDrawBackground (dc, clip_rectangle, control);
return;
}
VisualStyleElement element = VisualStyleElement.ToolTip.Standard.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.ToolTipDrawBackground (dc, clip_rectangle, control);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, control.ClientRectangle);
}
public override bool ToolTipTransparentBackground {
get {
if (!RenderClientAreas)
return base.ToolTipTransparentBackground;
VisualStyleElement element = VisualStyleElement.ToolTip.Standard.Normal;
if (!VisualStyleRenderer.IsElementDefined (element))
return base.ToolTipTransparentBackground;
return new VisualStyleRenderer (element).IsBackgroundPartiallyTransparent ();
}
}
#endregion
#region TrackBar
protected override Size TrackBarGetThumbSize (TrackBar trackBar)
{
if (!RenderClientAreas)
return base.TrackBarGetThumbSize (trackBar);
VisualStyleElement element = TrackBarGetThumbVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element))
return base.TrackBarGetThumbSize (trackBar);
Graphics g = trackBar.CreateGraphics ();
Size result = new VisualStyleRenderer (element).GetPartSize (g, ThemeSizeType.True);
g.Dispose ();
return trackBar.Orientation == Orientation.Horizontal ? result : TrackBarRotateVerticalThumbSize (result);
}
static VisualStyleElement TrackBarGetThumbVisualStyleElement (TrackBar trackBar)
{
if (trackBar.Orientation == Orientation.Horizontal)
switch (trackBar.TickStyle) {
case TickStyle.BottomRight:
case TickStyle.None:
return TrackBarGetHorizontalThumbBottomVisualStyleElement (trackBar);
case TickStyle.TopLeft:
return TrackBarGetHorizontalThumbTopVisualStyleElement (trackBar);
default:
return TrackBarGetHorizontalThumbVisualStyleElement (trackBar);
}
else
switch (trackBar.TickStyle) {
case TickStyle.BottomRight:
case TickStyle.None:
return TrackBarGetVerticalThumbRightVisualStyleElement (trackBar);
case TickStyle.TopLeft:
return TrackBarGetVerticalThumbLeftVisualStyleElement (trackBar);
default:
return TrackBarGetVerticalThumbVisualStyleElement (trackBar);
}
}
static Size TrackBarRotateVerticalThumbSize (Size value)
{
int temporary = value.Width;
value.Width = value.Height;
value.Height = temporary;
return value;
}
#region Track
protected override void TrackBarDrawHorizontalTrack (Graphics dc, Rectangle thumb_area, Point channel_startpoint, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.TrackBarDrawHorizontalTrack (dc, thumb_area, channel_startpoint, clippingArea);
return;
}
VisualStyleElement element = VisualStyleElement.TrackBar.Track.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawHorizontalTrack (dc, thumb_area, channel_startpoint, clippingArea);
return;
}
VisualStyleRenderer renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, new Rectangle (channel_startpoint, new Size (thumb_area.Width, renderer.GetPartSize (dc, ThemeSizeType.True).Height)), clippingArea);
}
protected override void TrackBarDrawVerticalTrack (Graphics dc, Rectangle thumb_area, Point channel_startpoint, Rectangle clippingArea)
{
if (!RenderClientAreas) {
base.TrackBarDrawVerticalTrack (dc, thumb_area, channel_startpoint, clippingArea);
return;
}
VisualStyleElement element = VisualStyleElement.TrackBar.TrackVertical.Normal;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawVerticalTrack (dc, thumb_area, channel_startpoint, clippingArea);
return;
}
VisualStyleRenderer renderer = new VisualStyleRenderer (element);
renderer.DrawBackground (dc, new Rectangle (channel_startpoint, new Size (renderer.GetPartSize (dc, ThemeSizeType.True).Width, thumb_area.Height)), clippingArea);
}
#endregion
#region Thumb
static bool TrackBarIsDisabled (TrackBar trackBar)
{
return !trackBar.Enabled;
}
static bool TrackBarIsHot (TrackBar trackBar)
{
return trackBar.ThumbEntered;
}
static bool TrackBarIsPressed (TrackBar trackBar)
{
return trackBar.thumb_pressed;
}
static bool TrackBarIsFocused (TrackBar trackBar)
{
return trackBar.Focused;
}
#region Horizontal
protected override void TrackBarDrawHorizontalThumbBottom (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawHorizontalThumbBottom (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetHorizontalThumbBottomVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawHorizontalThumbBottom (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, thumb_pos, clippingArea);
}
static VisualStyleElement TrackBarGetHorizontalThumbBottomVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.ThumbBottom.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.ThumbBottom.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.ThumbBottom.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.ThumbBottom.Focused;
return VisualStyleElement.TrackBar.ThumbBottom.Normal;
}
protected override void TrackBarDrawHorizontalThumbTop (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawHorizontalThumbTop (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetHorizontalThumbTopVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawHorizontalThumbTop (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, thumb_pos, clippingArea);
}
static VisualStyleElement TrackBarGetHorizontalThumbTopVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.ThumbTop.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.ThumbTop.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.ThumbTop.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.ThumbTop.Focused;
return VisualStyleElement.TrackBar.ThumbTop.Normal;
}
protected override void TrackBarDrawHorizontalThumb (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawHorizontalThumb (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetHorizontalThumbVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawHorizontalThumb (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, thumb_pos, clippingArea);
}
static VisualStyleElement TrackBarGetHorizontalThumbVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.Thumb.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.Thumb.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.Thumb.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.Thumb.Focused;
return VisualStyleElement.TrackBar.Thumb.Normal;
}
#endregion
#region Vertical
static Rectangle TrackBarRotateVerticalThumbSize (Rectangle value)
{
int temporary = value.Width;
value.Width = value.Height;
value.Height = temporary;
return value;
}
protected override void TrackBarDrawVerticalThumbRight (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawVerticalThumbRight (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetVerticalThumbRightVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawVerticalThumbRight (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, TrackBarRotateVerticalThumbSize (thumb_pos), clippingArea);
}
static VisualStyleElement TrackBarGetVerticalThumbRightVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.ThumbRight.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.ThumbRight.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.ThumbRight.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.ThumbRight.Focused;
return VisualStyleElement.TrackBar.ThumbRight.Normal;
}
protected override void TrackBarDrawVerticalThumbLeft (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawVerticalThumbLeft (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetVerticalThumbLeftVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawVerticalThumbLeft (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, TrackBarRotateVerticalThumbSize (thumb_pos), clippingArea);
}
static VisualStyleElement TrackBarGetVerticalThumbLeftVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.ThumbLeft.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.ThumbLeft.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.ThumbLeft.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.ThumbLeft.Focused;
return VisualStyleElement.TrackBar.ThumbLeft.Normal;
}
protected override void TrackBarDrawVerticalThumb (Graphics dc, Rectangle thumb_pos, Brush br_thumb, Rectangle clippingArea, TrackBar trackBar)
{
if (!RenderClientAreas) {
base.TrackBarDrawVerticalThumb (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
VisualStyleElement element = TrackBarGetVerticalThumbVisualStyleElement (trackBar);
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TrackBarDrawVerticalThumb (dc, thumb_pos, br_thumb, clippingArea, trackBar);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, TrackBarRotateVerticalThumbSize (thumb_pos), clippingArea);
}
static VisualStyleElement TrackBarGetVerticalThumbVisualStyleElement (TrackBar trackBar)
{
if (TrackBarIsDisabled (trackBar))
return VisualStyleElement.TrackBar.ThumbVertical.Disabled;
else if (TrackBarIsPressed (trackBar))
return VisualStyleElement.TrackBar.ThumbVertical.Pressed;
else if (TrackBarIsHot (trackBar))
return VisualStyleElement.TrackBar.ThumbVertical.Hot;
else if (TrackBarIsFocused (trackBar))
return VisualStyleElement.TrackBar.ThumbVertical.Focused;
return VisualStyleElement.TrackBar.ThumbVertical.Normal;
}
#endregion
#endregion
#region Ticks
const EdgeStyle TrackBarTickEdgeStyle = EdgeStyle.Bump;
const EdgeEffects TrackBarTickEdgeEffects = EdgeEffects.None;
#region Horizontal
protected override ITrackBarTickPainter TrackBarGetHorizontalTickPainter (Graphics g)
{
if (!RenderClientAreas ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.TrackBar.Ticks.Normal))
return base.TrackBarGetHorizontalTickPainter (g);
return new TrackBarHorizontalTickPainter (g);
}
class TrackBarHorizontalTickPainter : ITrackBarTickPainter
{
readonly Graphics g;
readonly VisualStyleRenderer renderer;
public TrackBarHorizontalTickPainter (Graphics g)
{
this.g = g;
renderer = new VisualStyleRenderer (VisualStyleElement.TrackBar.Ticks.Normal);
}
public void Paint (float x1, float y1, float x2, float y2)
{
renderer.DrawEdge (g, new Rectangle (
(int)Math.Round (x1),
(int)Math.Round (y1),
1,
(int)Math.Round (y2 - y1) + 1), Edges.Left, TrackBarTickEdgeStyle, TrackBarTickEdgeEffects);
}
}
#endregion
#region Vertical
protected override ITrackBarTickPainter TrackBarGetVerticalTickPainter (Graphics g)
{
if (!RenderClientAreas ||
!VisualStyleRenderer.IsElementDefined (VisualStyleElement.TrackBar.TicksVertical.Normal))
return base.TrackBarGetVerticalTickPainter (g);
return new TrackBarVerticalTickPainter (g);
}
class TrackBarVerticalTickPainter : ITrackBarTickPainter
{
readonly Graphics g;
readonly VisualStyleRenderer renderer;
public TrackBarVerticalTickPainter (Graphics g)
{
this.g = g;
renderer = new VisualStyleRenderer (VisualStyleElement.TrackBar.TicksVertical.Normal);
}
public void Paint (float x1, float y1, float x2, float y2)
{
renderer.DrawEdge (g, new Rectangle (
(int)Math.Round (x1),
(int)Math.Round (y1),
(int)Math.Round (x2 - x1) + 1,
1), Edges.Top, TrackBarTickEdgeStyle, TrackBarTickEdgeEffects);
}
}
#endregion
#endregion
public override bool TrackBarHasHotThumbStyle {
get {
if (!RenderClientAreas)
return base.TrackBarHasHotThumbStyle;
return true;
}
}
#endregion
#region TreeView
[MonoInternalNote ("Use the sizing information provided by the VisualStyles API.")]
public override void TreeViewDrawNodePlusMinus (TreeView treeView, TreeNode node, Graphics dc, int x, int middle)
{
if (!RenderClientAreas) {
base.TreeViewDrawNodePlusMinus (treeView, node, dc, x, middle);
return;
}
VisualStyleElement element = node.IsExpanded ?
VisualStyleElement.TreeView.Glyph.Opened :
VisualStyleElement.TreeView.Glyph.Closed;
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.TreeViewDrawNodePlusMinus (treeView, node, dc, x, middle);
return;
}
new VisualStyleRenderer (element).DrawBackground (dc, new Rectangle (x, middle - 4, 9, 9));
}
#endregion
#region UpDownBase
public override void UpDownBaseDrawButton (Graphics g, Rectangle bounds, bool top, PushButtonState state)
{
if (!RenderClientAreas) {
base.UpDownBaseDrawButton (g, bounds, top, state);
return;
}
VisualStyleElement element;
if (top)
switch (state) {
case PushButtonState.Disabled:
element = VisualStyleElement.Spin.Up.Disabled;
break;
case PushButtonState.Pressed:
element = VisualStyleElement.Spin.Up.Pressed;
break;
case PushButtonState.Hot:
element = VisualStyleElement.Spin.Up.Hot;
break;
default:
element = VisualStyleElement.Spin.Up.Normal;
break;
}
else
switch (state) {
case PushButtonState.Disabled:
element = VisualStyleElement.Spin.Down.Disabled;
break;
case PushButtonState.Pressed:
element = VisualStyleElement.Spin.Down.Pressed;
break;
case PushButtonState.Hot:
element = VisualStyleElement.Spin.Down.Hot;
break;
default:
element = VisualStyleElement.Spin.Down.Normal;
break;
}
if (!VisualStyleRenderer.IsElementDefined (element)) {
base.UpDownBaseDrawButton (g, bounds, top, state);
return;
}
new VisualStyleRenderer (element).DrawBackground (g, bounds);
}
public override bool UpDownBaseHasHotButtonStyle {
get {
if (!RenderClientAreas)
return base.UpDownBaseHasHotButtonStyle;
return true;
}
}
#endregion
#endregion
static bool AreEqual (VisualStyleElement value1, VisualStyleElement value2)
{
return
value1.ClassName == value1.ClassName &&
value1.Part == value2.Part &&
value1.State == value2.State;
}
#region Measurement device context
static Control control;
static IDeviceContext GetMeasurementDeviceContext ()
{
if (control == null)
control = new Control ();
return control.CreateGraphics ();
}
static void ReleaseMeasurementDeviceContext (IDeviceContext dc)
{
dc.Dispose ();
}
#endregion
}
}