using System; using System.Text; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using DevComponents.DotNetBar.Rendering; using DevComponents.Editors; using DevComponents.DotNetBar.Ribbon; namespace DevComponents.DotNetBar { /// /// Represents rating item control which provides rating functionality. /// [ToolboxItem(false), DesignTimeVisible(false), DefaultEvent("RatingChanged"), Designer("DevComponents.DotNetBar.Design.RatingItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public class RatingItem : PopupItem { #region Constructors /// /// Initializes a new instance of the RatingItem class. /// public RatingItem() { _BackgroundStyle.StyleChanged += new EventHandler(BackgroundStyleChanged); _CustomImages = new RatingImages(this); this.AutoCollapseOnClick = false; } protected override void Dispose(bool disposing) { if (BarUtilities.DisposeItemImages && !this.DesignMode) { BarUtilities.DisposeImage(ref _DefaultImage); _CustomImages.Dispose(); } base.Dispose(disposing); } #endregion #region Events /// /// Occurs when Rating property has changed. /// [Description("Occurs when Rating property has changed.")] public event EventHandler RatingChanged; /// /// Occurs when RatingValue property has changed. /// [Description("Occurs when Rating property has changed.")] public event EventHandler RatingValueChanged; /// /// Occurs when Rating property is about to be changed and provides opportunity to cancel the change. /// [Description("Occurs when Rating property has changed.")] public event RatingChangeEventHandler RatingChanging; /// /// Occurs when AverageRating property has changed. /// [Description("Occurs when AverageRating property has changed.")] public event EventHandler AverageRatingChanged; /// /// Occurs when AverageRatingValue property has changed. /// [Description("Occurs when AverageRatingValue property has changed.")] public event EventHandler AverageRatingValueChanged; /// /// Occurs when text markup link is clicked. Markup links can be created using "a" tag, for example: /// Markup link /// public event MarkupLinkClickEventHandler MarkupLinkClick; /// /// Occurs when RatingValue property is set and it allows you to provide custom parsing for the values. /// public event ParseIntegerValueEventHandler ParseRatingValue; /// /// Occurs when AverageRatingValue property is set and it allows you to provide custom parsing for the values. /// public event ParseDoubleValueEventHandler ParseAverageRatingValue; #endregion #region Internal Implementation public override BaseItem Copy() { RatingItem objCopy = new RatingItem(); objCopy.Name = this.Name; this.CopyToItem(objCopy); return objCopy; } /// /// Copies the ButtonItem specific properties to new instance of the item. /// /// New ButtonItem instance. protected override void CopyToItem(BaseItem copy) { RatingItem objCopy = copy as RatingItem; objCopy.AverageRating = this.AverageRating; objCopy.Rating = this.Rating; objCopy.RatingOrientation = this.RatingOrientation; objCopy.IsEditable = this.IsEditable; objCopy.TextSpacing = this.TextSpacing; objCopy.TextColor = this.TextColor; objCopy.TextVisible = this.TextVisible; base.CopyToItem(objCopy); } private double _AverageRating = 0; /// /// Gets or sets the average rating shown by control. Control will display average rating (if set) when no explicit /// Rating value is set through Rating property. Minimum value is 0 and Maximum value is controlled by NumberOfStars property value. /// [DefaultValue(0d), Category("Data"), Description("Indicates average rating shown by control.")] public double AverageRating { get { return _AverageRating; } set { if (value < 0) value = 0; if (value > _NumberOfStars) value = _NumberOfStars; if (value != _AverageRating) { _AverageRating = value; OnAverageRatingChanged(EventArgs.Empty); this.Refresh(); } } } /// /// Raises the AverageRatingChanged event. /// /// Event data. protected virtual void OnAverageRatingChanged(EventArgs eventArgs) { if (AverageRatingChanged != null) AverageRatingChanged(this, eventArgs); if (AverageRatingValueChanged != null) AverageRatingValueChanged(this, eventArgs); } /// /// Gets or sets the AverageRating property. This property is provided for Data-Binding with NULL value support. /// [Bindable(true), Browsable(false), RefreshProperties(RefreshProperties.All), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter))] public object AverageRatingValue { get { return AverageRating; } set { if (AcceptCustomAverageRatingValue(value)) return; else if (IsNull(value)) this.AverageRating = 0; else if (value is double || value is int || value is float) { this.AverageRating = (double)value; } else if (value is long) { string t = value.ToString(); this.AverageRating = double.Parse(t); } else if (value is string) { double i = 0; #if FRAMEWORK20 if (double.TryParse(value.ToString(), out i)) this.AverageRating = i; else throw new ArgumentException("AverageRatingValue property expects either null/nothing value or double type."); #else this.AverageRating = double.Parse(value.ToString()); #endif } else throw new ArgumentException("AverageRatingValue property expects either null/nothing value or double type."); } } private bool AcceptCustomAverageRatingValue(object value) { ParseDoubleValueEventArgs e = new ParseDoubleValueEventArgs(value); OnParseAverageRatingValue(e); if (e.IsParsed) { this.AverageRating = e.ParsedValue; } return e.IsParsed; } /// /// Raises the ParseAverageRatingValue event. /// /// Provides event arguments. protected virtual void OnParseAverageRatingValue(ParseDoubleValueEventArgs e) { if (ParseAverageRatingValue != null) ParseAverageRatingValue(this, e); } /// /// Sets the Rating value of the control and provides information about source of the rating change. /// /// New Rating value. /// Source of this change. public void SetRating(int newRating, eEventSource source) { if (newRating == _Rating) return; RatingChangeEventArgs e = new RatingChangeEventArgs(newRating, _Rating, source); OnRatingChanging(e); if (e.Cancel) return; newRating = e.NewRating; _Rating = newRating; OnRatingChanged(e); ExecuteCommand(); this.Refresh(); } /// /// Raises RatingChanging event. /// /// Event data protected virtual void OnRatingChanging(RatingChangeEventArgs e) { if (RatingChanging != null) RatingChanging(this, e); } private int _Rating = 0; /// /// Gets or sets the rating value represented by the control. Default value is 0 which indicates /// that there is no rating set. Maximum value is controlled by NumberOfStars property. /// [DefaultValue(0), Category("Data"), Description("Indicates rating value represented by the control.")] public int Rating { get { return _Rating; } set { if (value < 0) value = 0; if (_Initialized && value > _NumberOfStars) value = _NumberOfStars; if (_Rating != value) { SetRating(value, eEventSource.Code); } } } /// /// Raises the RatingChanged event. /// /// Event data. protected virtual void OnRatingChanged(EventArgs eventArgs) { EventHandler handler = RatingChanged; if (handler != null) handler(this, eventArgs); handler = RatingValueChanged; if (handler != null) handler(this, eventArgs); } /// /// Gets or sets the Rating property value. This property is provided for Data-Binding with NULL value support. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), RefreshProperties(RefreshProperties.All), Bindable(true)] public object RatingValue { get { return _Rating; } set { if (AcceptCustomRatingValue(value)) return; else if (IsNull(value)) this.Rating = 0; else if (value is int) { this.Rating = (int)value; } else if (value is string) { int i = 0; #if FRAMEWORK20 if (int.TryParse(value.ToString(), out i)) this.Rating = i; else throw new ArgumentException("RatingValue property expects either null/nothing value or int type."); #else this.Rating = int.Parse(value.ToString()); #endif } else throw new ArgumentException("RatingValue property expects either null/nothing value or int type."); } } protected virtual bool IsNull(object value) { if (value == null || value is DBNull) return true; return false; } private bool AcceptCustomRatingValue(object value) { ParseIntegerValueEventArgs e = new ParseIntegerValueEventArgs(value); OnParseRatingValue(e); if (e.IsParsed) { this.Rating = e.ParsedValue; } return e.IsParsed; } /// /// Raises the ParseRating event. /// /// Provides event arguments. protected virtual void OnParseRatingValue(ParseIntegerValueEventArgs e) { if (ParseRatingValue != null) ParseRatingValue(this, e); } private bool _IsEditable = true; /// /// Gets or sets whether rating can be edited. Default value is true. /// [DefaultValue(true), Category("Behavior"), Description("Indicates whether rating can be edited.")] public bool IsEditable { get { return _IsEditable; } set { if (_IsEditable != value) { _IsEditable = value; SetMouseOverIndex(-1); } } } private bool _Initialized = false; // Gets set to true when control is first painted RatingInfo[] _RatingInfo = new RatingInfo[5]; // Default number of stars private Size _DefaultImageSize = new Size(13, 13); public override void Paint(ItemPaintArgs p) { _Initialized = true; PaintBackground(p); Rectangle bounds = this.DisplayRectangle; if (_RenderMenuSide) PaintMenuItemSide(p, ref bounds); bounds = GetClientRectangle(bounds); if (_TextVisible && !_TextSize.IsEmpty) PaintText(p, bounds); Graphics g = p.Graphics; if (_MouseOverRatingIndex >= 0) { RatingImage rated = GetRatedMouseOverImage(); RatingImage unrated = GetUnratedMouseOverImage(); for (int i = 0; i < _NumberOfStars; i++) { if (_RatingInfo[i].IsMouseOver) g.DrawImage(rated.Image, _RatingInfo[i].Bounds, rated.SourceBounds, GraphicsUnit.Pixel); else g.DrawImage(unrated.Image, _RatingInfo[i].Bounds, unrated.SourceBounds, GraphicsUnit.Pixel); } } else { int rating = Math.Min(_Rating, _NumberOfStars); if (_AverageRating > 0 && rating == 0) { RatingImage rated = GetAverageRatedImage(); RatingImage unrated = GetUnratedImage(); for (int i = 0; i < _NumberOfStars; i++) { if (i + 1 <= _AverageRating) g.DrawImage(rated.Image, _RatingInfo[i].Bounds, rated.SourceBounds, GraphicsUnit.Pixel); else if (i + 1 == Math.Ceiling(_AverageRating)) { int size = (int)((RatingOrientation == eOrientation.Horizontal ? _RatingInfo[i].Bounds.Width : _RatingInfo[i].Bounds.Height) * (_AverageRating - Math.Floor(_AverageRating))); g.DrawImage(unrated.Image, _RatingInfo[i].Bounds, unrated.SourceBounds, GraphicsUnit.Pixel); if (size > 0) { Region oldClip = g.Clip; if (RatingOrientation == eOrientation.Horizontal) g.SetClip(new Rectangle(_RatingInfo[i].Bounds.X, _RatingInfo[i].Bounds.Y, size, _RatingInfo[i].Bounds.Height), System.Drawing.Drawing2D.CombineMode.Intersect); else g.SetClip(new Rectangle(_RatingInfo[i].Bounds.X + (_RatingInfo[i].Bounds.Height - size), _RatingInfo[i].Bounds.Y, _RatingInfo[i].Bounds.Width, size), System.Drawing.Drawing2D.CombineMode.Intersect); g.DrawImage(rated.Image, _RatingInfo[i].Bounds, rated.SourceBounds, GraphicsUnit.Pixel); g.Clip = oldClip; } } else g.DrawImage(unrated.Image, _RatingInfo[i].Bounds, unrated.SourceBounds, GraphicsUnit.Pixel); } } else { RatingImage rated = GetRatedImage(); RatingImage unrated = GetUnratedImage(); for (int i = 0; i < _NumberOfStars; i++) { if (rating > 0 && i + 1 <= rating) g.DrawImage(rated.Image, _RatingInfo[i].Bounds, rated.SourceBounds, GraphicsUnit.Pixel); else g.DrawImage(unrated.Image, _RatingInfo[i].Bounds, unrated.SourceBounds, GraphicsUnit.Pixel); } } } if (this.Focused && this.DesignMode) { Rectangle r = this.DisplayRectangle; r.Inflate(-1, -1); DesignTime.DrawDesignTimeSelection(g, r, p.Colors.ItemDesignTimeBorder); } } private void PaintText(ItemPaintArgs p, Rectangle bounds) { Color textColor = Color.Empty; if (!_TextColor.IsEmpty) textColor = _TextColor; else textColor = GetTextColor(p); bool rtl = p.RightToLeft; Rectangle textRect = bounds; if (_BackgroundStyle.TextAlignment == eStyleTextAlignment.Far && !rtl || rtl && _BackgroundStyle.TextAlignment == eStyleTextAlignment.Near) { textRect.X = textRect.Right - _TextSize.Width; textRect.Width = _TextSize.Width; } else textRect.Width = _TextSize.Width; Graphics g = p.Graphics; Font font = p.Font; eTextFormat textFormat = _BackgroundStyle.TextFormat; if (_TextVisible && this.Text != "" && !textRect.IsEmpty && !textColor.IsEmpty) { if (this.TextMarkupBody != null) { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rtl); d.HotKeyPrefixVisible = !((textFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); if ((textFormat & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter) textRect.Y = this.TopInternal + (this.Bounds.Height - textRect.Height) / 2; else if ((textFormat & eTextFormat.Bottom) == eTextFormat.Bottom) textRect.Y += (this.Bounds.Height - textRect.Height) + 1; this.TextMarkupBody.Bounds = textRect; this.TextMarkupBody.Render(d); } else { #if FRAMEWORK20 if (p.GlassEnabled && this.Parent is CaptionItemContainer && !(p.ContainerControl is QatToolbar)) { if (!p.CachedPaint) Office2007RibbonControlPainter.PaintTextOnGlass(g, this.Text, font, textRect, TextDrawing.GetTextFormat(textFormat)); } else #endif TextDrawing.DrawString(g, this.Text, font, textColor, textRect, textFormat); } } } private Color GetTextColor(ItemPaintArgs pa) { if (BarFunctions.IsOffice2007Style(this.EffectiveStyle) && pa.Renderer is Rendering.Office2007Renderer) { if ((pa.IsOnMenu || pa.IsOnPopupBar) && ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.ButtonItemColors.Count > 0) { return GetEnabled(pa.ContainerControl) ? ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.ButtonItemColors[0].Default.Text : pa.Colors.ItemDisabledText; } else { if ((pa.ContainerControl is RibbonStrip || pa.ContainerControl is Bar) && ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.RibbonTabItemColors.Count > 0) return ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.RibbonTabItemColors[0].Default.Text; Rendering.Office2007ButtonItemColorTable ct = ((Rendering.Office2007Renderer)pa.Renderer).ColorTable.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.Orange)]; if (ct != null && !ct.Default.Text.IsEmpty) return GetEnabled(pa.ContainerControl) ? ct.Default.Text : pa.Colors.ItemDisabledText; } } else return pa.Colors.ItemText; return _TextColor; } private void PaintMenuItemSide(ItemPaintArgs pa, ref Rectangle r) { bool isOnMenu = this.IsOnMenu && !(this.Parent is ItemContainer); Size objImageSize = GetMaxImageSize(); if (isOnMenu && (this.EffectiveStyle == eDotNetBarStyle.OfficeXP || this.EffectiveStyle == eDotNetBarStyle.Office2003 || this.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(this.EffectiveStyle))) { Graphics g = pa.Graphics; objImageSize.Width += 7; r.Width -= objImageSize.Width + _MenuIndent; if (!pa.RightToLeft) r.X += objImageSize.Width + _MenuIndent; if (this.IsOnCustomizeMenu) objImageSize.Width += objImageSize.Height + 8; Rectangle sideRect = new Rectangle(m_Rect.Left, m_Rect.Top, objImageSize.Width, m_Rect.Height); if (pa.RightToLeft) sideRect.X = m_Rect.Right - sideRect.Width; // Draw side bar //if (this.MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !this.RecentlyUsed) //{ // if (!pa.Colors.MenuUnusedSide2.IsEmpty) // { // System.Drawing.Drawing2D.LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(new Rectangle(m_Rect.Left, m_Rect.Top, objImageSize.Width, m_Rect.Height), pa.Colors.MenuUnusedSide, pa.Colors.MenuUnusedSide2, pa.Colors.MenuUnusedSideGradientAngle); // g.FillRectangle(gradient, sideRect); // gradient.Dispose(); // } // else // g.FillRectangle(new SolidBrush(pa.Colors.MenuUnusedSide), sideRect); //} //else { if (!pa.Colors.MenuSide2.IsEmpty) { System.Drawing.Drawing2D.LinearGradientBrush gradient = BarFunctions.CreateLinearGradientBrush(sideRect, pa.Colors.MenuSide, pa.Colors.MenuSide2, pa.Colors.MenuSideGradientAngle); g.FillRectangle(gradient, sideRect); gradient.Dispose(); } else g.FillRectangle(new SolidBrush(pa.Colors.MenuSide), sideRect); } if (BarFunctions.IsOffice2007Style(this.EffectiveStyle) && GlobalManager.Renderer is Office2007Renderer) { Office2007MenuColorTable mt = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.Menu; if (mt != null && !mt.SideBorder.IsEmpty) { if (pa.RightToLeft) DisplayHelp.DrawGradientLine(g, sideRect.X, sideRect.Y, sideRect.X, sideRect.Bottom - 1, mt.SideBorder, 1); else DisplayHelp.DrawGradientLine(g, sideRect.Right - 2, sideRect.Y, sideRect.Right - 2, sideRect.Bottom - 1, mt.SideBorder, 1); } if (mt != null && !mt.SideBorderLight.IsEmpty) { if (pa.RightToLeft) DisplayHelp.DrawGradientLine(g, sideRect.X + 1, sideRect.Y, sideRect.X + 1, sideRect.Bottom - 1, mt.SideBorderLight, 1); else DisplayHelp.DrawGradientLine(g, sideRect.Right - 1, sideRect.Y, sideRect.Right - 1, sideRect.Bottom - 1, mt.SideBorderLight, 1); } } } if (this.IsOnCustomizeMenu) { if (this.EffectiveStyle == eDotNetBarStyle.OfficeXP || this.EffectiveStyle == eDotNetBarStyle.Office2003 || this.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(this.EffectiveStyle)) { r.X += (objImageSize.Height + 8); r.Width -= (objImageSize.Height + 8); } else { r.X += (objImageSize.Height + 4); r.Width -= (objImageSize.Height + 4); } } } private RatingImage GetAverageRatedImage() { if (_CustomImages.AverageRated != null) return new RatingImage(_CustomImages.AverageRated, new Rectangle(Point.Empty, _CustomImages.AverageRated.Size)); EnsureDefaultImage(); return new RatingImage(_DefaultImage, new Rectangle(0, 52, _DefaultImageSize.Width, _DefaultImageSize.Height)); } private RatingImage GetRatedImage() { if (_CustomImages.Rated != null) return new RatingImage(_CustomImages.Rated, new Rectangle(Point.Empty, _CustomImages.Rated.Size)); EnsureDefaultImage(); return new RatingImage(_DefaultImage, new Rectangle(0, 26, _DefaultImageSize.Width, _DefaultImageSize.Height)); } private RatingImage GetUnratedImage() { if (_CustomImages.Unrated != null) return new RatingImage(_CustomImages.Unrated, new Rectangle(Point.Empty, _CustomImages.Unrated.Size)); EnsureDefaultImage(); return new RatingImage(_DefaultImage, new Rectangle(0, 0, _DefaultImageSize.Width, _DefaultImageSize.Height)); } private RatingImage GetUnratedMouseOverImage() { if (_CustomImages.UnratedMouseOver != null) return new RatingImage(_CustomImages.UnratedMouseOver, new Rectangle(Point.Empty, _CustomImages.UnratedMouseOver.Size)); EnsureDefaultImage(); return new RatingImage(_DefaultImage, new Rectangle(0, 13, _DefaultImageSize.Width, _DefaultImageSize.Height)); } private RatingImage GetRatedMouseOverImage() { if (_CustomImages.RatedMouseOver != null) return new RatingImage(_CustomImages.RatedMouseOver, new Rectangle(Point.Empty, _CustomImages.RatedMouseOver.Size)); EnsureDefaultImage(); return new RatingImage(_DefaultImage, new Rectangle(0, 39, _DefaultImageSize.Width, _DefaultImageSize.Height)); } private Image _DefaultImage = null; private void EnsureDefaultImage() { if (_DefaultImage == null) _DefaultImage = BarFunctions.LoadBitmap("SystemImages.Rating.png"); } private struct RatingImage { /// /// Initializes a new instance of the RatingImage structure. /// /// /// public RatingImage(Image image, Rectangle sourceBounds) { Image = image; SourceBounds = sourceBounds; } public Image Image; public Rectangle SourceBounds; } private struct RatingInfo { public Rectangle Bounds; public bool IsMouseOver; } public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs e) { if (_IsEditable) { int mouseOverIndex = -1; if (RatingOrientation == eOrientation.Horizontal) { for (int i = 0; i < _NumberOfStars; i++) { if (e.X >= _RatingInfo[i].Bounds.X && e.X <= _RatingInfo[i].Bounds.Right) { mouseOverIndex = i; break; } } } else { for (int i = 0; i < _NumberOfStars; i++) { if (e.Y >= _RatingInfo[i].Bounds.Y && e.Y <= _RatingInfo[i].Bounds.Bottom && (!_TextVisible || _TextSize.IsEmpty) || _RatingInfo[i].Bounds.Contains(e.X, e.Y)) { mouseOverIndex = i; break; } } } SetMouseOverIndex(mouseOverIndex); } else SetMouseOverIndex(-1); base.InternalMouseMove(e); } public override void InternalClick(System.Windows.Forms.MouseButtons buttons, Point position) { if (_MouseOverRatingIndex >= 0) SetRating(_MouseOverRatingIndex + 1, eEventSource.Mouse); base.InternalClick(buttons, position); } private int _MouseOverRatingIndex = -1; private void SetMouseOverIndex(int mouseOverIndex) { if (mouseOverIndex == _MouseOverRatingIndex) return; _MouseOverRatingIndex=mouseOverIndex; for (int i = 0; i < _NumberOfStars; i++) { _RatingInfo[i].IsMouseOver = (mouseOverIndex >= 0 && i <= mouseOverIndex); } Refresh(); } public override void InternalMouseLeave() { if (_IsEditable) { SetMouseOverIndex(-1); } base.InternalMouseLeave(); } private Rectangle GetClientRectangle() { return GetClientRectangle(this.DisplayRectangle); } private Rectangle GetClientRectangle(Rectangle bounds) { bounds.X += ElementStyleLayout.LeftWhiteSpace(_BackgroundStyle); bounds.Y += ElementStyleLayout.TopWhiteSpace(_BackgroundStyle); bounds.Width -= ElementStyleLayout.HorizontalStyleWhiteSpace(_BackgroundStyle); bounds.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(_BackgroundStyle); return bounds; } private void UpdateRatingBounds() { Rectangle bounds = GetClientRectangle(); if (_TextVisible && !_TextSize.IsEmpty) { if (_BackgroundStyle.TextAlignment == eStyleTextAlignment.Far && this.IsRightToLeft || !this.IsRightToLeft && _BackgroundStyle.TextAlignment == eStyleTextAlignment.Near) bounds.X += (_TextSpacing + _TextSize.Width + (_RenderMenuSide ? _MenuIndent : 0)); } if (_RenderMenuSide) { if (_BackgroundStyle.TextAlignment == eStyleTextAlignment.Far && this.IsRightToLeft || !this.IsRightToLeft && _BackgroundStyle.TextAlignment == eStyleTextAlignment.Near) { Size objImageSize = GetMaxImageSize(); // Get the right image size that we will use for calculation bounds.X += (objImageSize.Width + Dpi.Width7); if (this.IsOnCustomizeMenu) bounds.X += (bounds.Height + Dpi.Width2); } } Size size = Dpi.ImageSize(DisplayHelp.MaxSize(_DefaultImageSize, _CustomImages.LargestImageSize)); if (bounds.Height > size.Height && this.RatingOrientation == eOrientation.Horizontal) bounds.Y += (bounds.Height - size.Height) / 2; if (this.RatingOrientation == eOrientation.Horizontal) { Point p = bounds.Location; for (int i = 0; i < _NumberOfStars; i++) { _RatingInfo[i].Bounds = new Rectangle(p, size); p.X += size.Width; } } else { Point p = new Point(bounds.X, bounds.Bottom - size.Height); for (int i = 0; i < _NumberOfStars; i++) { _RatingInfo[i].Bounds = new Rectangle(p, size); p.Y -= size.Height; } } } private int _MenuIndent = 8; private Size _TextSize = Size.Empty; private bool _RenderMenuSide = false; private Size _CalcSize = Size.Empty; public override void RecalcSize() { Rectangle bounds = this.DisplayRectangle; Size size = Dpi.ImageSize(DisplayHelp.MaxSize(_DefaultImageSize, _CustomImages.LargestImageSize)); if (this.RatingOrientation == eOrientation.Horizontal) { size.Width *= _NumberOfStars; } else { size.Height *= _NumberOfStars; } size.Width += ElementStyleLayout.HorizontalStyleWhiteSpace(_BackgroundStyle); size.Height += ElementStyleLayout.VerticalStyleWhiteSpace(_BackgroundStyle); _RenderMenuSide = false; bool isOnMenu = this.IsOnMenu && !(this.Parent is ItemContainer); if (isOnMenu && (this.EffectiveStyle == eDotNetBarStyle.OfficeXP || this.EffectiveStyle == eDotNetBarStyle.Office2003 || this.EffectiveStyle == eDotNetBarStyle.VS2005 || BarFunctions.IsOffice2007Style(this.EffectiveStyle))) { Size objImageSize = GetMaxImageSize(); // Get the right image size that we will use for calculation size.Width += (objImageSize.Width + Dpi.Width7); if (this.IsOnCustomizeMenu) size.Width += (size.Height + Dpi.Width2); size.Width += _MenuIndent; _RenderMenuSide = true; } _TextSize = Size.Empty; if (_TextVisible) { Control objCtrl = this.ContainerControl as Control; if (objCtrl == null || objCtrl.Disposing || objCtrl.IsDisposed) return; Graphics g = BarFunctions.CreateGraphics(objCtrl); if (g == null) return; try { Size textSize = ButtonItemLayout.MeasureItemText(this, g, 0, objCtrl.Font, eTextFormat.Default, objCtrl.RightToLeft == RightToLeft.Yes); textSize.Width += Dpi.Width1; size.Width += _TextSpacing + textSize.Width; size.Height = Math.Max(size.Height, textSize.Height); _TextSize = textSize; } finally { g.Dispose(); } } _CalcSize = size; bounds.Size = size; if(!(this.ContainerControl is DevComponents.DotNetBar.Controls.RatingStar)) m_Rect = bounds; UpdateRatingBounds(); base.RecalcSize(); } internal Size CalcSize { get { return (_CalcSize); } } private Size GetMaxImageSize() { if (m_Parent != null) { ImageItem objParentImageItem = m_Parent as ImageItem; if (objParentImageItem != null) return objParentImageItem.SubItemsImageSize; else return this.ImageSize; } else return this.ImageSize; } public override Rectangle Bounds { get { return (base.Bounds); } set { if (base.Bounds.Equals(value) == false) { base.Bounds = value; UpdateRatingBounds(); } } } protected override void OnLeftLocationChanged(int oldValue) { UpdateRatingBounds(); base.OnLeftLocationChanged(oldValue); } protected override void OnTopLocationChanged(int oldValue) { UpdateRatingBounds(); base.OnTopLocationChanged(oldValue); } //protected override void OnExternalSizeChange() //{ // UpdateRatingBounds(); // base.OnExternalSizeChange(); //} protected virtual void PaintBackground(ItemPaintArgs p) { _BackgroundStyle.SetColorScheme(p.Colors); Graphics g = p.Graphics; ElementStyleDisplay.Paint(new ElementStyleDisplayInfo(_BackgroundStyle, g, this.DisplayRectangle)); } internal void SetBackgroundStyle(ElementStyle elementStyle) { _BackgroundStyle.StyleChanged -= new EventHandler(BackgroundStyleChanged); _BackgroundStyle = elementStyle; _BackgroundStyle.StyleChanged += new EventHandler(BackgroundStyleChanged); } private ElementStyle _BackgroundStyle = new ElementStyle(); /// /// Specifies the control background style. Default value is an empty style which means that container does not display any background. /// [Browsable(true), DevCoBrowsable(true), Category("Style"), Description("Gets or sets control background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ElementStyle BackgroundStyle { get { return _BackgroundStyle; } } private void BackgroundStyleChanged(object sender, EventArgs e) { this.NeedRecalcSize = true; this.OnAppearanceChanged(); } private RatingImages _CustomImages; /// /// Gets the reference to custom rating images. /// [Browsable(true), Category("Images"), Description("Gets the reference to custom rating images."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public RatingImages CustomImages { get { return _CustomImages; } } private bool _TextVisible = true; /// /// Gets or sets whether text assigned to the check box is visible. Default value is true. /// [Browsable(true), DefaultValue(true), Category("Appearance"), Description("Indicates whether text assigned to the check box is visible.")] public bool TextVisible { get { return _TextVisible; } set { _TextVisible = value; this.NeedRecalcSize = true; OnAppearanceChanged(); } } private Color _TextColor = Color.Empty; /// /// Gets or sets the text color. Default value is Color.Empty which indicates that default color is used. /// [Browsable(true), Category("Appearance"), Description("Indicates text color.")] public Color TextColor { get { return _TextColor; } set { _TextColor = value; OnAppearanceChanged(); } } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeTextColor() { return !_TextColor.IsEmpty; } [EditorBrowsable(EditorBrowsableState.Never)] public void ResetTextColor() { this.TextColor = Color.Empty; } private int _TextSpacing = 0; /// /// Gets or sets the spacing between optional text and the rating. /// [DefaultValue(0), Category("Appearance"), Description("Gets or sets the spacing between optional text and the rating.")] public int TextSpacing { get { return _TextSpacing; } set { if (_TextSpacing != value) { _TextSpacing = value; NeedRecalcSize = true; this.Refresh(); } } } private eOrientation _RatingOrientation = eOrientation.Horizontal; /// /// Gets or sets the orientation of rating control. /// [DefaultValue(eOrientation.Horizontal), Category("Appearance"), Description("Gets or sets the orientation of rating control.")] public eOrientation RatingOrientation { get { return _RatingOrientation; } set { if (_RatingOrientation != value) { _RatingOrientation = value; NeedRecalcSize = true; this.Refresh(); } } } private int _NumberOfStars = 5; /// /// Indicates number of stars used for the rating. Minium value is 2 stars. /// [DefaultValue(5), Category("Appearance"), Description("Indicates number of stars used for the rating.")] public int NumberOfStars { get { return _NumberOfStars; } set { if (_NumberOfStars < 2) _NumberOfStars = 2; if (_NumberOfStars != value) { _NumberOfStars = value; if (_Rating > _NumberOfStars) _Rating = _NumberOfStars; _RatingInfo = new RatingInfo[_NumberOfStars]; NeedRecalcSize = true; this.Refresh(); } } } #endregion #region Markup Implementation /// /// Gets whether item supports text markup. Default is false. /// protected override bool IsMarkupSupported { get { return _EnableMarkup; } } private bool _EnableMarkup = true; /// /// Gets or sets whether text-markup support is enabled for items Text property. Default value is true. /// Set this property to false to display HTML or other markup in the item instead of it being parsed as text-markup. /// [DefaultValue(true), Category("Appearance"), Description("Indicates whether text-markup support is enabled for items Text property.")] public bool EnableMarkup { get { return _EnableMarkup; } set { if (_EnableMarkup != value) { _EnableMarkup = value; NeedRecalcSize = true; OnTextChanged(); } } } protected override void TextMarkupLinkClick(object sender, EventArgs e) { TextMarkup.HyperLink link = sender as TextMarkup.HyperLink; if (link != null) OnMarkupLinkClick(new MarkupLinkClickEventArgs(link.Name, link.HRef)); base.TextMarkupLinkClick(sender, e); } protected virtual void OnMarkupLinkClick(MarkupLinkClickEventArgs e) { if (this.MarkupLinkClick != null) MarkupLinkClick(this, e); } #endregion #region Property Hiding [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public override SubItemsCollection SubItems { get { return base.SubItems; } } [Browsable(false)] public override bool ClickAutoRepeat { get { return base.ClickAutoRepeat; } set { base.ClickAutoRepeat = value; } } [Browsable(false)] public override int ClickRepeatInterval { get { return base.ClickRepeatInterval; } set { base.ClickRepeatInterval = value; } } [Browsable(false)] public override ePersonalizedMenus PersonalizedMenus { get { return base.PersonalizedMenus; } set { base.PersonalizedMenus = value; } } [Browsable(false)] public override ePopupAnimation PopupAnimation { get { return base.PopupAnimation; } set { base.PopupAnimation = value; } } [Browsable(false)] public override Font PopupFont { get { return base.PopupFont; } set { base.PopupFont = value; } } [Browsable(false)] public override ePopupSide PopupSide { get { return base.PopupSide; } set { base.PopupSide = value; } } [Browsable(false)] public override ePopupType PopupType { get { return base.PopupType; } set { base.PopupType = value; } } [Browsable(false)] public override int PopupWidth { get { return base.PopupWidth; } set { base.PopupWidth = value; } } [Browsable(false)] public override ShortcutsCollection Shortcuts { get { return base.Shortcuts; } set { base.Shortcuts = value; } } [Browsable(false)] public override bool ShowSubItems { get { return base.ShowSubItems; } set { base.ShowSubItems = value; } } [Browsable(false)] public override bool Stretch { get { return base.Stretch; } set { base.Stretch = value; } } [Browsable(false)] public override bool ThemeAware { get { return base.ThemeAware; } set { base.ThemeAware = value; } } [DefaultValue(false)] public override bool AutoCollapseOnClick { get { return base.AutoCollapseOnClick; } set { base.AutoCollapseOnClick = value; } } #endregion } #region RatingImages /// /// Defines the custom rating images for Rating control. /// [ToolboxItem(false), TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))] public class RatingImages { private RatingItem _Parent = null; /// /// Initializes a new instance of the RatingImages class. /// internal RatingImages(RatingItem parentItem) { _Parent = parentItem; } public void Dispose() { BarUtilities.DisposeImage(ref _AverageRated); BarUtilities.DisposeImage(ref _Rated); BarUtilities.DisposeImage(ref _RatedMouseOver); BarUtilities.DisposeImage(ref _Unrated); BarUtilities.DisposeImage(ref _UnratedMouseOver); } private Image _Unrated = null; /// /// Gets or sets the image used for unrated rating part. /// [DefaultValue(null), Description("Gets or sets the image used for unrated rating part.")] public Image Unrated { get { return _Unrated; } set { if (_Unrated != value) { _Unrated = value; OnImageChanged(); } } } private Image _UnratedMouseOver = null; /// /// Gets or sets the image used for unrated rating part when mouse is over the control. /// [DefaultValue(null), Description("Gets or sets the image used for unrated rating part when mouse is over the control.")] public Image UnratedMouseOver { get { return _UnratedMouseOver; } set { if (_UnratedMouseOver != value) { _UnratedMouseOver = value; OnImageChanged(); } } } private Image _Rated = null; /// /// Gets or sets the image used for rated part of the control. /// [DefaultValue(null), Description("Gets or sets the image used for rated part of the control.")] public Image Rated { get { return _Rated; } set { if (_Rated != value) { _Rated = value; OnImageChanged(); } } } private Image _AverageRated = null; /// /// Gets or sets the image used for Average Rated part of the control. /// [DefaultValue(null), Description("Gets or sets the image used for Average Rated part of the control.")] public Image AverageRated { get { return _AverageRated; } set { if (_AverageRated != value) { _AverageRated = value; OnImageChanged(); } } } private Image _RatedMouseOver = null; /// /// Gets or sets the image used for rated part of the control when mouse is over the control. /// [DefaultValue(null), Description("Gets or sets the image used for rated part of the control when mouse is over the control.")] public Image RatedMouseOver { get { return _RatedMouseOver; } set { if (_RatedMouseOver != value) { _RatedMouseOver = value; OnImageChanged(); } } } private Size _LargestImageSize = Size.Empty; internal Size LargestImageSize { get { return _LargestImageSize; } } private void OnImageChanged() { _LargestImageSize = new Size(); if (_Unrated != null) _LargestImageSize = DisplayHelp.MaxSize(_LargestImageSize, _Unrated.Size); if (_UnratedMouseOver != null) _LargestImageSize = DisplayHelp.MaxSize(_LargestImageSize, _UnratedMouseOver.Size); if (_Rated != null) _LargestImageSize = DisplayHelp.MaxSize(_LargestImageSize, _Rated.Size); if (_RatedMouseOver != null) _LargestImageSize = DisplayHelp.MaxSize(_LargestImageSize, _RatedMouseOver.Size); if (_AverageRated != null) _LargestImageSize = DisplayHelp.MaxSize(_LargestImageSize, _AverageRated.Size); if (_Parent != null) { _Parent.NeedRecalcSize = true; _Parent.OnAppearanceChanged(); } } } #endregion /// /// Delegate for Rating change events. /// public delegate void RatingChangeEventHandler(object sender, RatingChangeEventArgs e); #region CheckBoxChangeEventArgs /// /// Represents event arguments for Rating change events. /// public class RatingChangeEventArgs : CancelEventArgs { /// /// New Rating value being assigned. /// public int NewRating; /// /// Previous or current value (if RatingChanging event). /// public readonly int OldRating; /// /// Indicates the action that has caused the event. /// public readonly eEventSource EventSource = eEventSource.Code; /// /// Initializes a new instance of the RatingChangeEventArgs class. /// /// /// /// public RatingChangeEventArgs(int newRating, int oldRating, eEventSource eventSource) { NewRating = newRating; OldRating = oldRating; EventSource = eventSource; } } #endregion }