diff options
| author | MichaelTheShifter <[email protected]> | 2016-07-20 09:40:36 -0400 |
|---|---|---|
| committer | MichaelTheShifter <[email protected]> | 2016-07-20 09:40:36 -0400 |
| commit | d40fed5ce2bc806a91245adb18039634eac13ed0 (patch) | |
| tree | f1d7168aee6db109ac2c738ad18c9db667a6ba69 /source/ShiftUI/Theming/ThemeVisualStyles.cs | |
| parent | f1856e8ed30ed882229fd3fa2a4038122a5fb441 (diff) | |
| download | shiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.tar.gz shiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.tar.bz2 shiftos-c--d40fed5ce2bc806a91245adb18039634eac13ed0.zip | |
Move ShiftUI source code to ShiftOS
This'll be a lot easier to work on.
Diffstat (limited to 'source/ShiftUI/Theming/ThemeVisualStyles.cs')
| -rw-r--r-- | source/ShiftUI/Theming/ThemeVisualStyles.cs | 2162 |
1 files changed, 2162 insertions, 0 deletions
diff --git a/source/ShiftUI/Theming/ThemeVisualStyles.cs b/source/ShiftUI/Theming/ThemeVisualStyles.cs new file mode 100644 index 0000000..d0bd4ea --- /dev/null +++ b/source/ShiftUI/Theming/ThemeVisualStyles.cs @@ -0,0 +1,2162 @@ +// 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, [email protected] +// Ernesto Carrea, [email protected] + +using System.Drawing; +using System.Drawing.Drawing2D; +using ShiftUI.VisualStyles; +using System; + +namespace ShiftUI +{ + /// <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 Widgets + #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 WidgetPaint + #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 + /* FIXME: I SAID NO. + #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); + Widget control = null; + Graphics g; + if (listView == null) { + control = new Widget (); + 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 + /* FIXME: I SAID NO. + #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 Widget control; + static IDeviceContext GetMeasurementDeviceContext () + { + if (control == null) + control = new Widget (); + return control.CreateGraphics (); + } + static void ReleaseMeasurementDeviceContext (IDeviceContext dc) + { + dc.Dispose (); + } + #endregion + } +} |
