2008-06-02 Andy Hume <andyhume32@yahoo.co.uk>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / TextBox.cs
index 292f6ccd285c0d73f406ddafefc3120644036362..145d9550d165a5a52c2eaab60a14444ea75940d3 100644 (file)
@@ -38,6 +38,8 @@ namespace System.Windows.Forms {
 
 #if NET_2_0
        [ComVisible(true)]
+       [ClassInterface (ClassInterfaceType.AutoDispatch)]
+       [Designer ("System.Windows.Forms.Design.TextBoxDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
 #endif
        public class TextBox : TextBoxBase {
                #region Variables
@@ -48,6 +50,7 @@ namespace System.Windows.Forms {
                private MenuItem        paste;
                private MenuItem        delete;
                private MenuItem        select_all;
+
 #if NET_2_0
                private bool use_system_password_char = false;
                private AutoCompleteStringCollection auto_complete_custom_source = null;
@@ -62,6 +65,7 @@ namespace System.Windows.Forms {
                        scrollbars = RichTextBoxScrollBars.None;
                        alignment = HorizontalAlignment.Left;
                        this.LostFocus +=new EventHandler(TextBox_LostFocus);
+                       this.RightToLeftChanged += new EventHandler (TextBox_RightToLeftChanged);
 
                        BackColor = SystemColors.Window;
                        ForeColor = SystemColors.WindowText;
@@ -90,14 +94,67 @@ namespace System.Windows.Forms {
 
                        document.multiline = false;
                }
-               #endregion      // Public Constructors
 
+               #endregion      // Public Constructors
 
                #region Private & Internal Methods
+
+               void TextBox_RightToLeftChanged (object sender, EventArgs e)
+               {
+                       UpdateAlignment ();
+               }
+
                private void TextBox_LostFocus(object sender, EventArgs e) {
                        if (hide_selection)
                                document.InvalidateSelectionArea ();
                }
+
+               private void UpdateAlignment ()
+               {
+                       HorizontalAlignment new_alignment = alignment;
+                       RightToLeft rtol = GetInheritedRtoL ();
+
+                       if (rtol == RightToLeft.Yes) {
+                               if (new_alignment == HorizontalAlignment.Left)
+                                       new_alignment = HorizontalAlignment.Right;
+                               else if (new_alignment == HorizontalAlignment.Right)
+                                       new_alignment = HorizontalAlignment.Left;
+                       }
+
+                       document.alignment = new_alignment;
+
+                       // MS word-wraps if alignment isn't left
+                       if (Multiline) {
+                               if (alignment != HorizontalAlignment.Left) {
+                                       document.Wrap = true;
+                               } else {
+                                       document.Wrap = word_wrap;
+                               }
+                       }
+
+                       for (int i = 1; i <= document.Lines; i++) {
+                               document.GetLine (i).Alignment = new_alignment;
+                       }
+
+                       document.RecalculateDocument (CreateGraphicsInternal ());
+
+                       Invalidate ();  // Make sure we refresh
+               }
+
+               internal override Color ChangeBackColor (Color backColor)
+               {
+                       if (backColor == Color.Empty) {
+#if NET_2_0
+                               if (!ReadOnly)
+                                       backColor = SystemColors.Window;
+#else
+                               backColor = SystemColors.Window;
+#endif
+                               backcolor_set = false;
+                       }
+                       return backColor;
+               }
+
 #if NET_2_0
                void OnAutoCompleteCustomSourceChanged(object sender, CollectionChangeEventArgs e) {
                        if(auto_complete_source == AutoCompleteSource.CustomSource) {
@@ -114,6 +171,8 @@ namespace System.Windows.Forms {
                [Browsable (true)]
                [EditorBrowsable (EditorBrowsableState.Always)]
                [Localizable (true)]
+               [Editor ("System.Windows.Forms.Design.ListControlStringCollectionEditor, " + Consts.AssemblySystem_Design,
+                "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
                public AutoCompleteStringCollection AutoCompleteCustomSource { 
                        get {
                                if(auto_complete_custom_source == null) {
@@ -157,6 +216,7 @@ namespace System.Windows.Forms {
                [Browsable (true)]
                [EditorBrowsable (EditorBrowsableState.Always)]
                [DefaultValue (AutoCompleteSource.None)]
+               [TypeConverter (typeof (TextBoxAutoCompleteSourceConverter))]
                public AutoCompleteSource AutoCompleteSource {
                        get { return auto_complete_source; }
                        set {
@@ -171,13 +231,21 @@ namespace System.Windows.Forms {
                }
 
                [DefaultValue(false)]
+               [RefreshProperties (RefreshProperties.Repaint)]
                public bool UseSystemPasswordChar {
                        get {
                                return use_system_password_char;
                        }
 
                        set {
-                               use_system_password_char = value;
+                               if (use_system_password_char != value) {
+                                       use_system_password_char = value;
+                                       
+                                       if (!Multiline)
+                                               document.PasswordChar = PasswordChar.ToString ();
+                                       else
+                                               document.PasswordChar = string.Empty;
+                               }
                        }
                }
 #endif
@@ -192,7 +260,7 @@ namespace System.Windows.Forms {
                        set {
                                if (value != accepts_return) {
                                        accepts_return = value;
-                               }       
+                               }
                        }
                }
 
@@ -213,6 +281,9 @@ namespace System.Windows.Forms {
                [Localizable(true)]
                [DefaultValue('\0')]
                [MWFCategory("Behavior")]
+#if NET_2_0
+               [RefreshProperties (RefreshProperties.Repaint)]
+#endif
                public char PasswordChar {
                        get {
 #if NET_2_0
@@ -227,9 +298,9 @@ namespace System.Windows.Forms {
                                if (value != password_char) {
                                        password_char = value;
                                        if (!Multiline) {
-                                               document.PasswordChar = value.ToString();
+                                               document.PasswordChar = PasswordChar.ToString ();
                                        } else {
-                                               document.PasswordChar = "";
+                                               document.PasswordChar = string.Empty;
                                        }
                                        this.CalculateDocument();
                                }
@@ -245,6 +316,10 @@ namespace System.Windows.Forms {
                        }
 
                        set {
+                               if (!Enum.IsDefined (typeof (ScrollBars), value))
+                                       throw new InvalidEnumArgumentException ("value", (int) value,
+                                               typeof (ScrollBars));
+
                                if (value != (ScrollBars)scrollbars) {
                                        scrollbars = (RichTextBoxScrollBars)value;
                                        base.CalculateScrollBars();
@@ -252,6 +327,7 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if ONLY_1_1
                [Browsable(false)]
                [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
                public override int SelectionLength {
@@ -262,7 +338,7 @@ namespace System.Windows.Forms {
                                base.SelectionLength = value;
                        }
                }
-
+#endif
 
                public override string Text {
                        get {
@@ -286,27 +362,23 @@ namespace System.Windows.Forms {
                                if (value != alignment) {
                                        alignment = value;
 
-                                       document.alignment = value;
-
-                                       // MS word-wraps if alignment isn't left
-                                       if (Multiline) {
-                                               if (alignment != HorizontalAlignment.Left) {
-                                                       document.Wrap = true;
-                                               } else {
-                                                       document.Wrap = word_wrap;
-                                               }
-                                       }
+                                       UpdateAlignment ();
 
-                                       for (int i = 1; i <= document.Lines; i++) {
-                                               document.GetLine(i).Alignment = value;
-                                       }
-                                       document.RecalculateDocument(CreateGraphicsInternal());
                                        OnTextAlignChanged(EventArgs.Empty);
                                }
                        }
                }
                #endregion      // Public Instance Properties
 
+#if NET_2_0
+               public void Paste (string text)
+               {
+                       document.ReplaceSelection (CaseAdjust (text), false);
+
+                       ScrollToCaret();
+                       OnTextChanged(EventArgs.Empty);
+               }
+#endif
                #region Protected Instance Methods
                protected override CreateParams CreateParams {
                        get {
@@ -314,14 +386,13 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if ONLY_1_1
                protected override ImeMode DefaultImeMode {
                        get {
                                return base.DefaultImeMode;
                        }
                }
-               #endregion      // Protected Instance Methods
-
-               #region Protected Instance Methods
+#endif
 #if NET_2_0
                protected override void Dispose (bool disposing)
                {
@@ -329,32 +400,45 @@ namespace System.Windows.Forms {
                }
 #endif
 
-               protected override bool IsInputKey(Keys keyData) {
+               protected override bool IsInputKey (Keys keyData)
+               {
                        return base.IsInputKey (keyData);
                }
 
-               protected override void OnGotFocus(EventArgs e) {
+               protected override void OnGotFocus (EventArgs e)
+               {
                        base.OnGotFocus (e);
+                       if (selection_length == -1 && !has_been_focused)
+                               SelectAllNoScroll ();
+                       has_been_focused = true;
                }
 
-               protected override void OnHandleCreated(EventArgs e) {
+               protected override void OnHandleCreated (EventArgs e)
+               {
                        base.OnHandleCreated (e);
-                       SelectAllNoInvalidate ();
                }
 
-               protected override void OnMouseUp(MouseEventArgs e) {
-                       base.OnMouseUp (e);
+#if ONLY_1_1
+               protected override void OnMouseUp(MouseEventArgs mevent)
+               {
+                       base.OnMouseUp (mevent);
                }
+#endif
 
-               protected virtual void OnTextAlignChanged(EventArgs e) {
+               protected virtual void OnTextAlignChanged (EventArgs e)
+               {
                        EventHandler eh = (EventHandler)(Events [TextAlignChangedEvent]);
                        if (eh != null)
                                eh (this, e);
                }
 
-               protected override void WndProc(ref Message m) {
+               protected override void WndProc (ref Message m)
+               {
                        switch ((Msg)m.Msg) {
                                case Msg.WM_LBUTTONDOWN:
+                                       // When the textbox gets focus by LBUTTON (but not by middle or right)
+                                       // it does not do the select all / scroll thing.
+                                       has_been_focused = true;
                                        FocusInternal (true);
                                        break;
                        }
@@ -374,12 +458,21 @@ namespace System.Windows.Forms {
 
                #region Private Methods
 
-               internal override ContextMenu GetContextMenuInternal ()
+               internal override ContextMenu ContextMenuInternal {
+                       get {
+                               ContextMenu res = base.ContextMenuInternal;
+                               if (res == menu)
+                                       return null;
+                               return res;
+                       }
+                       set {
+                               base.ContextMenuInternal = value;
+                       }
+               }
+
+               internal void RestoreContextMenu ()
                {
-                       ContextMenu  res = base.GetContextMenuInternal ();
-                       if (res == menu)
-                               return null;
-                       return res;
+                       ContextMenuInternal = menu;
                }
 
                private void menu_Popup(object sender, EventArgs e) {
@@ -402,6 +495,10 @@ namespace System.Windows.Forms {
                        } else {
                                undo.Enabled = true;
                        }
+
+                       if (ReadOnly) {
+                               undo.Enabled = cut.Enabled = paste.Enabled = delete.Enabled = false;
+                       }
                }
 
                private void undo_Click(object sender, EventArgs e) {
@@ -421,7 +518,7 @@ namespace System.Windows.Forms {
                }
 
                private void delete_Click(object sender, EventArgs e) {
-                       SelectedText = "";
+                       SelectedText = string.Empty;
                }
 
                private void select_all_Click(object sender, EventArgs e) {
@@ -440,10 +537,41 @@ namespace System.Windows.Forms {
                        }
                }
 
+               protected override void OnBackColorChanged (EventArgs e)
+               {
+                       base.OnBackColorChanged (e);
+               }
+               
                protected override void OnFontChanged (EventArgs e)
                {
                        base.OnFontChanged (e);
                }
+
+               protected override void OnHandleDestroyed (EventArgs e)
+               {
+                       base.OnHandleDestroyed (e);
+               }
 #endif
        }
+       
+#if NET_2_0
+       internal class TextBoxAutoCompleteSourceConverter : EnumConverter
+       {
+               public TextBoxAutoCompleteSourceConverter(Type type)
+                       : base(type)
+               { }
+
+               public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
+               {
+                       StandardValuesCollection stdv = base.GetStandardValues(context);
+                       AutoCompleteSource[] arr = new AutoCompleteSource[stdv.Count];
+                       stdv.CopyTo(arr, 0);
+                       AutoCompleteSource[] arr2 = Array.FindAll(arr, delegate (AutoCompleteSource value) {
+                               // No "ListItems" in a TextBox.
+                               return value != AutoCompleteSource.ListItems;
+                       });
+                       return new StandardValuesCollection(arr2);
+               }
+       }
+#endif
 }