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");
47 this.control_align = ContentAlignment.MiddleCenter;
48 this.OnSubscribeControlEvents (this.control);
51 public ToolStripControlHost (Control c, string name) : this (c)
57 #region Public Properties
58 public override Color BackColor {
59 get { return control.BackColor; }
60 set { control.BackColor = value;
66 public override Image BackgroundImage {
67 get { return base.BackgroundImage; }
68 set { base.BackgroundImage = value; }
72 [DefaultValue (ImageLayout.Tile)]
73 public override ImageLayout BackgroundImageLayout {
74 get { return base.BackgroundImageLayout; }
75 set { base.BackgroundImageLayout = value; }
78 public override bool CanSelect {
79 get { return control.CanSelect; }
82 public bool CausesValidation {
83 get { return control.CausesValidation; }
84 set { control.CausesValidation = value; }
88 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
89 public Control Control {
90 get { return this.control; }
94 [DefaultValue (ContentAlignment.MiddleCenter)]
95 public ContentAlignment ControlAlign {
96 get { return this.control_align; }
98 if (!Enum.IsDefined (typeof (ContentAlignment), value))
99 throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for ContentAlignment", value));
101 this.control_align = value;
106 [EditorBrowsable (EditorBrowsableState.Never)]
107 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
108 public new ToolStripItemDisplayStyle DisplayStyle {
109 get { return base.DisplayStyle; }
110 set { base.DisplayStyle = value; }
114 [EditorBrowsable (EditorBrowsableState.Never)]
115 [DefaultValue (false)]
116 public new bool DoubleClickEnabled {
117 get { return this.double_click_enabled; }
118 set { this.double_click_enabled = value; }
121 public override bool Enabled {
122 get { return base.Enabled; }
124 base.Enabled = value;
125 control.Enabled = value;
130 [EditorBrowsable (EditorBrowsableState.Always)]
131 public virtual bool Focused {
132 get { return control.Focused; }
135 public override Font Font {
136 get { return control.Font; }
137 set { control.Font = value; }
140 public override Color ForeColor {
141 get { return control.ForeColor; }
142 set { control.ForeColor = value; }
146 [EditorBrowsable (EditorBrowsableState.Never)]
147 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
148 public override Image Image {
149 get { return base.Image; }
150 set { base.Image = value; }
154 [EditorBrowsable (EditorBrowsableState.Never)]
155 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
156 public new ContentAlignment ImageAlign {
157 get { return base.ImageAlign; }
158 set { base.ImageAlign = value; }
162 [EditorBrowsable (EditorBrowsableState.Never)]
163 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
164 public new ToolStripItemImageScaling ImageScaling {
165 get { return base.ImageScaling; }
166 set { base.ImageScaling = value; }
170 [EditorBrowsable (EditorBrowsableState.Never)]
171 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
172 public new Color ImageTransparentColor {
173 get { return base.ImageTransparentColor; }
174 set { base.ImageTransparentColor = value; }
177 public override bool Selected {
178 get { return base.Selected; }
181 [EditorBrowsable (EditorBrowsableState.Advanced)]
182 public override ISite Site {
183 get { return control.Site; }
184 set { control.Site = value;
188 public override Size Size
190 get { return control.Size; }
191 set { control.Size = value; base.Size = value; if (this.Owner != null) this.Owner.PerformLayout (); }
195 public override string Text {
196 get { return base.Text; }
199 control.Text = value;
204 [EditorBrowsable (EditorBrowsableState.Never)]
205 public new ContentAlignment TextAlign {
206 get { return base.TextAlign; }
207 set { base.TextAlign = value; }
211 [EditorBrowsable (EditorBrowsableState.Never)]
212 public new TextImageRelation TextImageRelation {
213 get { return base.TextImageRelation; }
214 set { base.TextImageRelation = value; }
218 #region Protected Properties
219 protected override Size DefaultSize {
222 return new Size (23, 23);
224 return control.GetPreferredSize (Size.Empty);
229 #region Public Methods
230 [EditorBrowsable (EditorBrowsableState.Advanced)]
236 public override Size GetPreferredSize (Size constrainingSize)
241 [EditorBrowsable (EditorBrowsableState.Never)]
242 public override void ResetBackColor ()
244 base.ResetBackColor ();
247 [EditorBrowsable (EditorBrowsableState.Never)]
248 public override void ResetForeColor ()
250 base.ResetForeColor ();
254 #region Protected Methods
255 [EditorBrowsable (EditorBrowsableState.Advanced)]
256 protected override AccessibleObject CreateAccessibilityInstance ()
258 return control.AccessibilityObject;
261 protected override void Dispose (bool disposing)
263 base.Dispose (disposing);
265 if (!control.IsDisposed)
269 protected override void OnBoundsChanged ()
271 base.OnBoundsChanged ();
274 protected virtual void OnEnter (EventArgs e)
276 EventHandler eh = (EventHandler)(Events [EnterEvent]);
281 protected virtual void OnGotFocus (EventArgs e)
283 EventHandler eh = (EventHandler)(Events [GotFocusEvent]);
288 protected virtual void OnHostedControlResize (EventArgs e)
292 protected virtual void OnKeyDown (KeyEventArgs e)
294 KeyEventHandler eh = (KeyEventHandler)(Events [KeyDownEvent]);
299 protected virtual void OnKeyPress (KeyPressEventArgs e)
301 KeyPressEventHandler eh = (KeyPressEventHandler)(Events [KeyPressEvent]);
306 protected virtual void OnKeyUp (KeyEventArgs e)
308 KeyEventHandler eh = (KeyEventHandler)(Events [KeyUpEvent]);
313 protected override void OnLayout (LayoutEventArgs e)
318 control.Bounds = AlignInRectangle (this.Bounds, control.Size, this.control_align);
321 protected virtual void OnLeave (EventArgs e)
323 EventHandler eh = (EventHandler)(Events [LeaveEvent]);
328 protected virtual void OnLostFocus (EventArgs e)
330 EventHandler eh = (EventHandler)(Events [LostFocusEvent]);
335 protected override void OnPaint (PaintEventArgs e)
340 protected override void OnParentChanged (ToolStrip oldParent, ToolStrip newParent)
342 base.OnParentChanged (oldParent, newParent);
344 if (oldParent != null)
345 oldParent.Controls.Remove (control);
347 if (newParent != null)
348 newParent.Controls.Add (control);
351 protected virtual void OnSubscribeControlEvents (Control control)
353 this.control.Enter += new EventHandler (HandleEnter);
354 this.control.GotFocus += new EventHandler (HandleGotFocus);
355 this.control.KeyDown += new KeyEventHandler (HandleKeyDown);
356 this.control.KeyPress += new KeyPressEventHandler (HandleKeyPress);
357 this.control.KeyUp += new KeyEventHandler (HandleKeyUp);
358 this.control.Leave += new EventHandler (HandleLeave);
359 this.control.LostFocus += new EventHandler (HandleLostFocus);
360 this.control.Validated += new EventHandler (HandleValidated);
361 this.control.Validating += new CancelEventHandler (HandleValidating);
364 protected virtual void OnUnsubscribeControlEvents (Control control)
368 protected virtual void OnValidated (EventArgs e)
370 EventHandler eh = (EventHandler)(Events [ValidatedEvent]);
375 protected virtual void OnValidating (CancelEventArgs e)
377 CancelEventHandler eh = (CancelEventHandler)(Events [ValidatingEvent]);
382 protected override void SetVisibleCore (bool visible)
384 base.SetVisibleCore (visible);
385 this.control.Visible = visible;
389 #region Public Events
390 static object EnterEvent = new object ();
391 static object GotFocusEvent = new object ();
392 static object KeyDownEvent = new object ();
393 static object KeyPressEvent = new object ();
394 static object KeyUpEvent = new object ();
395 static object LeaveEvent = new object ();
396 static object LostFocusEvent = new object ();
397 static object ValidatedEvent = new object ();
398 static object ValidatingEvent = new object ();
401 [EditorBrowsable (EditorBrowsableState.Never)]
402 public new event EventHandler DisplayStyleChanged {
403 add { base.DisplayStyleChanged += value; }
404 remove { base.DisplayStyleChanged -= value; }
407 public event EventHandler Enter {
408 add { Events.AddHandler (EnterEvent, value); }
409 remove { Events.RemoveHandler (EnterEvent, value); }
413 [EditorBrowsable (EditorBrowsableState.Advanced)]
414 public event EventHandler GotFocus {
415 add { Events.AddHandler (GotFocusEvent, value); }
416 remove { Events.RemoveHandler (GotFocusEvent, value); }
419 public event KeyEventHandler KeyDown {
420 add { Events.AddHandler (KeyDownEvent, value); }
421 remove { Events.RemoveHandler (KeyDownEvent, value); }
424 public event KeyPressEventHandler KeyPress {
425 add { Events.AddHandler (KeyPressEvent, value); }
426 remove { Events.RemoveHandler (KeyPressEvent, value); }
429 public event KeyEventHandler KeyUp {
430 add { Events.AddHandler (KeyUpEvent, value); }
431 remove { Events.RemoveHandler (KeyUpEvent, value); }
434 public event EventHandler Leave {
435 add { Events.AddHandler (LeaveEvent, value); }
436 remove { Events.RemoveHandler (LeaveEvent, value); }
440 [EditorBrowsable (EditorBrowsableState.Advanced)]
441 public event EventHandler LostFocus {
442 add { Events.AddHandler (LostFocusEvent, value); }
443 remove { Events.RemoveHandler (LostFocusEvent, value); }
446 public event EventHandler Validated {
447 add { Events.AddHandler (ValidatedEvent, value); }
448 remove { Events.RemoveHandler (ValidatedEvent, value); }
451 public event CancelEventHandler Validating {
452 add { Events.AddHandler (ValidatingEvent, value); }
453 remove { Events.RemoveHandler (ValidatingEvent, value); }
457 #region Private Methods
458 private void HandleEnter (object sender, EventArgs e)
463 private void HandleGotFocus (object sender, EventArgs e)
468 private void HandleKeyDown (object sender, KeyEventArgs e)
473 private void HandleKeyPress (object sender, KeyPressEventArgs e)
478 private void HandleKeyUp (object sender, KeyEventArgs e)
483 private void HandleLeave (object sender, EventArgs e)
488 private void HandleLostFocus (object sender, EventArgs e)
490 this.OnLostFocus (e);
493 private void HandleValidated (object sender, EventArgs e)
495 this.OnValidated (e);
498 private void HandleValidating (object sender, CancelEventArgs e)
500 this.OnValidating (e);