332 lines
12 KiB
C#
332 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.ComponentModel;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Drawing;
|
|
using DevComponents.DotNetBar.Metro.Rendering;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DevComponents.DotNetBar.Metro
|
|
{
|
|
public class MetroForm : OfficeForm
|
|
{
|
|
#region Private Vars
|
|
private const string DefaultSettingsButtonText = "<font size=\"7\">SETTINGS</font>";
|
|
private const string DefaultHelpButtonText = "<font size=\"7\">HELP</font>";
|
|
private ButtonItem _Settings = null;
|
|
private ButtonItem _Help = null;
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
/// <summary>
|
|
/// Initializes a new instance of the MetroForm class.
|
|
/// </summary>
|
|
public MetroForm()
|
|
{
|
|
if (!StyleManager.IsMetro(StyleManager.Style))
|
|
StyleManager.Style = eStyle.Metro;
|
|
|
|
StyleManager.Register(this);
|
|
base.EnableGlass = false;
|
|
}
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing) StyleManager.Unregister(this);
|
|
base.Dispose(disposing);
|
|
}
|
|
protected override void OnHandleCreated(EventArgs e)
|
|
{
|
|
UpdateColorScheme();
|
|
base.OnHandleCreated(e);
|
|
}
|
|
/// <summary>
|
|
/// Gets the array of LinearGradientColorTable objects that describe the border colors. The colors with index 0 is used as the outer most
|
|
/// border.
|
|
/// </summary>
|
|
/// <returns>Array of LinearGradientColorTable</returns>
|
|
protected override Color[] GetBorderColors(int borderSize)
|
|
{
|
|
DevComponents.DotNetBar.Metro.ColorTables.MetroColorTable metroColorTable = MetroRender.GetColorTable();
|
|
DevComponents.DotNetBar.Metro.ColorTables.MetroFormColorTable ct = metroColorTable.MetroForm;
|
|
Color canvas = this.BackColor; //metroColorTable.CanvasColor;
|
|
BorderColors[] borderColors = _BorderColors ?? ct.BorderColors;
|
|
Color[] colors = new Color[((FormBorderStyle == FormBorderStyle.FixedSingle) ? 1 : borderColors.Length + (borderSize > borderColors.Length ? 1 : 0))];
|
|
if (FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedSingle && borderSize > 1)
|
|
{
|
|
colors = new Color[4];
|
|
colors[0] = borderColors[0].Left;
|
|
colors[1] = colors[0];
|
|
colors[2] = colors[0];
|
|
colors[3] = canvas;
|
|
return colors;
|
|
}
|
|
for (int i = 0; i < colors.Length; i++)
|
|
{
|
|
if (i > borderColors.Length - 1)
|
|
colors[i] = canvas;
|
|
else
|
|
colors[i] = borderColors[i].Left;
|
|
}
|
|
|
|
return colors;
|
|
}
|
|
/// <summary>
|
|
/// Called by StyleManager to notify control that style on manager has changed and that control should refresh its appearance if
|
|
/// its style is controlled by StyleManager.
|
|
/// </summary>
|
|
/// <param name="newStyle">New active style.</param>
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public override void StyleManagerStyleChanged(eDotNetBarStyle newStyle)
|
|
{
|
|
base.StyleManagerStyleChanged(newStyle);
|
|
if (BarFunctions.IsHandleValid(this))
|
|
UpdateColorScheme();
|
|
}
|
|
|
|
private void UpdateColorScheme()
|
|
{
|
|
StyleManager.UpdateMetroAmbientColors(this);
|
|
}
|
|
|
|
private BorderColors[] _BorderColors = null;
|
|
/// <summary>
|
|
/// Gets or sets custom border colors for the form. When set it overrides settings from global Metro color table.
|
|
/// </summary>
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public BorderColors[] BorderColors
|
|
{
|
|
get { return _BorderColors; }
|
|
set { _BorderColors = value; Invalidate(); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// This property is not applicable for MetroForm.
|
|
/// </summary>
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public override bool EnableGlass
|
|
{
|
|
get
|
|
{
|
|
return base.EnableGlass;
|
|
}
|
|
set
|
|
{
|
|
base.EnableGlass = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the form path for the given input bounds.
|
|
/// </summary>
|
|
/// <param name="bounds">Represent the form bounds.</param>
|
|
/// <returns></returns>
|
|
protected override GraphicsPath GetFormPath(Rectangle bounds)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
path.AddRectangle(bounds);
|
|
return path;
|
|
}
|
|
|
|
protected override bool UseCornerSize
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// protected override Rectangle GetInnerFormBounds()
|
|
// {
|
|
// Rectangle r = new Rectangle(3, 3, this.Width - 7, this.Height - 2);
|
|
|
|
//#if FRAMEWORK20
|
|
// if (this.RightToLeftLayout) r = new Rectangle(3, 3, this.Width - 6, this.Height - 2);
|
|
//#endif
|
|
|
|
// return r;
|
|
// }
|
|
|
|
protected override LabelItem CreateTitleLabel()
|
|
{
|
|
LabelItem label = new LabelItem();
|
|
label.GlobalItem = false;
|
|
try
|
|
{
|
|
label.Font = new Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
}
|
|
catch
|
|
{
|
|
label.Font = SystemFonts.MenuFont; // SystemInformation.MenuFont;
|
|
}
|
|
label.Stretch = true;
|
|
label.TextLineAlignment = StringAlignment.Center;
|
|
label.TextAlignment = StringAlignment.Center;
|
|
label.Text = this.Text;
|
|
label.PaddingLeft = 3;
|
|
label.PaddingRight = 1;
|
|
|
|
return label;
|
|
}
|
|
|
|
protected override void CreateAdditionalCaptionItems(GenericItemContainer captionContainer)
|
|
{
|
|
// Add Settings and Help buttons
|
|
_Settings = new ButtonItem("sysSettingsButton");
|
|
_Settings.Text = DefaultSettingsButtonText;
|
|
//_Settings.ItemAlignment = eItemAlignment.Far;
|
|
_Settings.Click += InternalSettingsButtonClick;
|
|
_Settings.SetSystemItem(true);
|
|
_Settings.CanCustomize = false;
|
|
_Settings.Visible = false;
|
|
captionContainer.SubItems.Add(_Settings);
|
|
|
|
_Help = new ButtonItem("sysHelpButton");
|
|
_Help.Text = DefaultHelpButtonText;
|
|
_Help.SetSystemItem(true);
|
|
_Help.CanCustomize = false;
|
|
_Help.Visible = false;
|
|
//_Help.ItemAlignment = eItemAlignment.Far;
|
|
_Help.Click += InternalHelpButtonClick;
|
|
captionContainer.SubItems.Add(_Help);
|
|
|
|
base.CreateAdditionalCaptionItems(captionContainer);
|
|
}
|
|
|
|
/// Gets or sets whether SETTINGS button is visible.
|
|
/// </summary>
|
|
[DefaultValue(false), Category("Appearance"), Description("Indicates whether SETTINGS button is visible.")]
|
|
public bool SettingsButtonVisible
|
|
{
|
|
get { return _Settings.Visible; }
|
|
set
|
|
{
|
|
if (value != _Settings.Visible)
|
|
{
|
|
_Settings.Visible = value;
|
|
if (this.IsHandleCreated)
|
|
this.RecalcSize();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Gets or sets whether HELP button is visible.
|
|
/// </summary>
|
|
[DefaultValue(false), Category("Appearance"), Description("Indicates whether HELP button is visible.")]
|
|
public bool HelpButtonVisible
|
|
{
|
|
get { return _Help.Visible; }
|
|
set
|
|
{
|
|
if (value != _Help.Visible)
|
|
{
|
|
_Help.Visible = value;
|
|
this.RecalcSize();
|
|
}
|
|
}
|
|
}
|
|
|
|
private string _HelpButtonText = "";
|
|
/// <summary>
|
|
/// Gets or sets the HELP button text.
|
|
/// </summary>
|
|
[DefaultValue(""), Category("Appearance"), Description("Indicates HELP button text")]
|
|
public string HelpButtonText
|
|
{
|
|
get { return _HelpButtonText; }
|
|
set
|
|
{
|
|
if (value != _HelpButtonText)
|
|
{
|
|
string oldValue = _HelpButtonText;
|
|
_HelpButtonText = value;
|
|
OnHelpButtonTextChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when HelpButtonText property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnHelpButtonTextChanged(string oldValue, string newValue)
|
|
{
|
|
if (string.IsNullOrEmpty(newValue))
|
|
_Help.Text = DefaultHelpButtonText;
|
|
else
|
|
_Help.Text = "<font size=\"7\">" + newValue + "</font>";
|
|
this.RecalcSize();
|
|
}
|
|
private string _SettingsButtonText = "";
|
|
/// <summary>
|
|
/// Gets or sets the SETTINGS button text.
|
|
/// </summary>
|
|
[DefaultValue(""), Category("Appearance"), Description("Indicates SETTINGS button text")]
|
|
public string SettingsButtonText
|
|
{
|
|
get { return _SettingsButtonText; }
|
|
set
|
|
{
|
|
if (value != _SettingsButtonText)
|
|
{
|
|
string oldValue = _SettingsButtonText;
|
|
_SettingsButtonText = value;
|
|
OnSettingsButtonTextChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when SettingsButtonText property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnSettingsButtonTextChanged(string oldValue, string newValue)
|
|
{
|
|
if (string.IsNullOrEmpty(newValue))
|
|
_Settings.Text = DefaultSettingsButtonText;
|
|
else
|
|
_Settings.Text = "<font size=\"7\">" + newValue + "</font>";
|
|
this.RecalcSize();
|
|
}
|
|
private void InternalSettingsButtonClick(object sender, EventArgs e)
|
|
{
|
|
OnSettingsButtonClick(e);
|
|
}
|
|
private void InternalHelpButtonClick(object sender, EventArgs e)
|
|
{
|
|
OnHelpButtonClick(e);
|
|
}
|
|
/// <summary>
|
|
/// Occurs when SETTINGS button, if displayed, is clicked.
|
|
/// </summary>
|
|
[Description("Occurs when SETTINGS button, if displayed, is clicked.")]
|
|
public event EventHandler SettingsButtonClick;
|
|
/// <summary>
|
|
/// Raises SettingsButtonClick event.
|
|
/// </summary>
|
|
/// <param name="e">Provides event arguments.</param>
|
|
protected virtual void OnSettingsButtonClick(EventArgs e)
|
|
{
|
|
EventHandler handler = SettingsButtonClick;
|
|
if (handler != null)
|
|
handler(this, e);
|
|
}
|
|
/// <summary>
|
|
/// Occurs when HELP button, if displayed, is clicked.
|
|
/// </summary>
|
|
[Description("Occurs when HELP button, if displayed, is clicked.")]
|
|
public event EventHandler HelpButtonClick;
|
|
/// <summary>
|
|
/// Raises HelpButtonClick event.
|
|
/// </summary>
|
|
/// <param name="e">Provides event arguments.</param>
|
|
protected virtual void OnHelpButtonClick(EventArgs e)
|
|
{
|
|
EventHandler handler = HelpButtonClick;
|
|
if (handler != null)
|
|
handler(this, e);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|