using System; using System.Text; using System.ComponentModel; using System.Windows.Forms; using DevComponents.Editors; using System.Drawing; namespace DevComponents.DotNetBar.Controls { /// /// Represents the Rating control. /// [ToolboxBitmap(typeof(RatingStar), "Controls.RatingStar.ico"), ToolboxItem(true), DefaultEvent("RatingChanged"), System.Runtime.InteropServices.ComVisible(true)] public class RatingStar : BaseItemControl, ICommandSource { #region Private Variables private RatingItem _RatingItem = null; #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 Constructor /// /// Initializes a new instance of the Rating class. /// public RatingStar() { this.SetStyle(ControlStyles.Selectable, false); _RatingItem = new RatingItem(); _RatingItem.Style = eDotNetBarStyle.Office2007; _RatingItem.RatingChanging += new RatingChangeEventHandler(RatingItemRatingChanging); _RatingItem.RatingChanged += new EventHandler(RatingItemRatingChanged); _RatingItem.AverageRatingChanged += new EventHandler(RatingItemAverageRatingChanged); _RatingItem.ParseAverageRatingValue += new DevComponents.Editors.ParseDoubleValueEventHandler(RatingItemParseAverageRatingValue); _RatingItem.ParseRatingValue += new DevComponents.Editors.ParseIntegerValueEventHandler(RatingItemParseRatingValue); this.HostItem = _RatingItem; } #endregion #region Internal Implementation /// /// 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 _RatingItem.NumberOfStars; } set { _RatingItem.NumberOfStars = value; if (this.AutoSize) this.AdjustSize(); } } /// /// 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 5. /// [DefaultValue(0), Category("Data"), Description("Indicates rating value represented by the control.")] public int Rating { get { return _RatingItem.Rating; } set { _RatingItem.Rating = value; } } /// /// 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 5. /// [DefaultValue(0d), Category("Data"), Description("Indicates average rating shown by control.")] public double AverageRating { get { return _RatingItem.AverageRating; } set { _RatingItem.AverageRating = value; } } /// /// 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 _RatingItem.AverageRatingValue; } set { _RatingItem.AverageRatingValue = value; } } /// /// 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 _RatingItem.CustomImages; } } /// /// 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 _RatingItem.TextVisible; } set { _RatingItem.TextVisible = value; } } /// /// 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 _RatingItem.EnableMarkup; } set { _RatingItem.EnableMarkup = value; } } /// /// 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 _RatingItem.IsEditable; } set { _RatingItem.IsEditable = value; } } /// /// 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 _RatingItem.RatingOrientation; } set { _RatingItem.RatingOrientation = value; } } /// /// 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 _RatingItem.RatingValue; } set { _RatingItem.RatingValue = value; } } /// /// 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 _RatingItem.TextColor; } set { _RatingItem.TextColor = value; } } /// /// 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 _RatingItem.TextSpacing; } set { _RatingItem.TextSpacing = value; } } private void RatingItemParseRatingValue(object sender, DevComponents.Editors.ParseIntegerValueEventArgs e) { OnParseRatingValue(e); } /// /// Raises the ParseRating event. /// /// Provides event arguments. protected virtual void OnParseRatingValue(ParseIntegerValueEventArgs e) { if (ParseRatingValue != null) ParseRatingValue(this, e); } private void RatingItemParseAverageRatingValue(object sender, DevComponents.Editors.ParseDoubleValueEventArgs e) { OnParseAverageRatingValue(e); } /// /// Raises the ParseAverageRatingValue event. /// /// Provides event arguments. protected virtual void OnParseAverageRatingValue(ParseDoubleValueEventArgs e) { if (ParseAverageRatingValue != null) ParseAverageRatingValue(this, e); } private void RatingItemAverageRatingChanged(object sender, EventArgs e) { OnAverageRatingChanged(e); } /// /// Raises the AverageRatingChanged event. /// /// Event data. protected virtual void OnAverageRatingChanged(EventArgs eventArgs) { if (AverageRatingChanged != null) AverageRatingChanged(this, eventArgs); if (AverageRatingValueChanged != null) AverageRatingValueChanged(this, eventArgs); } private void RatingItemRatingChanged(object sender, EventArgs e) { OnRatingChanged(e); } /// /// 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); } private void RatingItemRatingChanging(object sender, RatingChangeEventArgs e) { OnRatingChanging(e); } /// /// Raises RatingChanging event. /// /// Event data protected virtual void OnRatingChanging(RatingChangeEventArgs e) { if (RatingChanging != null) RatingChanging(this, e); } #if FRAMEWORK20 [Localizable(true), Browsable(false)] public new System.Windows.Forms.Padding Padding { get { return base.Padding; } set { base.Padding = value; } } protected override void OnResize(EventArgs e) { base.OnResize(e); } public override Size GetPreferredSize(Size proposedSize) { if (!BarFunctions.IsHandleValid(this)) return base.GetPreferredSize(proposedSize); _RatingItem.RecalcSize(); Size s = _RatingItem.CalcSize; s.Width += 2; s.Height += 2; if (!this.TextVisible) s.Width += 2; s.Width += ElementStyleLayout.HorizontalStyleWhiteSpace(this.GetBackgroundStyle()); s.Height += ElementStyleLayout.VerticalStyleWhiteSpace(this.GetBackgroundStyle()); _RatingItem.Bounds = GetItemBounds(); return s; } /// /// Gets or sets a value indicating whether the control is automatically resized to display its entire contents. You can set MaximumSize.Width property to set the maximum width used by the control. /// [Browsable(true), DefaultValue(false), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public override bool AutoSize { get { return base.AutoSize; } set { if (this.AutoSize != value) { base.AutoSize = value; AdjustSize(); } } } protected Size CalcSize { get { return (_RatingItem.CalcSize); } } protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { if (this.AutoSize) { Size preferredSize = base.PreferredSize; width = preferredSize.Width; height = preferredSize.Height; } base.SetBoundsCore(x, y, width, height, specified); } private void AdjustSize() { if (this.AutoSize) { this.Size = base.PreferredSize; } } protected override void OnVisualPropertyChanged() { base.OnVisualPropertyChanged(); this.AdjustSize(); } protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); this.AdjustSize(); } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); if (this.AutoSize) this.AdjustSize(); } #endif #endregion #region ICommandSource Members protected virtual void ExecuteCommand() { if (_Command == null) return; CommandManager.ExecuteCommand(this); } /// /// Gets or sets the command assigned to the item. Default value is null. /// Note that if this property is set to null Enabled property will be set to false automatically to disable the item. /// [DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")] public Command Command { get { return (Command)((ICommandSource)this).Command; } set { ((ICommandSource)this).Command = value; } } private ICommand _Command = null; //[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] ICommand ICommandSource.Command { get { return _Command; } set { bool changed = false; if (_Command != value) changed = true; if (_Command != null) CommandManager.UnRegisterCommandSource(this, _Command); _Command = value; if (value != null) CommandManager.RegisterCommand(this, value); if (changed) OnCommandChanged(); } } /// /// Called when Command property value changes. /// protected virtual void OnCommandChanged() { } private object _CommandParameter = null; /// /// Gets or sets user defined data value that can be passed to the command when it is executed. /// [Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)] public object CommandParameter { get { return _CommandParameter; } set { _CommandParameter = value; } } #endregion } }