DotNet 4.8.1 build of DotNetBar
This commit is contained in:
946
PROMS/DotNetBar Source Code/RadialMenu/RadialMenuItem.cs
Normal file
946
PROMS/DotNetBar Source Code/RadialMenu/RadialMenuItem.cs
Normal file
@@ -0,0 +1,946 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using DevComponents.DotNetBar.Rendering;
|
||||
|
||||
namespace DevComponents.DotNetBar
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines Radial Menu Item.
|
||||
/// </summary>
|
||||
[ToolboxItem(false), DesignTimeVisible(false), Designer("DevComponents.DotNetBar.Design.RadialMenuItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
|
||||
public class RadialMenuItem : BaseItem
|
||||
{
|
||||
#region Constructor
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (_DisplayPath != null)
|
||||
{
|
||||
_DisplayPath.Dispose();
|
||||
_DisplayPath = null;
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
/// <summary>
|
||||
/// Occurs after Checked property has changed.
|
||||
/// </summary>
|
||||
[Description("Occurs after Checked property has changed.")]
|
||||
public event EventHandler CheckedChanged;
|
||||
/// <summary>
|
||||
/// Raises CheckedChanged event.
|
||||
/// </summary>
|
||||
/// <param name="e">Provides event arguments.</param>
|
||||
protected virtual void OnCheckedChanged(EventArgs e)
|
||||
{
|
||||
EventHandler handler = CheckedChanged;
|
||||
if (handler != null)
|
||||
handler(this, e);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Implementation
|
||||
public override void Paint(ItemPaintArgs p)
|
||||
{
|
||||
Image image = (this.Enabled || _DisabledImage == null) ? _Image : _DisabledImage;
|
||||
if (string.IsNullOrEmpty(this.Text) && string.IsNullOrEmpty(this.SymbolRealized) && image == null) return; // This is just spacer item
|
||||
|
||||
if ((eRadialMenuType)p.ContextData2 == eRadialMenuType.Circular)
|
||||
{
|
||||
PaintCircularItem(p);
|
||||
return;
|
||||
}
|
||||
|
||||
Graphics g = p.Graphics;
|
||||
|
||||
RadialMenuColorTable renderTable = RadialMenuContainer.GetColorTable();
|
||||
RadialMenuColorTable localTable = (RadialMenuColorTable)p.ContextData;
|
||||
|
||||
Color foreColor = ColorScheme.GetColor(0x2B579A);
|
||||
Color mouseOverColor = Color.FromArgb(72, foreColor);
|
||||
|
||||
if (!this.Enabled &&
|
||||
(!localTable.RadialMenuItemDisabledForeground.IsEmpty ||
|
||||
renderTable != null && !renderTable.RadialMenuItemDisabledForeground.IsEmpty))
|
||||
{
|
||||
if (!localTable.RadialMenuItemDisabledForeground.IsEmpty)
|
||||
foreColor = localTable.RadialMenuItemDisabledForeground;
|
||||
else if (renderTable != null && !renderTable.RadialMenuItemDisabledForeground.IsEmpty)
|
||||
foreColor = renderTable.RadialMenuItemDisabledForeground;
|
||||
}
|
||||
else if (_IsMouseOver && _TracksMouse && (!localTable.RadialMenuItemMouseOverForeground.IsEmpty || renderTable != null && !renderTable.RadialMenuItemMouseOverForeground.IsEmpty))
|
||||
{
|
||||
if (!localTable.RadialMenuItemMouseOverForeground.IsEmpty)
|
||||
foreColor = localTable.RadialMenuItemMouseOverForeground;
|
||||
else if (renderTable != null && !renderTable.RadialMenuItemMouseOverForeground.IsEmpty)
|
||||
foreColor = renderTable.RadialMenuItemMouseOverForeground;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!localTable.RadialMenuItemForeground.IsEmpty)
|
||||
foreColor = localTable.RadialMenuItemForeground;
|
||||
else if (renderTable != null && !renderTable.RadialMenuItemForeground.IsEmpty)
|
||||
foreColor = renderTable.RadialMenuItemForeground;
|
||||
}
|
||||
|
||||
if (!localTable.RadialMenuItemMouseOverBackground.IsEmpty)
|
||||
mouseOverColor = localTable.RadialMenuItemMouseOverBackground;
|
||||
else if (renderTable != null && !renderTable.RadialMenuItemMouseOverBackground.IsEmpty)
|
||||
mouseOverColor = renderTable.RadialMenuItemMouseOverBackground;
|
||||
|
||||
Size imageSize = Size.Empty;
|
||||
Size itemSize = Size.Empty;
|
||||
if (!string.IsNullOrEmpty(_SymbolRealized))
|
||||
{
|
||||
imageSize = _SymbolTextSize;
|
||||
}
|
||||
else if (image != null)
|
||||
{
|
||||
imageSize = image.Size;
|
||||
if(this.Parent is RadialMenuContainer)
|
||||
{
|
||||
RadialMenuContainer cont = (RadialMenuContainer)this.Parent;
|
||||
imageSize.Width = (int)(imageSize.Width * cont.ScaleFactor.Width);
|
||||
imageSize.Height = (int)(imageSize.Height * cont.ScaleFactor.Height);
|
||||
}
|
||||
}
|
||||
itemSize = imageSize;
|
||||
if (!string.IsNullOrEmpty(Text) && _TextVisible)
|
||||
{
|
||||
itemSize.Width = Math.Max(itemSize.Width, _TextSize.Width);
|
||||
itemSize.Height += _TextSize.Height + 1;
|
||||
}
|
||||
itemSize.Width += 2; // Padding
|
||||
itemSize.Height += 2;
|
||||
|
||||
if (_IsMouseOver && _TracksMouse)
|
||||
{
|
||||
using (SolidBrush brush = new SolidBrush(mouseOverColor))
|
||||
g.FillPath(brush, _DisplayPath);
|
||||
}
|
||||
|
||||
|
||||
// Calculate position for image/Symbol
|
||||
// Position item along the imaginary inner circle
|
||||
Rectangle innerCircle = _OutterBounds;
|
||||
innerCircle.Width -= itemSize.Width;
|
||||
innerCircle.Height -= itemSize.Height;
|
||||
innerCircle.Inflate(-2, -2); // Pad it
|
||||
if (innerCircle.Width < _CenterBounds.Width) innerCircle.Inflate((_CenterBounds.Width - innerCircle.Width) / 2, 0);
|
||||
if (innerCircle.Height < _CenterBounds.Height) innerCircle.Inflate(0, (_CenterBounds.Height - innerCircle.Height) / 2);
|
||||
Point imageLoc = new Point(innerCircle.X + (int)((innerCircle.Width / 2) * Math.Cos((_ItemAngle + _ItemPieAngle / 2) * (Math.PI / 180))),
|
||||
innerCircle.Y + (int)((innerCircle.Height / 2) * Math.Sin((_ItemAngle + _ItemPieAngle / 2) * (Math.PI / 180))));
|
||||
imageLoc.Offset(innerCircle.Width / 2, innerCircle.Height / 2);
|
||||
|
||||
if (!string.IsNullOrEmpty(_SymbolRealized))
|
||||
{
|
||||
TextDrawing.DrawStringLegacy(g, _SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet),
|
||||
foreColor, new Rectangle(imageLoc.X + itemSize.Width / 2, imageLoc.Y + 2, 0, 0), eTextFormat.HorizontalCenter);
|
||||
}
|
||||
else if (image != null)
|
||||
{
|
||||
if (g.DpiX != 96f || g.DpiY != 96f)
|
||||
{
|
||||
float scaleX = g.DpiX / 96f;
|
||||
float scaleY = g.DpiY / 96f;
|
||||
g.DrawImage(image, imageLoc.X + (itemSize.Width - imageSize.Width) / 2, imageLoc.Y, image.Width * scaleX, image.Height * scaleY);
|
||||
}
|
||||
else
|
||||
g.DrawImage(image, imageLoc.X + (itemSize.Width - imageSize.Width) / 2, imageLoc.Y, image.Width, image.Height);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(Text) && _TextVisible)
|
||||
{
|
||||
TextDrawing.DrawString(g, GetText(this.Text), p.Font, foreColor, imageLoc.X + itemSize.Width / 2 + _TextOffset.X, imageLoc.Y + imageSize.Height + 3 + _TextOffset.Y, eTextFormat.HorizontalCenter);
|
||||
}
|
||||
|
||||
if (_Checked)
|
||||
{
|
||||
using (Pen pen = new Pen(foreColor, 2))
|
||||
g.DrawArc(pen, _OutterBounds, _ItemAngle, _ItemPieAngle);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnClick()
|
||||
{
|
||||
base.OnClick();
|
||||
ExecuteCommand();
|
||||
}
|
||||
|
||||
private void PaintCircularItem(ItemPaintArgs p)
|
||||
{
|
||||
Graphics g = p.Graphics;
|
||||
|
||||
RadialMenuColorTable renderTable = RadialMenuContainer.GetColorTable();
|
||||
RadialMenuColorTable localTable = (RadialMenuColorTable)p.ContextData;
|
||||
|
||||
Color backColor = ColorScheme.GetColor(0xD44F2E);
|
||||
Color foreColor = Color.White;
|
||||
Color borderColor = Color.White;
|
||||
|
||||
if (!_CircularForeColor.IsEmpty)
|
||||
foreColor = _CircularForeColor;
|
||||
else if (!localTable.CircularForeColor.IsEmpty)
|
||||
foreColor = localTable.CircularForeColor;
|
||||
else if (renderTable != null && !renderTable.CircularForeColor.IsEmpty)
|
||||
foreColor = renderTable.CircularForeColor;
|
||||
|
||||
if (!_CircularBackColor.IsEmpty)
|
||||
backColor = _CircularBackColor;
|
||||
else if (!localTable.CircularBackColor.IsEmpty)
|
||||
backColor = localTable.CircularBackColor;
|
||||
else if (renderTable != null && !renderTable.CircularBackColor.IsEmpty)
|
||||
backColor = renderTable.CircularBackColor;
|
||||
|
||||
if (!_CircularBorderColor.IsEmpty)
|
||||
borderColor = _CircularBorderColor;
|
||||
else if (!localTable.CircularBorderColor.IsEmpty)
|
||||
borderColor = localTable.CircularBorderColor;
|
||||
else if (renderTable != null && !renderTable.CircularBorderColor.IsEmpty)
|
||||
borderColor = renderTable.CircularBorderColor;
|
||||
|
||||
Color mouseOverColor = Color.FromArgb(192, backColor);
|
||||
|
||||
if (_TracksMouse && _IsMouseOver)
|
||||
backColor = mouseOverColor;
|
||||
|
||||
Size imageSize = Size.Empty;
|
||||
if (!string.IsNullOrEmpty(_SymbolRealized))
|
||||
{
|
||||
imageSize = new Size(_SymbolTextSize.Height, _SymbolTextSize.Height); // For consistency use height as guideline
|
||||
}
|
||||
else if (_Image != null)
|
||||
{
|
||||
imageSize = _Image.Size;
|
||||
}
|
||||
|
||||
if (imageSize.Width > imageSize.Height)
|
||||
imageSize.Height = imageSize.Width;
|
||||
else if (imageSize.Height > imageSize.Width)
|
||||
imageSize.Width = imageSize.Height;
|
||||
|
||||
imageSize.Width = (int)Math.Sqrt((Math.Pow(imageSize.Width, 2) + Math.Pow(imageSize.Height, 2)));
|
||||
imageSize.Height = imageSize.Width;
|
||||
|
||||
imageSize.Width += 1;
|
||||
imageSize.Height += 1;
|
||||
int circularMenuDiameter = Dpi.Width(_CircularMenuDiameter);
|
||||
if (circularMenuDiameter > 0)
|
||||
{
|
||||
imageSize.Width = circularMenuDiameter;
|
||||
imageSize.Height = circularMenuDiameter;
|
||||
}
|
||||
|
||||
// Calculate position for image/Symbol
|
||||
// Position item along the imaginary inner circle
|
||||
Rectangle innerCircle = _OutterBounds;
|
||||
innerCircle.Inflate(-1, -1);
|
||||
innerCircle.Inflate(-imageSize.Width, -imageSize.Height);
|
||||
if (innerCircle.Width < _CenterBounds.Width) innerCircle.Inflate((_CenterBounds.Width - innerCircle.Width) / 2, 0);
|
||||
if (innerCircle.Height < _CenterBounds.Height) innerCircle.Inflate(0, (_CenterBounds.Height - innerCircle.Height) / 2);
|
||||
Point imageLoc = new Point(innerCircle.X + (int)((innerCircle.Width / 2) * Math.Cos((_ItemAngle + _ItemPieAngle / 2) * (Math.PI / 180))),
|
||||
innerCircle.Y + (int)((innerCircle.Height / 2) * Math.Sin((_ItemAngle + _ItemPieAngle / 2) * (Math.PI / 180))));
|
||||
imageLoc.Offset(innerCircle.Width/2, innerCircle.Height/2);
|
||||
Rectangle r = new Rectangle(imageLoc, Size.Empty);
|
||||
r.Inflate(imageSize);
|
||||
r.Inflate(-1, -1);
|
||||
//if (this.Parent is RadialMenuContainer)
|
||||
//{
|
||||
// r.Width = (int)(r.Width * ((RadialMenuContainer)this.Parent).ScaleFactor.Width);
|
||||
// r.Height = (int)(r.Height * ((RadialMenuContainer)this.Parent).ScaleFactor.Width);
|
||||
//}
|
||||
|
||||
if (backColor.A < 255)
|
||||
g.FillEllipse(Brushes.White, r);
|
||||
using (SolidBrush brush = new SolidBrush(backColor))
|
||||
g.FillEllipse(brush, r);
|
||||
r.Inflate(1, 1);
|
||||
using (Pen pen = new Pen(borderColor, 3))
|
||||
g.DrawEllipse(pen, r);
|
||||
|
||||
if (!string.IsNullOrEmpty(_SymbolRealized))
|
||||
{
|
||||
TextDrawing.DrawStringLegacy(g, _SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet),
|
||||
foreColor, new RectangleF(r.X + r.Width / 2, r.Y + r.Height / 2 + 2, 0, 0), eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter | eTextFormat.SingleLine);
|
||||
}
|
||||
else if (_Image != null)
|
||||
{
|
||||
ImageHelper.DrawImageCenteredDpiAware(g, _Image, r);
|
||||
//g.DrawImage(_Image, r.X + (r.Width - _Image.Width) / 2, r.Y + (r.Height - _Image.Height) / 2);
|
||||
}
|
||||
}
|
||||
|
||||
private Size _SymbolTextSize = Size.Empty;
|
||||
private Size _TextSize = Size.Empty;
|
||||
public override void RecalcSize()
|
||||
{
|
||||
_SymbolTextSize = Size.Empty;
|
||||
_TextSize = Size.Empty;
|
||||
|
||||
Control c = this.ContainerControl as Control;
|
||||
if (c == null || !BarFunctions.IsHandleValid(c)) return;
|
||||
|
||||
Graphics g = BarFunctions.CreateGraphics(c);
|
||||
if (g == null) return;
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_SymbolRealized))
|
||||
{
|
||||
Font symFont = Symbols.GetFont(_SymbolSize, _SymbolSet);
|
||||
_SymbolTextSize = TextDrawing.MeasureStringLegacy(g, _SymbolRealized, Symbols.GetFont(this.SymbolSize, this.SymbolSet), Size.Empty, eTextFormat.Default);
|
||||
int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) *
|
||||
symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style)));
|
||||
_SymbolTextSize.Height -= descent;
|
||||
//_SymbolTextSize.Width += 4; // Add some padding
|
||||
//_SymbolTextSize.Height += 4; // Add some padding
|
||||
}
|
||||
if (!string.IsNullOrEmpty(Text) && _TextVisible)
|
||||
{
|
||||
string text = GetText(this.Text);
|
||||
_TextSize = TextDrawing.MeasureString(g, text, c.Font, Size.Empty, eTextFormat.Default);
|
||||
_TextSize.Width += 2; // Add some padding
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
g.Dispose();
|
||||
}
|
||||
|
||||
base.RecalcSize();
|
||||
}
|
||||
|
||||
private string GetText(string text)
|
||||
{
|
||||
if (text.Contains("\\r\\n")) text = text.Replace("\\r\\n", "\r\n"); // Escaped by designer fix it
|
||||
return text;
|
||||
}
|
||||
private GraphicsPath _DisplayPath;
|
||||
/// <summary>
|
||||
/// Gets display path of the item.
|
||||
/// </summary>
|
||||
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
||||
public GraphicsPath DisplayPath
|
||||
{
|
||||
get { return _DisplayPath; }
|
||||
internal set
|
||||
{
|
||||
if (value != _DisplayPath)
|
||||
{
|
||||
GraphicsPath oldValue = _DisplayPath;
|
||||
_DisplayPath = value;
|
||||
OnDisplayPathChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when DisplayPath property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnDisplayPathChanged(GraphicsPath oldValue, GraphicsPath newValue)
|
||||
{
|
||||
if (oldValue != null && oldValue != newValue) oldValue.Dispose();
|
||||
//this.Refresh();
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("DisplayPath"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns copy of the item.
|
||||
/// </summary>
|
||||
public override BaseItem Copy()
|
||||
{
|
||||
RadialMenuItem copy = new RadialMenuItem();
|
||||
this.CopyToItem(copy);
|
||||
return copy;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies the RadialMenuItem specific properties to new instance of the item.
|
||||
/// </summary>
|
||||
/// <param name="copy">New ProgressBarItem instance.</param>
|
||||
internal void InternalCopyToItem(RadialMenuItem copy)
|
||||
{
|
||||
CopyToItem(copy);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies the RadialMenuItem specific properties to new instance of the item.
|
||||
/// </summary>
|
||||
/// <param name="copy">New RadialMenuItem instance.</param>
|
||||
protected override void CopyToItem(BaseItem copy)
|
||||
{
|
||||
base.CopyToItem(copy);
|
||||
|
||||
RadialMenuItem item = copy as RadialMenuItem;
|
||||
item.Checked = _Checked;
|
||||
item.Symbol = _Symbol;
|
||||
item.SymbolSet = _SymbolSet;
|
||||
item.SymbolSize = _SymbolSize;
|
||||
item.TextVisible = _TextVisible;
|
||||
item.TracksMouse = _TracksMouse;
|
||||
item.CircularBackColor = _CircularBackColor;
|
||||
item.CircularBorderColor = _CircularBorderColor;
|
||||
item.CircularForeColor = _CircularForeColor;
|
||||
item.CircularMenuDiameter = _CircularMenuDiameter;
|
||||
item.Image = _Image;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the realized symbol string.
|
||||
/// </summary>
|
||||
[Browsable(false)]
|
||||
public string SymbolRealized
|
||||
{
|
||||
get { return _SymbolRealized; }
|
||||
}
|
||||
private string _Symbol = "", _SymbolRealized = "";
|
||||
/// <summary>
|
||||
/// Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting.
|
||||
/// </summary>
|
||||
[DefaultValue(""), Category("Appearance"), Description("Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting.")]
|
||||
[Editor("DevComponents.DotNetBar.Design.SymbolTypeEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
|
||||
public string Symbol
|
||||
{
|
||||
get { return _Symbol; }
|
||||
set
|
||||
{
|
||||
if (value != _Symbol)
|
||||
{
|
||||
string oldValue = _Symbol;
|
||||
_Symbol = value;
|
||||
OnSymbolChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when Symbol property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnSymbolChanged(string oldValue, string newValue)
|
||||
{
|
||||
if (string.IsNullOrEmpty(newValue))
|
||||
_SymbolRealized = "";
|
||||
else
|
||||
_SymbolRealized = Symbols.GetSymbol(newValue);
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("Symbol"));
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private eSymbolSet _SymbolSet = eSymbolSet.Awesome;
|
||||
/// <summary>
|
||||
/// Gets or sets the symbol set used to represent the Symbol.
|
||||
/// </summary>
|
||||
[Browsable(false), DefaultValue(eSymbolSet.Awesome)]
|
||||
public eSymbolSet SymbolSet
|
||||
{
|
||||
get { return _SymbolSet; }
|
||||
set
|
||||
{
|
||||
if (_SymbolSet != value)
|
||||
{
|
||||
eSymbolSet oldValue = _SymbolSet;
|
||||
_SymbolSet = value;
|
||||
OnSymbolSetChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when SymbolSet property value changes.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Indciates old value</param>
|
||||
/// <param name="newValue">Indicates new value</param>
|
||||
protected virtual void OnSymbolSetChanged(eSymbolSet oldValue, eSymbolSet newValue)
|
||||
{
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private float _SymbolSize = 0f;
|
||||
/// <summary>
|
||||
/// Indicates the size of the symbol in points.
|
||||
/// </summary>
|
||||
[DefaultValue(0f), Category("Appearance"), Description("Indicates the size of the symbol in points.")]
|
||||
public float SymbolSize
|
||||
{
|
||||
get { return _SymbolSize; }
|
||||
set
|
||||
{
|
||||
if (value != _SymbolSize)
|
||||
{
|
||||
float oldValue = _SymbolSize;
|
||||
_SymbolSize = value;
|
||||
OnSymbolSizeChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when SymbolSize property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnSymbolSizeChanged(float oldValue, float newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("SymbolSize"));
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private Image _Image;
|
||||
/// <summary>
|
||||
/// Gets or sets the image displayed on the item.
|
||||
/// </summary>
|
||||
[DefaultValue(null), Category("Appearance"), Description("Indicates image displayed on the item.")]
|
||||
public Image Image
|
||||
{
|
||||
get { return _Image; }
|
||||
set
|
||||
{
|
||||
if (value != _Image)
|
||||
{
|
||||
Image oldValue = _Image;
|
||||
_Image = value;
|
||||
OnImageChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when Image property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnImageChanged(Image oldValue, Image newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("Image"));
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private Image _DisabledImage;
|
||||
/// <summary>
|
||||
/// Gets or sets the disabled image for the item when Enabled is set to false.
|
||||
/// </summary>
|
||||
[DefaultValue(null), Category("Appearance"), Description("Indicates disabled image displayed on the item when Enabled is set to false.")]
|
||||
public Image DisabledImage
|
||||
{
|
||||
get { return _DisabledImage; }
|
||||
set
|
||||
{
|
||||
if (value != _DisabledImage)
|
||||
{
|
||||
Image oldValue = _DisabledImage;
|
||||
_DisabledImage = value;
|
||||
OnDisabledImageChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when DisabledImage property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnDisabledImageChanged(Image oldValue, Image newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("Image"));
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private Rectangle _OutterBounds;
|
||||
internal Rectangle OutterBounds
|
||||
{
|
||||
get { return _OutterBounds; }
|
||||
set { _OutterBounds = value; }
|
||||
}
|
||||
|
||||
private Rectangle _CenterBounds;
|
||||
internal Rectangle CenterBounds
|
||||
{
|
||||
get { return _CenterBounds; }
|
||||
set { _CenterBounds = value; }
|
||||
}
|
||||
|
||||
private int _ItemAngle;
|
||||
internal int ItemAngle
|
||||
{
|
||||
get { return _ItemAngle; }
|
||||
set { _ItemAngle = value; }
|
||||
}
|
||||
|
||||
private int _ItemPieAngle;
|
||||
internal int ItemPieAngle
|
||||
{
|
||||
get { return _ItemPieAngle; }
|
||||
set { _ItemPieAngle = value; }
|
||||
}
|
||||
|
||||
private bool _TextVisible = true;
|
||||
/// <summary>
|
||||
/// Indicates whether text on item is visible.
|
||||
/// </summary>
|
||||
[DefaultValue(true), Category("Appearance"), Description("Indicates whether text on item is visible")]
|
||||
public bool TextVisible
|
||||
{
|
||||
get { return _TextVisible; }
|
||||
set
|
||||
{
|
||||
if (value != _TextVisible)
|
||||
{
|
||||
bool oldValue = _TextVisible;
|
||||
_TextVisible = value;
|
||||
OnTextVisibleChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when TextVisible property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnTextVisibleChanged(bool oldValue, bool newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("TextVisible"));
|
||||
NeedRecalcSize = true;
|
||||
OnAppearanceChanged();
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
public override void InternalMouseMove(MouseEventArgs objArg)
|
||||
{
|
||||
if (!_IsMouseOver)
|
||||
IsMouseOver = true;
|
||||
base.InternalMouseMove(objArg);
|
||||
}
|
||||
|
||||
public override void InternalMouseLeave()
|
||||
{
|
||||
if (_IsMouseOver)
|
||||
IsMouseOver = false;
|
||||
base.InternalMouseLeave();
|
||||
}
|
||||
|
||||
private bool _IsMouseOver;
|
||||
/// <summary>
|
||||
/// Gets whether mouse is over the item.
|
||||
/// </summary>
|
||||
[Browsable(false)]
|
||||
public bool IsMouseOver
|
||||
{
|
||||
get { return _IsMouseOver; }
|
||||
internal set
|
||||
{
|
||||
_IsMouseOver = value;
|
||||
OnIsMouseOverChanged();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnIsMouseOverChanged()
|
||||
{
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private bool _TracksMouse = true;
|
||||
/// <summary>
|
||||
/// Indicates whether item changes its appearance when mouse is over it or pressed
|
||||
/// </summary>
|
||||
[DefaultValue(true), Description("Indicates whether item changes its appearance when mouse is over it or pressed"), Category("Behavior")]
|
||||
public bool TracksMouse
|
||||
{
|
||||
get { return _TracksMouse; }
|
||||
set
|
||||
{
|
||||
if (value != _TracksMouse)
|
||||
{
|
||||
bool oldValue = _TracksMouse;
|
||||
_TracksMouse = value;
|
||||
OnTracksMouseChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when TracksMouse property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnTracksMouseChanged(bool oldValue, bool newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("TracksMouse"));
|
||||
|
||||
}
|
||||
|
||||
protected internal override void OnExpandChange()
|
||||
{
|
||||
NeedRecalcSize = true;
|
||||
if (!this.Expanded && HotSubItem != null) HotSubItem.InternalMouseLeave();
|
||||
base.OnExpandChange();
|
||||
}
|
||||
|
||||
private bool _Checked = false;
|
||||
/// <summary>
|
||||
/// Indicates whether item is in checked state.
|
||||
/// </summary>
|
||||
[DefaultValue(false), Category("Appearance"), Description("Indicates whether item is in checked state.")]
|
||||
public bool Checked
|
||||
{
|
||||
get { return _Checked; }
|
||||
set
|
||||
{
|
||||
if (value != _Checked)
|
||||
{
|
||||
bool oldValue = _Checked;
|
||||
_Checked = value;
|
||||
OnCheckedChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when Checked property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnCheckedChanged(bool oldValue, bool newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("Checked"));
|
||||
OnCheckedChanged(EventArgs.Empty);
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
protected internal override void OnSubItemExpandChange(BaseItem item)
|
||||
{
|
||||
if (this.Parent != null)
|
||||
this.Parent.OnSubItemExpandChange(item); // Pass it up the chain
|
||||
base.OnSubItemExpandChange(item);
|
||||
}
|
||||
|
||||
private Point _TextOffset = Point.Empty;
|
||||
/// <summary>
|
||||
/// Gets or sets the optional text offset for the item.
|
||||
/// </summary>
|
||||
[Category("Appearance"), Description("Specifies optional text offset.")]
|
||||
public Point TextOffset
|
||||
{
|
||||
get { return _TextOffset; }
|
||||
set
|
||||
{
|
||||
if (value != _TextOffset)
|
||||
{
|
||||
Point oldValue = _TextOffset;
|
||||
_TextOffset = value;
|
||||
OnTextOffsetChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when TextOffset property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnTextOffsetChanged(Point oldValue, Point newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("TextOffset"));
|
||||
//NeedRecalcSize = true;
|
||||
this.Invalidate();
|
||||
}
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public bool ShouldSerializeTextOffset()
|
||||
{
|
||||
return !_TextOffset.IsEmpty;
|
||||
}
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public void ResetTextOffset()
|
||||
{
|
||||
TextOffset = Point.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
|
||||
/// </summary>
|
||||
[System.ComponentModel.Browsable(false), System.ComponentModel.DefaultValue(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
|
||||
public override bool Expanded
|
||||
{
|
||||
get { return base.Expanded; }
|
||||
|
||||
set
|
||||
{
|
||||
if (base.Expanded != value)
|
||||
{
|
||||
if (value)
|
||||
OnBeforeMenuOpened(EventArgs.Empty);
|
||||
else
|
||||
OnBeforeMenuClosed(EventArgs.Empty);
|
||||
|
||||
base.Expanded = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Occurs before radial menu item is expanded and its sub-items displayed.
|
||||
/// </summary>
|
||||
[Description("Occurs before radial menu item is expanded and its sub-items displayed.")]
|
||||
public event EventHandler BeforeMenuOpened;
|
||||
/// <summary>
|
||||
/// Raises BeforeMenuOpened event.
|
||||
/// </summary>
|
||||
/// <param name="e">Provides event arguments.</param>
|
||||
protected virtual void OnBeforeMenuOpened(EventArgs e)
|
||||
{
|
||||
EventHandler handler = BeforeMenuOpened;
|
||||
if (handler != null)
|
||||
handler(this, e);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Occurs before radial menu item is closed
|
||||
/// </summary>
|
||||
[Description("Occurs before radial menu item is closed.")]
|
||||
public event EventHandler BeforeMenuClosed;
|
||||
/// <summary>
|
||||
/// Raises BeforeMenuClosed event.
|
||||
/// </summary>
|
||||
/// <param name="e">Provides event arguments.</param>
|
||||
protected virtual void OnBeforeMenuClosed(EventArgs e)
|
||||
{
|
||||
EventHandler handler = BeforeMenuClosed;
|
||||
if (handler != null)
|
||||
handler(this, e);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Control Container (System.Windows.Forms.Control or its descendant)
|
||||
/// </summary>
|
||||
[System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
|
||||
public override object ContainerControl
|
||||
{
|
||||
get { return GetContainerControl(false); }
|
||||
set { base.ContainerControl = value; }
|
||||
}
|
||||
|
||||
#region Circular Menu
|
||||
private int _CircularMenuDiameter = 0;
|
||||
/// <summary>
|
||||
/// Specifies explicit circular menu type diameter. Applies to circular menu type only.
|
||||
/// </summary>
|
||||
[DefaultValue(0), Category("Appearance"), Description("Specifies explicit circular menu type diameter. Applies to circular menu type only.")]
|
||||
public int CircularMenuDiameter
|
||||
{
|
||||
get { return _CircularMenuDiameter; }
|
||||
set
|
||||
{
|
||||
if (value < 0) value = 0;
|
||||
if (value != _CircularMenuDiameter)
|
||||
{
|
||||
int oldValue = _CircularMenuDiameter;
|
||||
_CircularMenuDiameter = value;
|
||||
OnCircularMenuDiameterChanged(oldValue, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Called when CircularMenuDiameter property has changed.
|
||||
/// </summary>
|
||||
/// <param name="oldValue">Old property value</param>
|
||||
/// <param name="newValue">New property value</param>
|
||||
protected virtual void OnCircularMenuDiameterChanged(int oldValue, int newValue)
|
||||
{
|
||||
//OnPropertyChanged(new PropertyChangedEventArgs("CircularMenuDiameter"));
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
private Color _CircularBackColor = Color.Empty;
|
||||
/// <summary>
|
||||
/// Gets or sets background color of the circular menu item type. Applies only to circular menu types.
|
||||
/// </summary>
|
||||
[Category("Appearance"), Description("Indicates background color of the circular menu item type.")]
|
||||
public Color CircularBackColor
|
||||
{
|
||||
get { return _CircularBackColor; }
|
||||
set { _CircularBackColor = value; this.Invalidate(); /*OnPropertyChanged("CircularBackColor");*/ }
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets whether property should be serialized.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public bool ShouldSerializeCircularBackColor()
|
||||
{
|
||||
return !_CircularBackColor.IsEmpty;
|
||||
}
|
||||
/// <summary>
|
||||
/// Resets property to its default value.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public void ResetCircularBackColor()
|
||||
{
|
||||
this.CircularBackColor = Color.Empty;
|
||||
}
|
||||
|
||||
private Color _CircularForeColor = Color.Empty;
|
||||
/// <summary>
|
||||
/// Gets or sets text color of the circular menu item type. Applies only to circular menu types.
|
||||
/// </summary>
|
||||
[Category("Appearance"), Description("Indicates text color of the circular menu item type.")]
|
||||
public Color CircularForeColor
|
||||
{
|
||||
get { return _CircularForeColor; }
|
||||
set { _CircularForeColor = value; this.Invalidate(); /*OnPropertyChanged("CircularForeColor");*/ }
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets whether property should be serialized.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public bool ShouldSerializeCircularForeColor()
|
||||
{
|
||||
return !_CircularForeColor.IsEmpty;
|
||||
}
|
||||
/// <summary>
|
||||
/// Resets property to its default value.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public void ResetCircularForeColor()
|
||||
{
|
||||
this.CircularForeColor = Color.Empty;
|
||||
}
|
||||
|
||||
private Color _CircularBorderColor = Color.Empty;
|
||||
/// <summary>
|
||||
/// Gets or sets border color of the circular menu item type. Applies only to circular menu types.
|
||||
/// </summary>
|
||||
[Category("Appearance"), Description("Indicates border color of the circular menu item type.")]
|
||||
public Color CircularBorderColor
|
||||
{
|
||||
get { return _CircularBorderColor; }
|
||||
set { _CircularBorderColor = value; this.Invalidate(); /*OnPropertyChanged("CircularBorderColor");*/ }
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets whether property should be serialized.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public bool ShouldSerializeCircularBorderColor()
|
||||
{
|
||||
return !_CircularBorderColor.IsEmpty;
|
||||
}
|
||||
/// <summary>
|
||||
/// Resets property to its default value.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public void ResetCircularBorderColor()
|
||||
{
|
||||
this.CircularBorderColor = Color.Empty;
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user