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 { /// /// Defines Radial Menu Item. /// [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 /// /// Occurs after Checked property has changed. /// [Description("Occurs after Checked property has changed.")] public event EventHandler CheckedChanged; /// /// Raises CheckedChanged event. /// /// Provides event arguments. 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; /// /// Gets display path of the item. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public GraphicsPath DisplayPath { get { return _DisplayPath; } internal set { if (value != _DisplayPath) { GraphicsPath oldValue = _DisplayPath; _DisplayPath = value; OnDisplayPathChanged(oldValue, value); } } } /// /// Called when DisplayPath property has changed. /// /// Old property value /// New property value protected virtual void OnDisplayPathChanged(GraphicsPath oldValue, GraphicsPath newValue) { if (oldValue != null && oldValue != newValue) oldValue.Dispose(); //this.Refresh(); //OnPropertyChanged(new PropertyChangedEventArgs("DisplayPath")); } /// /// Returns copy of the item. /// public override BaseItem Copy() { RadialMenuItem copy = new RadialMenuItem(); this.CopyToItem(copy); return copy; } /// /// Copies the RadialMenuItem specific properties to new instance of the item. /// /// New ProgressBarItem instance. internal void InternalCopyToItem(RadialMenuItem copy) { CopyToItem(copy); } /// /// Copies the RadialMenuItem specific properties to new instance of the item. /// /// New RadialMenuItem instance. 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; } /// /// Gets the realized symbol string. /// [Browsable(false)] public string SymbolRealized { get { return _SymbolRealized; } } private string _Symbol = "", _SymbolRealized = ""; /// /// Indicates the symbol displayed on face of the button instead of the image. Setting the symbol overrides the image setting. /// [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); } } } /// /// Called when Symbol property has changed. /// /// Old property value /// New property value 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; /// /// Gets or sets the symbol set used to represent the Symbol. /// [Browsable(false), DefaultValue(eSymbolSet.Awesome)] public eSymbolSet SymbolSet { get { return _SymbolSet; } set { if (_SymbolSet != value) { eSymbolSet oldValue = _SymbolSet; _SymbolSet = value; OnSymbolSetChanged(oldValue, value); } } } /// /// Called when SymbolSet property value changes. /// /// Indciates old value /// Indicates new value protected virtual void OnSymbolSetChanged(eSymbolSet oldValue, eSymbolSet newValue) { NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private float _SymbolSize = 0f; /// /// Indicates the size of the symbol in points. /// [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); } } } /// /// Called when SymbolSize property has changed. /// /// Old property value /// New property value protected virtual void OnSymbolSizeChanged(float oldValue, float newValue) { //OnPropertyChanged(new PropertyChangedEventArgs("SymbolSize")); NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private Image _Image; /// /// Gets or sets the image displayed on the item. /// [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); } } } /// /// Called when Image property has changed. /// /// Old property value /// New property value protected virtual void OnImageChanged(Image oldValue, Image newValue) { //OnPropertyChanged(new PropertyChangedEventArgs("Image")); NeedRecalcSize = true; OnAppearanceChanged(); this.Refresh(); } private Image _DisabledImage; /// /// Gets or sets the disabled image for the item when Enabled is set to false. /// [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); } } } /// /// Called when DisabledImage property has changed. /// /// Old property value /// New property value 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; /// /// Indicates whether text on item is visible. /// [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); } } } /// /// Called when TextVisible property has changed. /// /// Old property value /// New property value 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; /// /// Gets whether mouse is over the item. /// [Browsable(false)] public bool IsMouseOver { get { return _IsMouseOver; } internal set { _IsMouseOver = value; OnIsMouseOverChanged(); } } protected virtual void OnIsMouseOverChanged() { this.Refresh(); } private bool _TracksMouse = true; /// /// Indicates whether item changes its appearance when mouse is over it or pressed /// [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); } } } /// /// Called when TracksMouse property has changed. /// /// Old property value /// New property value 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; /// /// Indicates whether item is in checked state. /// [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); } } } /// /// Called when Checked property has changed. /// /// Old property value /// New property value 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; /// /// Gets or sets the optional text offset for the item. /// [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); } } } /// /// Called when TextOffset property has changed. /// /// Old property value /// New property value 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; } /// /// 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. /// [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; } } } /// /// Occurs before radial menu item is expanded and its sub-items displayed. /// [Description("Occurs before radial menu item is expanded and its sub-items displayed.")] public event EventHandler BeforeMenuOpened; /// /// Raises BeforeMenuOpened event. /// /// Provides event arguments. protected virtual void OnBeforeMenuOpened(EventArgs e) { EventHandler handler = BeforeMenuOpened; if (handler != null) handler(this, e); } /// /// Occurs before radial menu item is closed /// [Description("Occurs before radial menu item is closed.")] public event EventHandler BeforeMenuClosed; /// /// Raises BeforeMenuClosed event. /// /// Provides event arguments. protected virtual void OnBeforeMenuClosed(EventArgs e) { EventHandler handler = BeforeMenuClosed; if (handler != null) handler(this, e); } /// /// Control Container (System.Windows.Forms.Control or its descendant) /// [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; /// /// Specifies explicit circular menu type diameter. Applies to circular menu type only. /// [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); } } } /// /// Called when CircularMenuDiameter property has changed. /// /// Old property value /// New property value protected virtual void OnCircularMenuDiameterChanged(int oldValue, int newValue) { //OnPropertyChanged(new PropertyChangedEventArgs("CircularMenuDiameter")); this.Refresh(); } private Color _CircularBackColor = Color.Empty; /// /// Gets or sets background color of the circular menu item type. Applies only to circular menu types. /// [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");*/ } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeCircularBackColor() { return !_CircularBackColor.IsEmpty; } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetCircularBackColor() { this.CircularBackColor = Color.Empty; } private Color _CircularForeColor = Color.Empty; /// /// Gets or sets text color of the circular menu item type. Applies only to circular menu types. /// [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");*/ } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeCircularForeColor() { return !_CircularForeColor.IsEmpty; } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetCircularForeColor() { this.CircularForeColor = Color.Empty; } private Color _CircularBorderColor = Color.Empty; /// /// Gets or sets border color of the circular menu item type. Applies only to circular menu types. /// [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");*/ } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeCircularBorderColor() { return !_CircularBorderColor.IsEmpty; } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetCircularBorderColor() { this.CircularBorderColor = Color.Empty; } #endregion #endregion } }