2 // ToolStripControlHost.cs
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 // Copyright (c) 2006 Jonathan Pobst
26 // Jonathan Pobst (monkey@jpobst.com)
30 using System.ComponentModel;
32 namespace System.Windows.Forms
34 public class ToolStripControlHost : ToolStripItem
36 private Control control;
37 private ContentAlignment control_align;
38 private bool double_click_enabled;
40 #region Public Constructors
41 public ToolStripControlHost (Control c) : base ()
44 throw new ArgumentNullException ("c");
46 this.RightToLeft = RightToLeft.No;
48 this.control_align = ContentAlignment.MiddleCenter;
49 this.control.TabStop = false;
50 this.OnSubscribeControlEvents (this.control);
53 public ToolStripControlHost (Control c, string name) : this (c)
59 #region Public Properties
60 public override Color BackColor {
61 get { return control.BackColor; }
62 set { control.BackColor = value;
68 public override Image BackgroundImage {
69 get { return base.BackgroundImage; }
70 set { base.BackgroundImage = value; }
74 [DefaultValue (ImageLayout.Tile)]
75 public override ImageLayout BackgroundImageLayout {
76 get { return base.BackgroundImageLayout; }
77 set { base.BackgroundImageLayout = value; }
80 public override bool CanSelect {
81 get { return control.CanSelect; }
85 public bool CausesValidation {
86 get { return control.CausesValidation; }
87 set { control.CausesValidation = value; }
91 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
92 public Control Control {
93 get { return this.control; }
97 [DefaultValue (ContentAlignment.MiddleCenter)]
98 public ContentAlignment ControlAlign {
99 get { return this.control_align; }
101 if (!Enum.IsDefined (typeof (ContentAlignment), value))
102 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for ContentAlignment", value));
104 this.control_align = value;
109 [EditorBrowsable (EditorBrowsableState.Never)]
110 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
111 public new ToolStripItemDisplayStyle DisplayStyle {
112 get { return base.DisplayStyle; }
113 set { base.DisplayStyle = value; }
117 [EditorBrowsable (EditorBrowsableState.Never)]
118 [DefaultValue (false)]
119 public new bool DoubleClickEnabled {
120 get { return this.double_click_enabled; }
121 set { this.double_click_enabled = value; }
124 public override bool Enabled {
125 get { return base.Enabled; }
127 base.Enabled = value;
128 control.Enabled = value;
133 [EditorBrowsable (EditorBrowsableState.Always)]
134 public virtual bool Focused {
135 get { return control.Focused; }
138 public override Font Font {
139 get { return control.Font; }
140 set { control.Font = value; }
143 public override Color ForeColor {
144 get { return control.ForeColor; }
145 set { control.ForeColor = value; }
149 [EditorBrowsable (EditorBrowsableState.Never)]
150 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
151 public override Image Image {
152 get { return base.Image; }
153 set { base.Image = value; }
157 [EditorBrowsable (EditorBrowsableState.Never)]
158 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
159 public new ContentAlignment ImageAlign {
160 get { return base.ImageAlign; }
161 set { base.ImageAlign = value; }
165 [EditorBrowsable (EditorBrowsableState.Never)]
166 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
167 public new ToolStripItemImageScaling ImageScaling {
168 get { return base.ImageScaling; }
169 set { base.ImageScaling = value; }
173 [EditorBrowsable (EditorBrowsableState.Never)]
174 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
175 public new Color ImageTransparentColor {
176 get { return base.ImageTransparentColor; }
177 set { base.ImageTransparentColor = value; }
180 public override RightToLeft RightToLeft {
181 get { return base.RightToLeft; }
182 set { base.RightToLeft = value; }
186 [EditorBrowsable (EditorBrowsableState.Never)]
187 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
188 public new bool RightToLeftAutoMirrorImage {
189 get { return base.RightToLeftAutoMirrorImage; }
190 set { base.RightToLeftAutoMirrorImage = value; }
193 public override bool Selected {
194 get { return base.Selected; }
197 [EditorBrowsable (EditorBrowsableState.Advanced)]
198 public override ISite Site {
199 get { return control.Site; }
200 set { control.Site = value;
204 public override Size Size
206 get { return control.Size; }
207 set { control.Size = value; base.Size = value; if (this.Owner != null) this.Owner.PerformLayout (); }
211 public override string Text {
212 get { return control.Text; }
215 control.Text = value;
220 [EditorBrowsable (EditorBrowsableState.Never)]
221 public new ContentAlignment TextAlign {
222 get { return base.TextAlign; }
223 set { base.TextAlign = value; }
227 [EditorBrowsable (EditorBrowsableState.Never)]
228 [DefaultValue (ToolStripTextDirection.Horizontal)]
229 public override ToolStripTextDirection TextDirection {
230 get { return base.TextDirection; }
231 set { base.TextDirection = value; }
235 [EditorBrowsable (EditorBrowsableState.Never)]
236 public new TextImageRelation TextImageRelation {
237 get { return base.TextImageRelation; }
238 set { base.TextImageRelation = value; }
242 #region Protected Properties
243 protected override Size DefaultSize {
246 return new Size (23, 23);
248 return control.GetPreferredSize (Size.Empty);
253 #region Public Methods
254 [EditorBrowsable (EditorBrowsableState.Advanced)]
260 public override Size GetPreferredSize (Size constrainingSize)
265 [EditorBrowsable (EditorBrowsableState.Never)]
266 public override void ResetBackColor ()
268 base.ResetBackColor ();
271 [EditorBrowsable (EditorBrowsableState.Never)]
272 public override void ResetForeColor ()
274 base.ResetForeColor ();
278 #region Protected Methods
279 [EditorBrowsable (EditorBrowsableState.Advanced)]
280 protected override AccessibleObject CreateAccessibilityInstance ()
282 return control.AccessibilityObject;
285 protected override void Dispose (bool disposing)
287 base.Dispose (disposing);
289 if (control.Created && !control.IsDisposed)
293 protected override void OnBoundsChanged ()
295 base.OnBoundsChanged ();
298 protected virtual void OnEnter (EventArgs e)
300 EventHandler eh = (EventHandler)(Events [EnterEvent]);
305 protected virtual void OnGotFocus (EventArgs e)
307 EventHandler eh = (EventHandler)(Events [GotFocusEvent]);
312 protected virtual void OnHostedControlResize (EventArgs e)
316 protected virtual void OnKeyDown (KeyEventArgs e)
318 KeyEventHandler eh = (KeyEventHandler)(Events [KeyDownEvent]);
323 protected virtual void OnKeyPress (KeyPressEventArgs e)
325 KeyPressEventHandler eh = (KeyPressEventHandler)(Events [KeyPressEvent]);
330 protected virtual void OnKeyUp (KeyEventArgs e)
332 KeyEventHandler eh = (KeyEventHandler)(Events [KeyUpEvent]);
337 protected override void OnLayout (LayoutEventArgs e)
342 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
345 protected virtual void OnLeave (EventArgs e)
347 EventHandler eh = (EventHandler)(Events [LeaveEvent]);
352 protected virtual void OnLostFocus (EventArgs e)
354 EventHandler eh = (EventHandler)(Events [LostFocusEvent]);
359 protected override void OnPaint (PaintEventArgs e)
364 protected override void OnParentChanged (ToolStrip oldParent, ToolStrip newParent)
366 base.OnParentChanged (oldParent, newParent);
368 if (oldParent != null)
369 oldParent.Controls.Remove (control);
371 if (newParent != null)
372 newParent.Controls.Add (control);
375 protected virtual void OnSubscribeControlEvents (Control control)
377 this.control.Enter += new EventHandler (HandleEnter);
378 this.control.GotFocus += new EventHandler (HandleGotFocus);
379 this.control.KeyDown += new KeyEventHandler (HandleKeyDown);
380 this.control.KeyPress += new KeyPressEventHandler (HandleKeyPress);
381 this.control.KeyUp += new KeyEventHandler (HandleKeyUp);
382 this.control.Leave += new EventHandler (HandleLeave);
383 this.control.LostFocus += new EventHandler (HandleLostFocus);
384 this.control.Validated += new EventHandler (HandleValidated);
385 this.control.Validating += new CancelEventHandler (HandleValidating);
388 protected virtual void OnUnsubscribeControlEvents (Control control)
392 protected virtual void OnValidated (EventArgs e)
394 EventHandler eh = (EventHandler)(Events [ValidatedEvent]);
399 protected virtual void OnValidating (CancelEventArgs e)
401 CancelEventHandler eh = (CancelEventHandler)(Events [ValidatingEvent]);
406 protected internal override bool ProcessCmdKey (ref Message m, Keys keyData)
408 return base.ProcessCmdKey (ref m, keyData);
411 protected internal override bool ProcessDialogKey (Keys keyData)
413 return base.ProcessDialogKey (keyData);
416 protected override void SetVisibleCore (bool visible)
418 base.SetVisibleCore (visible);
419 this.control.Visible = visible;
423 #region Public Events
424 static object EnterEvent = new object ();
425 static object GotFocusEvent = new object ();
426 static object KeyDownEvent = new object ();
427 static object KeyPressEvent = new object ();
428 static object KeyUpEvent = new object ();
429 static object LeaveEvent = new object ();
430 static object LostFocusEvent = new object ();
431 static object ValidatedEvent = new object ();
432 static object ValidatingEvent = new object ();
435 [EditorBrowsable (EditorBrowsableState.Never)]
436 public new event EventHandler DisplayStyleChanged {
437 add { base.DisplayStyleChanged += value; }
438 remove { base.DisplayStyleChanged -= value; }
441 public event EventHandler Enter {
442 add { Events.AddHandler (EnterEvent, value); }
443 remove { Events.RemoveHandler (EnterEvent, value); }
447 [EditorBrowsable (EditorBrowsableState.Advanced)]
448 public event EventHandler GotFocus {
449 add { Events.AddHandler (GotFocusEvent, value); }
450 remove { Events.RemoveHandler (GotFocusEvent, value); }
453 public event KeyEventHandler KeyDown {
454 add { Events.AddHandler (KeyDownEvent, value); }
455 remove { Events.RemoveHandler (KeyDownEvent, value); }
458 public event KeyPressEventHandler KeyPress {
459 add { Events.AddHandler (KeyPressEvent, value); }
460 remove { Events.RemoveHandler (KeyPressEvent, value); }
463 public event KeyEventHandler KeyUp {
464 add { Events.AddHandler (KeyUpEvent, value); }
465 remove { Events.RemoveHandler (KeyUpEvent, value); }
468 public event EventHandler Leave {
469 add { Events.AddHandler (LeaveEvent, value); }
470 remove { Events.RemoveHandler (LeaveEvent, value); }
474 [EditorBrowsable (EditorBrowsableState.Advanced)]
475 public event EventHandler LostFocus {
476 add { Events.AddHandler (LostFocusEvent, value); }
477 remove { Events.RemoveHandler (LostFocusEvent, value); }
480 public event EventHandler Validated {
481 add { Events.AddHandler (ValidatedEvent, value); }
482 remove { Events.RemoveHandler (ValidatedEvent, value); }
485 public event CancelEventHandler Validating {
486 add { Events.AddHandler (ValidatingEvent, value); }
487 remove { Events.RemoveHandler (ValidatingEvent, value); }
491 #region Private Methods
492 internal override ToolStripTextDirection DefaultTextDirection { get { return ToolStripTextDirection.Horizontal; } }
494 internal override void Dismiss (ToolStripDropDownCloseReason reason)
497 this.Parent.Focus ();
499 base.Dismiss (reason);
502 private void HandleEnter (object sender, EventArgs e)
507 private void HandleGotFocus (object sender, EventArgs e)
512 private void HandleKeyDown (object sender, KeyEventArgs e)
517 private void HandleKeyPress (object sender, KeyPressEventArgs e)
522 private void HandleKeyUp (object sender, KeyEventArgs e)
527 private void HandleLeave (object sender, EventArgs e)
532 private void HandleLostFocus (object sender, EventArgs e)
534 this.OnLostFocus (e);
537 private void HandleValidated (object sender, EventArgs e)
539 this.OnValidated (e);
542 private void HandleValidating (object sender, CancelEventArgs e)
544 this.OnValidating (e);