using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using DevComponents.DotNetBar.SuperGrid.Primitives;
using DevComponents.DotNetBar.SuperGrid.Style;
using DevComponents.SuperGrid.TextMarkup;
namespace DevComponents.DotNetBar.SuperGrid
{
///
///ColumnGroupHeaderCollection
///
[Editor("DevComponents.SuperGrid.Design.ColumnGroupHeaderCollectionEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
public class ColumnGroupHeaderCollection : CustomCollection
{
#region Events
#region HeaderMarkupLinkClick
internal event EventHandler GroupHeaderMarkupLinkClick;
#endregion
#endregion
#region Private variables
private object _Parent;
#endregion
#region Public properties
#region Name indexer
///
/// Name indexer
///
///
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ColumnGroupHeader this[string name]
{
get
{
int index = FindIndexByName(name);
return (index >= 0 ? this[index] : null);
}
set
{
int index = FindIndexByName(name);
if (index < 0)
throw new Exception("Column Name not defined (" + name + ").");
Items[index] = value;
}
}
#region FindIndexByName
private int FindIndexByName(string name)
{
for (int i = 0; i < Items.Count; i++)
{
ColumnGroupHeader item = Items[i];
if (name != null)
name = name.ToUpper();
if (item.Name != null && item.Name.ToUpper().Equals(name))
return (i);
}
return (-1);
}
#endregion
#endregion
#region Parent
///
/// Parent
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object Parent
{
get { return (_Parent); }
internal set { _Parent = value; }
}
#endregion
#endregion
#region OnCollectionChanged
///
/// Handles CollectionChange notifications
///
///
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (INotifyPropertyChanged newValue in e.NewItems)
{
ItemChangeHandler(null, newValue);
PropertyChangeHandler(null, newValue);
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (INotifyPropertyChanged oldValue in e.OldItems)
{
ItemChangeHandler(null, oldValue);
PropertyChangeHandler(null, oldValue);
}
break;
case NotifyCollectionChangedAction.Replace:
for (int i = 0; i < e.OldItems.Count; i++)
{
ItemChangeHandler(e.OldItems[i], e.NewItems[i]);
PropertyChangeHandler((INotifyPropertyChanged)e.OldItems[i],
(INotifyPropertyChanged)e.NewItems[i]);
}
break;
case NotifyCollectionChangedAction.Reset:
for (int i = 0; i < Items.Count; i++)
{
ItemChangeHandler(Items[i], null);
PropertyChangeHandler(Items[i], null);
}
break;
}
base.OnCollectionChanged(e);
}
#endregion
#region ItemChangeHandler
private void ItemChangeHandler(object oldValue, object newValue)
{
ColumnGroupHeader cgh = oldValue as ColumnGroupHeader;
if (cgh != null)
{
cgh.Collection = null;
cgh.GroupHeaderMarkupLinkClick -= CGroupHeaderMarkupLinkClick;
}
cgh = newValue as ColumnGroupHeader;
if (cgh != null)
{
cgh.Collection = this;
cgh.GroupHeaderMarkupLinkClick += CGroupHeaderMarkupLinkClick;
}
}
#endregion
#region CGroupHeaderMarkupLinkClick
void CGroupHeaderMarkupLinkClick(object sender, GroupHeaderMarkupLinkClickEventArgs e)
{
if (GroupHeaderMarkupLinkClick != null)
GroupHeaderMarkupLinkClick(sender, e);
}
#endregion
#region PropertyChangeHandler
private void PropertyChangeHandler(
INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
{
if (oldValue != null)
oldValue.PropertyChanged -= PropertyValueChanged;
if (newValue != null)
newValue.PropertyChanged += PropertyValueChanged;
}
#endregion
#region PropertyValueChanged
///
/// 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 PropertyValueChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged(e);
}
#endregion
#region INotifyPropertyChanged Members
///
/// Default PropertyChanged processing
///
///
/// invalidate
protected void OnPropertyChangedEx(string s, VisualChangeType changeType)
{
OnPropertyChanged(new VisualPropertyChangedEventArgs(s, changeType));
}
#endregion
}
///
///Column GroupHeader
///
public class ColumnGroupHeader : INotifyPropertyChanged, IDisposable
{
#region Events
#region HeaderMarkupLinkClick
internal event EventHandler GroupHeaderMarkupLinkClick;
#endregion
#endregion
#region Private variables
private int _StartDisplayIndex = -1;
private int _EndDisplayIndex = -1;
private int _RowHeight;
private int _MinRowHeight;
private int _StyleUpdateCount;
private ColumnHeaderVisualStyles _HeaderStyles;
private ColumnHeaderVisualStyles _EffectiveStyles;
private ColumnGroupHeaderCollection _Collection;
private ColumnGroupHeaderCollection _GroupHeaders;
private string _Name;
private string _ToolTip;
private string _HeaderText;
private BodyElement _HeaderTextMarkup;
private Size _Size;
private Size _ContentSize;
private Size _HeaderTextSize;
private Rectangle _BoundsRelative;
private Shs _States;
private Tbool _ShowColumnHeaders = Tbool.NotSet;
private Tbool _AutoApplyGroupColors = Tbool.NotSet;
#endregion
///
///ColumnGroupHeader
///
public ColumnGroupHeader()
{
AllowSelection = true;
Visible = true;
}
#region Public properties
#region AllowSelection
///
/// Gets or sets whether the element can be selected
///
[DefaultValue(true), Category("Behavior")]
[Description("Indicates whether the element can be selected")]
public bool AllowSelection
{
get { return (TestState(Shs.AllowSelection)); }
set
{
if (AllowSelection != value)
{
SetState(Shs.AllowSelection, value);
OnPropertyChangedEx("AllowSelection", VisualChangeType.Render);
}
}
}
#endregion
#region AutoApplyGroupColors
///
/// Gets or sets whether Group Header color properties
/// (ie. Background and TextColor) are automatically
/// applied to group Column Headers
///
[DefaultValue(Tbool.NotSet), Category("Appearance")]
[Description("Indicates whether Group Header color properties (ie. Background and TextColor) are automatically applied to group Column Headers.")]
public Tbool AutoApplyGroupColors
{
get { return (_AutoApplyGroupColors); }
set
{
if (_AutoApplyGroupColors != value)
{
_AutoApplyGroupColors = value;
OnPropertyChangedEx("AutoApplyGroupColors", VisualChangeType.Render);
}
}
}
#endregion
#region Collection
///
///The collection the item is contained within
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ColumnGroupHeaderCollection Collection
{
get { return (_Collection); }
internal set { _Collection = value; }
}
#endregion
#region DisplayCount
///
/// Gets the count of displayed columns
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int DisplayCount
{
get { return (_EndDisplayIndex - _StartDisplayIndex + 1); }
}
#endregion
#region EnableHeaderMarkup
///
/// Gets or sets whether text-markup support is enabled for the HeaderText
///
[DefaultValue(false), Category("Appearance")]
[Description("Indicates whether text-markup support is enabled for the HeaderText.")]
public bool EnableHeaderMarkup
{
get { return (TestState(Shs.EnableHeaderMarkup)); }
set
{
if (EnableHeaderMarkup != value)
{
SetState(Shs.EnableHeaderMarkup, value);
MarkupHeaderTextChanged();
OnPropertyChangedEx("EnableHeaderMarkup", VisualChangeType.Layout);
}
}
}
#endregion
#region EndDisplayIndex
///
/// Gets or sets the end column display index
///
[DefaultValue(0), Category("Appearance")]
[Description("Indicates the end column display index (inclusive)")]
public int EndDisplayIndex
{
get { return ((_EndDisplayIndex < 0) ? 0 : _EndDisplayIndex); }
set
{
if (_EndDisplayIndex != value)
{
_EndDisplayIndex = value;
OnPropertyChangedEx("EndDisplayIndex", VisualChangeType.Layout);
}
}
}
#endregion
#region GroupHeaders
///
///Gets or sets the GroupHeaders contained under the given header
///
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the GroupHeaders contained under the given header.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ColumnGroupHeaderCollection GroupHeaders
{
get
{
if (_GroupHeaders == null)
{
_GroupHeaders = new ColumnGroupHeaderCollection();
_GroupHeaders.Parent = this;
PropertyChangeHandler(null, _GroupHeaders);
GroupCollectionChangeHandler(null, _GroupHeaders);
}
return (_GroupHeaders);
}
set
{
if (_GroupHeaders != value)
{
PropertyChangeHandler(_GroupHeaders, value);
GroupCollectionChangeHandler(_GroupHeaders, value);
_GroupHeaders = value;
OnPropertyChangedEx("GroupHeaders", VisualChangeType.Layout);
}
}
}
#region _GroupHeaders
void GroupHeadersCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
ColumnGroupHeaderCollection cgc = sender as ColumnGroupHeaderCollection;
if (cgc != null)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
ColumnGroupHeader parent = cgc.Parent as ColumnGroupHeader;
if (parent != null)
{
foreach (ColumnGroupHeader cgh in e.NewItems)
{
if (parent._StartDisplayIndex < 0 || cgh.StartDisplayIndex < parent.StartDisplayIndex)
parent.StartDisplayIndex = cgh.StartDisplayIndex;
if (parent._EndDisplayIndex < 0 || cgh.EndDisplayIndex > parent.EndDisplayIndex)
parent.EndDisplayIndex = cgh.EndDisplayIndex;
}
}
}
}
}
#endregion
#endregion
#region HeaderStyles
///
/// Gets or sets the visual styles assigned to the Column Header
///
[DefaultValue(null), Category("Appearance")]
[Description("Indicates visual style assigned to the Column Header.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ColumnHeaderVisualStyles HeaderStyles
{
get
{
if (_HeaderStyles == null)
{
_HeaderStyles = new ColumnHeaderVisualStyles();
PropertyChangeHandler(null, _HeaderStyles);
}
return (_HeaderStyles);
}
set
{
if (_HeaderStyles != value)
{
PropertyChangeHandler(_HeaderStyles, value);
_HeaderStyles = value;
OnPropertyChangedEx("HeaderStyles", VisualChangeType.Layout);
}
}
}
#endregion
#region HeaderText
///
/// Gets or sets the Header Text
///
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the Header Text")]
public string HeaderText
{
get { return (_HeaderText); }
set
{
if (_HeaderText != value)
{
_HeaderText = value;
MarkupHeaderTextChanged();
OnPropertyChangedEx("HeaderText", VisualChangeType.Layout);
}
}
}
#endregion
#region IsReadOnly
///
///Returns whether the given GroupHeader is ReadOnly (ie. all
///visible columns/headers it encompasses must be ReadOnly)
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool IsReadOnly
{
get
{
GridColumnHeader gch = GetColumnHeader();
if (gch != null)
return (gch.IsGroupHeaderReadOnly(this));
return (false);
}
}
#endregion
#region IsSelected
///
///Returns whether the given GroupHeader is selected (ie. all
///visible columns/headers it encompasses must be selected)
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool IsSelected
{
get
{
GridColumnHeader gch = GetColumnHeader();
if (gch != null)
return (gch.IsGroupHeaderSelected(this));
return (false);
}
}
#endregion
#region MinRowHeight
///
/// Gets or sets the minimum height of the Header row
///
[DefaultValue(0), Category("Style")]
[Description("Indicates the minimum height of the ColumnHeader row")]
public int MinRowHeight
{
get { return (_MinRowHeight); }
set
{
if (_MinRowHeight != value)
{
if (value < 0)
throw new Exception("MinRowHeight cannot be negative");
_MinRowHeight = value;
OnPropertyChangedEx("MinRowHeight", VisualChangeType.Layout);
}
}
}
#endregion
#region Name
///
/// Gets or sets the GroupHeader Name
///
[DefaultValue(null)]
[Description("Indicates the GroupHeader Name")]
public string Name
{
get { return (_Name); }
set { _Name = value; }
}
#endregion
#region Parent
///
///The Parent the item
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object Parent
{
get
{
if (_Collection != null)
return (_Collection.Parent);
return (null);
}
}
#endregion
#region RowHeight
///
/// Gets or sets the fixed height of the header
///
[DefaultValue(0), Category("Appearance")]
[Description("Indicates the fixed height of the header")]
public int RowHeight
{
get { return (_RowHeight); }
set
{
if (_RowHeight != value)
{
_RowHeight = value;
OnPropertyChangedEx("RowHeight", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowColumnHeaders
///
/// Gets or sets whether the column headers are shown
///
[DefaultValue(Tbool.NotSet), Category("Appearance")]
[Description("Indicates whether the root column headers are shown.")]
public Tbool ShowColumnHeaders
{
get { return (_ShowColumnHeaders); }
set
{
if (_ShowColumnHeaders != value)
{
_ShowColumnHeaders = value;
OnPropertyChangedEx("ShowColumnHeaders", VisualChangeType.Layout);
}
}
}
#endregion
#region StartDisplayIndex
///
/// Gets or sets the start column display index
///
[DefaultValue(-1), Category("Appearance")]
[Description("Indicates the start column index")]
public int StartDisplayIndex
{
get { return ((_StartDisplayIndex < 0) ? 0 : _StartDisplayIndex); }
set
{
if (_StartDisplayIndex != value)
{
_StartDisplayIndex = value;
OnPropertyChangedEx("StartDisplayIndex", VisualChangeType.Layout);
}
}
}
#endregion
#region ToolTip
///
/// Gets or sets the ToolTip text for the sub header.
///
[DefaultValue(null), Category("Appearance")]
[Description("Indicates ththe ToolTip text for the sub header.")]
public string ToolTip
{
get { return (_ToolTip); }
set
{
if (_ToolTip != value)
{
_ToolTip = value;
OnPropertyChanged("ToolTip");
}
}
}
#endregion
#region Visible
///
/// Get or sets whether the item is visible
///
[DefaultValue(true), Category("Appearance")]
[Description("Indicates whether item is visible")]
public bool Visible
{
get { return (TestState(Shs.Visible)); }
set
{
if (Visible != value)
{
SetState(Shs.Visible, value);
OnPropertyChangedEx("Visible", VisualChangeType.Layout);
}
}
}
#endregion
#endregion
#region Internal properties
#region BoundsRelative
// Does not include sub headers
internal Rectangle BoundsRelative
{
get { return (_BoundsRelative); }
set { _BoundsRelative = value; }
}
#endregion
#region ContentSize
internal Size ContentSize
{
get { return (_ContentSize); }
set { _ContentSize = value; }
}
#endregion
#region EffectiveStyles
internal ColumnHeaderVisualStyles EffectiveStyles
{
get { return (_EffectiveStyles); }
set { _EffectiveStyles = value; }
}
#endregion
#region HeaderTextMarkup
internal BodyElement HeaderTextMarkup
{
get { return (_HeaderTextMarkup); }
}
#endregion
#region HeaderTextSize
internal Size HeaderTextSize
{
get { return (_HeaderTextSize); }
set { _HeaderTextSize = value; }
}
#endregion
#region Size
// Includes sub headers
internal Size Size
{
get { return (_Size); }
set { _Size = value; }
}
#endregion
#region StyleUpdateCount
internal int StyleUpdateCount
{
get { return (_StyleUpdateCount); }
set { _StyleUpdateCount = value; }
}
#endregion
#endregion
#region TestState
private bool TestState(Shs state)
{
return ((_States & state) == state);
}
#endregion
#region SetState
private void SetState(Shs state, bool value)
{
if (value == true)
_States |= state;
else
_States &= ~state;
}
#endregion
#region Contains
internal bool Contains(int index)
{
return (index >= StartDisplayIndex && index <= EndDisplayIndex);
}
#endregion
#region GetColumnHeader
private GridColumnHeader GetColumnHeader()
{
object parent = Collection.Parent;
while (parent.GetType() == typeof(ColumnGroupHeader))
parent = ((ColumnGroupHeader)parent).Collection.Parent;
return (parent as GridColumnHeader);
}
#endregion
#region Markup support
private void MarkupHeaderTextChanged()
{
if (_HeaderTextMarkup != null)
_HeaderTextMarkup.HyperLinkClick -= HeaderTextMarkupLinkClick;
_HeaderTextMarkup = null;
if (EnableHeaderMarkup == true)
{
if (MarkupParser.IsMarkup(_HeaderText) == true)
{
_HeaderTextMarkup = MarkupParser.Parse(_HeaderText);
if (_HeaderTextMarkup != null)
_HeaderTextMarkup.HyperLinkClick += HeaderTextMarkupLinkClick;
}
}
}
///
/// Occurs when a header text markup link is clicked
///
protected virtual void HeaderTextMarkupLinkClick(object sender, EventArgs e)
{
if (GroupHeaderMarkupLinkClick != null)
{
HyperLink link = (HyperLink)sender;
GroupHeaderMarkupLinkClickEventArgs ev =
new GroupHeaderMarkupLinkClickEventArgs(this, link);
GroupHeaderMarkupLinkClick(this, ev);
}
}
///
/// Gets plain Header text without text-markup (if text-markup is used in Text)
///
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public string PlainHeaderText
{
get { return (_HeaderTextMarkup != null ? _HeaderTextMarkup.PlainText : _HeaderText); }
}
#endregion
#region GroupCollectionChangeHandler
private void GroupCollectionChangeHandler(
ColumnGroupHeaderCollection oldValue, ColumnGroupHeaderCollection newValue)
{
if (oldValue != null)
{
oldValue.Parent = null;
oldValue.CollectionChanged -= GroupHeadersCollectionChanged;
}
if (newValue != null)
{
newValue.Parent = this;
newValue.CollectionChanged += GroupHeadersCollectionChanged;
}
}
#endregion
#region PropertyChangeHandler
private void PropertyChangeHandler(
INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
{
if (oldValue != null)
oldValue.PropertyChanged -= PropertyValueChanged;
if (newValue != null)
newValue.PropertyChanged += PropertyValueChanged;
}
#endregion
#region PropertyValueChanged
///
/// 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 PropertyValueChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged(e);
}
#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);
}
///
/// Default PropertyChanged processing
///
///
protected void OnPropertyChanged(string s)
{
if (PropertyChanged != null)
OnPropertyChanged(new VisualPropertyChangedEventArgs(s));
}
///
/// Default PropertyChanged processing
///
///
/// invalidate
protected void OnPropertyChangedEx(string s, VisualChangeType changeType)
{
if (PropertyChanged != null)
OnPropertyChanged(new VisualPropertyChangedEventArgs(s, changeType));
}
#endregion
#region GroupHeaderStates
[Flags]
private enum Shs
{
AllowSelection = (1 << 0),
EnableHeaderMarkup = (1 << 1),
Visible = (1 << 2),
}
#endregion
#region Dispose
///
/// Dispose
///
public void Dispose()
{
if (_HeaderTextMarkup != null)
{
_HeaderTextMarkup.HyperLinkClick -= HeaderTextMarkupLinkClick;
_HeaderTextMarkup = null;
}
}
#endregion
}
#region EventArgs
#region GroupHeaderMarkupLinkClickEventArgs
///
/// GroupHeaderMarkupLinkClickEventArgs
///
internal class GroupHeaderMarkupLinkClickEventArgs : EventArgs
{
#region Private variables
private ColumnGroupHeader _GroupHeader;
private HyperLink _HyperLink;
#endregion
///
/// GroupHeaderMarkupLinkClickEventArgs
///
///
///
public GroupHeaderMarkupLinkClickEventArgs(ColumnGroupHeader groupHeader, HyperLink hyperLink)
{
_GroupHeader = groupHeader;
_HyperLink = hyperLink;
}
#region Public properties
///
/// Gets the associated GroupHeader
///
public ColumnGroupHeader GroupHeader
{
get { return (_GroupHeader); }
}
///
/// Gets the associated HyperLink
///
public HyperLink HyperLink
{
get { return (_HyperLink); }
}
#endregion
}
#endregion
#endregion
}