In .:
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ContainerControl.cs
index a08010d7c4e429ec2249070448b6523b4ace52d9..276f9baf6f894482157fed955b0d5ea7764b79cd 100644 (file)
 //     Peter Bartok    pbartok@novell.com
 //
 //
-// $Revision: 1.3 $
-// $Modtime: $
-// $Log: ContainerControl.cs,v $
-// Revision 1.3  2004/11/08 20:36:11  pbartok
-// - Implemented BindingContext
-// - Implemented ParentForm
-//
-// Revision 1.2  2004/08/11 22:20:59  pbartok
-// - Signature fixes
-//
-// Revision 1.1  2004/07/09 05:21:25  pbartok
-// - Initial check-in
-//
-//
+
 
 // NOT COMPLETE
 
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Drawing;
+
 namespace System.Windows.Forms {
        public class ContainerControl : ScrollableControl, IContainerControl {
-               private Control active_control;
-               private Control focused_control;
+               private Control         active_control;
+               private Control         focused_control;
+               private Control         unvalidated_control;
+#if NET_2_0
+               private SizeF           auto_scale_dimensions;
+               private AutoScaleMode   auto_scale_mode;
+#endif
 
                #region Public Constructors
                public ContainerControl() {
+                       active_control = null;
+                       focused_control = null;
+                       unvalidated_control = null;
+                       ControlRemoved += new ControlEventHandler(OnControlRemoved);
+#if NET_2_0
+                       auto_scale_dimensions = SizeF.Empty;
+                       auto_scale_mode = AutoScaleMode.None;
+#endif
                }
                #endregion      // Public Constructors
 
                #region Public Instance Properties
+               [Browsable (false)]
+               [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
                public Control ActiveControl {
                        get {
                                return active_control;
@@ -61,14 +67,60 @@ namespace System.Windows.Forms {
                                        return;
                                }
 
-                               if (!Contains(value)) {
+                               active_control = value;
+
+                               if (!Contains(value) && this != value) {
                                        throw new ArgumentException("Not a child control");
                                }
 
-                               XplatUI.Activate(active_control.window.Handle);
+                               if (this is Form)
+                                       CheckAcceptButton();
+                               
+                               // Scroll control into view
+
+                               // Let the control know it's selected
+                               Select(value);
+                       }
+               }
+
+#if NET_2_0
+               public SizeF AutoScaleDimensions {
+                       get {
+                               return auto_scale_dimensions;
+                       }
+
+                       set {
+                               auto_scale_dimensions = value;
+                       }
+               }
+
+               public SizeF AutoScaleFactor {
+                       get {
+                               if (auto_scale_dimensions.IsEmpty) {
+                                       return new SizeF(1f, 1f);
+                               }
+                               return new SizeF(CurrentAutoScaleDimensions.Width / auto_scale_dimensions.Width, 
+                                       CurrentAutoScaleDimensions.Height / auto_scale_dimensions.Height);
+                       }
+               }
+
+
+               [MonoTODO("Call scaling method")]
+               public virtual AutoScaleMode AutoScaleMode {
+                       get {
+                               return auto_scale_mode;
+                       }
+                       set {
+                               if (auto_scale_mode != value) {
+                                       auto_scale_mode = value;
+
+                                       // Trigger scaling
+                               }
                        }
                }
+#endif // NET_2_0
 
+               [Browsable (false)]
                public override BindingContext BindingContext {
                        get {
                                if (base.BindingContext == null) {
@@ -82,6 +134,38 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               [MonoTODO("Revisit when System.Drawing.GDI.WindowsGraphics.GetTextMetrics is done or come up with other cross-plat avg. font width calc method")]
+               public SizeF CurrentAutoScaleDimensions {
+                       get {
+                               switch(auto_scale_mode) {
+                                       case AutoScaleMode.Dpi: {
+                                               Bitmap          bmp;
+                                               Graphics        g;
+                                               SizeF           size;
+
+                                               bmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+                                               g = Graphics.FromImage(bmp);
+                                               size = new SizeF(g.DpiX, g.DpiY);
+                                               g.Dispose();
+                                               bmp.Dispose();
+                                               return size;
+                                       }
+
+                                       case AutoScaleMode.Font: {
+                                               // http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.currentautoscaledimensions(VS.80).aspx
+                                               // Implement System.Drawing.GDI.WindowsGraphics.GetTextMetrics first...
+                                               break;
+                                       }
+                               }
+
+                               return auto_scale_dimensions;
+                       }
+               }
+#endif
+
+               [Browsable (false)]
+               [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
                public Form ParentForm {
                        get {
                                Control parent;
@@ -109,54 +193,151 @@ namespace System.Windows.Forms {
                #endregion      // Public Instance Methods
 
                #region Public Instance Methods
+               [MonoTODO]
+               static bool ValidateWarned;
                public bool Validate() {
-                       throw new NotImplementedException();
+                       //throw new NotImplementedException();
+                       if (!ValidateWarned) {
+                               Console.WriteLine("ContainerControl.Validate is not yet implemented");
+                               ValidateWarned = true;
+                       }
+                       return true;
                }
 
                bool IContainerControl.ActivateControl(Control control) {
-                       throw new NotImplementedException();
+                       return Select(control);
                }
                #endregion      // Public Instance Methods
 
                #region Protected Instance Methods
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected override void AdjustFormScrollbars(bool displayScrollbars) {
+                       base.AdjustFormScrollbars(displayScrollbars);
                }
 
                protected override void Dispose(bool disposing) {
+                       base.Dispose(disposing);
                }
 
-               protected override void OnControlRemoved(ControlEventArgs e) {
+               // LAMESPEC This used to be documented, but it's not in code 
+               // and no longer listed in MSDN2
+               // [EditorBrowsable (EditorBrowsableState.Advanced)]
+               // protected override void OnControlRemoved(ControlEventArgs e) {
+               private void OnControlRemoved(object sender, ControlEventArgs e) {
+                       if (e.Control == this.unvalidated_control) {
+                               this.unvalidated_control = null;
+                       }
+
+                       if (e.Control == this.active_control) {
+                               this.unvalidated_control = null;
+                       }
+
+                       // base.OnControlRemoved(e);
                }
 
                protected override void OnCreateControl() {
+                       base.OnCreateControl();
+                       // MS seems to call this here, it gets the whole databinding process started
+                       OnBindingContextChanged (EventArgs.Empty);
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected override bool ProcessDialogChar(char charCode) {
-                       throw new NotImplementedException();
+                       if (GetTopLevel()) {
+                               if (ProcessMnemonic(charCode)) {
+                                       return true;
+                               }
+                       }
+                       return base.ProcessDialogChar(charCode);
                }
 
                protected override bool ProcessDialogKey(Keys keyData) {
-                       // throw new NotImplementedException();
-                       return false;
+                       Keys    key;
+                       bool    forward;
+
+                       key = keyData & Keys.KeyCode;
+                       forward = true;
+
+                       switch (key) {
+                               case Keys.Tab: {
+                                       if (ProcessTabKey((Control.ModifierKeys & Keys.Shift) == 0)) {
+                                               return true;
+                                       }
+                                       break;
+                               }
+
+                               case Keys.Left: {
+                                       forward = false;
+                                       goto case Keys.Down;
+                               }
+
+                               case Keys.Up: {
+                                       forward = false;
+                                       goto case Keys.Down;
+                               }
+
+                               case Keys.Right: {
+                                       goto case Keys.Down;
+                               }
+                               case Keys.Down: {
+                                       if (SelectNextControl(active_control, forward, false, false, true)) {
+                                               return true;
+                                       }
+                                       break;
+                               } 
+
+
+                       }
+                       return base.ProcessDialogKey(keyData);
                }
 
                protected override bool ProcessMnemonic(char charCode) {
-                       throw new NotImplementedException();
+                       bool    wrapped;
+                       Control c;
+
+                       wrapped = false;
+                       c = active_control;
+
+                       do {
+                               c = GetNextControl(c, true);
+                               if (c != null) {
+                                       // This is stupid. I want to be able to call c.ProcessMnemonic directly
+                                       if (c.ProcessControlMnemonic(charCode)) {
+                                               return(true);
+                                       }
+                                       continue;
+                               } else {
+                                       if (wrapped) {
+                                               break;
+                                       }
+                                       wrapped = true;
+                               }
+                       } while (c != active_control);
+                       
+                       return false;
                }
 
                protected virtual bool ProcessTabKey(bool forward) {
-                       throw new NotImplementedException();
+                       return SelectNextControl(active_control, forward, true, true, true);
                }
 
                protected override void Select(bool directed, bool forward) {
+                       base.Select(directed, forward);
                }
 
                protected virtual void UpdateDefaultButton() {
+                       // MS Internal
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected override void WndProc(ref Message m) {
                        base.WndProc(ref m);
                }
                #endregion      // Protected Instance Methods
+               
+               internal virtual void CheckAcceptButton()
+               {
+                       // do nothing here, only called if it is a Form
+               }
        }
 }