Click here to Skip to main content
15,886,110 members
Articles / Programming Languages / C#

A .NET Wizard control

Rate me:
Please Sign up or sign in to vote.
4.86/5 (89 votes)
24 Apr 2003CPOL7 min read 660.5K   8.7K   216  
A .NET Wizard control for the VS.IDE and client apps
using System;
using System.Collections;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;


namespace UtilityLibrary.DateTimeControls
{
  [ ToolboxItem( true ) ]
  public class HeaderControl : Control
  {
    #region Class Constants
    private const int DEF_HEADER_HEIGHT = 21;
    #endregion

    #region Class members
    private int   m_iLevelHeight = DEF_HEADER_HEIGHT;
    private int   m_iLevelsCount = 1; // by default we always have one level of header
    private bool  m_bSkipEvents;

    private ArrayList m_headersColl = new ArrayList( 2 );
    #endregion

    #region Class Internal declarations
    [Flags]
      public enum TCellState
    {
      #region Enums
      Normal    = 0x0000,
      Active    = 0x0001,
      Selected  = 0x0002,
      
      All  = Active | Selected
      #endregion
    };

    public class HeaderCell
    {
      #region Class members
      private Rectangle   m_rect;
      private string      m_strText     = "";
      private string      m_strToolTip  = "";
      private Color       m_backColor   = SystemColors.Control;
      private Color       m_foreColor   = SystemColors.ControlText;
      
      private ImageList   m_imageList;
      private int         m_iImageIndex = -1;
      private bool        m_bSkipEvents;
      private TCellState  m_enState;
      private object      m_tag         = null;
      #endregion

      #region Class events
      [ Category( "Property Changed" ) ]
      public event EventHandler ImageIndexChanged;

      [ Category( "Property Changed" ) ]
      public event EventHandler ImageListChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler TextChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler ToolTipChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler BackColorChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler ForeColorChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler RectChanged;

      [ Category( "Property Changed" ) ]
      public event EventHandler StateChanged;
      
      [ Category( "Property Changed" ) ]
      public event EventHandler TagChanged;
      #endregion

      #region Class properties
      [ DefaultValue( -1 ),
      Editor( "System.Windows.Forms.Design.ImageIndexEditor, System.Design, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
        typeof( System.Drawing.Design.UITypeEditor ) ),
      TypeConverter("System.Windows.Forms.ImageIndexConverter"), 
      Category( "Appearance" ) ]
      public int ImageIndex
      {
        get
        {
          return m_iImageIndex;
        }
        set
        {
          if( value != m_iImageIndex )
          {
            m_iImageIndex = value;
            OnImageIndexChanged();
          }
        }
      }
      
      [ DefaultValue( null ), Browsable( true ), Category( "Appearance" ) ]
      public ImageList ImageList
      {
        get
        {
          return m_imageList;
        }
        set
        {
          if( value != m_imageList )
          {
            m_imageList = value;
            OnImageListChanged();
          }
        }
      }
      
      [ DefaultValue( "" ), Browsable( true ), Category( "Appearance" ) ]
      public string Text
      {
        get
        {
          return m_strText;
        }
        set
        {
          if( value != m_strText )
          {
            m_strText = value;
            OnTextChanged();
          }
        }
      }
      
      [ DefaultValue( "" ), Browsable( true ), Category( "Appearance" ) ]
      public string ToolTip
      {
        get
        {
          return m_strToolTip;
        }
        set
        {
          if( value != m_strToolTip )
          {
            m_strToolTip = value;
            OnToolTipChanged();
          }
        }
      }
      
      [ Browsable( true ), Category( "Appearance" ) ]
      public Color BackColor
      {
        get
        {
          return m_backColor;
        }
        set
        {
          if( value != m_backColor )
          {
            m_backColor = value;
            OnBackColorChanged();
          }
        }
      }
      
