using System; using System.ComponentModel; using System.Globalization; namespace DevComponents.DotNetBar.SuperGrid.Style { /// /// VisualStyles /// [TypeConverter(typeof(VisualStylesConverter))] public class VisualStyles : IDisposable, INotifyPropertyChanged where T : BaseVisualStyle, new() { #region Private variables private T[] _Styles; #endregion /// /// Constructor /// public VisualStyles() { _Styles = new T[Enum.GetValues(typeof(StyleType)).Length - 1]; } #region Public properties #region Indexer /// /// Gets or sets the visual style /// assigned to the element. Default value is null. /// [DefaultValue(null), Category("Style")] [Description("Indicates visual style assigned to the element")] public T this[StyleType e] { get { int n = ((IConvertible)e).ToInt32(null); if (n < 0 || n > _Styles.Length) throw new Exception("Invalid Style indexer"); return (GetStyle(n)); } set { int n = ((IConvertible)e).ToInt32(null); if (n < 0 || n > _Styles.Length) throw new Exception("Invalid Style indexer"); SetStyle(n, value); } } #endregion #region Default /// /// The normal, default style /// [Description("Style to use for normal, default items")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T Default { get { return (GetStyle((int) StyleType.Default)); } set { SetStyle((int) StyleType.Default, value); } } #endregion #region Empty /// /// Style to use when a cell item is empty /// [Description("Style to use when a cell item is empty")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T Empty { get { return (GetStyle((int)StyleType.Empty)); } set { SetStyle((int)StyleType.Empty, value); } } #endregion #region MouseOver /// /// MouseOver /// [Description("Style to use when the Mouse is over an item")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T MouseOver { get { return (GetStyle((int)StyleType.MouseOver)); } set { SetStyle((int)StyleType.MouseOver, value); } } #endregion #region NotSelectable /// /// Style to use for non-selectable items /// [Description("Style to use for non-selectable items")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T NotSelectable { get { return (GetStyle((int)StyleType.NotSelectable)); } set { SetStyle((int)StyleType.NotSelectable, value); } } #endregion #region Selected /// /// Style to use for selected items. /// [Description("Style to use for selected items.")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T Selected { get { return (GetStyle((int)StyleType.Selected)); } set { SetStyle((int)StyleType.Selected, value); } } #endregion #region SelectedMouseOver /// /// Style to use for MouseOver selected items /// [Description("Style to use for MouseOver selected items")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T SelectedMouseOver { get { return (GetStyle((int)StyleType.SelectedMouseOver)); } set { SetStyle((int)StyleType.SelectedMouseOver, value); } } #endregion #region ReadOnly /// /// Style to use for ReadOnly items /// [Description("Style to use for ReadOnly items.")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T ReadOnly { get { return (GetStyle((int)StyleType.ReadOnly)); } set { SetStyle((int)StyleType.ReadOnly, value); } } #endregion #region ReadOnlyMouseOver /// /// Style to use for ReadOnly, MouseOver items /// [Description("Style to use for ReadOnly, MouseOver items.")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T ReadOnlyMouseOver { get { return (GetStyle((int)StyleType.ReadOnlyMouseOver)); } set { SetStyle((int)StyleType.ReadOnlyMouseOver, value); } } #endregion #region ReadOnlySelected /// /// ReadOnlySelected /// [Description("Style to use for ReadOnly, Selected items.")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T ReadOnlySelected { get { return (GetStyle((int)StyleType.ReadOnlySelected)); } set { SetStyle((int)StyleType.ReadOnlySelected, value); } } #endregion #region ReadOnlySelectedMouseOver /// /// Style to use for ReadOnly, Selected, MouseOver items /// [Description("Style to use for ReadOnly, Selected, MouseOver items.")] [TypeConverter(typeof(VisualStylesConverter))] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public T ReadOnlySelectedMouseOver { get { return (GetStyle((int)StyleType.ReadOnlySelectedMouseOver)); } set { SetStyle((int)StyleType.ReadOnlySelectedMouseOver, value); } } #endregion #region Styles /// /// Styles array /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public T[] Styles { get { return (_Styles); } } #endregion #endregion #region GetStyle private T GetStyle(int n) { if (_Styles[n] == null) { _Styles[n] = new T(); OnStyleChangeHandler(null, _Styles[n]); } return (_Styles[n]); } #endregion #region SetStyle private void SetStyle(int n, T value) { if (_Styles[n] != value) { T oldValue = _Styles[n]; _Styles[n] = value; OnStyleChanged(Enum.GetName(typeof(StyleType), n), oldValue, value); } } #endregion #region OnStyleChanged private void OnStyleChanged( string property, T oldValue, T newValue) { OnStyleChangeHandler(oldValue, newValue); OnPropertyChanged(new VisualPropertyChangedEventArgs(property)); } #endregion #region IsValid internal bool IsValid(Enum e) { int n = ((IConvertible) e).ToInt32(null); if (n < 0 || n > _Styles.Length) throw new Exception("Invalid Style indexer"); return (_Styles[n] != null); } #endregion #region Style support routines #region StyleVisualChangeHandler private void OnStyleChangeHandler(T oldValue, T newValue) { if (oldValue != null) oldValue.PropertyChanged -= StyleChanged; if (newValue != null) newValue.PropertyChanged += StyleChanged; } #endregion #region StyleChanged /// /// Occurs when one of element visual styles has property changes. /// Default implementation invalidates visual appearance of element. /// /// VisualStyle that changed. /// Event arguments. protected virtual void StyleChanged(object sender, PropertyChangedEventArgs e) { OnPropertyChanged(e); } #endregion #endregion #region INotifyPropertyChanged Members /// /// Occurs when property value has changed. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Raises the PropertyChanged event. /// /// Event arguments protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler eh = PropertyChanged; if (eh != null) eh(this, e); } #endregion #region IDisposable /// /// Dispose /// public void Dispose() { for (int i = 0; i < _Styles.Length; i++) { T style = _Styles[i]; if (style != null) { SetStyle(i, null); style.Dispose(); } } _Styles = null; } #endregion } #region enums #region StyleType /// /// StyleType /// public enum StyleType { /// /// CellStyle is Not Set /// NotSet = -1, /// /// Default /// Default = 0, /// /// MouseOver /// MouseOver, /// /// Selected /// Selected, /// /// SelectedMouseOver /// SelectedMouseOver, /// /// ReadOnly /// ReadOnly, /// /// ReadOnlyMouseOver /// ReadOnlyMouseOver, /// /// ReadOnlySelected /// ReadOnlySelected, /// /// ReadOnlySelectedMouseOver /// ReadOnlySelectedMouseOver, /// /// Empty, non-populated cell /// Empty, /// /// Empty, mouseOver non-populated cell /// EmptyMouseOver, /// /// Empty, MouseOver, Selected, non-populated cell /// EmptyMouseOverSelected, /// /// Not Selectable cell /// NotSelectable, } #endregion #region StyleState /// /// StyleState /// [Flags] public enum StyleState { /// /// Default /// Default = 0, /// /// MouseOver /// MouseOver = (1 << 0), /// /// Selected /// Selected = (1 << 1), /// /// ReadOnly /// ReadOnly = (1 << 2), } #endregion #endregion #region VisualStylesConverter /// /// VisualStylesConverter /// public class VisualStylesConverter : ExpandableObjectConverter { /// /// ConvertTo /// /// /// /// /// /// public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) return (" "); return (base.ConvertTo(context, culture, value, destinationType)); } } #endregion }