This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.Windows.Forms / System.Windows.Forms / TextBoxBase.cs
index 4968aa48598110f395f325b50351559ee6128f2c..534cb9cf2cfb89eddf2fb8181400242dfc7d2d45 100644 (file)
-//\r
-// System.Windows.Forms.TextBoxBase\r
-//\r
-// Author:\r
-//   stubbed out by Jackson Harper (jackson@latitudegeo.com)\r
-//\r
-// (C) 2002 Ximian, Inc\r
-//\r
-\r
-namespace System.Windows.Forms {\r
-\r
-       // <summary>\r
-       //      This is only a template.  Nothing is implemented yet.\r
-       //\r
-       // </summary>\r
-\r
-        //public class TextBoxBase : Control {\r
-\r
-               //\r
-               //  --- Public Properties\r
-               //\r
-               //[MonoTODO]\r
-               //public bool AcceptsTab {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual bool AutoSize {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public override Color BackColor {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public override Image BackgroundImage {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public BorderStyle BorderStyle {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public bool CanUndo {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public override Color ForeColor {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public bool HideSelection {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public string[] Lines {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual int MaxLength {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public bool Modified {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual bool Multiline {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public int PreferredHeight {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public bool ReadOnly {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual string SelectedText {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual int SelectionLength {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public int SelectionStart {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public override string Text {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public virtual int TextLength  {\r
-\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //public bool WordWrap {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //      set\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //\r
-               // --- Public Methods\r
-               //\r
-               //[MonoTODO]\r
-               //public void AppendText(string text) \r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Clear()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void ClearUndo()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Copy()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Cut()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Paste()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void ScrollToCaret()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Select(int start, int length) \r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void SelectAll()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public override string ToString()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //public void Undo()\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //\r
-               // --- Public Events\r
-               //\r
-               //[MonoTODO]\r
-               //public event EventHandler AcceptsTabChanged;\r
-               //[MonoTODO]\r
-               //public event EventHandler AutoSizeChanged;\r
-               //[MonoTODO]\r
-               //public event EventHandler BorderStyleChanged;\r
-               //[MonoTODO]\r
-               //public new event EventHandler Click;\r
-               //[MonoTODO]\r
-               //public event EventHandler HideSelectionChanged;\r
-               //[MonoTODO]\r
-               //public event EventHandler ModifiedChanged;\r
-               //[MonoTODO]\r
-               //public event EventHandler MultilineChanged;\r
-               //[MonoTODO]\r
-               //public event EventHandler ReadOnlyChanged;\r
-        //\r
-        // --- Protected Properties\r
-        //\r
-               //[MonoTODO]\r
-               //protected override CreateParams CreateParams {\r
-               //      get\r
-               //      {\r
-               //              throw new NotImplementedException ();\r
-               //      }\r
-               //}\r
-               //[MonoTODO]\r
-               //protected override Size DefaultSize {\r
-               //      get\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 bool IsInputKey(Keys keyData)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnAcceptsTabChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnAutoSizeChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnBorderStyleChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected override void OnFontChanged(EventArgs 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 virtual void OnHideSelectionChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnModifiedChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnMultilineChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected virtual void OnReadOnlyChanged(EventArgs e)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected override bool ProcessDialogKey(Keys keyData)\r
-               //{\r
-               //      throw new NotImplementedException ();\r
-               //}\r
-               //[MonoTODO]\r
-               //protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)\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
-\r
+//
+// System.Windows.Forms.TextBoxBase.cs
+//
+// Author:
+//   stubbed out by Jackson Harper (jackson@latitudegeo.com)
+//   Dennis Hayes (dennish@Raytek.com)
+//   Aleksey Ryabchuk (ryabchuk@yahoo.com)
+//
+// (C) 2002/3 Ximian, Inc
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System.Drawing;
+using System.ComponentModel;
+using System.Collections.Specialized;
+
+namespace System.Windows.Forms {
+
+       // <summary>
+       // </summary>
+
+        public class TextBoxBase : Control {
+
+               BorderStyle borderStyle;
+               int maxLength;
+               int  selectionStart;
+               int  selectionLength;
+
+               BitVector32 flags;
+               private static readonly int acceptsTab    = BitVector32.CreateMask();
+               private static readonly int autoSize      = BitVector32.CreateMask( acceptsTab );
+               private static readonly int hideSelection = BitVector32.CreateMask( autoSize );
+               private static readonly int modified      = BitVector32.CreateMask( hideSelection );
+               private static readonly int multiline     = BitVector32.CreateMask( modified );
+               private static readonly int readOnly      = BitVector32.CreateMask( multiline );
+               private static readonly int wordWrap      = BitVector32.CreateMask( readOnly );
+
+               private IntPtr backgrBrush;
+
+               internal TextBoxBase ( ) {
+                       SubClassWndProc_ = true;
+
+                       flags = new BitVector32 ( );
+
+                       flags[ autoSize ] = true;
+                       flags[ hideSelection ] = true;
+                       flags[ wordWrap ] = true;
+
+                       borderStyle = BorderStyle.Fixed3D;
+                       selectionStart = -1;
+
+                       base.foreColor = SystemColors.WindowText;
+                       base.backColor = SystemColors.Window;
+                       backgrBrush = IntPtr.Zero;
+
+                       SetStyle ( ControlStyles.FixedHeight, true );
+               }
+
+               [MonoTODO]
+                       //this should be inherited
+               ~TextBoxBase ( )
+               {
+                       if ( backgrBrush != IntPtr.Zero )
+                               Win32.DeleteObject ( backgrBrush );
+               }
+
+               [MonoTODO]
+               public bool AcceptsTab {
+                       get { return flags[ acceptsTab ]; }
+                       set {
+                               if ( flags[ acceptsTab ] != value ) {
+                                       flags[ acceptsTab ] = value;
+                                       OnAcceptsTabChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+
+               [MonoTODO]
+               public virtual bool AutoSize {
+                       get { return flags[ autoSize ]; }
+                       set {
+                               if ( flags[ autoSize ] != value ) {
+                                       flags[ autoSize ] = value;
+                                       OnAutoSizeChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+
+               [MonoTODO]
+               public override Color BackColor {
+                       get { return base.BackColor; }
+                       set {
+                               if ( base.BackColor != value ) {
+                                       base.BackColor = value;
+                                       createBackgroundBrush ( );
+                                       Refresh ( );
+                               }
+                       }
+               }
+
+               [EditorBrowsable (EditorBrowsableState.Never)]   
+               public override Image BackgroundImage {
+                       get { return base.BackgroundImage; }
+                       set { base.BackgroundImage = value;}
+               }
+
+
+               public BorderStyle BorderStyle {
+                       get {   return borderStyle; }
+                       set {
+                               if ( !Enum.IsDefined ( typeof(BorderStyle), value ) )
+                                       throw new InvalidEnumArgumentException( "BorderStyle",
+                                               (int)value,
+                                               typeof(BorderStyle));
+                               
+                               if ( borderStyle != value ) {
+                                       borderStyle = value;
+                                       OnBorderStyleChanged ( EventArgs.Empty );
+                                       RecreateHandle ( );
+                               }
+                       }
+               }
+
+               public bool CanUndo {
+                       get {
+                               if ( IsHandleCreated ) 
+                                       return Win32.SendMessage ( Handle, (int) EditControlMessages.EM_CANUNDO, 0, 0 ) != 0; 
+                               return false;
+                       }
+               }
+
+               [MonoTODO]
+               public override Color ForeColor {
+                       get { return base.ForeColor; }
+                       set {
+                               if ( base.ForeColor == value )
+                                       return;
+
+                               base.ForeColor = value;
+                               createBackgroundBrush ( );
+                               Refresh ( );
+                       }
+               }
+
+               public bool HideSelection {
+                       get {   return flags[ hideSelection ];  }
+                       set {
+                               if ( flags[ hideSelection ] != value ) {
+                                       flags[ hideSelection ] = value;
+                                       RecreateHandle ( );
+                                       OnHideSelectionChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+               [MonoTODO]
+               public string[] Lines {
+                       get
+                       {
+                               throw new NotImplementedException ();
+                       }
+                       set
+                       {
+                               //FIXME:
+                       }
+               }
+
+               public virtual int MaxLength {
+                       get { 
+                               if ( IsHandleCreated ) 
+                                       maxLength = Win32.SendMessage ( Handle, (int) EditControlMessages.EM_GETLIMITTEXT, 0, 0 );
+                               return maxLength;
+                       }
+                       set {
+                               if ( value < 0 )
+                                       throw new ArgumentException (
+                                               string.Format ( "'{0}' is not a valid value for 'MaxLength'.  'MaxLength' must be greater than or equal to 0.", value ),
+                                               "MaxLength" );
+
+                               maxLength = value;
+                               if ( IsHandleCreated )
+                                       Win32.SendMessage ( Handle, (int) EditControlMessages.EM_LIMITTEXT, maxLength, 0 );
+                       }
+               }
+
+               public bool Modified {
+                       get {
+                               if ( IsHandleCreated )
+                                       flags[ modified ] = Win32.SendMessage ( Handle, (int) EditControlMessages.EM_GETMODIFY, 0, 0 ) != 0;
+                               return flags[ modified ];
+                       }
+                       set {
+                               if ( flags[ modified ] != value ) {
+                                       flags[ modified ] = value;
+                                       if ( IsHandleCreated )
+                                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_SETMODIFY, flags[ modified ] ? 1 : 0, 0 );
+                                       OnModifiedChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+
+               public virtual bool Multiline {
+                       get { return flags[ multiline ]; }
+                       set {
+                               if ( flags[ multiline ] != value ) {
+                                       flags[ multiline ] = value;
+
+                                       SetStyle ( ControlStyles.FixedHeight, !value );
+
+                                       RecreateHandle ( );
+                                       OnMultilineChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+
+               [MonoTODO]
+               public int PreferredHeight {
+                       get
+                       {
+                               throw new NotImplementedException ();
+                       }
+               }
+
+               public bool ReadOnly {
+                       get {   return flags[ readOnly ]; }
+                       set {
+                               if ( flags[ readOnly ] != value ) {
+                                       flags[ readOnly ] = value;
+                                       if ( IsHandleCreated )
+                                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_SETREADONLY,
+                                                                       flags[ readOnly ] ? 1 : 0, 0 );
+                                       OnReadOnlyChanged ( EventArgs.Empty );
+                               }
+                       }
+               }
+
+               public virtual string SelectedText {
+                       get {
+                               if ( SelectionStart < 0 || SelectionStart >= TextLength || SelectionLength == 0 )
+                                       return String.Empty;
+
+                               return Text.Substring ( SelectionStart,
+                                                       SelectionStart + SelectionLength <= Text.Length ?
+                                                       SelectionLength : Text.Length - SelectionStart );
+                               
+                       }
+                       set {
+                               if ( IsHandleCreated )
+                                       Win32.SendMessage ( Handle, (int) EditControlMessages.EM_REPLACESEL, -1, value );
+                               else {
+                                       if ( SelectionStart >= 0 && SelectionStart < TextLength && SelectionLength != 0 ) {
+                                               Text =  Text.Remove (   SelectionStart,
+                                                                       SelectionStart + SelectionLength <= Text.Length ?
+                                                                       SelectionLength : Text.Length - SelectionStart )
+                                                                       .Insert (   SelectionStart, value );
+                                       }
+                               }
+                       }
+               }
+
+               public virtual int SelectionLength {
+                       get {
+                               if ( IsHandleCreated ) {
+                                       int selectionEnd = 0;
+                                       Win32.SendMessage2ref ( Handle, (int) EditControlMessages.EM_GETSEL, ref selectionStart, ref selectionEnd );
+                                       selectionLength = selectionEnd - selectionStart;
+                               }
+                               return selectionLength;
+                       }
+                       set {
+                               if ( value < 0 )
+                                       throw new ArgumentException (
+                                               String.Format ( "'{0}' is not a valid value for 'value'.", value ), "SelectionLength" );
+                               
+                               selectionLength = value;
+                               selectImpl ( SelectionStart, selectionLength );
+                       }
+               }
+
+               public int SelectionStart {
+                       get {
+                               if ( IsHandleCreated ) {
+                                       int selectionEnd = 0;
+                                       Win32.SendMessage2ref ( Handle, (int) EditControlMessages.EM_GETSEL, ref selectionStart, ref selectionEnd );
+                               }
+                               return selectionStart;
+                       }
+                       set {
+                               if ( value < 0 )
+                                       throw new ArgumentException (
+                                                       String.Format ( "'{0}' is not a valid value for 'value'.", value ), "SelectionStart" );
+
+                               selectionStart = value;
+                               selectImpl ( selectionStart, SelectionLength );
+                       }
+               }
+
+               [MonoTODO]
+               public override string Text {
+                       get {
+                               return base.Text;
+                       }
+                       set
+                       {
+                               //FIXME:
+                               base.Text = value;
+                       }
+               }
+
+               public virtual int TextLength  {
+                       get {   return Text.Length; }
+               }
+
+               public bool WordWrap {
+                       get {   return flags[ wordWrap ]; }
+                       set {
+                               if ( flags[ wordWrap ] != value ) {
+                                       flags[ wordWrap ] = value;
+                                       RecreateHandle ( );
+                               }
+                       }
+               }
+               
+               // --- Public Methods
+               
+               [MonoTODO]
+               public void AppendText(string text) 
+               {
+                       if ( !IsHandleCreated )
+                               Text += text;
+                       else {
+                               selectImpl ( TextLength, 1 );
+                               if ( IsHandleCreated )
+                                       Win32.SendMessage ( Handle, (int) EditControlMessages.EM_REPLACESEL, -1, text );
+                       }
+               }
+               
+               public void Clear()
+               {
+                       Text = String.Empty;
+               }
+
+               public void ClearUndo()
+               {
+                       if ( IsHandleCreated )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_EMPTYUNDOBUFFER, 0, 0 );
+               }
+
+               [MonoTODO]
+               public void Copy()
+               {
+                       //FIXME:
+               }
+               [MonoTODO]
+               public void Cut()
+               {
+                       //FIXME:
+               }
+               [MonoTODO]
+               public void Paste()
+               {
+                       //FIXME:
+               }
+               [MonoTODO]
+               public void ScrollToCaret()
+               {
+                       //FIXME:
+               }
+
+               public void Select(int start, int length) 
+               {
+                       if ( start < 0 )
+                               throw new ArgumentException ( 
+                                       String.Format ( " '{0}' is not a valid value for 'start'.", start ) );
+
+                       if ( length < 0 )
+                               throw new ArgumentException ( 
+                                       String.Format ( " '{0}' is not a valid value for 'length'.", length ) );
+
+                       selectImpl ( start, length );
+               }
+               
+               public void SelectAll()
+               {
+                       Select ( 0, TextLength );
+               }
+
+               public override string ToString()
+               {
+                       return GetType( ).FullName.ToString ( ) + ", Text: " + Text;
+               }
+
+               public void Undo()
+               {
+                       if ( IsHandleCreated )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_UNDO, 0, 0 );
+               }
+               
+               // --- Public Events
+               
+               public event EventHandler AcceptsTabChanged;
+               public event EventHandler AutoSizeChanged;
+               public event EventHandler BorderStyleChanged;
+               //[MonoTODO]
+               //public event EventHandler Click;
+               public event EventHandler HideSelectionChanged;
+               public event EventHandler ModifiedChanged;
+               public event EventHandler MultilineChanged;
+               public event EventHandler ReadOnlyChanged;
+        
+        // --- Protected Properties
+        
+               [MonoTODO]
+               protected override CreateParams CreateParams {
+                       get {
+                               CreateParams createParams = base.CreateParams;
+                               
+                               switch ( BorderStyle ) {
+                               case BorderStyle.Fixed3D:
+                                       createParams.ExStyle |= (int)WindowExStyles.WS_EX_CLIENTEDGE;
+                               break;
+                               case BorderStyle.FixedSingle:
+                                       createParams.Style |= (int) WindowStyles.WS_BORDER;
+                               break;
+                               };
+
+                               if ( !HideSelection )
+                                       createParams.Style |= (int) EditControlStyles.ES_NOHIDESEL;
+
+                               if ( Multiline ) {
+                                       createParams.Style |= (int) EditControlStyles.ES_MULTILINE;
+                                       createParams.Style |= (int) EditControlStyles.ES_AUTOVSCROLL;
+                               }
+
+                               if ( !WordWrap )
+                                       createParams.Style |= (int) EditControlStyles.ES_AUTOHSCROLL;
+
+                               return createParams; 
+                       }
+               }
+
+               protected override Size DefaultSize {
+                       get { return new Size(100,20); }
+               }
+               
+               // --- Protected Methods
+               
+               [MonoTODO]
+               protected override void CreateHandle()
+               {
+                       //FIXME:
+                       base.CreateHandle();
+               }
+               [MonoTODO]
+               protected override bool IsInputKey(Keys keyData)
+               {
+                       //FIXME:
+                       return base.IsInputKey(keyData);
+               }
+
+               protected virtual void OnAcceptsTabChanged(EventArgs e)
+               {
+                       if ( AcceptsTabChanged != null )
+                               AcceptsTabChanged ( this, e );
+               }
+
+               protected virtual void OnAutoSizeChanged(EventArgs e)
+               {
+                       if ( AutoSizeChanged != null )
+                               AutoSizeChanged ( this, e );
+               }
+
+               protected virtual void OnBorderStyleChanged(EventArgs e)
+               {
+                       if ( BorderStyleChanged != null )
+                               BorderStyleChanged ( this, e );                 
+               }
+
+               [MonoTODO]
+               protected override void OnFontChanged(EventArgs e)
+               {
+                       //FIXME:
+                       base.OnFontChanged(e);
+               }
+               [MonoTODO]
+               protected override void OnHandleCreated(EventArgs e)
+               {
+                       //FIXME:
+                       base.OnHandleCreated(e);
+
+                       if ( maxLength != 0 )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_LIMITTEXT, maxLength, 0 );
+                       if ( flags[ modified ] )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_SETMODIFY, flags[ modified ] ? 1 : 0, 0 );
+                       if ( ReadOnly )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_SETREADONLY, ReadOnly ? 1 : 0, 0 );
+                       
+                       selectImpl ( selectionStart, selectionLength );
+               }
+
+               [MonoTODO]
+               protected override void OnHandleDestroyed(EventArgs e)
+               {
+                       //FIXME:
+                       base.OnHandleDestroyed(e);
+               }
+
+               protected virtual void OnHideSelectionChanged(EventArgs e)
+               {
+                       if ( HideSelectionChanged != null )
+                               HideSelectionChanged ( this, e );
+               }
+
+               protected virtual void OnModifiedChanged(EventArgs e)
+               {
+                       if ( ModifiedChanged != null )
+                               ModifiedChanged ( this, e );
+               }
+
+               protected virtual void OnMultilineChanged(EventArgs e)
+               {
+                       if ( MultilineChanged != null )
+                               MultilineChanged ( this, e );
+               }
+
+               protected virtual void OnReadOnlyChanged(EventArgs e)
+               {
+                       if ( ReadOnlyChanged != null )
+                               ReadOnlyChanged ( this, e );
+               }
+               [MonoTODO]
+               protected override bool ProcessDialogKey(Keys keyData)
+               {
+                       //FIXME:
+                       return base.ProcessDialogKey(keyData);
+               }
+               [MonoTODO]
+               protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
+               {
+                       //FIXME:
+                       base.SetBoundsCore(x, y, width, height, specified);
+               }
+               [MonoTODO]
+               protected override void WndProc(ref Message m)
+               {
+                       switch ((Msg) m.Msg ) {
+                       case Msg.WM_CTLCOLOREDIT:
+                       case Msg.WM_CTLCOLORSTATIC:
+                               if ( backgrBrush != IntPtr.Zero ) {
+                                       Win32.SetTextColor ( m.WParam, Win32.RGB ( ForeColor ) );
+                                       Win32.SetBkColor ( m.WParam, (uint)Win32.RGB ( BackColor ) );
+                                       m.Result = backgrBrush;
+                               }
+                               else
+                                       CallControlWndProc ( ref m );
+                       break;
+                       case Msg.WM_COMMAND:
+                               if ( m.HiWordWParam == (int) EditControlNotifications.EN_CHANGE )
+                                       OnTextChanged ( EventArgs.Empty );
+
+                               CallControlWndProc ( ref m );
+                       break;
+                       default:
+                               base.WndProc(ref m);
+                       break;
+                       }
+               }
+
+               private void selectImpl ( int start, int length ) {
+                       if ( IsHandleCreated )
+                               Win32.SendMessage ( Handle, (int) EditControlMessages.EM_SETSEL, start, start + length );
+                       else {
+                               selectionStart = start;
+                               selectionLength = length;
+                       }
+               }
+               
+               private void createBackgroundBrush ( )
+               {
+                       if ( backgrBrush != IntPtr.Zero )
+                               Win32.DeleteObject ( backgrBrush );
+                       
+                       backgrBrush = Win32.CreateSolidBrush ( Win32.RGB ( BackColor ) );
+               }
+       }
+}
+