      [ Browsable( false ) ]
      public bool QuietMode
      {
        get
        {
          return m_bSkipEvents;
        }
        set
        {
          if( value != m_bSkipEvents )
          {
            m_bSkipEvents = value;
            OnQuietModeChanged();
          }
        }
      }
      
      [ Browsable( true ), Category( "Appearance" ) ]
      public Color ForeColor
      {
        get
        {
          return m_foreColor;
        }
        set
        {
          if( value != m_foreColor )
          {
            m_foreColor = value;
            OnForeColorChanged();
          }
        }
      }
      
      [ Browsable( false ) ]
      public Rectangle Rect
      {
        get
        {
          return m_rect;
        }
        set
        {
          if( value != m_rect )
          {
            m_rect = value;
            OnRectChanged();
          }
        }
      }
      
      [ Browsable( false ) ]
      public TCellState State
      {
        get
        {
          return m_enState;
        }
        set
        {
          if( value != m_enState )
          {
            m_enState = value;
            OnStateChanged();
          }
        }
      }
      
      [ Browsable( false ) ]
      public bool IsActive
      {
        get
        {
          return ( m_enState & TCellState.Active ) == TCellState.Active;
        }
      }
      
      [ Browsable( false ) ]
      public bool IsSelected
      {
        get
        {
          return ( m_enState & TCellState.Selected ) == TCellState.Selected;
        }
      }
      
      [ Browsable( false ) ]
      public bool IsNormal
      {
        get
        {
          return ( m_enState & TCellState.All ) == 0;
        }
      }
      [ Browsable( false ) ]
      public object Tag
      {
        get
        {
          return m_tag;
        }
        set
        {
          m_tag = value;
          OnTagChanged();
        }
      }
      #endregion

      #region Class helper methods
      protected virtual void OnImageIndexChanged()
      {
        RaiseImageIndexChangedEvent();
      }
      
      protected virtual void OnImageListChanged()
      {
        RaiseImageListChangedEvent();
      }
      
      protected virtual void OnTextChanged()
      {
        RaiseTextChangedEvent();
      }
      
      protected virtual void OnToolTipChanged()
      {
        RaiseToolTipChangedEvent();
      }
      
      protected virtual void OnBackColorChanged()
      {
        RaiseBackColorChangedEvent();
      }
      
      protected virtual void OnQuietModeChanged()
      {
        // NOTE: inheritors can use this method to detect Quiet mode 
      }
      protected virtual void OnForeColorChanged()
      {
        RaiseForeColorChangedEvent();
      }
      
      protected virtual void OnRectChanged()
      {
        RaiseRectChangedEvent();
      }
      protected virtual void OnStateChanged()
      {
        RaiseStateChangedEvent();
      }
      
