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.control.Resize += ControlResizeHandler;
51 this.Size = DefaultSize;
52 this.OnSubscribeControlEvents (this.control);
55 public ToolStripControlHost (Control c, string name) : this (c)
61 #region Public Properties
62 public override Color BackColor {
63 get { return control.BackColor; }
64 set { control.BackColor = value;
70 public override Image BackgroundImage {
71 get { return base.BackgroundImage; }
72 set { base.BackgroundImage = value; }
76 [DefaultValue (ImageLayout.Tile)]
77 public override ImageLayout BackgroundImageLayout {
78 get { return base.BackgroundImageLayout; }
79 set { base.BackgroundImageLayout = value; }
82 public override bool CanSelect {
83 get { return control.CanSelect; }
87 public bool CausesValidation {
88 get { return control.CausesValidation; }
89 set { control.CausesValidation = value; }
93 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
94 public Control Control {
95 get { return this.control; }
99 [DefaultValue (ContentAlignment.MiddleCenter)]
100 public ContentAlignment ControlAlign {
101 get { return this.control_align; }
103 if (control_align != value) {
104 if (!Enum.IsDefined (typeof (ContentAlignment), value))
105 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for ContentAlignment", value));
107 this.control_align = value;
110 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
116 [EditorBrowsable (EditorBrowsableState.Never)]
117 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
118 public new ToolStripItemDisplayStyle DisplayStyle {
119 get { return base.DisplayStyle; }
120 set { base.DisplayStyle = value; }
124 [EditorBrowsable (EditorBrowsableState.Never)]
125 [DefaultValue (false)]
126 public new bool DoubleClickEnabled {
127 get { return this.double_click_enabled; }
128 set { this.double_click_enabled = value; }
131 public override bool Enabled {
132 get { return base.Enabled; }
134 base.Enabled = value;
135 control.Enabled = value;
140 [EditorBrowsable (EditorBrowsableState.Always)]
141 public virtual bool Focused {
142 get { return control.Focused; }
145 public override Font Font {
146 get { return control.Font; }
147 set { control.Font = value; }
150 public override Color ForeColor {
151 get { return control.ForeColor; }
152 set { control.ForeColor = value; }
156 [EditorBrowsable (EditorBrowsableState.Never)]
157 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
158 public override Image Image {
159 get { return base.Image; }
160 set { base.Image = value; }
164 [EditorBrowsable (EditorBrowsableState.Never)]
165 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
166 public new ContentAlignment ImageAlign {
167 get { return base.ImageAlign; }
168 set { base.ImageAlign = value; }
172 [EditorBrowsable (EditorBrowsableState.Never)]
173 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
174 public new ToolStripItemImageScaling ImageScaling {
175 get { return base.ImageScaling; }
176 set { base.ImageScaling = value; }
180 [EditorBrowsable (EditorBrowsableState.Never)]
181 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
182 public new Color ImageTransparentColor {
183 get { return base.ImageTransparentColor; }
184 set { base.ImageTransparentColor = value; }
187 public override RightToLeft RightToLeft {
188 get { return base.RightToLeft; }
189 set { base.RightToLeft = value; }
193 [EditorBrowsable (EditorBrowsableState.Never)]
194 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
195 public new bool RightToLeftAutoMirrorImage {
196 get { return base.RightToLeftAutoMirrorImage; }
197 set { base.RightToLeftAutoMirrorImage = value; }
200 public override bool Selected {
201 get { return base.Selected; }
204 [EditorBrowsable (EditorBrowsableState.Advanced)]
205 public override ISite Site {
206 get { return control.Site; }
207 set { control.Site = value;
211 public override Size Size {
212 get { return base.Size; }
213 set { control.Size = value; base.Size = value; if (this.Owner != null) this.Owner.PerformLayout (); }
217 public override string Text {
218 get { return control.Text; }
221 control.Text = value;
226 [EditorBrowsable (EditorBrowsableState.Never)]
227 public new ContentAlignment TextAlign {
228 get { return base.TextAlign; }
229 set { base.TextAlign = value; }
233 [EditorBrowsable (EditorBrowsableState.Never)]
234 [DefaultValue (ToolStripTextDirection.Horizontal)]
235 public override ToolStripTextDirection TextDirection {
236 get { return base.TextDirection; }
237 set { base.TextDirection = value; }
241 [EditorBrowsable (EditorBrowsableState.Never)]
242 public new TextImageRelation TextImageRelation {
243 get { return base.TextImageRelation; }
244 set { base.TextImageRelation = value; }
248 #region Protected Properties
249 protected override Size DefaultSize {
252 return new Size (23, 23);
259 #region Public Methods
260 [EditorBrowsable (EditorBrowsableState.Advanced)]
266 public override Size GetPreferredSize (Size constrainingSize)
268 return control.GetPreferredSize (constrainingSize);
271 [EditorBrowsable (EditorBrowsableState.Never)]
272 public override void ResetBackColor ()
274 base.ResetBackColor ();
277 [EditorBrowsable (EditorBrowsableState.Never)]
278 public override void ResetForeColor ()
280 base.ResetForeColor ();
284 #region Protected Methods
285 [EditorBrowsable (EditorBrowsableState.Advanced)]
286 protected override AccessibleObject CreateAccessibilityInstance ()
288 return control.AccessibilityObject;
291 protected override void Dispose (bool disposing)
293 base.Dispose (disposing);
295 if (control.Created && !control.IsDisposed)
299 protected override void OnBoundsChanged ()
302 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
304 base.OnBoundsChanged ();
307 protected virtual void OnEnter (EventArgs e)
309 EventHandler eh = (EventHandler)(Events [EnterEvent]);
314 protected virtual void OnGotFocus (EventArgs e)
316 EventHandler eh = (EventHandler)(Events [GotFocusEvent]);
321 void ControlResizeHandler (object obj, EventArgs args)
323 OnHostedControlResize (args);
326 protected virtual void OnHostedControlResize (EventArgs e)
328 // Since the control size has been just adjusted, only update the location
330 control.Location = AlignInRectangle (this.Bounds, control.Size, this.control_align).Location;
333 protected virtual void OnKeyDown (KeyEventArgs e)
335 KeyEventHandler eh = (KeyEventHandler)(Events [KeyDownEvent]);
340 protected virtual void OnKeyPress (KeyPressEventArgs e)
342 KeyPressEventHandler eh = (KeyPressEventHandler)(Events [KeyPressEvent]);
347 protected virtual void OnKeyUp (KeyEventArgs e)
349 KeyEventHandler eh = (KeyEventHandler)(Events [KeyUpEvent]);
354 protected override void OnLayout (LayoutEventArgs e)
359 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
362 protected virtual void OnLeave (EventArgs e)
364 EventHandler eh = (EventHandler)(Events [LeaveEvent]);
369 protected virtual void OnLostFocus (EventArgs e)
371 EventHandler eh = (EventHandler)(Events [LostFocusEvent]);
376 protected override void OnPaint (PaintEventArgs e)
381 protected override void OnParentChanged (ToolStrip oldParent, ToolStrip newParent)
383 base.OnParentChanged (oldParent, newParent);
385 if (oldParent != null)
386 oldParent.Controls.Remove (control);
388 if (newParent != null)
389 newParent.Controls.Add (control);
392 protected virtual void OnSubscribeControlEvents (Control control)
394 this.control.Enter += new EventHandler (HandleEnter);
395 this.control.GotFocus += new EventHandler (HandleGotFocus);
396 this.control.KeyDown += new KeyEventHandler (HandleKeyDown);
397 this.control.KeyPress += new KeyPressEventHandler (HandleKeyPress);
398 this.control.KeyUp += new KeyEventHandler (HandleKeyUp);
399 this.control.Leave += new EventHandler (HandleLeave);
400 this.control.LostFocus += new EventHandler (HandleLostFocus);
401 this.control.Validated += new EventHandler (HandleValidated);
402 this.control.Validating += new CancelEventHandler (HandleValidating);
405 protected virtual void OnUnsubscribeControlEvents (Control control)
409 protected virtual void OnValidated (EventArgs e)
411 EventHandler eh = (EventHandler)(Events [ValidatedEvent]);
416 protected virtual void OnValidating (CancelEventArgs e)
418 CancelEventHandler eh = (CancelEventHandler)(Events [ValidatingEvent]);
423 protected internal override bool ProcessCmdKey (ref Message m, Keys keyData)
425 return base.ProcessCmdKey (ref m, keyData);
428 protected internal override bool ProcessDialogKey (Keys keyData)
430 return base.ProcessDialogKey (keyData);
433 protected override void SetVisibleCore (bool visible)
435 base.SetVisibleCore (visible);
436 this.control.Visible = visible;
439 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
443 #region Public Events
444 static object EnterEvent = new object ();
445 static object GotFocusEvent = new object ();
446 static object KeyDownEvent = new object ();
447 static object KeyPressEvent = new object ();
448 static object KeyUpEvent = new object ();
449 static object LeaveEvent = new object ();
450 static object LostFocusEvent = new object ();
451 static object ValidatedEvent = new object ();
452 static object ValidatingEvent = new object ();
455 [EditorBrowsable (EditorBrowsableState.Never)]
456 public new event EventHandler DisplayStyleChanged {
457 add { base.DisplayStyleChanged += value; }
458 remove { base.DisplayStyleChanged -= value; }
461 public event EventHandler Enter {
462 add { Events.AddHandler (EnterEvent, value); }
463 remove { Events.RemoveHandler (EnterEvent, value); }
467 [EditorBrowsable (EditorBrowsableState.Advanced)]
468 public event EventHandler GotFocus {
469 add { Events.AddHandler (GotFocusEvent, value); }
470 remove { Events.RemoveHandler (GotFocusEvent, value); }
473 public event KeyEventHandler KeyDown {
474 add { Events.AddHandler (KeyDownEvent, value); }
475 remove { Events.RemoveHandler (KeyDownEvent, value); }
478 public event KeyPressEventHandler KeyPress {
479 add { Events.AddHandler (KeyPressEvent, value); }
480 remove { Events.RemoveHandler (KeyPressEvent, value); }
483 public event KeyEventHandler KeyUp {
484 add { Events.AddHandler (KeyUpEvent, value); }
485 remove { Events.RemoveHandler (KeyUpEvent, value); }
488 public event EventHandler Leave {
489 add { Events.AddHandler (LeaveEvent, value); }
490 remove { Events.RemoveHandler (LeaveEvent, value); }
494 [EditorBrowsable (EditorBrowsableState.Advanced)]
495 public event EventHandler LostFocus {
496 add { Events.AddHandler (LostFocusEvent, value); }
497 remove { Events.RemoveHandler (LostFocusEvent, value); }
500 public event EventHandler Validated {
501 add { Events.AddHandler (ValidatedEvent, value); }
502 remove { Events.RemoveHandler (ValidatedEvent, value); }
505 public event CancelEventHandler Validating {
506 add { Events.AddHandler (ValidatingEvent, value); }
507 remove { Events.RemoveHandler (ValidatingEvent, value); }
511 #region Private Methods
512 internal override ToolStripTextDirection DefaultTextDirection { get { return ToolStripTextDirection.Horizontal; } }
514 internal override void Dismiss (ToolStripDropDownCloseReason reason)
517 this.Parent.Focus ();
519 base.Dismiss (reason);
522 private void HandleEnter (object sender, EventArgs e)
527 private void HandleGotFocus (object sender, EventArgs e)
532 private void HandleKeyDown (object sender, KeyEventArgs e)
537 private void HandleKeyPress (object sender, KeyPressEventArgs e)
542 private void HandleKeyUp (object sender, KeyEventArgs e)
547 private void HandleLeave (object sender, EventArgs e)
552 private void HandleLostFocus (object sender, EventArgs e)
554 this.OnLostFocus (e);
557 private void HandleValidated (object sender, EventArgs e)
559 this.OnValidated (e);
562 private void HandleValidating (object sender, CancelEventArgs e)
564 this.OnValidating (e);
567 internal override bool InternalVisible {
568 get { return base.InternalVisible; }
570 Control.Visible = value;
571 base.InternalVisible = value;