Merge pull request #268 from pcc/menudeactivate
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / MdiControlStrip.cs
1 //\r
2 // MdiControlStrip.cs\r
3 //\r
4 // Permission is hereby granted, free of charge, to any person obtaining\r
5 // a copy of this software and associated documentation files (the\r
6 // "Software"), to deal in the Software without restriction, including\r
7 // without limitation the rights to use, copy, modify, merge, publish,\r
8 // distribute, sublicense, and/or sell copies of the Software, and to\r
9 // permit persons to whom the Software is furnished to do so, subject to\r
10 // the following conditions:\r
11 // \r
12 // The above copyright notice and this permission notice shall be\r
13 // included in all copies or substantial portions of the Software.\r
14 // \r
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22 //\r
23 // Copyright (c) 2006 Novell, Inc.\r
24 //\r
25 // Authors:\r
26 //      Jonathan Pobst (monkey@jpobst.com)\r
27 //\r
28 \r
29 using System;\r
30 using System.Runtime.InteropServices;\r
31 using System.ComponentModel;\r
32 using System.Drawing;\r
33 using System.Windows.Forms.Layout;\r
34 using System.Collections.Generic;\r
35 using System.ComponentModel.Design.Serialization;\r
36 \r
37 namespace System.Windows.Forms\r
38 {\r
39         internal class MdiControlStrip\r
40         {\r
41                 public class SystemMenuItem : ToolStripMenuItem\r
42                 {\r
43                         private Form form;\r
44                         \r
45                         public SystemMenuItem (Form ownerForm)\r
46                         {\r
47                                 form = ownerForm;\r
48                                 \r
49                                 base.AutoSize = false;\r
50                                 base.Size = new Size (20, 20);\r
51                                 base.Image = ownerForm.Icon.ToBitmap ();\r
52                                 base.MergeIndex = int.MinValue;\r
53                                 base.DisplayStyle = ToolStripItemDisplayStyle.Image;\r
54 \r
55                                 DropDownItems.Add ("&Restore", null, RestoreItemHandler);\r
56                                 ToolStripMenuItem tsiMove = (ToolStripMenuItem)DropDownItems.Add ("&Move");\r
57                                 tsiMove.Enabled = false;\r
58                                 ToolStripMenuItem tsiSize = (ToolStripMenuItem)DropDownItems.Add ("&Size");\r
59                                 tsiSize.Enabled = false;\r
60                                 DropDownItems.Add ("Mi&nimize", null, MinimizeItemHandler);\r
61                                 ToolStripMenuItem tsiMaximize = (ToolStripMenuItem)DropDownItems.Add ("Ma&ximize");\r
62                                 tsiMaximize.Enabled = false;\r
63                                 DropDownItems.Add ("-");\r
64                                 ToolStripMenuItem tsiClose = (ToolStripMenuItem)DropDownItems.Add ("&Close", null, CloseItemHandler);\r
65                                 tsiClose.ShortcutKeys = Keys.Control | Keys.F4;\r
66                                 DropDownItems.Add ("-");\r
67                                 ToolStripMenuItem tsiNext = (ToolStripMenuItem)DropDownItems.Add ("Nex&t", null, NextItemHandler);\r
68                                 tsiNext.ShortcutKeys = Keys.Control | Keys.F6;\r
69                         }\r
70 \r
71                         protected override void OnPaint (PaintEventArgs e)\r
72                         {\r
73                                 // Can't render without an owner\r
74                                 if (this.Owner == null)\r
75                                         return;\r
76 \r
77                                 // If DropDown.ShowImageMargin is false, we don't display the image\r
78                                 Image draw_image = this.Image;\r
79 \r
80                                 // Figure out where our text and image go\r
81                                 Rectangle text_layout_rect;\r
82                                 Rectangle image_layout_rect;\r
83 \r
84                                 this.CalculateTextAndImageRectangles (out text_layout_rect, out image_layout_rect);\r
85 \r
86                                 if (image_layout_rect != Rectangle.Empty)\r
87                                         this.Owner.Renderer.DrawItemImage (new ToolStripItemImageRenderEventArgs (e.Graphics, this, draw_image, image_layout_rect));\r
88 \r
89                                 return;\r
90                         }\r
91 \r
92                         public Form MdiForm {\r
93                                 get { return form; }\r
94                                 set { form = value; }\r
95                         }\r
96 \r
97                         private void RestoreItemHandler (object sender, EventArgs e)\r
98                         {\r
99                                 form.WindowState = FormWindowState.Normal;\r
100                         }\r
101 \r
102                         private void MinimizeItemHandler (object sender, EventArgs e)\r
103                         {\r
104                                 form.WindowState = FormWindowState.Minimized;\r
105                         }\r
106 \r
107                         private void CloseItemHandler (object sender, EventArgs e)\r
108                         {\r
109                                 form.Close ();\r
110                         }\r
111 \r
112                         private void NextItemHandler (object sender, EventArgs e)\r
113                         {\r
114                                 form.MdiParent.MdiContainer.ActivateNextChild ();\r
115                         }\r
116                 }\r
117                 \r
118                 public class ControlBoxMenuItem : ToolStripMenuItem\r
119                 {\r
120                         private Form form;\r
121                         private ControlBoxType type;\r
122                         \r
123                         public ControlBoxMenuItem (Form ownerForm, ControlBoxType type)\r
124                         {\r
125                                 form = ownerForm;\r
126                                 this.type = type;\r
127                                 \r
128                                 base.AutoSize = false;\r
129                                 base.Alignment = ToolStripItemAlignment.Right;\r
130                                 base.Size = new Size (20, 20);\r
131                                 base.MergeIndex = int.MaxValue;\r
132                                 base.DisplayStyle = ToolStripItemDisplayStyle.None;\r
133 \r
134                                 switch (type) {\r
135                                         case ControlBoxType.Close:\r
136                                                 this.Click += new EventHandler(CloseItemHandler);\r
137                                                 break;\r
138                                         case ControlBoxType.Min:\r
139                                                 this.Click += new EventHandler (MinimizeItemHandler);\r
140                                                 break;\r
141                                         case ControlBoxType.Max:\r
142                                                 this.Click += new EventHandler (RestoreItemHandler);\r
143                                                 break;\r
144                                 }\r
145                         }\r
146 \r
147                         protected override void OnPaint (PaintEventArgs e)\r
148                         {\r
149                                 base.OnPaint (e);\r
150                                 Graphics g = e.Graphics;\r
151                                 \r
152                                 switch (type) {\r
153                                         case ControlBoxType.Close:\r
154                                                 g.FillRectangle (Brushes.Black, 8, 8, 4, 4);\r
155                                                 g.FillRectangle (Brushes.Black, 6, 6, 2, 2);\r
156                                                 g.FillRectangle (Brushes.Black, 6, 12, 2, 2);\r
157                                                 g.FillRectangle (Brushes.Black, 12, 6, 2, 2);\r
158                                                 g.FillRectangle (Brushes.Black, 12, 12, 2, 2);\r
159                                                 g.DrawLine (Pens.Black, 8, 7, 8, 12);\r
160                                                 g.DrawLine (Pens.Black, 7, 8, 12, 8);\r
161                                                 g.DrawLine (Pens.Black, 11, 7, 11, 12);\r
162                                                 g.DrawLine (Pens.Black, 7, 11, 12, 11);\r
163                                                 break;\r
164                                         case ControlBoxType.Min:\r
165                                                 g.DrawLine (Pens.Black, 6, 12, 11, 12);\r
166                                                 g.DrawLine (Pens.Black, 6, 13, 11, 13);\r
167                                                 break;\r
168                                         case ControlBoxType.Max:\r
169                                                 g.DrawLines (Pens.Black, new Point[] {new Point (7, 8), new Point (7, 5), new Point (13, 5), new Point (13, 10), new Point (11, 10)});\r
170                                                 g.DrawLine (Pens.Black, 7, 6, 12, 6);\r
171                                                 \r
172                                                 g.DrawRectangle (Pens.Black, new Rectangle (5, 8, 6, 5));\r
173                                                 g.DrawLine (Pens.Black, 5, 9, 11, 9);\r
174                                                 \r
175                                                 break;\r
176                                 }\r
177                         }\r
178 \r
179                         public Form MdiForm {\r
180                                 get { return form; }\r
181                                 set { form = value; }\r
182                         }\r
183                         \r
184                         private void RestoreItemHandler (object sender, EventArgs e)\r
185                         {\r
186                                 form.WindowState = FormWindowState.Normal;\r
187                         }\r
188 \r
189                         private void MinimizeItemHandler (object sender, EventArgs e)\r
190                         {\r
191                                 form.WindowState = FormWindowState.Minimized;\r
192                         }\r
193 \r
194                         private void CloseItemHandler (object sender, EventArgs e)\r
195                         {\r
196                                 form.Close ();\r
197                         }\r
198                 }\r
199                 \r
200                 public enum ControlBoxType\r
201                 {\r
202                         Close,\r
203                         Min,\r
204                         Max\r
205                 }\r
206         }\r
207 }\r