[DesignTimeVisible(false)]
[Designer("System.Windows.Forms.Design.FormDocumentDesigner, " + Consts.AssemblySystem_Design, typeof(IRootDesigner))]
[DefaultEvent("Load")]
-#if NET_2_0
[ClassInterface (ClassInterfaceType.AutoDispatch)]
[InitializationEvent ("Load")]
[ComVisible (true)]
[ToolboxItemFilter ("System.Windows.Forms.Control.TopLevel")]
-#endif
[ToolboxItem(false)]
public class Form : ContainerControl {
#region Local Variables
internal bool waiting_showwindow; // for XplatUIX11
private bool is_minimizing;
private bool show_icon = true;
-
-#if NET_2_0
private MenuStrip main_menu_strip;
private bool right_to_left_layout;
private Rectangle restore_bounds;
private bool autoscale_base_size_set;
-#endif
+ internal ArrayList disabled_by_showdialog = new ArrayList();
+ internal static ArrayList modal_dialogs = new ArrayList();
#endregion // Local Variables
#region Private & Internal Methods
CancelEventArgs cea = new CancelEventArgs (cancel);
this.OnClosing (cea);
-#if NET_2_0
FormClosingEventArgs fcea = new FormClosingEventArgs (reason, cea.Cancel);
this.OnFormClosing (fcea);
return fcea.Cancel;
-#else
- return cea.Cancel;
-#endif
}
// Convenience method for fire BOTH OnClosed and OnFormClosed events
private void FireClosedEvents (CloseReason reason)
{
this.OnClosed (EventArgs.Empty);
-
-#if NET_2_0
this.OnFormClosed (new FormClosedEventArgs (reason));
-#endif
}
-#if NET_2_0
internal override Size GetPreferredSizeCore (Size proposedSize)
{
Size retsize = Size.Empty;
{
base.ScaleControl (factor, specified);
}
-#endif
internal void OnActivatedInternal ()
{
#endregion // Private & Internal Methods
#region Public Classes
-#if NET_2_0
[ComVisible (false)]
-#endif
public new class ControlCollection : Control.ControlCollection {
Form form_owner;
default_maximized_bounds = Rectangle.Empty;
owned_forms = new Form.ControlCollection(this);
transparency_key = Color.Empty;
+ CreateDockPadding ();
InternalClientSize = new Size (this.Width - (SystemInformation.FrameBorderSize.Width * 2), this.Height - (SystemInformation.FrameBorderSize.Height * 2) - SystemInformation.CaptionHeight);
-
-#if NET_2_0
restore_bounds = Bounds;
-#endif
}
#endregion // Public Constructor & Destructor
}
}
-#if NET_2_0
[Browsable (false)]
[EditorBrowsable (EditorBrowsableState.Never)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[Obsolete ("This property has been deprecated in favor of AutoScaleMode.")]
-#else
- [DefaultValue(true)]
-#endif
[MWFCategory("Layout")]
public bool AutoScale {
get {
}
set {
-#if NET_2_0
if (value)
AutoScaleMode = AutoScaleMode.None;
-#endif
autoscale = value;
}
}
-#if NET_2_0
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[EditorBrowsable(EditorBrowsableState.Never)]
-#else
- [EditorBrowsable(EditorBrowsableState.Advanced)]
-#endif
[Localizable(true)]
[Browsable(false)]
public virtual Size AutoScaleBaseSize {
[MonoTODO ("Setting this is probably unintentional and can cause Forms to be improperly sized. See http://www.mono-project.com/FAQ:_Winforms#My_forms_are_sized_improperly for details.")]
set {
autoscale_base_size = value;
-
-#if NET_2_0
autoscale_base_size_set = true;
-#endif
}
}
return this.AutoScroll != false;
}
-#if NET_2_0
[Browsable (true)]
[EditorBrowsable (EditorBrowsableState.Always)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Visible)]
get { return base.AutoValidate; }
set { base.AutoValidate = value; }
}
-#endif
public override Color BackColor {
get {
typeof (DialogResult));
dialog_result = value;
- closing = (dialog_result != DialogResult.None && is_modal);
+ if (dialog_result != DialogResult.None && is_modal)
+ RaiseCloseEvents (false, false); // .Net doesn't send WM_CLOSE here.
}
}
}
}
-#if NET_2_0
[DefaultValue (null)]
[TypeConverter (typeof (ReferenceConverter))]
public MenuStrip MainMenuStrip {
get { return base.Margin; }
set { base.Margin = value; }
}
-#endif
[DefaultValue(true)]
[MWFCategory("Window Style")]
[Localizable(true)]
[RefreshProperties(RefreshProperties.Repaint)]
[MWFCategory("Layout")]
- public
-#if NET_2_0
- override
-#endif
- Size MaximumSize {
+ public override Size MaximumSize {
get {
return maximum_size;
}
get { return window_manager; }
}
-#if NET_2_0
[Browsable (false)]
[TypeConverter (typeof (ReferenceConverter))]
-#endif
[DefaultValue(null)]
[MWFCategory("Window Style")]
public MainMenu Menu {
}
} else
UpdateBounds ();
-#if NET_2_0
+
// UIA Framework Event: Menu Changed
OnUIAMenuChanged (EventArgs.Empty);
-#endif
}
}
}
}
}
-#if !NET_2_0
- [DefaultValue("{Width=0, Height=0}")]
-#endif
[Localizable(true)]
[RefreshProperties(RefreshProperties.Repaint)]
[MWFCategory("Layout")]
- public
-#if NET_2_0
- override
-#endif
- Size MinimumSize {
+ public override Size MinimumSize {
get {
return minimum_size;
}
}
}
-#if NET_2_0
[Browsable (false)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
public Rectangle RestoreBounds {
}
}
}
- }
-#endif
+ }
[DefaultValue(true)]
[MWFCategory("Window Style")]
set { base.TabIndex = value; }
}
-#if NET_2_0
[Browsable(false)]
[DefaultValue (true)]
[DispIdAttribute (-516)]
get { return base.TabStop; }
set { base.TabStop = value; }
}
-#endif
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
if (IsHandleCreated)
XplatUI.SetTopmost(window.Handle, value);
-#if NET_2_0
// UIA Framework: Raises internal event
OnUIATopMostChanged ();
-#endif
}
}
}
XplatUI.SetWindowState(Handle, value);
}
-#if NET_2_0
// UIA Framework: Raises internal event
if (old_state != window_state)
OnUIAWindowStateChanged ();
-#endif
-
}
}
if (Text != null)
cp.Caption = Text.Replace (Environment.NewLine, string.Empty);
- cp.ClassName = XplatUI.DefaultClassName;
+ cp.ClassName = XplatUI.GetDefaultClassName (GetType ());
cp.ClassStyle = 0;
cp.Style = 0;
cp.ExStyle = 0;
cp.Style |= (int)WindowStyles.WS_SYSMENU;
}
-#if NET_2_0
if (!this.show_icon) {
cp.ExStyle |= (int)WindowExStyles.WS_EX_DLGMODALFRAME;
}
-#endif
+
cp.ExStyle |= (int)WindowExStyles.WS_EX_CONTROLPARENT;
if (HelpButton && !MaximizeBox && !MinimizeBox) {
}
}
-#if !NET_2_0
- internal
-#else
[Browsable (false)]
[MonoTODO ("Implemented for Win32, needs X11 implementation")]
- protected
-#endif
- virtual bool ShowWithoutActivation {
+ protected virtual bool ShowWithoutActivation {
get { return false; }
}
#endregion // Protected Instance Properties
#region Public Static Methods
-#if NET_2_0
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete ("This method has been deprecated. Use AutoScaleDimensions instead")]
-#else
- [EditorBrowsable(EditorBrowsableState.Advanced)]
-#endif
public static SizeF GetAutoScaleSize (Font font)
{
return XplatUI.GetAutoScaleSize(font);
return;
if (!IsHandleCreated) {
-#if NET_2_0
base.Dispose ();
-#endif
return;
}
DesktopLocation = new Point(x, y);
}
-#if NET_2_0
public void Show (IWin32Window owner)
{
if (owner == null)
base.Show ();
}
-#endif
public DialogResult ShowDialog() {
return ShowDialog (null);
XplatUI.UngrabWindow(capture_window);
}
+ foreach (Form form in Application.OpenForms)
+ {
+ if (form.Enabled == true)
+ {
+ disabled_by_showdialog.Add(form);
+ form.Enabled = false;
+ }
+ }
+ modal_dialogs.Add(this);
+
#if not
// Commented out; we instead let the Visible=true inside the runloop create the control
// otherwise setting DialogResult inside any of the events that are triggered by the
return GetType().FullName + ", Text: " + Text;
}
-#if NET_2_0
[Browsable (true)]
[EditorBrowsable (EditorBrowsableState.Always)]
public override bool ValidateChildren ()
{
return base.ValidateChildren (validationConstraints);
}
-#else
- private bool ValidateChildren ()
- {
- return ValidateChildren (this);
- }
-
- private bool ValidateChildren (Control c)
- {
- if (!ValidateControl (c))
- return false;
-
- foreach (Control child in c.Controls) {
- if (!ValidateChildren (child))
- return false;
- }
-
- return true;
- }
-
- private bool ValidateControl (Control c)
- {
- CancelEventArgs e = new CancelEventArgs ();
- c.FireValidating (e);
- if (e.Cancel)
- return false;
- c.FireValidated ();
- return true;
- }
-#endif
#endregion // Public Instance Methods
#region Protected Instance Methods
base.AdjustFormScrollbars (displayScrollbars);
}
-#if NET_2_0
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete ("This method has been deprecated")] // XXX what to use instead?
-#else
- [EditorBrowsable(EditorBrowsableState.Advanced)]
-#endif
protected void ApplyAutoScaling()
{
SizeF current_size_f = GetAutoScaleSize (Font);
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged (e);
-#if NET_2_0
if (!autoscale_base_size_set) {
SizeF sizef = Form.GetAutoScaleSize (Font);
autoscale_base_size = new Size ((int)Math.Round (sizef.Width), (int)Math.Round (sizef.Height));
}
-#endif
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
// Give our menu a shot
if (ActiveMenu != null) {
- return ActiveMenu.ProcessCmdKey(ref msg, keyData);
+ if (ActiveMenu.ProcessCmdKey (ref msg, keyData))
+ return true;
+ }
+
+ // Detect any active ContextMenu for a child control that
+ // can't receive focus (which means: both input and preprocess)
+ if (ActiveTracker != null && ActiveTracker.TopMenu is ContextMenu) {
+ ContextMenu cmenu = ActiveTracker.TopMenu as ContextMenu;
+ if (cmenu.SourceControl != this && cmenu.ProcessCmdKey (ref msg, keyData))
+ return true;
}
if (IsMdiChild) {
return true;
}
else if (accept_button != null) {
- accept_button.PerformClick();
+ // Set ActiveControl to force any Validation to take place.
+ ActiveControl = (accept_button as Control);
+ if (ActiveControl == accept_button) // else Validation failed
+ accept_button.PerformClick();
return true;
}
} else if (keyData == Keys.Escape && cancel_button != null) {
return control_activated;
}
-#if NET_2_0
[EditorBrowsable (EditorBrowsableState.Never)]
-#else
- [EditorBrowsable (EditorBrowsableState.Advanced)]
-#endif
protected override void ScaleCore (float x, float y)
{
base.ScaleCore (x, y);
base.SetBoundsCore (x, y, width, height, specified);
-#if NET_2_0
int restore_x = (specified & BoundsSpecified.X) == BoundsSpecified.X ? x : restore_bounds.X;
int restore_y = (specified & BoundsSpecified.Y) == BoundsSpecified.Y ? y : restore_bounds.Y;
int restore_w = (specified & BoundsSpecified.Width) == BoundsSpecified.Width ? width : restore_bounds.Width;
int restore_h = (specified & BoundsSpecified.Height) == BoundsSpecified.Height ? height : restore_bounds.Height;
restore_bounds = new Rectangle (restore_x, restore_y, restore_w, restore_h);
-#endif
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
// Shown event is only called once, the first time the form is made visible
if (value && !shown_raised) {
-#if NET_2_0
this.OnShown (EventArgs.Empty);
-#endif
shown_raised = true;
}
return;
}
-#if NET_2_0
case Msg.WM_SYSCOMMAND: {
WmSysCommand (ref m);
break;
}
-#endif
case Msg.WM_ACTIVATE: {
WmActivate (ref m);
break;
}
-#if NET_2_0
case Msg.WM_ENTERSIZEMOVE: {
OnResizeBegin (EventArgs.Empty);
break;
OnResizeEnd (EventArgs.Empty);
break;
}
-#endif
default: {
base.WndProc (ref m);
private void WmClose (ref Message m)
{
+ if (this.Enabled == false)
+ return; // prevent closing a disabled form.
+
Form act = Form.ActiveForm;
// Don't close this form if there's another modal form visible.
if (act != null && act != this && act.Modal == true) {
}
}
-#if NET_2_0
if (WindowState == FormWindowState.Normal)
restore_bounds = Bounds;
-#endif
}
-#if NET_2_0
private void WmSysCommand (ref Message m)
{
// Let *Strips know the app's title bar was clicked
base.WndProc (ref m);
}
-#endif
+
private void WmActivate (ref Message m)
{
+ if (!this.Enabled && modal_dialogs.Count > 0)
+ {
+ (modal_dialogs[modal_dialogs.Count -1] as Form).Activate ();
+ return; // prevent Activating of disabled form.
+ }
+
if (m.WParam != (IntPtr)WindowActiveFlags.WA_INACTIVE) {
if (is_loaded) {
SelectActiveControl ();
IsActive = true;
} else {
-#if NET_2_0
if (XplatUI.IsEnabled (Handle) && XplatUI.GetParent (m.LParam) != Handle)
ToolStripManager.FireAppFocusChanged (this);
-#endif
IsActive = false;
}
}
private void WmNcPaint (ref Message m)
{
if (ActiveMenu != null) {
- PaintEventArgs pe;
- Point pnt;
-
- pe = XplatUI.PaintEventStart (ref m, Handle, false);
- pnt = XplatUI.GetMenuOrigin (window.Handle);
+ PaintEventArgs pe = XplatUI.PaintEventStart (ref m, Handle, false);
+ Point pnt = XplatUI.GetMenuOrigin (window.Handle);
// The entire menu has to be in the clip rectangle because the
// control buttons are right-aligned and otherwise they would
ActiveMenu.Draw (pe, new Rectangle (pnt.X, pnt.Y, ClientSize.Width, 0));
- if (ActiveMaximizedMdiChild != null) {
+ if (ActiveMaximizedMdiChild != null)
ActiveMaximizedMdiChild.DrawMaximizedButtons (ActiveMenu, pe);
- }
XplatUI.PaintEventEnd (ref m, Handle, false);
}
remove { Events.RemoveHandler (ActivatedEvent, value); }
}
-#if NET_2_0
[Browsable (false)]
[EditorBrowsable (EditorBrowsableState.Never)]
-#endif
public event EventHandler Closed {
add { Events.AddHandler (ClosedEvent, value); }
remove { Events.RemoveHandler (ClosedEvent, value); }
}
-#if NET_2_0
[Browsable (false)]
[EditorBrowsable (EditorBrowsableState.Never)]
-#endif
public event CancelEventHandler Closing {
add { Events.AddHandler (ClosingEvent, value); }
remove { Events.RemoveHandler (ClosingEvent, value); }
remove { Events.RemoveHandler (MdiChildActivateEvent, value); }
}
-#if NET_2_0
[Browsable (false)]
-#endif
public event EventHandler MenuComplete {
add { Events.AddHandler (MenuCompleteEvent, value); }
remove { Events.RemoveHandler (MenuCompleteEvent, value); }
}
-#if NET_2_0
[Browsable (false)]
-#endif
public event EventHandler MenuStart {
add { Events.AddHandler (MenuStartEvent, value); }
remove { Events.RemoveHandler (MenuStartEvent, value); }
remove { base.TabIndexChanged -= value; }
}
-#if NET_2_0
[SettingsBindable (true)]
public override string Text {
get {
FormClosedEventHandler eh = (FormClosedEventHandler)(Events[FormClosedEvent]);
if (eh != null)
eh (this, e);
+
+ foreach (Form form in disabled_by_showdialog)
+ {
+ form.Enabled = true;
+ }
+ disabled_by_showdialog.Clear();
+ if (modal_dialogs.Contains(this))
+ modal_dialogs.Remove(this);
}
// Consider calling FireClosingEvents instead of calling this directly.
eh (this, e);
}
- [MonoTODO ("Not hooked up to event")]
+ [MonoTODO ("Will never be called")]
[EditorBrowsable (EditorBrowsableState.Advanced)]
protected virtual void OnHelpButtonClicked (CancelEventArgs e)
{
if (eh != null)
eh (this, e);
}
-#endif
#region UIA Framework Events
-#if NET_2_0
static object UIAMenuChangedEvent = new object ();
static object UIATopMostChangedEvent = new object ();
static object UIAWindowStateChangedEvent = new object ();
if (eh != null)
eh (this, EventArgs.Empty);
}
-#endif
#endregion // UIA Framework Events
#endregion // Events
}