/// <devdoc> Given a form, the items on this toolstrip populate with the mdi children /// with mnemonics 1-9 and More Windows menu item. /// These items can then be merged into a menustrip. /// /// Based on similar code in MenuItem.cs::PopulateMdiList(), which is unfortunately just different /// enough in its working environment that we can't readily combine the two. /// But if you're fixing something here, chances are that the same issue will need scrutiny over there. ///</devdoc> public void PopulateItems(Form mdiParent, ToolStripMenuItem mdiMergeItem, bool includeSeparator) { this.mdiParent = mdiParent; this.SuspendLayout(); MergeItem.DropDown.SuspendLayout(); try { ToolStripMenuItem mergeItem = MergeItem; mergeItem.DropDownItems.Clear(); mergeItem.Text = mdiMergeItem.Text; Form[] forms = mdiParent.MdiChildren; if (forms != null && forms.Length != 0) { if (includeSeparator) { ToolStripSeparator separator = new ToolStripSeparator(); separator.MergeAction = MergeAction.Append; separator.MergeIndex = -1; mergeItem.DropDownItems.Add(separator); } Form activeMdiChild = mdiParent.ActiveMdiChild; const int maxMenuForms = 9; // max number of Window menu items for forms int visibleChildren = 0; // number of visible child forms (so we know if we need to show More Windows... int accel = 1; // prefix the form name with this digit, underlined, as an accelerator int formsAddedToMenu = 0; bool activeFormAdded = false; for (int i = 0; i < forms.Length; i++) { // we need to check close reason here because we could be getting called // here in the midst of a WM_CLOSE - WM_MDIDESTROY eventually fires a WM_MDIACTIVATE if (forms[i].Visible && (forms[i].CloseReason == CloseReason.None)) { visibleChildren++; if ((activeFormAdded && (formsAddedToMenu < maxMenuForms)) || // don't exceed max (!activeFormAdded && (formsAddedToMenu < (maxMenuForms - 1)) || // save room for active if it's not in yet (forms[i].Equals(activeMdiChild)))) // there's always room for activeMdiChild { string text = WindowsFormsUtils.EscapeTextWithAmpersands(mdiParent.MdiChildren[i].Text); text = (text == null) ? String.Empty : text; ToolStripMenuItem windowListItem = new ToolStripMenuItem(mdiParent.MdiChildren[i]); windowListItem.Text = String.Format(CultureInfo.CurrentCulture, "&{0} {1}", accel, text); windowListItem.MergeAction = MergeAction.Append; windowListItem.MergeIndex = accel; windowListItem.Click += new EventHandler(OnWindowListItemClick); if (forms[i].Equals(activeMdiChild)) // if this the active one, check it off. { windowListItem.Checked = true; activeFormAdded = true; } accel++; formsAddedToMenu++; Debug.WriteLineIf(ToolStrip.MDIMergeDebug.TraceVerbose, "\tPopulateItems: Added " + windowListItem.Text); mergeItem.DropDownItems.Add(windowListItem); } } } // show the More Windows... item if necessary. if (visibleChildren > maxMenuForms) { ToolStripMenuItem moreWindowsMenuItem = new ToolStripMenuItem(); moreWindowsMenuItem.Text = SR.GetString(SR.MDIMenuMoreWindows); Debug.WriteLineIf(ToolStrip.MDIMergeDebug.TraceVerbose, "\tPopulateItems: Added " + moreWindowsMenuItem.Text); moreWindowsMenuItem.Click += new EventHandler(OnMoreWindowsMenuItemClick); moreWindowsMenuItem.MergeAction = MergeAction.Append; mergeItem.DropDownItems.Add(moreWindowsMenuItem); } } } finally { // this is an invisible toolstrip dont even bother doing layout. this.ResumeLayout(false); MergeItem.DropDown.ResumeLayout(false); } }
public void PopulateItems(Form mdiParent, ToolStripMenuItem mdiMergeItem, bool includeSeparator) { this.mdiParent = mdiParent; base.SuspendLayout(); this.MergeItem.DropDown.SuspendLayout(); try { ToolStripMenuItem mergeItem = this.MergeItem; mergeItem.DropDownItems.Clear(); mergeItem.Text = mdiMergeItem.Text; Form[] mdiChildren = mdiParent.MdiChildren; if ((mdiChildren != null) && (mdiChildren.Length != 0)) { if (includeSeparator) { ToolStripSeparator separator = new ToolStripSeparator { MergeAction = MergeAction.Append, MergeIndex = -1 }; mergeItem.DropDownItems.Add(separator); } Form activeMdiChild = mdiParent.ActiveMdiChild; int num = 0; int num2 = 1; int num3 = 0; bool flag = false; for (int i = 0; i < mdiChildren.Length; i++) { if (mdiChildren[i].Visible && (mdiChildren[i].CloseReason == CloseReason.None)) { num++; if (((flag && (num3 < 9)) || (!flag && (num3 < 8))) || mdiChildren[i].Equals(activeMdiChild)) { string str = WindowsFormsUtils.EscapeTextWithAmpersands(mdiParent.MdiChildren[i].Text); str = (str == null) ? string.Empty : str; ToolStripMenuItem item2 = new ToolStripMenuItem(mdiParent.MdiChildren[i]) { Text = string.Format(CultureInfo.CurrentCulture, "&{0} {1}", new object[] { num2, str }), MergeAction = MergeAction.Append, MergeIndex = num2 }; item2.Click += new EventHandler(this.OnWindowListItemClick); if (mdiChildren[i].Equals(activeMdiChild)) { item2.Checked = true; flag = true; } num2++; num3++; mergeItem.DropDownItems.Add(item2); } } } if (num > 9) { ToolStripMenuItem item3 = new ToolStripMenuItem { Text = System.Windows.Forms.SR.GetString("MDIMenuMoreWindows") }; item3.Click += new EventHandler(this.OnMoreWindowsMenuItemClick); item3.MergeAction = MergeAction.Append; mergeItem.DropDownItems.Add(item3); } } } finally { base.ResumeLayout(false); this.MergeItem.DropDown.ResumeLayout(false); } }