internal bool SetWindowStates(MdiWindowManager wm)
{
/*
* MDI WindowState behaviour:
* - If the active window is maximized, all other maximized windows are normalized.
* - If a normal window gets focus and the original active window was maximized,
* the normal window gets maximized and the original window gets normalized.
* - If a minimized window gets focus and the original window was maximized,
* the minimzed window gets maximized and the original window gets normalized.
* If the ex-minimized window gets deactivated, it will be normalized.
*/
Form form = wm.form;
if (setting_windowstates)
{
return(false);
}
if (!form.Visible)
{
return(false);
}
bool is_active = wm.IsActive;
bool maximize_this = false;
if (!is_active)
{
return(false);
}
ArrayList minimize_these = new ArrayList();
ArrayList normalize_these = new ArrayList();
setting_windowstates = true;
foreach (Form frm in mdi_child_list)
{
if (frm == form)
{
continue;
}
else if (!frm.Visible)
{
continue;
}
if (frm.WindowState == FormWindowState.Maximized && is_active)
{
maximize_this = true;
if (((MdiWindowManager)frm.window_manager).was_minimized)
{
minimize_these.Add(frm);
}
else
{
normalize_these.Add(frm);
}
}
}
if (maximize_this && form.WindowState != FormWindowState.Maximized)
{
wm.was_minimized = form.window_state == FormWindowState.Minimized;
form.WindowState = FormWindowState.Maximized;
}
foreach (Form frm in minimize_these)
{
frm.WindowState = FormWindowState.Minimized;
}
foreach (Form frm in normalize_these)
{
frm.WindowState = FormWindowState.Normal;
}
SetParentText(false);
XplatUI.RequestNCRecalc(ParentForm.Handle);
XplatUI.RequestNCRecalc(Handle);
SizeScrollBars();
setting_windowstates = false;
if (form.MdiParent.MainMenuStrip != null)
{
form.MdiParent.MainMenuStrip.RefreshMdiItems();
}
// Implicit menu strip merging
// - When child is activated
// - Parent form must have a MainMenuStrip
// - Find the first menustrip on the child
// - Merge
MenuStrip parent_menu = form.MdiParent.MainMenuStrip;
if (parent_menu != null)
{
if (parent_menu.IsCurrentlyMerged)
{
ToolStripManager.RevertMerge(parent_menu);
}
MenuStrip child_menu = LookForChildMenu(form);
if (form.WindowState != FormWindowState.Maximized)
{
RemoveControlMenuItems(wm);
}
if (form.WindowState == FormWindowState.Maximized)
{
bool found = false;
foreach (ToolStripItem tsi in parent_menu.Items)
{
if (tsi is MdiControlStrip.SystemMenuItem)
{
(tsi as MdiControlStrip.SystemMenuItem).MdiForm = form;
found = true;
}
else if (tsi is MdiControlStrip.ControlBoxMenuItem)
{
(tsi as MdiControlStrip.ControlBoxMenuItem).MdiForm = form;
found = true;
}
}
if (!found)
{
parent_menu.SuspendLayout();
parent_menu.Items.Insert(0, new MdiControlStrip.SystemMenuItem(form));
parent_menu.Items.Add(new MdiControlStrip.ControlBoxMenuItem(form, MdiControlStrip.ControlBoxType.Close));
parent_menu.Items.Add(new MdiControlStrip.ControlBoxMenuItem(form, MdiControlStrip.ControlBoxType.Max));
parent_menu.Items.Add(new MdiControlStrip.ControlBoxMenuItem(form, MdiControlStrip.ControlBoxType.Min));
parent_menu.ResumeLayout();
}
}
if (child_menu != null)
{
ToolStripManager.Merge(child_menu, parent_menu);
}
}
return(maximize_this);
}