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
}
}