1432 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1432 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Represents rating item control which provides rating functionality.
 | |
|     /// </summary>
 | |
|     [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
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RatingItem class.
 | |
|         /// </summary>
 | |
|         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
 | |
|         /// <summary>
 | |
|         /// Occurs when Rating property has changed.
 | |
|         /// </summary>
 | |
|         [Description("Occurs when Rating property has changed.")]
 | |
|         public event EventHandler RatingChanged;
 | |
|         /// <summary>
 | |
|         /// Occurs when RatingValue property has changed.
 | |
|         /// </summary>
 | |
|         [Description("Occurs when Rating property has changed.")]
 | |
|         public event EventHandler RatingValueChanged;
 | |
|         /// <summary>
 | |
|         /// Occurs when Rating property is about to be changed and provides opportunity to cancel the change.
 | |
|         /// </summary>
 | |
|         [Description("Occurs when Rating property has changed.")]
 | |
|         public event RatingChangeEventHandler RatingChanging;
 | |
|         /// <summary>
 | |
|         /// Occurs when AverageRating property has changed.
 | |
|         /// </summary>
 | |
|         [Description("Occurs when AverageRating property has changed.")]
 | |
|         public event EventHandler AverageRatingChanged;
 | |
|         /// <summary>
 | |
|         /// Occurs when AverageRatingValue property has changed.
 | |
|         /// </summary>
 | |
|         [Description("Occurs when AverageRatingValue property has changed.")]
 | |
|         public event EventHandler AverageRatingValueChanged;
 | |
|         /// <summary>
 | |
|         /// Occurs when text markup link is clicked. Markup links can be created using "a" tag, for example:
 | |
|         /// <a name="MyLink">Markup link</a>
 | |
|         /// </summary>
 | |
|         public event MarkupLinkClickEventHandler MarkupLinkClick;
 | |
|         /// <summary>
 | |
|         /// Occurs when RatingValue property is set and it allows you to provide custom parsing for the values.
 | |
|         /// </summary>
 | |
|         public event ParseIntegerValueEventHandler ParseRatingValue;
 | |
|         /// <summary>
 | |
|         /// Occurs when AverageRatingValue property is set and it allows you to provide custom parsing for the values.
 | |
|         /// </summary>
 | |
|         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;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Copies the ButtonItem specific properties to new instance of the item.
 | |
|         /// </summary>
 | |
|         /// <param name="copy">New ButtonItem instance.</param>
 | |
|         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;
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Raises the AverageRatingChanged event.
 | |
|         /// </summary>
 | |
|         /// <param name="eventArgs">Event data.</param>
 | |
|         protected virtual void OnAverageRatingChanged(EventArgs eventArgs)
 | |
|         {
 | |
|             if (AverageRatingChanged != null) AverageRatingChanged(this, eventArgs);
 | |
|             if (AverageRatingValueChanged != null) AverageRatingValueChanged(this, eventArgs);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets or sets the AverageRating property. This property is provided for Data-Binding with NULL value support.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Raises the ParseAverageRatingValue event.
 | |
|         /// </summary>
 | |
|         /// <param name="e">Provides event arguments.</param>
 | |
|         protected virtual void OnParseAverageRatingValue(ParseDoubleValueEventArgs e)
 | |
|         {
 | |
|             if (ParseAverageRatingValue != null)
 | |
|                 ParseAverageRatingValue(this, e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Sets the Rating value of the control and provides information about source of the rating change.
 | |
|         /// </summary>
 | |
|         /// <param name="newRating">New Rating value.</param>
 | |
|         /// <param name="eEventSource">Source of this change.</param>
 | |
|         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();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Raises RatingChanging event.
 | |
|         /// </summary>
 | |
|         /// <param name="e">Event data</param>
 | |
|         protected virtual void OnRatingChanging(RatingChangeEventArgs e)
 | |
|         {
 | |
|             if (RatingChanging != null)
 | |
|                 RatingChanging(this, e);
 | |
|         }
 | |
| 
 | |
|         private int _Rating = 0;
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Raises the RatingChanged event.
 | |
|         /// </summary>
 | |
|         /// <param name="eventArgs">Event data.</param>
 | |
|         protected virtual void OnRatingChanged(EventArgs eventArgs)
 | |
|         {
 | |
|             EventHandler handler = RatingChanged;
 | |
|             if (handler != null) handler(this, eventArgs);
 | |
| 
 | |
|             handler = RatingValueChanged;
 | |
|             if (handler != null) handler(this, eventArgs);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets or sets the Rating property value. This property is provided for Data-Binding with NULL value support.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Raises the ParseRating event.
 | |
|         /// </summary>
 | |
|         /// <param name="e">Provides event arguments.</param>
 | |
|         protected virtual void OnParseRatingValue(ParseIntegerValueEventArgs e)
 | |
|         {
 | |
|             if (ParseRatingValue != null)
 | |
|                 ParseRatingValue(this, e);
 | |
|         }
 | |
| 
 | |
|         private bool _IsEditable = true;
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether rating can be edited. Default value is true.
 | |
|         /// </summary>
 | |
|         [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
 | |
|         {
 | |
|             /// <summary>
 | |
|             /// Initializes a new instance of the RatingImage structure.
 | |
|             /// </summary>
 | |
|             /// <param name="image"></param>
 | |
|             /// <param name="sourceBounds"></param>
 | |
|             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();
 | |
|         /// <summary>
 | |
|         /// Specifies the control background style. Default value is an empty style which means that container does not display any background.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets the reference to custom rating images.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether text assigned to the check box is visible. Default value is true.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the text color. Default value is Color.Empty which indicates that default color is used.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the spacing between optional text and the rating.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the orientation of rating control.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Indicates number of stars used for the rating. Minium value is 2 stars.
 | |
|         /// </summary>
 | |
|         [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
 | |
|         /// <summary>
 | |
|         /// Gets whether item supports text markup. Default is false.
 | |
|         /// </summary>
 | |
|         protected override bool IsMarkupSupported
 | |
|         {
 | |
|             get { return _EnableMarkup; }
 | |
|         }
 | |
| 
 | |
|         private bool _EnableMarkup = true;
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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
 | |
|     /// <summary>
 | |
|     /// Defines the custom rating images for Rating control.
 | |
|     /// </summary>
 | |
|     [ToolboxItem(false), TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))]
 | |
|     public class RatingImages
 | |
|     {
 | |
|         private RatingItem _Parent = null;
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RatingImages class.
 | |
|         /// </summary>
 | |
|         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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image used for unrated rating part.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image used for unrated rating part when mouse is over the control.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image used for rated part of the control.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image used for Average Rated part of the control.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the image used for rated part of the control when mouse is over the control.
 | |
|         /// </summary>
 | |
|         [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
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Delegate for Rating change events.
 | |
|     /// </summary>
 | |
|     public delegate void RatingChangeEventHandler(object sender, RatingChangeEventArgs e);
 | |
| 
 | |
|     #region CheckBoxChangeEventArgs
 | |
|     /// <summary>
 | |
|     /// Represents event arguments for Rating change events.
 | |
|     /// </summary>
 | |
|     public class RatingChangeEventArgs : CancelEventArgs
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// New Rating value being assigned.
 | |
|         /// </summary>
 | |
|         public int NewRating;
 | |
|         /// <summary>
 | |
|         /// Previous or current value (if RatingChanging event).
 | |
|         /// </summary>
 | |
|         public readonly int OldRating;
 | |
|         /// <summary>
 | |
|         /// Indicates the action that has caused the event.
 | |
|         /// </summary>
 | |
|         public readonly eEventSource EventSource = eEventSource.Code;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RatingChangeEventArgs class.
 | |
|         /// </summary>
 | |
|         /// <param name="newRating"></param>
 | |
|         /// <param name="oldRating"></param>
 | |
|         /// <param name="eventSource"></param>
 | |
|         public RatingChangeEventArgs(int newRating, int oldRating, eEventSource eventSource)
 | |
|         {
 | |
|             NewRating = newRating;
 | |
|             OldRating = oldRating;
 | |
|             EventSource = eventSource;
 | |
|         }
 | |
|     }
 | |
|     #endregion
 | |
| }
 |