      protected virtual void OnTagChanged()
      {
        RaiseTagChangedEvent();
      }
      
      
      protected void RaiseImageIndexChangedEvent()
      {
        if( ImageIndexChanged != null && QuietMode == false )
        {
          ImageIndexChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseImageListChangedEvent()
      {
        if( ImageListChanged != null && QuietMode == false )
        {
          ImageListChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseTextChangedEvent()
      {
        if( TextChanged != null && QuietMode == false )
        {
          TextChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseToolTipChangedEvent()
      {
        if( ToolTipChanged != null && QuietMode == false )
        {
          ToolTipChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseBackColorChangedEvent()
      {
        if( BackColorChanged != null && QuietMode == false )
        {
          BackColorChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseForeColorChangedEvent()
      {
        if( ForeColorChanged != null && QuietMode == false )
        {
          ForeColorChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseRectChangedEvent()
      {
        if( RectChanged != null && QuietMode == false )
        {
          RectChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseStateChangedEvent()
      {
        if( StateChanged != null && QuietMode == false )
        {
          StateChanged( this, EventArgs.Empty );
        }
      }

      protected void RaiseTagChangedEvent()
      {
        if( TagChanged != null && QuietMode == false )
        {
          TagChanged( this, EventArgs.Empty );
        }
      }
      #endregion
    }

    
    public class HeaderCellEventArgs : EventArgs
    {
      #region Class Properties
      private HeaderCell m_cell;
      #endregion
      
      #region Class Properties
      public HeaderCell Item
      {
        get
        {
          return m_cell;
        }
      }
      #endregion
      
      #region Class Constructors
      private HeaderCellEventArgs()
      {
      
      }

      public HeaderCellEventArgs( HeaderCell cell )
      {
        m_cell = cell;
      }
      #endregion
    }

    public delegate void HeaderCellEventHandler( object sender, HeaderCellEventArgs e );

    public class HeaderCellCollection : CollectionBase
    {
      #region Class events
      public event HeaderCellEventHandler Changed;
      public event HeaderCellEventHandler OnItemAdded;
      public event HeaderCellEventHandler OnItemRemoved;
      public event HeaderCellEventHandler OnItemSet;
      
      public event EventHandler OnClearItems;
      #endregion  

      #region IList methods
      public int Add( HeaderCell value )
      {
        return List.Add( value ); 
      }

      public bool Contains( HeaderCell value )
      {
        return InnerList.Contains( value );
      }

      public int IndexOf( HeaderCell value )
      {
        return InnerList.IndexOf( value );
      }

      public void Insert( int index, HeaderCell value )
      {
        List.Insert( index, value );
      }

      public void Remove( HeaderCell value )
      {
        List.Remove( value );
      }

      public HeaderCell this[ int index ]
      {
        get
        {
          return (HeaderCell)InnerList[ index ];
        }
        set
        {
          List[ index ] = value;
        }
      }
      #endregion

      #region Class overrides
      protected override void OnInsertComplete( int index, object value )
      {
        base.OnInsertComplete( index, value );
        RaiseOnItemAdded( (HeaderCell)value );
      }

      protected override void OnRemoveComplete( int index, object value )
      {
        base.OnRemoveComplete( index, value );
        RaiseOnItemRemoved( (HeaderCell)value );
      }

      protected override void OnSetComplete( int index, object oldValue, object newValue )
      {
        base.OnSetComplete( index, oldValue, newValue );
        RaiseOnItemSet( (HeaderCell)newValue );
      }

      protected override void OnClearComplete()
      {
        RaiseOnClear();
      }

      protected void RaiseChanged( HeaderCell item )
      {
        if( Changed != null )
        {
          Changed( this, new HeaderCellEventArgs( item ) );
        }
      }

      protected void RaiseOnItemAdded( HeaderCell item )
      {
        if( OnItemAdded != null )
        {
          OnItemAdded( this, new HeaderCellEventArgs( item ) );
        }

        RaiseChanged( item );
      }

      protected void RaiseOnItemRemoved( HeaderCell item )
      {
        if( OnItemRemoved != null )
        {
          OnItemRemoved( this, new HeaderCellEventArgs( item ) );
        }

        RaiseChanged( item );
      }

      protected void RaiseOnItemSet( HeaderCell item )
      {
        if( OnItemSet != null )
        {
          OnItemSet( this, new HeaderCellEventArgs( item ) );
        }

        RaiseChanged( item );
      }

      protected void RaiseOnClear()
      {
        if( OnClearItems != null )
        {
          OnClearItems( this, EventArgs.Empty );
        }

        RaiseChanged( null );
      }
      
      #endregion
    }
    #endregion

    #region Class Properties
    /// <summary>
    /// Indicate to control does user want that control throw events on any property
    /// change or not.
    /// </summary>
    [ Browsable( false ), Description( "GET/SET flag: can coontrol throw events or not" ) ]
    public bool QuietMode
    {
      get
      {
        return m_bSkipEvents;
      }
      set
      {
        if( value != m_bSkipEvents )
        {
          m_bSkipEvents = value;
          OnQuietModeChanged();
        }
      }
    }

    /// <summary>
    /// Height in pixels of one level of heder
    /// </summary>
    [ Category( "Appearance" ), DefaultValue( DEF_HEADER_HEIGHT ) ]
    [ Browsable( true ), Description( "GET/SET height of header level" )]
    public int LevelHeight
    {
      get
      {
        return  m_iLevelHeight;
      }
      set
      {
        if( value != m_iLevelHeight )
        {
          m_iLevelHeight = value;
          OnLevelHeightChanged();
        }
      }
    }

    /// <summary>
    /// Indicate how many levels of header exists in control
    /// </summary>
    [ Category( "Appearance" ), DefaultValue( 1 ) ]
    [ Browsable( true ), Description( "GET/SET quantity of header levels in control" ) ]
    public int Levels
    {
      get
      {
        return m_iLevelsCount;
      }
      set
      {
        if( value != m_iLevelsCount )
        {
          m_iLevelsCount = value;
          OnLevelsChanged();
        }
      }
    }

    /// <summary>
    /// Retrun Collection of Header Cells 
    /// </summary>
    [ Browsable( false ) ]
    public HeaderCellCollection this[ int level ]
    {
      get
      {
        return ( HeaderCellCollection )m_headersColl[ level ];
      }
    }
    #endregion

    #region Class events
    [Category("Property Changed")]
    public event EventHandler LevelHeightChanged;
    
    [Category("Property Changed")]
    public event EventHandler LevelsChanged;
    #endregion

    #region Class Initialize/Finilize methods
    public HeaderControl()
    {
      ControlStyles styleTrue = 
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.DoubleBuffer | 
        ControlStyles.UserPaint;

      ControlStyles styleFalse = ControlStyles.Selectable;

      SetStyle( styleTrue, true );
      SetStyle( styleFalse, false ); 

      this.Name = "HeaderControl";
    }
    #endregion

    #region Class Overrides and event raisers
    protected void RaiseLevelHeightChanged()
    {
      if( LevelHeightChanged != null && m_bSkipEvents == false )
      {
        LevelHeightChanged( this, EventArgs.Empty );
      }
    }
    
    protected void RaiseLevelsChanged()
    {
      if( LevelsChanged != null && m_bSkipEvents == false )
      {
        LevelsChanged( this, EventArgs.Empty );
      }
    }

    
    protected virtual void OnLevelHeightChanged()
    {
    
    }
    
    protected virtual void OnLevelsChanged()
    {
    
    }
    
    protected virtual void OnQuietModeChanged()
    {
      // can be used only by inheritors
    }

    #endregion

    #region Paint methods
    protected override void OnPaint( PaintEventArgs e )
    {
      OnPaintBackground( e );
    }

    protected override void OnPaintBackground( PaintEventArgs pevent )
    {
      Graphics g = pevent.Graphics;
      Rectangle rc = pevent.ClipRectangle;

      g.FillRectangle( Brushes.Gray, rc ); 
    }
    #endregion
  }

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
CEO ArtfulBits Inc.
Ukraine Ukraine
Name:Kucherenko Oleksandr

Born:September 20, 1979

Platforms: Win32, Linux; - well known and MS-DOS; Win16; OS/2 - old time not touched;

Hardware: IBM PC

Programming Languages: Assembler (for Intel 80386); Borland C/C++; Borland Pascal; Object Pascal; Borland C++Builder; Delphi; Perl; Java; Visual C++; Visual J++; UML; XML/XSL; C#; VB.NET; T-SQL; PL/SQL; and etc.

Development Environments: MS Visual Studio 2001-2008; MS Visual C++; Borland Delphi; Borland C++Builder; C/C++ any; Rational Rose; GDPro; Together and etc.

Libraries: STL, ATL, WTL, MFC, NuMega Driver Works, VCL; .NET 1.0, 1.1, 2.0, 3.5; and etc.

Technologies: Client/Server; COM; DirectX; DirectX Media; BDE; HTML/DHTML; ActiveX; Java Servlets; DCOM; COM+; ADO; CORBA; .NET; Windows Forms; GDI/GDI+; and etc.

Application Skills: Databases - design and maintain, support, programming; GUI Design; System Programming, Security; Business Software Development. Win/Web Services development and etc.

Comments and Discussions