2004-04-08 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Windows.Forms / System.Windows.Forms / StatusBar.cs
index 9a3d5e1b697c14cd8e80b51e77bfce7c134e79be..589f9e923c496d0645ac336279e95ad7f9cda32e 100644 (file)
-//\r
-// System.Windows.Forms.StatusBar.cs\r
-//\r
-// Author:\r
-//   stubbed out by Daniel Carrera (dcarrera@math.toronto.edu)\r
-//   stubbed out by Richard Baumann (biochem333@nyc.rr.com)\r
-//     Dennis Hayes (dennish@raytek.com)\r
-//\r
-// (C) 2002 Ximian, Inc\r
-//\r
-\r
-using System;\r
-using System.Collections;\r
-using System.Drawing;\r
-using System.ComponentModel;\r
-\r
-namespace System.Windows.Forms {\r
-\r
-       // <summary>\r
-       //      This is only a template.  Nothing is implemented yet.\r
-       //      Represents a Windows status bar control.\r
-       // </summary>\r
-       public class StatusBar : Control {\r
-\r
-               //\r
-               //  --- Private Fields\r
-               //\r
-               private bool showPanels;\r
-               private bool sizingGrip;\r
-\r
-               //\r
-               //  --- Constructors/Destructors\r
-               //\r
-               [MonoTODO]\r
-               public StatusBar() : base()\r
-               {\r
-                       Dock = DockStyle.Bottom;\r
-                       showPanels = false;\r
-                       sizingGrip = true;\r
-                       throw new NotImplementedException ();\r
-               }\r
-\r
-               //\r
-               //  --- Public Methods\r
-               //\r
-               [MonoTODO]\r
-               public override string ToString()\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-\r
-               //\r
-               //  --- Protected Methods\r
-               //\r
-               [MonoTODO]\r
-               protected override void CreateHandle()\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void Dispose(bool disposing)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected virtual void OnDrawItem(StatusBarDrawItemEventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void OnHandleCreated(EventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void OnHandleDestroyed(EventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void OnLayout(LayoutEventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void OnMouseDown(MouseEventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected virtual void OnPanelClick(StatusBarPanelClickEventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void OnResize(EventArgs e)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               [MonoTODO]\r
-               protected override void WndProc(ref Message m)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-\r
-               //\r
-               //  --- Public Events\r
-               //\r
-               public event StatusBarDrawItemEventHandler DrawItem;\r
-               public event StatusBarPanelClickEventHandler PanelClick;\r
-\r
-               //\r
-               //  --- Public Properties\r
-               //\r
-               [MonoTODO]\r
-               public override Color BackColor {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public override Image BackgroundImage {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public override DockStyle Dock {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public override Font Font {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public override Color ForeColor {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public new ImeMode ImeMode {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public StatusBar.StatusBarPanelCollection Panels {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public bool ShowPanels {// default false {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public bool SizingGrip // default true {\r
-               {\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public new bool TabStop {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               public override string Text {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-                       set { throw new NotImplementedException (); }\r
-               }\r
-\r
-               //\r
-               //  --- Protected Properties\r
-               //\r
-               [MonoTODO]\r
-               protected override CreateParams CreateParams {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               protected override ImeMode DefaultImeMode {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-               [MonoTODO]\r
-               protected override Size DefaultSize {\r
-\r
-                       get { throw new NotImplementedException (); }\r
-               }\r
-\r
-               //\r
-               // System.Windows.Forms.StatusBar.StatusBarPanelCollection\r
-               //\r
-               // Author:\r
-               //   stubbed out by Richard Baumann (biochem333@nyc.rr.com)\r
-               //   stub ammended by Jaak Simm (jaaksimm@firm.ee)\r
-               //   Implemented by Richard Baumann <biochem333@nyc.rr.com>\r
-               // (C) Ximian, Inc., 2002\r
-               //\r
-               // <summary>\r
-               //      Represents the collection of panels in a StatusBar control.\r
-               // </summary>\r
-               public class StatusBarPanelCollection : IList, ICollection, IEnumerable {\r
-\r
-                       //\r
-                       //  --- Private Fields\r
-                       //\r
-                       private ArrayList list;\r
-                       private StatusBar owner;\r
-                       private static string class_string = "System.Windows.Forms.StatusBar.StatusBarPanelCollection::";\r
-\r
-                       //\r
-                       //  --- Constructors/Destructors\r
-                       //\r
-                       StatusBarPanelCollection(StatusBar owner) : base()\r
-                       {\r
-                               list = new ArrayList();\r
-                               this.owner = owner;\r
-                       }\r
-\r
-                       //\r
-                       //  --- Public Methods\r
-                       //\r
-                       [MonoTODO]\r
-                       public virtual int Add(StatusBarPanel panel)\r
-                       {\r
-                               string method_string = "Add(StatusBarPanel) ";\r
-                               if (panel == null) {\r
-\r
-                                       throw new ArgumentNullException(class_string + method_string + "panel == null");\r
-                               }\r
-                               if (panel.Parent == null) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "panel.Parent != null");\r
-                               }\r
-                               // FIXME: StatusBarPanel.Parent is readonly!\r
-                               //panel.Parent = owner;\r
-                               return list.Add(panel);\r
-                       }\r
-                       [MonoTODO]\r
-                       public virtual StatusBarPanel Add(string s)\r
-                       {\r
-                               throw new NotImplementedException ();\r
-                       //      StatusBarPanel tmp = new StatusBarPanel();\r
-                       //      tmp.Text = s;\r
-                       //      // FIXME: StatusBarPanel.Parent is readonly!\r
-                       //      //tmp.Parent = owner;\r
-                       //      list.Add(tmp);\r
-                       //      return tmp;\r
-                       }\r
-                       [MonoTODO]\r
-                       public virtual void AddRange(StatusBarPanel[] panels)\r
-                       {\r
-                               string method_string = "AddRange(StatusBarPanel[]) ";\r
-                               if (panels == null) {\r
-\r
-                                       throw new ArgumentNullException(class_string + method_string + "panels == null");\r
-                               }\r
-                               for (int i = 0; i < panels.Length; i++) {\r
-                                       // FIXME: StatusBarPanel.Parent is readonly!\r
-                                       //panels[i].Parent = owner;\r
-                               }\r
-                               list.AddRange(panels);\r
-                       }\r
-                       public virtual void Clear()\r
-                       {\r
-                               list.Clear();\r
-                       }\r
-                       public bool Contains(StatusBarPanel panel)\r
-                       {\r
-                               return list.Contains(panel);\r
-                       }\r
-                       public IEnumerator GetEnumerator()\r
-                       {\r
-                               return list.GetEnumerator();\r
-                       }\r
-                       public int IndexOf(StatusBarPanel panel)\r
-                       {\r
-                               return list.IndexOf(panel);\r
-                       }\r
-                       [MonoTODO]\r
-                       public virtual void Insert(int index, StatusBarPanel panel)\r
-                       {\r
-                               string method_string = "Insert(int,StatusBarPanel) ";\r
-                               if (panel == null) {\r
-\r
-                                       throw new ArgumentNullException(class_string + method_string + "panel == null");\r
-                               }\r
-                               if (panel.Parent == null) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "panel.Parent != null");\r
-                               }\r
-                               if  (panel.AutoSize != StatusBarPanelAutoSize.None &&\r
-                                    panel.AutoSize != StatusBarPanelAutoSize.Contents &&\r
-                                    panel.AutoSize != StatusBarPanelAutoSize.Spring)\r
-                               {\r
-                                       throw new InvalidEnumArgumentException(class_string + method_string + "panel.AutoSize is not a valid StatusBarPanelAutoSize value");\r
-                               }\r
-                               list.Insert(index,panel);\r
-                               \r
-                                                     // do this after insert because insert does the range checking and might throw an exception\r
-                               // FIXME: StatusBarPanel.Parent is readonly!\r
-                               // panel.Parent = owner; // a rethrow for a better exception message, or an extra range check, would incur an unnecessary performance cost\r
-                       }\r
-                       public virtual void Remove(StatusBarPanel panel)\r
-                       {\r
-                               string method_string = "Remove(StatusBarPanel) ";\r
-                               if (panel == null) {\r
-\r
-                                       throw new ArgumentNullException(class_string + method_string + "panel == null");\r
-                               }\r
-                               list.Remove(panel);\r
-                       }\r
-                       public virtual void RemoveAt(int index)\r
-                       {\r
-                               list.RemoveAt(index);\r
-                       }\r
-                       void ICollection.CopyTo(Array dest, int index)\r
-                       {\r
-                               string method_string = "ICollection.CopyTo(Array,int) ";\r
-                               if (dest == null) {\r
-\r
-                                       throw new ArgumentNullException(class_string + method_string + "array == null");\r
-                               }\r
-                               if (index < 0) {\r
-\r
-                                       throw new ArgumentOutOfRangeException(class_string + method_string + "index < 0");\r
-                               }\r
-                               if (dest.Rank != 1) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "array is multidimensional");\r
-                               }\r
-                               if (index >= dest.Length) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "index >= array.Length");\r
-                               }\r
-                               if (Count+index >= dest.Length) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "insufficient array capacity");\r
-                               }\r
-                               // easier/quicker to let the runtime throw the invalid cast exception if necessary\r
-                               for (int i = 0; index < dest.Length; i++, index++) {\r
-\r
-                                       dest.SetValue(list[i], index);\r
-                               }\r
-                       }\r
-                       int IList.Add(object panel)\r
-                       {\r
-                               string method_string = "IList.Add(object) ";\r
-                               if (!(panel is StatusBarPanel)) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "panel is not a StatusBarPanel");\r
-                               }\r
-                               return Add((StatusBarPanel) panel);\r
-                       }\r
-                       bool IList.Contains(object panel)\r
-                       {\r
-                               if (!(panel is StatusBarPanel)) {\r
-\r
-                                       return false;\r
-                               }\r
-                               return Contains((StatusBarPanel) panel);\r
-                       }\r
-                       int IList.IndexOf(object panel)\r
-                       {\r
-                               if (!(panel is StatusBarPanel)) {\r
-\r
-                                       return -1;\r
-                               }\r
-                               return IndexOf((StatusBarPanel) panel);\r
-                       }\r
-                       void IList.Insert(int index, object panel)\r
-                       {\r
-                               string method_string = "IList.Insert(int,object) ";\r
-                               if (!(panel is StatusBarPanel)) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "panel is not a StatusBarPanel");\r
-                               }\r
-                               Insert(index, (StatusBarPanel) panel);\r
-                       }\r
-                       void IList.Remove(object panel)\r
-                       {\r
-                               string method_string = "IList.Remove(object) ";\r
-                               if (!(panel is StatusBarPanel)) {\r
-\r
-                                       throw new ArgumentException(class_string + method_string + "panel is not a StatusBarPanel");\r
-                               }\r
-                               Remove((StatusBarPanel) panel);\r
-                       }\r
-\r
-                       \r
-                       //  --- Public Properties\r
-                       [MonoTODO]\r
-                       public int Count {\r
-                               get { throw new NotImplementedException (); }\r
-                               //get { return list.Count; }\r
-                       }\r
-                       public bool IsReadOnly {\r
-\r
-                               get { return false; }\r
-                       }\r
-                       object IList.this[int index] {\r
-\r
-                               get { return this[index]; }\r
-                               set { this[index]=(StatusBarPanel)value; }\r
-                       }\r
-                       public virtual StatusBarPanel this[int index] {\r
-\r
-                               get\r
-                               {\r
-                                       // The same checks are done by the list, so this is redundant\r
-                                       // This is left here in case you prefer better exception messages over performance\r
-                                       //string method_string = "get_Item(int) ";\r
-                                       //if (index < 0)\r
-                                       //{\r
-                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index < 0");\r
-                                       //}\r
-                                       //if (index >= Count)\r
-                                       //{\r
-                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index >= Count");\r
-                                       //}\r
-                                       return (StatusBarPanel)list[index];\r
-                               }\r
-                               set\r
-                               {\r
-                                       // The same checks are done by the list, so this is redundant\r
-                                       // This is left here in case you prefer better exception messages over performance\r
-                                       //string method_string = "set_Item(int,StatusBarPanel) ";\r
-                                       //if (index < 0)\r
-                                       //{\r
-                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index < 0");\r
-                                       //}\r
-                                       //if (index >= Count)\r
-                                       //{\r
-                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index >= Count");\r
-                                       //}\r
-                                       //if (value == null)\r
-                                       //{\r
-                                       //      throw new ArgumentNullException(class_string + method_string + "panel == null");\r
-                                       //}\r
-                                       list[index] = value;\r
-                               }\r
-                       }\r
-                       bool IList.IsFixedSize {\r
-                               [MonoTODO] get { throw new NotImplementedException (); }\r
-                       }\r
-                       object ICollection.SyncRoot {\r
-\r
-                               [MonoTODO] get { throw new NotImplementedException (); }\r
-                       }\r
-                       bool ICollection.IsSynchronized {\r
-\r
-                               [MonoTODO] get { throw new NotImplementedException (); }\r
-                       }\r
-                       \r
-                       \r
-                       //  --- Private Properties\r
-                       \r
-                       private bool IsFixedSize { get { return false; } }\r
-\r
-//                     private object ILList.this[int index]\r
-//                     {\r
-//                             get { return (StatusBarPanel) this[index]; }\r
-//                             set\r
-//                             {\r
-//                                     string method_string = "IList.set_Item(int,object) ";\r
-//                                     if (!(value is StatusBarPanel))\r
-//                                     {\r
-//                                             throw new ArgumentException(class_string + method_string + "panel is not a StatusBarPanel");\r
-//                                     }\r
-//                                     this[index] = (StatusBarPanel) value;\r
-//                             }\r
-//                     }\r
-               }\r
-       }\r
-}\r
-\r
+//
+// System.Windows.Forms.StatusBar.cs
+//
+// Author:
+//   stubbed out by Daniel Carrera (dcarrera@math.toronto.edu)
+//   stubbed out by Richard Baumann (biochem333@nyc.rr.com)
+//   Dennis Hayes (dennish@Raytek.com)
+//   Aleksey Ryabchuk (ryabchuk@yahoo.com)
+//
+// (C) 2002/3 Ximian, Inc
+//
+
+using System;
+using System.Collections;
+using System.Drawing;
+using System.ComponentModel;
+using System.Runtime.InteropServices;
+
+namespace System.Windows.Forms {
+
+       // <summary>
+       //      Represents a Windows status bar control.
+       // </summary>
+       public class StatusBar : Control {
+
+               private bool sizingGrip;
+               private bool showPanels;
+               private StatusBarPanelCollection panels;
+               private string  stext;
+               private const int GripSize = 16;   // FIXME: get size from SystemMetrics
+               private const int PanelGap = 2;    // FIXME: get size from StatusBar
+               private const int TextOffset = 3;
+               internal DockStyle dockstyle;
+
+               public StatusBar() : base()
+               {
+                       Dock = DockStyle.Bottom;
+                       showPanels = false;
+                       sizingGrip = true;
+                       base.TabStop = false;
+               }
+
+               public override string ToString()
+               {
+                       string str = "System.Windows.Forms.StatusBar, Panels.Count: ";
+                       str += Panels.Count;
+                       for ( int i = 0; i < Panels.Count ; i++ ) {
+                               
+                               str += ", Panels[" + i + "]: " + Panels[i].ToString ( );
+                       }
+                       return str;
+               }
+
+               protected override void CreateHandle()
+               {
+                       initCommonControlsLibrary ( );
+                       base.CreateHandle();
+               }
+
+               [MonoTODO]
+               protected override void Dispose(bool disposing) {
+                       // FIXME:
+                       base.Dispose(disposing);
+               }
+
+               protected virtual void OnDrawItem(StatusBarDrawItemEventArgs e)
+               {
+                       if( DrawItem != null)
+                               DrawItem ( this, e );
+               }
+
+               protected override void OnHandleCreated(EventArgs e)
+               {
+                       base.OnHandleCreated(e);
+                       SetPanelsImpl ( );
+               }
+
+               [MonoTODO]
+               protected override void OnHandleDestroyed(EventArgs e)
+               {
+                       //FIXME:
+                       base.OnHandleDestroyed(e);
+               }
+
+               [MonoTODO]
+               protected override void OnLayout(LayoutEventArgs e)
+               {
+                       base.OnLayout(e);
+                       if ( IsHandleCreated )
+                               UpdateParts ( );
+               }
+
+               [MonoTODO]
+               protected override void OnMouseDown(MouseEventArgs e)
+               {
+                       //FIXME:
+                       base.OnMouseDown(e);
+               }
+
+               protected virtual void OnPanelClick(StatusBarPanelClickEventArgs e)
+               {
+                       if ( PanelClick != null )
+                               PanelClick ( this , e );
+               }
+
+               [MonoTODO]
+               protected override void OnResize(EventArgs e)
+               {
+                       UpdatePanels( true, false, null );
+                       base.OnResize(e);
+               }
+
+               [MonoTODO]
+               protected override void WndProc(ref Message m)
+               {
+                       switch ( m.Msg ) {
+                       case Msg.WM_DRAWITEM:
+                               DRAWITEMSTRUCT dis = new DRAWITEMSTRUCT();
+                               dis = (DRAWITEMSTRUCT)Marshal.PtrToStructure( m.LParam, dis.GetType() );
+                               
+                               if ( dis.itemID < Panels.Count ) {
+                                       OnDrawItem (
+                                               new StatusBarDrawItemEventArgs (
+                                               Graphics.FromHdc ( dis.hDC ),
+                                               Font,
+                                               new Rectangle(  dis.rcItem.left,
+                                               dis.rcItem.top,
+                                               dis.rcItem.right - dis.rcItem.left,
+                                               dis.rcItem.bottom - dis.rcItem.top),
+                                               dis.itemID,
+                                               (DrawItemState)dis.itemState,
+                                               Panels[dis.itemID] ) );
+                               }
+                               m.Result = (IntPtr)1;
+                       break;
+                       case Msg.WM_NOTIFY:
+                               // FIXME
+                       break;
+                       default:
+                               base.WndProc(ref m);
+                       break;
+                       }
+               }
+
+               public event StatusBarDrawItemEventHandler DrawItem;
+               public event StatusBarPanelClickEventHandler PanelClick;
+
+               public override Color BackColor {
+                       get {   return base.BackColor;  }
+                       set {   base.BackColor = value; }
+               }
+
+               public override Image BackgroundImage {
+                       get {   return base.BackgroundImage;    }
+                       set {   base.BackgroundImage = value;   }
+               }
+
+               //FIXME:
+               [MonoTODO]
+               public override DockStyle Dock {
+                       get {
+                               return dockstyle;
+                       }
+                       set {
+                               dockstyle =  value;
+                       }
+               }
+
+               public override Font Font {
+
+                       get { return base.Font; }
+                       set { base.Font = value; }
+               }
+
+               public override Color ForeColor {
+
+                       get { return base.ForeColor; }
+                       set { base.ForeColor = value; }
+               }
+
+               public new ImeMode ImeMode {
+
+                       get { return DefaultImeMode; }
+                       set {  }
+               }
+
+               public StatusBar.StatusBarPanelCollection Panels {
+                       get { 
+                               if( panels == null )
+                                       panels = new StatusBar.StatusBarPanelCollection( this );
+                               return panels;
+                       }
+               }
+
+               public bool ShowPanels {
+                       get { return showPanels; }
+                       set {
+                               showPanels = value; 
+                               SetPanelsImpl ( );
+                       }
+               }
+
+               [MonoTODO]
+               public bool SizingGrip
+               {
+                       get { return sizingGrip; }
+                       set { 
+                               // the only way to get rid of the grip dynamically
+                               // is to recreate window
+                               bool recreate = sizingGrip != value;
+                               sizingGrip = value;
+                               if ( IsHandleCreated && recreate )
+                                       RecreateHandle();
+                       }
+               }
+
+               [MonoTODO]
+               public new bool TabStop {
+                       get { return false; }
+                       set {  } 
+               }
+
+               [MonoTODO]
+               public override string Text {
+                       get {   // should reuse base.Text ?
+                               return stext;
+                       }
+                       set {
+                               stext = value;
+                               if ( IsHandleCreated )
+                                       UpdateStatusText ( );
+                       }
+               }
+
+               //
+               //  --- Protected Properties
+               //
+               [MonoTODO]
+               protected override CreateParams CreateParams {
+                       get {
+                               CreateParams createParams = base.CreateParams;
+
+                               createParams.ClassName = "msctls_statusbar32";
+
+                               createParams.Style = (int) (
+                                       WindowStyles.WS_CHILD | 
+                                       WindowStyles.WS_VISIBLE |
+                                       WindowStyles.WS_OVERLAPPED |
+                                       WindowStyles.WS_CLIPCHILDREN |
+                                       WindowStyles.WS_CLIPCHILDREN ) |
+                                       (int)( CommonControlStyles.CCS_NORESIZE );
+
+                               if( SizingGrip )
+                                       createParams.Style |= (int)StatusbarControlStyles.SBARS_SIZEGRIP;
+
+                               createParams.Style |= (int)StatusbarControlStyles.SBT_TOOLTIPS;
+
+                               return createParams;
+                       }               
+               }
+
+               protected override ImeMode DefaultImeMode {
+                       get { return ImeMode.Disable; }
+               }
+
+               protected override Size DefaultSize {
+                       get { return new Size ( 100, 22 ); }
+               }
+               
+               internal  void UpdateParts ( )  {
+                       if ( Panels.Count > 0) {
+                               int[] array = new int[ panels.Count ];
+
+                               CalculatePanelWidths ( array );
+                               int size = array.Length;
+
+                               IntPtr buffer = Marshal.AllocHGlobal ( Marshal.SizeOf( size ) * size );
+                               Marshal.Copy( array, 0, buffer, size );
+                               Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SETPARTS, size, buffer.ToInt32() );
+                               Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SIMPLE, 0, 0 );
+                               Marshal.FreeHGlobal ( buffer );
+                       }
+                       else {
+                               Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SIMPLE, 1, 0 );
+                               UpdateStatusText ( );
+                       }
+               }
+
+               internal  void UpdateText ( StatusBarPanel p ) {
+                       // if p is not null then this call is request to 
+                       // update text in some specific panel
+                       for (int i = 0; i < panels.Count; i++ ) {
+                               if ( p != null && p != panels[i] )
+                                       continue;
+
+                               int DrawStyle = i;
+                                               
+                               if ( panels[i].Style == StatusBarPanelStyle.OwnerDraw )
+                                       DrawStyle |= (int)StatusbarDrawType.SBT_OWNERDRAW;
+
+                               switch ( panels[i].BorderStyle ) 
+                               {
+                                       case StatusBarPanelBorderStyle.None:
+                                               DrawStyle |= (int)StatusbarDrawType.SBT_NOBORDERS;
+                                               break;
+                                       case StatusBarPanelBorderStyle.Raised:
+                                               DrawStyle |= (int)StatusbarDrawType.SBT_POPOUT;
+                                               break;
+                               }
+
+                               string TextToSet;
+                               
+                               switch ( panels[i].Alignment ) {
+                               case HorizontalAlignment.Center:
+                                       TextToSet = panels[i].Text.Insert( 0, "\t" );
+                               break;
+                               case HorizontalAlignment.Right:
+                                       TextToSet = panels[i].Text.Insert( 0, "\t\t" );
+                               break;
+                               default:
+                                       TextToSet = panels[i].Text;
+                               break;
+                               }
+
+                               Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SETTEXT, DrawStyle,
+                                                       TextToSet );
+                       }
+               }
+
+               internal  void UpdateToolTips ( StatusBarPanel p ) {
+                       // if p == null set tooltips for each panel
+                       for (int i = 0; i < panels.Count; i++ ) {
+                               if ( p != null && p != panels[i] )
+                                       continue;
+
+                               Win32.SendMessage ( Handle, (int)StatusbarMessages.SB_SETTIPTEXT, i ,
+                                                       panels[i].ToolTipText );
+                       }
+               }
+
+               internal  void UpdatePanels ( bool updateParts, bool updateText, StatusBarPanel p ) {
+                       if ( IsHandleCreated ) {
+                               if ( updateParts )
+                                       UpdateParts ( );
+
+                               if ( updateText )
+                                       UpdateText( p );
+
+                               Invalidate( );
+                       }
+               }
+
+               protected void CalculatePanelWidths ( int[] array ) {
+                       int[] WidthArray = new int[panels.Count];
+
+                       int FixedWidth = ClientSize.Width - (SizingGrip == true ? GripSize : 0);
+                       int NumSpringPanels = 0;
+
+                       for (int i = 0; i < panels.Count; i++ ) {
+                               switch ( panels[i].AutoSize ) {
+                               case StatusBarPanelAutoSize.None: 
+                                       WidthArray[i] = panels[i].Width + (PanelGap + TextOffset)*2;
+                               break;
+                               case StatusBarPanelAutoSize.Contents:
+                                       WidthArray[i] = panels[i].GetContentWidth( ) + (PanelGap + TextOffset)*2;
+                               break;
+                               default:
+                                       WidthArray[i] = 0;
+                                       NumSpringPanels++;
+                               break;
+                               }
+                               FixedWidth   -= WidthArray[i];
+                       }
+
+                       int SpringPanelLength = 0;
+                       if ( NumSpringPanels > 0 && FixedWidth > 0)
+                               SpringPanelLength = FixedWidth / NumSpringPanels;
+
+                       for (int i = 0; i < panels.Count; i++ ) {
+                               if ( panels[i].AutoSize == StatusBarPanelAutoSize.Spring) 
+                                       WidthArray[i] = SpringPanelLength > panels[i].MinWidth ? 
+                                                       SpringPanelLength : panels[i].MinWidth;
+                       }
+
+                       for (int i = 0; i < panels.Count; i++ )
+                               array[i] = WidthArray[i] + (i == 0 ? 0 : array[i - 1]);
+               }
+
+               internal  void UpdateStatusText ( ){
+                       Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SETTEXT,
+                                               255 | (int)StatusbarDrawType.SBT_NOBORDERS, Text );
+               }
+
+               internal  void SetPanelsImpl ( ) {
+                       if( IsHandleCreated ) {
+                               if ( base.Font.ToHfont ( ) != IntPtr.Zero )
+                                       Win32.SendMessage ( Handle, Msg.WM_SETFONT, base.Font.ToHfont().ToInt32(), 0 );
+
+                               if( panels == null || panels.Count == 0 || showPanels == false) {
+                                       Win32.SendMessage( Handle, (int)StatusbarMessages.SB_SIMPLE, 1, 0 );
+                                       UpdateStatusText ( );
+                               }
+                               else {
+                                       UpdatePanels ( true, true, null );
+                                       UpdateToolTips ( null );
+                               }
+                       }
+               }
+
+               private void initCommonControlsLibrary ( ) {
+                       if ( !RecreatingHandle ) {
+                               INITCOMMONCONTROLSEX    initEx = new INITCOMMONCONTROLSEX();
+                               initEx.dwICC = CommonControlInitFlags.ICC_BAR_CLASSES;
+                               Win32.InitCommonControlsEx(initEx);
+                       }
+               }
+
+               //
+               // System.Windows.Forms.StatusBar.StatusBarPanelCollection
+               //
+               // Author:
+               //   stubbed out by Richard Baumann (biochem333@nyc.rr.com)
+               //   stub ammended by Jaak Simm (jaaksimm@firm.ee)
+               //   Implemented by Richard Baumann <biochem333@nyc.rr.com>
+               // (C) Ximian, Inc., 2002
+               //
+               // <summary>
+               //      Represents the collection of panels in a StatusBar control.
+               // </summary>
+               public class StatusBarPanelCollection : IList, ICollection, IEnumerable {
+                       private ArrayList list;
+                       private StatusBar owner;
+
+                       public StatusBarPanelCollection( StatusBar owner ) : base() {
+                               list = new ArrayList();
+                               this.owner = owner;
+                       }
+
+                       public virtual int Add( StatusBarPanel value ) {
+                               if (value == null)
+                                       throw new ArgumentNullException("value");
+
+                               if (value.Parent != null)
+                                       throw new ArgumentException("Object already has a parent.", "value");
+
+                               value.SetParent( owner );
+                               int Index = list.Add( value );
+
+                               owner.UpdatePanels ( true, true, null );
+                               return Index;
+                       }
+
+                       public virtual StatusBarPanel Add( string text ) {
+                               StatusBarPanel panel = new StatusBarPanel();
+                               panel.Text = text;
+                               this.Add ( panel );
+                               return panel;
+                       }
+
+                       public virtual void AddRange(StatusBarPanel[] panels) {
+                               if (panels == null)
+                                       throw new ArgumentNullException("panels");
+
+                               // do we need to check for panel.Parent
+                               // like it is done in Add(StatusBarPanel) ?
+
+                               for (int i = 0; i < panels.Length; i++)
+                                       panels[i].SetParent( owner );
+
+                               list.AddRange(panels);
+                               owner.UpdatePanels ( true, true, null );
+                       }
+
+                       public virtual void Clear() {
+                               for (int i = 0; i < list.Count; i++ )
+                                       ((StatusBarPanel)list[i]).SetParent ( null );
+
+                               list.Clear();
+                               owner.UpdatePanels ( true, true, null );
+                       }
+
+                       public bool Contains(StatusBarPanel panel) {
+                               return list.Contains(panel);
+                       }
+
+                       public IEnumerator GetEnumerator() {
+                               return list.GetEnumerator();
+                       }
+
+                       public int IndexOf(StatusBarPanel panel) {
+                               return list.IndexOf(panel);
+                       }
+
+                       public virtual void Insert(int index, StatusBarPanel value) {
+                               if (value == null)
+                                       throw new ArgumentNullException ( "value" );
+
+                               if (value.Parent != null)
+                                       throw new ArgumentException ( "Object already has a parent.", "value" );
+
+                               if (index < 0 || index > Count )
+                                       throw new ArgumentOutOfRangeException( "index" );
+
+                               // very strange place to check autosize property :-))
+                               if ( !Enum.IsDefined ( typeof(StatusBarPanelAutoSize), value.AutoSize ) )
+                                       throw new InvalidEnumArgumentException( "AutoSize",
+                                               (int)value.AutoSize,
+                                               typeof(StatusBarPanelAutoSize));
+
+                               list.Insert(index, value);
+                               value.SetParent ( owner ); 
+                               owner.UpdatePanels ( true, true , null );
+                       }
+
+                       public virtual void Remove(StatusBarPanel value) {
+                               if (value == null)
+                                       throw new ArgumentNullException( "value" );
+
+                               list.Remove( value );
+                               value.SetParent ( null );
+                       }
+
+                       public virtual void RemoveAt(int index) {
+                               if (index < 0 || index > Count )
+                                       throw new ArgumentOutOfRangeException( "index" );
+
+                               StatusBarPanel p = (StatusBarPanel)list[index];
+                               list.RemoveAt(index);
+                               p.SetParent ( null );
+                               owner.UpdatePanels( true, true, null );
+                       }
+
+                       [MonoTODO]
+                       // This member supports the .NET Framework 
+                       void ICollection.CopyTo(Array array, int index) {
+                               if (array == null)
+                                       throw new ArgumentNullException ( "array" );
+
+                               if (index < 0)
+                                       throw new ArgumentOutOfRangeException ( "index" );
+
+                               if (array.Rank != 1 || index >= array.Length || Count+index >= array.Length)
+                                       throw new ArgumentException ( ); // FIXME: messages
+
+                               // easier/quicker to let the runtime throw the invalid cast exception if necessary
+                               for (int i = 0; index < array.Length; i++, index++)
+                                       array.SetValue(list[i], index);
+                       }
+                       
+                       [MonoTODO]
+                       int IList.Add(object panel)
+                       {
+                               if (!(panel is StatusBarPanel))
+                                       throw new ArgumentException();//FIXME: message
+                               return Add((StatusBarPanel) panel);
+                       }
+
+                       bool IList.Contains(object panel)
+                       {
+                               if (!(panel is StatusBarPanel))
+                                       return false;
+                               return Contains((StatusBarPanel) panel);
+                       }
+
+                       int IList.IndexOf(object panel) {
+                               if (!(panel is StatusBarPanel))
+                                       return -1;
+                               return IndexOf((StatusBarPanel) panel);
+                       }
+
+                       [MonoTODO]
+                       void IList.Insert(int index, object panel)
+                       {
+                               if (!(panel is StatusBarPanel))
+                                       throw new ArgumentException();//FIXME: message
+
+                               Insert(index, (StatusBarPanel) panel);
+                       }
+
+                       [MonoTODO]
+                       void IList.Remove(object panel)
+                       {
+                               if (!(panel is StatusBarPanel))
+                                       throw new ArgumentException(); //FIXME: message
+
+                               Remove((StatusBarPanel) panel);
+                       }
+
+                       
+                       public int Count {
+                               get { return list.Count; }
+                       }
+
+                       public bool IsReadOnly {
+                               get { return false; }
+                       }
+
+                       object IList.this[int index] {
+                               get { return this[index]; }
+                               set { this[index]= (StatusBarPanel)value; }
+                       }
+
+                       public virtual StatusBarPanel this[int index] {
+                               get
+                               {
+                                       // The same checks are done by the list, so this is redundant
+                                       // This is left here in case you prefer better exception messages over performance
+                                       //string method_string = "get_Item(int) ";
+                                       //if (index < 0)
+                                       //{
+                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index < 0");
+                                       //}
+                                       //if (index >= Count)
+                                       //{
+                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index >= Count");
+                                       //}
+                                       return (StatusBarPanel)list[index];
+                               }
+                               set
+                               {
+                                       // The same checks are done by the list, so this is redundant
+                                       // This is left here in case you prefer better exception messages over performance
+                                       //string method_string = "set_Item(int,StatusBarPanel) ";
+                                       //if (index < 0)
+                                       //{
+                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index < 0");
+                                       //}
+                                       //if (index >= Count)
+                                       //{
+                                       //      throw new ArgumentOutOfRangeException(class_string + method_string + "index >= Count");
+                                       //}
+                                       //if (value == null)
+                                       //{
+                                       //      throw new ArgumentNullException(class_string + method_string + "panel == null");
+                                       //}
+                                       list[index] = value;
+                               }
+                       }
+
+                       bool IList.IsFixedSize {
+                               [MonoTODO] get { throw new NotImplementedException (); }
+                       }
+
+                       object ICollection.SyncRoot {
+
+                               [MonoTODO] get { throw new NotImplementedException (); }
+                       }
+
+                       bool ICollection.IsSynchronized {
+
+                               [MonoTODO] get { throw new NotImplementedException (); }
+                       }
+                       
+                       private bool IsFixedSize { get { return false; } }
+               }
+       }
+}
+