// 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;
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) {
}
}
+#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;
#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
+ }
}
}