/// <summary>
 /// Initializes a new instance of the HeaderMouseEventArgs class with 
 /// the specified source Column, Table, column index, column header bounds 
 /// and MouseEventArgs
 /// </summary>
 /// <param name="column">The Column that Raised the event</param>
 /// <param name="table">The Table the Column belongs to</param>
 /// <param name="index">The index of the Column</param>
 /// <param name="headerRect">The column header's bounding rectangle</param>
 /// <param name="mea">The MouseEventArgs that contains data about the 
 /// mouse event</param>
 public HeaderMouseEventArgs(Column column, HTable table, int index, Gdk.Rectangle headerRect, Gtk.MotionNotifyEventArgs mea)
 {
     this.column = column;
     this.table = table;
     this.index = index;
     this.headerRect = headerRect;
 }
 /// <summary>
 /// Initializes a new instance of the ColumnModelEventArgs class with 
 /// the specified ColumnModel source, start index, end index and affected Column
 /// </summary>
 /// <param name="source">The ColumnModel that originated the event</param>
 /// <param name="column">The affected Column</param>
 /// <param name="fromIndex">The start index of the affected Column(s)</param>
 /// <param name="toIndex">The end index of the affected Column(s)</param>
 public ColumnModelEventArgs(ColumnModel source, Column column, int fromIndex, int toIndex)
     : base()
 {
     this.source = source;
     this.column = column;
     this.fromIndex = fromIndex;
     this.toIndex = toIndex;
 }
 /// <summary>
 /// Initializes a new instance of the ColumnEventArgs class with 
 /// the specified Column source, column index and event type
 /// </summary>
 /// <param name="source">The Column that Raised the event</param>
 /// <param name="index">The index of the Column</param>
 /// <param name="eventType">The type of event</param>
 /// <param name="oldValue">The old value of the changed property</param>
 public ColumnEventArgs(Column source, int index, ColumnEventType eventType, object oldValue)
     : base()
 {
     this.source = source;
     this.index = index;
     this.eventType = eventType;
     this.oldValue = oldValue;
 }
        /// <summary>
        /// Initializes a new instance of the ColumnModel class with an array of strings 
        /// representing TextColumns
        /// </summary>
        /// <param name="columns">An array of strings that represent the Columns of 
        /// the ColumnModel</param>
        public ColumnModel(string[] columns)
        {
            if (columns == null)
            {
                throw new ArgumentNullException("columns", "string[] cannot be null");
            }

            this.Init();

            if (columns.Length > 0)
            {
                Column[] cols = new Column[columns.Length];

                for (int i=0; i<columns.Length; i++)
                {
                    cols[i] = new TextColumn(columns[i]);
                }

                this.Columns.AddRange(cols);
            }
        }
        /// <summary>
        /// Returns a rectangle that countains the header of the specified column
        /// </summary>
        /// <param name="column">The column</param>
        /// <returns>A rectangle that countains the header of the specified column</returns>
        public Gdk.Rectangle ColumnHeaderRect(Column column)
        {
            // check if we actually own the column
            int index = this.Columns.IndexOf(column);

            if (index == -1)
            {
                return Rectangle.Empty;
            }

            return this.ColumnHeaderRect(index);
        }
        /// <summary>
        /// Initializes a new instance of the Row class with an array of Column objects
        /// </summary>
        /// <param name="columns">An array of Cell objects that represent the Columns 
        /// of the ColumnModel</param>
        public ColumnModel(Column[] columns)
        {
            if (columns == null)
            {
                throw new ArgumentNullException("columns", "Column[] cannot be null");
            }

            this.Init();

            if (columns.Length > 0)
            {
                this.Columns.AddRange(columns);
            }
        }
        /// <summary>
        /// Removes an array of Column objects from the collection
        /// </summary>
        /// <param name="columns">An array of Column objects to remove 
        /// from the collection</param>
        public void RemoveRange(Column[] columns)
        {
            if (columns == null)
            {
                throw new System.ArgumentNullException("Column[] is null");
            }

            for (int i=0; i<columns.Length; i++)
            {
                this.Remove(columns[i]);
            }
        }
        /// <summary>
        /// Removes the specified Column from the model
        /// </summary>
        /// <param name="column">The Column to remove</param>
        public void Remove(Column column)
        {
            int columnIndex = this.IndexOf(column);

            if (columnIndex != -1)
            {
                this.RemoveAt(columnIndex);
            }
        }
        /// <summary>
        ///	Returns the index of the specified Column in the model
        /// </summary>
        /// <param name="column">The Column to look for</param>
        /// <returns>The index of the specified Column in the model</returns>
        public int IndexOf(Column column)
        {
            for (int i=0; i<this.Count; i++)
            {
                if (this[i] == column)
                {
                    return i;
                }
            }

            return -1;
        }
        /// <summary>
        /// Adds the specified Column to the end of the collection
        /// </summary>
        /// <param name="column">The Column to add</param>
        public int Add(Column column)
        {
            if (column == null)
            {
                throw new System.ArgumentNullException("Column is null");
            }

            int index = this.List.Add(column);

            this.RecalcWidthCache();

            this.OnColumnAdded(new ColumnModelEventArgs(this.owner, column, index, index));

            return index;
        }
 /// <summary>
 /// Initializes a new instance of the PaintHeaderEventArgs class with 
 /// the specified graphics, column, table, column index, header style 
 /// and clipping rectangle
 /// </summary>
 /// <param name="g">The Graphics used to paint the Column header</param>
 /// <param name="column">The Column to be painted</param>
 /// <param name="table">The Table the Column's ColumnModel belongs to</param>
 /// <param name="columnIndex">The index of the Column in the Table's ColumnModel</param>
 /// <param name="headerStyle">The style of the Column's header</param>
 /// <param name="headerRect">The Rectangle that represents the rectangle 
 /// in which to paint</param>
 public PaintHeaderEventArgs(Gdk.Drawable g, Column column, HTable table, int columnIndex, ColumnHeaderStyle headerStyle, Gdk.Rectangle headerRect)
 {
     this.column = column;
     this.table = table;
     this.columnIndex = columnIndex;
     this.column = column;
     this.headerStyle = headerStyle;
     this.headerRect = headerRect;
     this.handled = false;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="column"></param>
 internal void SetColumn(Column column)
 {
     this.column = column;
 }
 /// <summary>
 /// Initializes a new instance of the ColumnEventArgs class with 
 /// the specified Column source, column index and event type
 /// </summary>
 /// <param name="source">The Column that Raised the event</param>
 /// <param name="eventType">The type of event</param>
 /// <param name="oldValue">The old value of the changed property</param>
 public ColumnEventArgs(Column source, ColumnEventType eventType, object oldValue)
     : this(source, -1, eventType, oldValue)
 {
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="column"></param>
 internal void SetColumn(Column column)
 {
     this.source = column;
 }