Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / WinForms / Managed / System / WinForms / ToolStripControlHost.cs / 1 / ToolStripControlHost.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms { using System; using System.Diagnostics; using System.Drawing; using System.ComponentModel; using System.Windows.Forms.Layout; using System.Security; using System.Security.Permissions; using System.Diagnostics.CodeAnalysis; ////// /// ToolStripItem that can host Controls. /// public class ToolStripControlHost : ToolStripItem { private Control control; private int suspendSyncSizeCount = 0; private ContentAlignment controlAlign = ContentAlignment.MiddleCenter; private bool inSetVisibleCore = false; internal static readonly object EventGotFocus = new object(); internal static readonly object EventLostFocus = new object(); internal static readonly object EventKeyDown = new object(); internal static readonly object EventKeyPress = new object(); internal static readonly object EventKeyUp = new object(); internal static readonly object EventEnter = new object(); internal static readonly object EventLeave = new object(); internal static readonly object EventValidated = new object(); internal static readonly object EventValidating = new object(); ////// /// Constructs a ToolStripControlHost /// public ToolStripControlHost(Control c) { if (c == null) { throw new ArgumentNullException("c", SR.ControlCannotBeNull); } control = c; SyncControlParent(); c.Visible = true; SetBounds(c.Bounds); // now that we have a control set in, update the bounds. Rectangle bounds = this.Bounds; CommonProperties.UpdateSpecifiedBounds(c, bounds.X, bounds.Y, bounds.Width, bounds.Height); OnSubscribeControlEvents(c); } public ToolStripControlHost(Control c, string name) : this (c){ this.Name = name; } ///public override Color BackColor { get { return Control.BackColor; } set { Control.BackColor = value; } } /// /// /// [ Localizable(true), SRCategory(SR.CatAppearance), SRDescription(SR.ToolStripItemImageDescr), DefaultValue(null) ] public override Image BackgroundImage { get { return Control.BackgroundImage; } set { Control.BackgroundImage = value; } } ////// Gets or sets the image that is displayed on a ///. /// [ SRCategory(SR.CatAppearance), DefaultValue(ImageLayout.Tile), Localizable(true), SRDescription(SR.ControlBackgroundImageLayoutDescr) ] public override ImageLayout BackgroundImageLayout { get { return Control.BackgroundImageLayout; } set { Control.BackgroundImageLayout = value; } } /// /// /// Overriden to return value from Control.CanSelect. /// public override bool CanSelect { get { if (control != null) { return (DesignMode || this.Control.CanSelect); } return false; } } [ SRCategory(SR.CatFocus), DefaultValue(true), SRDescription(SR.ControlCausesValidationDescr) ] public bool CausesValidation { get { return Control.CausesValidation; } set { Control.CausesValidation = value; } } ///[DefaultValue(ContentAlignment.MiddleCenter), Browsable(false)] public ContentAlignment ControlAlign { get { return controlAlign; } set { if (!WindowsFormsUtils.EnumValidator.IsValidContentAlignment(value)) { throw new InvalidEnumArgumentException("value", (int)value, typeof(ContentAlignment)); } if (controlAlign != value) { controlAlign = value; OnBoundsChanged(); } } } /// /// /// The control that this item is hosting. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Control Control { get { return control; } } ////// /// Deriving classes can override this to configure a default size for their control. /// This is more efficient than setting the size in the control's constructor. /// protected override Size DefaultSize { get { if (Control != null) { // When you create the control - it sets up its size as its default size. // Since the property is protected we dont know for sure, but this is a pretty good guess. return Control.Size; } return base.DefaultSize; } } ///[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new ToolStripItemDisplayStyle DisplayStyle { get { return base.DisplayStyle; } set { base.DisplayStyle = value; } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new event EventHandler DisplayStyleChanged { add { Events.AddHandler(EventDisplayStyleChanged, value); } remove { Events.RemoveHandler(EventDisplayStyleChanged, value); } } /// // For control hosts, this property has no effect /// as they get their own clicks. Use ControlStyles.StandardClick /// instead. /// [DefaultValue(false), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new bool DoubleClickEnabled { get { return base.DoubleClickEnabled; } set { base.DoubleClickEnabled = value; } } ///public override Font Font { get { return Control.Font; } set { Control.Font = value; } } /// public override bool Enabled { get { return Control.Enabled; } set { Control.Enabled = value; } } /// [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnEnterDescr)] public event EventHandler Enter { add { Events.AddHandler(EventEnter, value); } remove { Events.RemoveHandler(EventEnter, value); } } /// [ Browsable(false), EditorBrowsable(EditorBrowsableState.Always) ] public virtual bool Focused { get { return Control.Focused; } } /// public override Color ForeColor { get { return Control.ForeColor; } set { Control.ForeColor = value; } } /// [ SRCategory(SR.CatFocus), SRDescription(SR.ToolStripItemOnGotFocusDescr), Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced) ] public event EventHandler GotFocus { add { Events.AddHandler(EventGotFocus, value); } remove { Events.RemoveHandler(EventGotFocus, value); } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public override Image Image { get { return base.Image; } set { base.Image = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new ToolStripItemImageScaling ImageScaling { get { return base.ImageScaling; } set { base.ImageScaling = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new Color ImageTransparentColor { get { return base.ImageTransparentColor; } set { base.ImageTransparentColor = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new ContentAlignment ImageAlign { get { return base.ImageAlign; } set { base.ImageAlign = value; } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnLeaveDescr)] public event EventHandler Leave { add { Events.AddHandler(EventLeave, value); } remove { Events.RemoveHandler(EventLeave, value); } } /// /// /// [ SRCategory(SR.CatFocus), SRDescription(SR.ToolStripItemOnLostFocusDescr), Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced) ] public event EventHandler LostFocus { add { Events.AddHandler(EventLostFocus, value); } remove { Events.RemoveHandler(EventLostFocus, value); } } ///Occurs when the control loses focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyDownDescr)] public event KeyEventHandler KeyDown { add { Events.AddHandler(EventKeyDown, value); } remove { Events.RemoveHandler(EventKeyDown, value); } } ///Occurs when a key is pressed down while the control has focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyPressDescr)] public event KeyPressEventHandler KeyPress { add { Events.AddHandler(EventKeyPress, value); } remove { Events.RemoveHandler(EventKeyPress, value); } } ///Occurs when a key is pressed while the control has focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyUpDescr)] public event KeyEventHandler KeyUp { add { Events.AddHandler(EventKeyUp, value); } remove { Events.RemoveHandler(EventKeyUp, value); } } ///Occurs when a key is released while the control has focus. ////// /// This is used for international applications where the language /// is written from RightToLeft. When this property is true, /// control placement and text will be from right to left. /// public override RightToLeft RightToLeft { get { if (control != null) { return control.RightToLeft; } return base.RightToLeft; } set { if (control != null) { control.RightToLeft = value; } } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new bool RightToLeftAutoMirrorImage { get { return base.RightToLeftAutoMirrorImage; } set { base.RightToLeftAutoMirrorImage = value; } } ///public override bool Selected { get { if (Control != null) { return Control.Focused; } return false; } } public override Size Size { get { return base.Size; } set { Rectangle specifiedBounds = Rectangle.Empty; if (control != null) { // we dont normally update the specified bounds, but if someone explicitly sets // the size we should. specifiedBounds = control.Bounds; specifiedBounds.Size = value; CommonProperties.UpdateSpecifiedBounds(control, specifiedBounds.X, specifiedBounds.Y, specifiedBounds.Width, specifiedBounds.Height); } base.Size = value; if (control != null) { // checking again in case the control has adjusted the size. Rectangle bounds = control.Bounds; if (bounds != specifiedBounds) { CommonProperties.UpdateSpecifiedBounds(control, bounds.X, bounds.Y, bounds.Width, bounds.Height); } } } } /// /// Overriden to set the Site for the control hosted. This is set at DesignTime when the component is added to the Container. /// Refer to VsWhidbey : 390573. /// [EditorBrowsable(EditorBrowsableState.Advanced)] public override ISite Site { get { return base.Site; } set { base.Site = value; if (value != null) { Control.Site = new StubSite(Control, this); } else { Control.Site = null; } } } ////// /// Overriden to modify hosted control's text. /// [DefaultValue("")] public override string Text { get { return Control.Text; } set { Control.Text = value; } } ///[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DefaultValue(ToolStripTextDirection.Horizontal)] public override ToolStripTextDirection TextDirection { get { return base.TextDirection; } set { base.TextDirection = value; } } /// [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new TextImageRelation TextImageRelation { get { return base.TextImageRelation; } set { base.TextImageRelation = value; } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnValidatingDescr)] public event CancelEventHandler Validating { add { Events.AddHandler(EventValidating, value); } remove { Events.RemoveHandler(EventValidating, value); } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnValidatedDescr)] public event EventHandler Validated { add { Events.AddHandler(EventValidated, value); } remove { Events.RemoveHandler(EventValidated, value); } } /// [EditorBrowsable(EditorBrowsableState.Advanced)] protected override AccessibleObject CreateAccessibilityInstance() { return Control.AccessibilityObject; } /// /// /// Cleans up and destroys the hosted control. /// protected override void Dispose(bool disposing) { // Call base first so other things stop trying to talk to the control. This will // unparent the host item which will cause a SyncControlParent, so the control // will be correctly unparented before being disposed. base.Dispose (disposing); if (disposing && Control != null) { OnUnsubscribeControlEvents(Control); // we only call control.Dispose if we are NOT being disposed in the finalizer. Control.Dispose(); control = null; } } ///[EditorBrowsable(EditorBrowsableState.Advanced)] public void Focus() { Control.Focus(); } /// public override Size GetPreferredSize(Size constrainingSize) { if (control != null) { return Control.GetPreferredSize(constrainingSize - Padding.Size) + Padding.Size; } return base.GetPreferredSize(constrainingSize); } /// /// Handle* wrappers: /// We [....] the event from the hosted control and call resurface it on ToolStripItem. /// private void HandleClick(object sender, System.EventArgs e) { OnClick(e); } private void HandleBackColorChanged(object sender, System.EventArgs e) { OnBackColorChanged(e); } private void HandleDoubleClick(object sender, System.EventArgs e) { OnDoubleClick(e); } private void HandleDragDrop(object sender, DragEventArgs e) { OnDragDrop(e); } private void HandleDragEnter(object sender, DragEventArgs e) { OnDragEnter(e); } private void HandleDragLeave(object sender, EventArgs e) { OnDragLeave(e); } private void HandleDragOver(object sender, DragEventArgs e) { OnDragOver(e); } private void HandleEnter(object sender, System.EventArgs e) { OnEnter(e); } private void HandleEnabledChanged(object sender, System.EventArgs e) { OnEnabledChanged(e); } private void HandleForeColorChanged(object sender, System.EventArgs e) { OnForeColorChanged(e); } private void HandleGiveFeedback(object sender, GiveFeedbackEventArgs e) { OnGiveFeedback(e); } private void HandleGotFocus(object sender, EventArgs e) { OnGotFocus(e); } private void HandleLocationChanged(object sender, EventArgs e) { OnLocationChanged(e); } private void HandleLostFocus(object sender, EventArgs e) { OnLostFocus(e); } private void HandleKeyDown(object sender, KeyEventArgs e) { OnKeyDown(e); } private void HandleKeyPress(object sender, KeyPressEventArgs e) { OnKeyPress(e); } private void HandleKeyUp(object sender, KeyEventArgs e) { OnKeyUp(e); } private void HandleLeave(object sender, System.EventArgs e) { OnLeave(e); } private void HandleMouseDown(object sender, MouseEventArgs e) { OnMouseDown(e); RaiseMouseEvent(ToolStripItem.EventMouseDown, e); } private void HandleMouseEnter(object sender, EventArgs e) { OnMouseEnter(e); RaiseEvent(ToolStripItem.EventMouseEnter, e); } private void HandleMouseLeave(object sender, EventArgs e) { OnMouseLeave(e); RaiseEvent(ToolStripItem.EventMouseLeave, e); } private void HandleMouseHover(object sender, EventArgs e) { OnMouseHover(e); RaiseEvent(ToolStripItem.EventMouseHover, e); } private void HandleMouseMove(object sender, MouseEventArgs e) { OnMouseMove(e); RaiseMouseEvent(ToolStripItem.EventMouseMove, e); } private void HandleMouseUp(object sender, MouseEventArgs e) { OnMouseUp(e); RaiseMouseEvent(ToolStripItem.EventMouseUp, e); } private void HandlePaint(object sender, PaintEventArgs e) { OnPaint(e); RaisePaintEvent(ToolStripItem.EventPaint, e); } private void HandleQueryAccessibilityHelp(object sender, QueryAccessibilityHelpEventArgs e) { QueryAccessibilityHelpEventHandler handler = (QueryAccessibilityHelpEventHandler)Events[ToolStripItem.EventQueryAccessibilityHelp]; if (handler != null) handler(this, e); } private void HandleQueryContinueDrag(object sender, QueryContinueDragEventArgs e) { OnQueryContinueDrag(e); } private void HandleRightToLeftChanged(object sender, EventArgs e) { OnRightToLeftChanged(e); } private void HandleResize(object sender, EventArgs e) { if (suspendSyncSizeCount == 0) { OnHostedControlResize(e); } } private void HandleTextChanged(object sender, EventArgs e) { OnTextChanged(e); } private void HandleControlVisibleChanged(object sender, EventArgs e) { // check the STATE_VISIBLE flag rather than using Control.Visible. // if we check while it's unparented it will return visible false. // the easiest way to do this is to use ParticipatesInLayout. bool controlVisibleStateFlag = ((IArrangedElement)Control).ParticipatesInLayout; bool itemVisibleStateFlag = ((IArrangedElement)(this)).ParticipatesInLayout; if (itemVisibleStateFlag != controlVisibleStateFlag) { this.Visible = Control.Visible; // this should fire the OnVisibleChanged and raise events appropriately. }; } private void HandleValidating(object sender, CancelEventArgs e) { OnValidating(e); } private void HandleValidated(object sender, System.EventArgs e) { OnValidated(e); } internal override void OnAccessibleDescriptionChanged(EventArgs e) { Control.AccessibleDescription = AccessibleDescription; } internal override void OnAccessibleNameChanged(EventArgs e) { Control.AccessibleName = AccessibleName; } internal override void OnAccessibleDefaultActionDescriptionChanged(EventArgs e) { Control.AccessibleDefaultActionDescription = AccessibleDefaultActionDescription; } internal override void OnAccessibleRoleChanged(EventArgs e) { Control.AccessibleRole = AccessibleRole; } protected virtual void OnEnter(EventArgs e) { RaiseEvent(EventEnter, e); } /// /// /// called when the control has lost focus /// protected virtual void OnGotFocus(EventArgs e) { RaiseEvent(EventGotFocus, e); } protected virtual void OnLeave(EventArgs e) { RaiseEvent(EventLeave, e); } ////// /// called when the control has lost focus /// protected virtual void OnLostFocus(EventArgs e) { RaiseEvent(EventLostFocus, e); } ///protected virtual void OnKeyDown(KeyEventArgs e) { RaiseKeyEvent(EventKeyDown, e); } /// protected virtual void OnKeyPress(KeyPressEventArgs e) { RaiseKeyPressEvent(EventKeyPress, e); } /// protected virtual void OnKeyUp(KeyEventArgs e) { RaiseKeyEvent(EventKeyUp, e); } /// /// /// Called when the items bounds are changed. Here, we update the Control's bounds. /// protected override void OnBoundsChanged() { if (control != null) { SuspendSizeSync(); IArrangedElement element = control as IArrangedElement; if (element == null) { Debug.Fail("why are we here? control should not be null"); return; } Size size = LayoutUtils.DeflateRect(this.Bounds, this.Padding).Size; Rectangle bounds = LayoutUtils.Align(size, this.Bounds, ControlAlign); // use BoundsSpecified.None so we dont deal w/specified bounds - this way we can tell what someone has set the size to. element.SetBounds(bounds, BoundsSpecified.None); // sometimes a control can ignore the size passed in, use the adjustment // to re-align. if (bounds != control.Bounds) { bounds = LayoutUtils.Align(control.Size, this.Bounds, ControlAlign); element.SetBounds(bounds, BoundsSpecified.None); } ResumeSizeSync(); } } ////// /// Called when the control fires its Paint event. /// protected override void OnPaint(PaintEventArgs e) { // do nothing.... } ///protected internal override void OnLayout(LayoutEventArgs e) { // do nothing... called via the controls collection } /// /// /// Called when the item's parent has been changed. /// protected override void OnParentChanged(ToolStrip oldParent, ToolStrip newParent) { if (oldParent != null && Owner == null && newParent == null && Control != null) { // if we've really been removed from the item collection, // politely remove ourselves from the control collection WindowsFormsUtils.ReadOnlyControlCollection oldControlCollection = GetControlCollection(Control.ParentInternal as ToolStrip); if (oldControlCollection != null) { oldControlCollection.RemoveInternal(Control); } } else { SyncControlParent(); } base.OnParentChanged(oldParent, newParent); } ////// /// The events from the hosted control are subscribed here. /// Override to add/prevent syncing of control events. /// NOTE: if you override and hook up events here, you should unhook in OnUnsubscribeControlEvents. /// protected virtual void OnSubscribeControlEvents(Control control) { if (control != null) { // Please keep this alphabetized and in [....] with Unsubscribe // control.Click += new EventHandler(HandleClick); control.BackColorChanged += new EventHandler(HandleBackColorChanged); control.DoubleClick += new EventHandler(HandleDoubleClick); control.DragDrop += new DragEventHandler(HandleDragDrop); control.DragEnter += new DragEventHandler(HandleDragEnter); control.DragLeave += new EventHandler(HandleDragLeave); control.DragOver += new DragEventHandler(HandleDragOver); control.Enter += new EventHandler(HandleEnter); control.EnabledChanged += new EventHandler(HandleEnabledChanged); control.ForeColorChanged += new EventHandler(HandleForeColorChanged); control.GiveFeedback += new GiveFeedbackEventHandler(HandleGiveFeedback); control.GotFocus += new EventHandler(HandleGotFocus); control.Leave += new EventHandler(HandleLeave); control.LocationChanged += new EventHandler(HandleLocationChanged); control.LostFocus += new EventHandler(HandleLostFocus); control.KeyDown += new KeyEventHandler(HandleKeyDown); control.KeyPress += new KeyPressEventHandler(HandleKeyPress); control.KeyUp += new KeyEventHandler(HandleKeyUp); control.MouseDown += new MouseEventHandler(HandleMouseDown); control.MouseEnter += new EventHandler(HandleMouseEnter); control.MouseHover += new EventHandler(HandleMouseHover); control.MouseLeave += new EventHandler(HandleMouseLeave); control.MouseMove += new MouseEventHandler(HandleMouseMove); control.MouseUp += new MouseEventHandler(HandleMouseUp); control.Paint += new PaintEventHandler(HandlePaint); control.QueryAccessibilityHelp += new QueryAccessibilityHelpEventHandler(HandleQueryAccessibilityHelp); control.QueryContinueDrag += new QueryContinueDragEventHandler(HandleQueryContinueDrag); control.Resize += new EventHandler(HandleResize); control.RightToLeftChanged += new EventHandler(HandleRightToLeftChanged); control.TextChanged += new EventHandler(HandleTextChanged); control.VisibleChanged += new EventHandler(HandleControlVisibleChanged); control.Validating += new CancelEventHandler(HandleValidating); control.Validated += new EventHandler(HandleValidated); } } ////// /// The events from the hosted control are unsubscribed here. /// Override to unhook events subscribed in OnSubscribeControlEvents. /// protected virtual void OnUnsubscribeControlEvents(Control control) { if (control != null) { // Please keep this alphabetized and in [....] with Subscribe // control.Click -= new EventHandler(HandleClick); control.BackColorChanged -= new EventHandler(HandleBackColorChanged); control.DoubleClick -= new EventHandler(HandleDoubleClick); control.DragDrop -= new DragEventHandler(HandleDragDrop); control.DragEnter -= new DragEventHandler(HandleDragEnter); control.DragLeave -= new EventHandler(HandleDragLeave); control.DragOver -= new DragEventHandler(HandleDragOver); control.Enter -= new EventHandler(HandleEnter); control.EnabledChanged -= new EventHandler(HandleEnabledChanged); control.ForeColorChanged -= new EventHandler(HandleForeColorChanged); control.GiveFeedback -= new GiveFeedbackEventHandler(HandleGiveFeedback); control.GotFocus -= new EventHandler(HandleGotFocus); control.Leave -= new EventHandler(HandleLeave); control.LocationChanged -= new EventHandler(HandleLocationChanged); control.LostFocus -= new EventHandler(HandleLostFocus); control.KeyDown -= new KeyEventHandler(HandleKeyDown); control.KeyPress -= new KeyPressEventHandler(HandleKeyPress); control.KeyUp -= new KeyEventHandler(HandleKeyUp); control.MouseDown -= new MouseEventHandler(HandleMouseDown); control.MouseEnter -= new EventHandler(HandleMouseEnter); control.MouseHover -= new EventHandler(HandleMouseHover); control.MouseLeave -= new EventHandler(HandleMouseLeave); control.MouseMove -= new MouseEventHandler(HandleMouseMove); control.MouseUp -= new MouseEventHandler(HandleMouseUp); control.Paint -= new PaintEventHandler(HandlePaint); control.QueryAccessibilityHelp -= new QueryAccessibilityHelpEventHandler(HandleQueryAccessibilityHelp); control.QueryContinueDrag -= new QueryContinueDragEventHandler(HandleQueryContinueDrag); control.Resize -= new EventHandler(HandleResize); control.RightToLeftChanged -= new EventHandler(HandleRightToLeftChanged); control.TextChanged -= new EventHandler(HandleTextChanged); control.VisibleChanged -= new EventHandler(HandleControlVisibleChanged); control.Validating -= new CancelEventHandler(HandleValidating); control.Validated -= new EventHandler(HandleValidated); } } protected virtual void OnValidating(CancelEventArgs e) { RaiseCancelEvent(EventValidating, e); } protected virtual void OnValidated(EventArgs e) { RaiseEvent(EventValidated, e); } private static WindowsFormsUtils.ReadOnlyControlCollection GetControlCollection(ToolStrip toolStrip) { WindowsFormsUtils.ReadOnlyControlCollection newControls = toolStrip != null ? (WindowsFormsUtils.ReadOnlyControlCollection) toolStrip.Controls : null; return newControls; } // Ensures the hosted Control is parented to the ToolStrip hosting this ToolStripItem. private void SyncControlParent() { WindowsFormsUtils.ReadOnlyControlCollection newControls = GetControlCollection(ParentInternal); if (newControls != null) { newControls.AddInternal(Control); } } ///protected virtual void OnHostedControlResize(EventArgs e) { // support for syncing the wrapper when the control size has changed this.Size = Control.Size; } /// // SECREVIEW: Technically full trust != unmanaged code, therefore this WndProc is at // lesser permission that all the other members in the class. Practically speaking though // they are the same - keeping UnmanagedCode to match the base class. [SuppressMessage("Microsoft.Security", "CA2114:MethodSecurityShouldBeASupersetOfType")] [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] protected internal override bool ProcessCmdKey(ref Message m, Keys keyData) { // Control will get this from being in the control collection. return false; } /// [SuppressMessage("Microsoft.Security", "CA2114:MethodSecurityShouldBeASupersetOfType")] [UIPermission(SecurityAction.LinkDemand, Window=UIPermissionWindow.AllWindows)] protected internal override bool ProcessDialogKey(Keys keyData) { // Control will get this from being in the control collection. return false; } protected override void SetVisibleCore(bool visible) { // This is needed, because if you try and set set visible to true before the parent is visible, // we will get called back into here, and set it back to false, since the parent is not visible. if (inSetVisibleCore) { return; } inSetVisibleCore = true; Control.SuspendLayout(); try { Control.Visible = visible; } finally { Control.ResumeLayout(false); // this will go ahead and perform layout. base.SetVisibleCore(visible); inSetVisibleCore = false; } } [EditorBrowsable(EditorBrowsableState.Never)] public override void ResetBackColor() { Control.ResetBackColor(); } [EditorBrowsable(EditorBrowsableState.Never)] public override void ResetForeColor() { Control.ResetForeColor(); } private void SuspendSizeSync() { this.suspendSyncSizeCount++; } private void ResumeSizeSync() { this.suspendSyncSizeCount--; } internal override bool ShouldSerializeBackColor() { if (control != null) { return control.ShouldSerializeBackColor(); } return base.ShouldSerializeBackColor(); } internal override bool ShouldSerializeForeColor() { if (control != null) { return control.ShouldSerializeForeColor(); } return base.ShouldSerializeForeColor(); } internal override bool ShouldSerializeFont() { if (control != null) { return control.ShouldSerializeFont(); } return base.ShouldSerializeFont(); } internal override bool ShouldSerializeRightToLeft() { if (control != null) { return control.ShouldSerializeRightToLeft(); } return base.ShouldSerializeRightToLeft(); } // Our implementation of ISite: // Since the Control which is wrapped by ToolStripControlHost is a runtime instance, there is no way of knowing // whether the control is in runtime or designtime. // This implementation of ISite would be set to Control.Site when ToolStripControlHost.Site is set at DesignTime. (Refer to Site property on ToolStripControlHost) // This implementation just returns the DesigMode property to be ToolStripControlHost's DesignMode property. // Everything else is pretty much default implementation. private class StubSite : ISite { IComponent comp = null; IComponent owner = null; public StubSite(Component control, Component host) { comp = control as IComponent; owner = host as IComponent; } // The component sited by this component site. /// /// IComponent ISite.Component { get { return comp; } } // The container in which the component is sited. ///When implemented by a class, gets the component associated with the ///. /// IContainer ISite.Container { get { return owner.Site.Container; } } // Indicates whether the component is in design mode. ///When implemented by a class, gets the container associated with the ///. /// bool ISite.DesignMode { get { return owner.Site.DesignMode; } } // The name of the component. // ///When implemented by a class, determines whether the component is in design mode. ////// String ISite.Name { get { return owner.Site.Name; } set { owner.Site.Name = value; } } ///When implemented by a class, gets or sets the name of /// the component associated with the ///. /// Returns the requested service. /// object IServiceProvider.GetService(Type service) { if (service == null) { throw new ArgumentNullException("service"); } if (owner.Site != null) { return owner.Site.GetService(service); } return null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms { using System; using System.Diagnostics; using System.Drawing; using System.ComponentModel; using System.Windows.Forms.Layout; using System.Security; using System.Security.Permissions; using System.Diagnostics.CodeAnalysis; ////// /// ToolStripItem that can host Controls. /// public class ToolStripControlHost : ToolStripItem { private Control control; private int suspendSyncSizeCount = 0; private ContentAlignment controlAlign = ContentAlignment.MiddleCenter; private bool inSetVisibleCore = false; internal static readonly object EventGotFocus = new object(); internal static readonly object EventLostFocus = new object(); internal static readonly object EventKeyDown = new object(); internal static readonly object EventKeyPress = new object(); internal static readonly object EventKeyUp = new object(); internal static readonly object EventEnter = new object(); internal static readonly object EventLeave = new object(); internal static readonly object EventValidated = new object(); internal static readonly object EventValidating = new object(); ////// /// Constructs a ToolStripControlHost /// public ToolStripControlHost(Control c) { if (c == null) { throw new ArgumentNullException("c", SR.ControlCannotBeNull); } control = c; SyncControlParent(); c.Visible = true; SetBounds(c.Bounds); // now that we have a control set in, update the bounds. Rectangle bounds = this.Bounds; CommonProperties.UpdateSpecifiedBounds(c, bounds.X, bounds.Y, bounds.Width, bounds.Height); OnSubscribeControlEvents(c); } public ToolStripControlHost(Control c, string name) : this (c){ this.Name = name; } ///public override Color BackColor { get { return Control.BackColor; } set { Control.BackColor = value; } } /// /// /// [ Localizable(true), SRCategory(SR.CatAppearance), SRDescription(SR.ToolStripItemImageDescr), DefaultValue(null) ] public override Image BackgroundImage { get { return Control.BackgroundImage; } set { Control.BackgroundImage = value; } } ////// Gets or sets the image that is displayed on a ///. /// [ SRCategory(SR.CatAppearance), DefaultValue(ImageLayout.Tile), Localizable(true), SRDescription(SR.ControlBackgroundImageLayoutDescr) ] public override ImageLayout BackgroundImageLayout { get { return Control.BackgroundImageLayout; } set { Control.BackgroundImageLayout = value; } } /// /// /// Overriden to return value from Control.CanSelect. /// public override bool CanSelect { get { if (control != null) { return (DesignMode || this.Control.CanSelect); } return false; } } [ SRCategory(SR.CatFocus), DefaultValue(true), SRDescription(SR.ControlCausesValidationDescr) ] public bool CausesValidation { get { return Control.CausesValidation; } set { Control.CausesValidation = value; } } ///[DefaultValue(ContentAlignment.MiddleCenter), Browsable(false)] public ContentAlignment ControlAlign { get { return controlAlign; } set { if (!WindowsFormsUtils.EnumValidator.IsValidContentAlignment(value)) { throw new InvalidEnumArgumentException("value", (int)value, typeof(ContentAlignment)); } if (controlAlign != value) { controlAlign = value; OnBoundsChanged(); } } } /// /// /// The control that this item is hosting. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Control Control { get { return control; } } ////// /// Deriving classes can override this to configure a default size for their control. /// This is more efficient than setting the size in the control's constructor. /// protected override Size DefaultSize { get { if (Control != null) { // When you create the control - it sets up its size as its default size. // Since the property is protected we dont know for sure, but this is a pretty good guess. return Control.Size; } return base.DefaultSize; } } ///[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new ToolStripItemDisplayStyle DisplayStyle { get { return base.DisplayStyle; } set { base.DisplayStyle = value; } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new event EventHandler DisplayStyleChanged { add { Events.AddHandler(EventDisplayStyleChanged, value); } remove { Events.RemoveHandler(EventDisplayStyleChanged, value); } } /// // For control hosts, this property has no effect /// as they get their own clicks. Use ControlStyles.StandardClick /// instead. /// [DefaultValue(false), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new bool DoubleClickEnabled { get { return base.DoubleClickEnabled; } set { base.DoubleClickEnabled = value; } } ///public override Font Font { get { return Control.Font; } set { Control.Font = value; } } /// public override bool Enabled { get { return Control.Enabled; } set { Control.Enabled = value; } } /// [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnEnterDescr)] public event EventHandler Enter { add { Events.AddHandler(EventEnter, value); } remove { Events.RemoveHandler(EventEnter, value); } } /// [ Browsable(false), EditorBrowsable(EditorBrowsableState.Always) ] public virtual bool Focused { get { return Control.Focused; } } /// public override Color ForeColor { get { return Control.ForeColor; } set { Control.ForeColor = value; } } /// [ SRCategory(SR.CatFocus), SRDescription(SR.ToolStripItemOnGotFocusDescr), Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced) ] public event EventHandler GotFocus { add { Events.AddHandler(EventGotFocus, value); } remove { Events.RemoveHandler(EventGotFocus, value); } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public override Image Image { get { return base.Image; } set { base.Image = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new ToolStripItemImageScaling ImageScaling { get { return base.ImageScaling; } set { base.ImageScaling = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new Color ImageTransparentColor { get { return base.ImageTransparentColor; } set { base.ImageTransparentColor = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new ContentAlignment ImageAlign { get { return base.ImageAlign; } set { base.ImageAlign = value; } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnLeaveDescr)] public event EventHandler Leave { add { Events.AddHandler(EventLeave, value); } remove { Events.RemoveHandler(EventLeave, value); } } /// /// /// [ SRCategory(SR.CatFocus), SRDescription(SR.ToolStripItemOnLostFocusDescr), Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced) ] public event EventHandler LostFocus { add { Events.AddHandler(EventLostFocus, value); } remove { Events.RemoveHandler(EventLostFocus, value); } } ///Occurs when the control loses focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyDownDescr)] public event KeyEventHandler KeyDown { add { Events.AddHandler(EventKeyDown, value); } remove { Events.RemoveHandler(EventKeyDown, value); } } ///Occurs when a key is pressed down while the control has focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyPressDescr)] public event KeyPressEventHandler KeyPress { add { Events.AddHandler(EventKeyPress, value); } remove { Events.RemoveHandler(EventKeyPress, value); } } ///Occurs when a key is pressed while the control has focus. ////// /// [SRCategory(SR.CatKey), SRDescription(SR.ControlOnKeyUpDescr)] public event KeyEventHandler KeyUp { add { Events.AddHandler(EventKeyUp, value); } remove { Events.RemoveHandler(EventKeyUp, value); } } ///Occurs when a key is released while the control has focus. ////// /// This is used for international applications where the language /// is written from RightToLeft. When this property is true, /// control placement and text will be from right to left. /// public override RightToLeft RightToLeft { get { if (control != null) { return control.RightToLeft; } return base.RightToLeft; } set { if (control != null) { control.RightToLeft = value; } } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public new bool RightToLeftAutoMirrorImage { get { return base.RightToLeftAutoMirrorImage; } set { base.RightToLeftAutoMirrorImage = value; } } ///public override bool Selected { get { if (Control != null) { return Control.Focused; } return false; } } public override Size Size { get { return base.Size; } set { Rectangle specifiedBounds = Rectangle.Empty; if (control != null) { // we dont normally update the specified bounds, but if someone explicitly sets // the size we should. specifiedBounds = control.Bounds; specifiedBounds.Size = value; CommonProperties.UpdateSpecifiedBounds(control, specifiedBounds.X, specifiedBounds.Y, specifiedBounds.Width, specifiedBounds.Height); } base.Size = value; if (control != null) { // checking again in case the control has adjusted the size. Rectangle bounds = control.Bounds; if (bounds != specifiedBounds) { CommonProperties.UpdateSpecifiedBounds(control, bounds.X, bounds.Y, bounds.Width, bounds.Height); } } } } /// /// Overriden to set the Site for the control hosted. This is set at DesignTime when the component is added to the Container. /// Refer to VsWhidbey : 390573. /// [EditorBrowsable(EditorBrowsableState.Advanced)] public override ISite Site { get { return base.Site; } set { base.Site = value; if (value != null) { Control.Site = new StubSite(Control, this); } else { Control.Site = null; } } } ////// /// Overriden to modify hosted control's text. /// [DefaultValue("")] public override string Text { get { return Control.Text; } set { Control.Text = value; } } ///[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DefaultValue(ToolStripTextDirection.Horizontal)] public override ToolStripTextDirection TextDirection { get { return base.TextDirection; } set { base.TextDirection = value; } } /// [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new TextImageRelation TextImageRelation { get { return base.TextImageRelation; } set { base.TextImageRelation = value; } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnValidatingDescr)] public event CancelEventHandler Validating { add { Events.AddHandler(EventValidating, value); } remove { Events.RemoveHandler(EventValidating, value); } } [SRCategory(SR.CatFocus), SRDescription(SR.ControlOnValidatedDescr)] public event EventHandler Validated { add { Events.AddHandler(EventValidated, value); } remove { Events.RemoveHandler(EventValidated, value); } } /// [EditorBrowsable(EditorBrowsableState.Advanced)] protected override AccessibleObject CreateAccessibilityInstance() { return Control.AccessibilityObject; } /// /// /// Cleans up and destroys the hosted control. /// protected override void Dispose(bool disposing) { // Call base first so other things stop trying to talk to the control. This will // unparent the host item which will cause a SyncControlParent, so the control // will be correctly unparented before being disposed. base.Dispose (disposing); if (disposing && Control != null) { OnUnsubscribeControlEvents(Control); // we only call control.Dispose if we are NOT being disposed in the finalizer. Control.Dispose(); control = null; } } ///[EditorBrowsable(EditorBrowsableState.Advanced)] public void Focus() { Control.Focus(); } /// public override Size GetPreferredSize(Size constrainingSize) { if (control != null) { return Control.GetPreferredSize(constrainingSize - Padding.Size) + Padding.Size; } return base.GetPreferredSize(constrainingSize); } /// /// Handle* wrappers: /// We [....] the event from the hosted control and call resurface it on ToolStripItem. /// private void HandleClick(object sender, System.EventArgs e) { OnClick(e); } private void HandleBackColorChanged(object sender, System.EventArgs e) { OnBackColorChanged(e); } private void HandleDoubleClick(object sender, System.EventArgs e) { OnDoubleClick(e); } private void HandleDragDrop(object sender, DragEventArgs e) { OnDragDrop(e); } private void HandleDragEnter(object sender, DragEventArgs e) { OnDragEnter(e); } private void HandleDragLeave(object sender, EventArgs e) { OnDragLeave(e); } private void HandleDragOver(object sender, DragEventArgs e) { OnDragOver(e); } private void HandleEnter(object sender, System.EventArgs e) { OnEnter(e); } private void HandleEnabledChanged(object sender, System.EventArgs e) { OnEnabledChanged(e); } private void HandleForeColorChanged(object sender, System.EventArgs e) { OnForeColorChanged(e); } private void HandleGiveFeedback(object sender, GiveFeedbackEventArgs e) { OnGiveFeedback(e); } private void HandleGotFocus(object sender, EventArgs e) { OnGotFocus(e); } private void HandleLocationChanged(object sender, EventArgs e) { OnLocationChanged(e); } private void HandleLostFocus(object sender, EventArgs e) { OnLostFocus(e); } private void HandleKeyDown(object sender, KeyEventArgs e) { OnKeyDown(e); } private void HandleKeyPress(object sender, KeyPressEventArgs e) { OnKeyPress(e); } private void HandleKeyUp(object sender, KeyEventArgs e) { OnKeyUp(e); } private void HandleLeave(object sender, System.EventArgs e) { OnLeave(e); } private void HandleMouseDown(object sender, MouseEventArgs e) { OnMouseDown(e); RaiseMouseEvent(ToolStripItem.EventMouseDown, e); } private void HandleMouseEnter(object sender, EventArgs e) { OnMouseEnter(e); RaiseEvent(ToolStripItem.EventMouseEnter, e); } private void HandleMouseLeave(object sender, EventArgs e) { OnMouseLeave(e); RaiseEvent(ToolStripItem.EventMouseLeave, e); } private void HandleMouseHover(object sender, EventArgs e) { OnMouseHover(e); RaiseEvent(ToolStripItem.EventMouseHover, e); } private void HandleMouseMove(object sender, MouseEventArgs e) { OnMouseMove(e); RaiseMouseEvent(ToolStripItem.EventMouseMove, e); } private void HandleMouseUp(object sender, MouseEventArgs e) { OnMouseUp(e); RaiseMouseEvent(ToolStripItem.EventMouseUp, e); } private void HandlePaint(object sender, PaintEventArgs e) { OnPaint(e); RaisePaintEvent(ToolStripItem.EventPaint, e); } private void HandleQueryAccessibilityHelp(object sender, QueryAccessibilityHelpEventArgs e) { QueryAccessibilityHelpEventHandler handler = (QueryAccessibilityHelpEventHandler)Events[ToolStripItem.EventQueryAccessibilityHelp]; if (handler != null) handler(this, e); } private void HandleQueryContinueDrag(object sender, QueryContinueDragEventArgs e) { OnQueryContinueDrag(e); } private void HandleRightToLeftChanged(object sender, EventArgs e) { OnRightToLeftChanged(e); } private void HandleResize(object sender, EventArgs e) { if (suspendSyncSizeCount == 0) { OnHostedControlResize(e); } } private void HandleTextChanged(object sender, EventArgs e) { OnTextChanged(e); } private void HandleControlVisibleChanged(object sender, EventArgs e) { // check the STATE_VISIBLE flag rather than using Control.Visible. // if we check while it's unparented it will return visible false. // the easiest way to do this is to use ParticipatesInLayout. bool controlVisibleStateFlag = ((IArrangedElement)Control).ParticipatesInLayout; bool itemVisibleStateFlag = ((IArrangedElement)(this)).ParticipatesInLayout; if (itemVisibleStateFlag != controlVisibleStateFlag) { this.Visible = Control.Visible; // this should fire the OnVisibleChanged and raise events appropriately. }; } private void HandleValidating(object sender, CancelEventArgs e) { OnValidating(e); } private void HandleValidated(object sender, System.EventArgs e) { OnValidated(e); } internal override void OnAccessibleDescriptionChanged(EventArgs e) { Control.AccessibleDescription = AccessibleDescription; } internal override void OnAccessibleNameChanged(EventArgs e) { Control.AccessibleName = AccessibleName; } internal override void OnAccessibleDefaultActionDescriptionChanged(EventArgs e) { Control.AccessibleDefaultActionDescription = AccessibleDefaultActionDescription; } internal override void OnAccessibleRoleChanged(EventArgs e) { Control.AccessibleRole = AccessibleRole; } protected virtual void OnEnter(EventArgs e) { RaiseEvent(EventEnter, e); } /// /// /// called when the control has lost focus /// protected virtual void OnGotFocus(EventArgs e) { RaiseEvent(EventGotFocus, e); } protected virtual void OnLeave(EventArgs e) { RaiseEvent(EventLeave, e); } ////// /// called when the control has lost focus /// protected virtual void OnLostFocus(EventArgs e) { RaiseEvent(EventLostFocus, e); } ///protected virtual void OnKeyDown(KeyEventArgs e) { RaiseKeyEvent(EventKeyDown, e); } /// protected virtual void OnKeyPress(KeyPressEventArgs e) { RaiseKeyPressEvent(EventKeyPress, e); } /// protected virtual void OnKeyUp(KeyEventArgs e) { RaiseKeyEvent(EventKeyUp, e); } /// /// /// Called when the items bounds are changed. Here, we update the Control's bounds. /// protected override void OnBoundsChanged() { if (control != null) { SuspendSizeSync(); IArrangedElement element = control as IArrangedElement; if (element == null) { Debug.Fail("why are we here? control should not be null"); return; } Size size = LayoutUtils.DeflateRect(this.Bounds, this.Padding).Size; Rectangle bounds = LayoutUtils.Align(size, this.Bounds, ControlAlign); // use BoundsSpecified.None so we dont deal w/specified bounds - this way we can tell what someone has set the size to. element.SetBounds(bounds, BoundsSpecified.None); // sometimes a control can ignore the size passed in, use the adjustment // to re-align. if (bounds != control.Bounds) { bounds = LayoutUtils.Align(control.Size, this.Bounds, ControlAlign); element.SetBounds(bounds, BoundsSpecified.None); } ResumeSizeSync(); } } ////// /// Called when the control fires its Paint event. /// protected override void OnPaint(PaintEventArgs e) { // do nothing.... } ///protected internal override void OnLayout(LayoutEventArgs e) { // do nothing... called via the controls collection } /// /// /// Called when the item's parent has been changed. /// protected override void OnParentChanged(ToolStrip oldParent, ToolStrip newParent) { if (oldParent != null && Owner == null && newParent == null && Control != null) { // if we've really been removed from the item collection, // politely remove ourselves from the control collection WindowsFormsUtils.ReadOnlyControlCollection oldControlCollection = GetControlCollection(Control.ParentInternal as ToolStrip); if (oldControlCollection != null) { oldControlCollection.RemoveInternal(Control); } } else { SyncControlParent(); } base.OnParentChanged(oldParent, newParent); } ////// /// The events from the hosted control are subscribed here. /// Override to add/prevent syncing of control events. /// NOTE: if you override and hook up events here, you should unhook in OnUnsubscribeControlEvents. /// protected virtual void OnSubscribeControlEvents(Control control) { if (control != null) { // Please keep this alphabetized and in [....] with Unsubscribe // control.Click += new EventHandler(HandleClick); control.BackColorChanged += new EventHandler(HandleBackColorChanged); control.DoubleClick += new EventHandler(HandleDoubleClick); control.DragDrop += new DragEventHandler(HandleDragDrop); control.DragEnter += new DragEventHandler(HandleDragEnter); control.DragLeave += new EventHandler(HandleDragLeave); control.DragOver += new DragEventHandler(HandleDragOver); control.Enter += new EventHandler(HandleEnter); control.EnabledChanged += new EventHandler(HandleEnabledChanged); control.ForeColorChanged += new EventHandler(HandleForeColorChanged); control.GiveFeedback += new GiveFeedbackEventHandler(HandleGiveFeedback); control.GotFocus += new EventHandler(HandleGotFocus); control.Leave += new EventHandler(HandleLeave); control.LocationChanged += new EventHandler(HandleLocationChanged); control.LostFocus += new EventHandler(HandleLostFocus); control.KeyDown += new KeyEventHandler(HandleKeyDown); control.KeyPress += new KeyPressEventHandler(HandleKeyPress); control.KeyUp += new KeyEventHandler(HandleKeyUp); control.MouseDown += new MouseEventHandler(HandleMouseDown); control.MouseEnter += new EventHandler(HandleMouseEnter); control.MouseHover += new EventHandler(HandleMouseHover); control.MouseLeave += new EventHandler(HandleMouseLeave); control.MouseMove += new MouseEventHandler(HandleMouseMove); control.MouseUp += new MouseEventHandler(HandleMouseUp); control.Paint += new PaintEventHandler(HandlePaint); control.QueryAccessibilityHelp += new QueryAccessibilityHelpEventHandler(HandleQueryAccessibilityHelp); control.QueryContinueDrag += new QueryContinueDragEventHandler(HandleQueryContinueDrag); control.Resize += new EventHandler(HandleResize); control.RightToLeftChanged += new EventHandler(HandleRightToLeftChanged); control.TextChanged += new EventHandler(HandleTextChanged); control.VisibleChanged += new EventHandler(HandleControlVisibleChanged); control.Validating += new CancelEventHandler(HandleValidating); control.Validated += new EventHandler(HandleValidated); } } ////// /// The events from the hosted control are unsubscribed here. /// Override to unhook events subscribed in OnSubscribeControlEvents. /// protected virtual void OnUnsubscribeControlEvents(Control control) { if (control != null) { // Please keep this alphabetized and in [....] with Subscribe // control.Click -= new EventHandler(HandleClick); control.BackColorChanged -= new EventHandler(HandleBackColorChanged); control.DoubleClick -= new EventHandler(HandleDoubleClick); control.DragDrop -= new DragEventHandler(HandleDragDrop); control.DragEnter -= new DragEventHandler(HandleDragEnter); control.DragLeave -= new EventHandler(HandleDragLeave); control.DragOver -= new DragEventHandler(HandleDragOver); control.Enter -= new EventHandler(HandleEnter); control.EnabledChanged -= new EventHandler(HandleEnabledChanged); control.ForeColorChanged -= new EventHandler(HandleForeColorChanged); control.GiveFeedback -= new GiveFeedbackEventHandler(HandleGiveFeedback); control.GotFocus -= new EventHandler(HandleGotFocus); control.Leave -= new EventHandler(HandleLeave); control.LocationChanged -= new EventHandler(HandleLocationChanged); control.LostFocus -= new EventHandler(HandleLostFocus); control.KeyDown -= new KeyEventHandler(HandleKeyDown); control.KeyPress -= new KeyPressEventHandler(HandleKeyPress); control.KeyUp -= new KeyEventHandler(HandleKeyUp); control.MouseDown -= new MouseEventHandler(HandleMouseDown); control.MouseEnter -= new EventHandler(HandleMouseEnter); control.MouseHover -= new EventHandler(HandleMouseHover); control.MouseLeave -= new EventHandler(HandleMouseLeave); control.MouseMove -= new MouseEventHandler(HandleMouseMove); control.MouseUp -= new MouseEventHandler(HandleMouseUp); control.Paint -= new PaintEventHandler(HandlePaint); control.QueryAccessibilityHelp -= new QueryAccessibilityHelpEventHandler(HandleQueryAccessibilityHelp); control.QueryContinueDrag -= new QueryContinueDragEventHandler(HandleQueryContinueDrag); control.Resize -= new EventHandler(HandleResize); control.RightToLeftChanged -= new EventHandler(HandleRightToLeftChanged); control.TextChanged -= new EventHandler(HandleTextChanged); control.VisibleChanged -= new EventHandler(HandleControlVisibleChanged); control.Validating -= new CancelEventHandler(HandleValidating); control.Validated -= new EventHandler(HandleValidated); } } protected virtual void OnValidating(CancelEventArgs e) { RaiseCancelEvent(EventValidating, e); } protected virtual void OnValidated(EventArgs e) { RaiseEvent(EventValidated, e); } private static WindowsFormsUtils.ReadOnlyControlCollection GetControlCollection(ToolStrip toolStrip) { WindowsFormsUtils.ReadOnlyControlCollection newControls = toolStrip != null ? (WindowsFormsUtils.ReadOnlyControlCollection) toolStrip.Controls : null; return newControls; } // Ensures the hosted Control is parented to the ToolStrip hosting this ToolStripItem. private void SyncControlParent() { WindowsFormsUtils.ReadOnlyControlCollection newControls = GetControlCollection(ParentInternal); if (newControls != null) { newControls.AddInternal(Control); } } ///protected virtual void OnHostedControlResize(EventArgs e) { // support for syncing the wrapper when the control size has changed this.Size = Control.Size; } /// // SECREVIEW: Technically full trust != unmanaged code, therefore this WndProc is at // lesser permission that all the other members in the class. Practically speaking though // they are the same - keeping UnmanagedCode to match the base class. [SuppressMessage("Microsoft.Security", "CA2114:MethodSecurityShouldBeASupersetOfType")] [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)] protected internal override bool ProcessCmdKey(ref Message m, Keys keyData) { // Control will get this from being in the control collection. return false; } /// [SuppressMessage("Microsoft.Security", "CA2114:MethodSecurityShouldBeASupersetOfType")] [UIPermission(SecurityAction.LinkDemand, Window=UIPermissionWindow.AllWindows)] protected internal override bool ProcessDialogKey(Keys keyData) { // Control will get this from being in the control collection. return false; } protected override void SetVisibleCore(bool visible) { // This is needed, because if you try and set set visible to true before the parent is visible, // we will get called back into here, and set it back to false, since the parent is not visible. if (inSetVisibleCore) { return; } inSetVisibleCore = true; Control.SuspendLayout(); try { Control.Visible = visible; } finally { Control.ResumeLayout(false); // this will go ahead and perform layout. base.SetVisibleCore(visible); inSetVisibleCore = false; } } [EditorBrowsable(EditorBrowsableState.Never)] public override void ResetBackColor() { Control.ResetBackColor(); } [EditorBrowsable(EditorBrowsableState.Never)] public override void ResetForeColor() { Control.ResetForeColor(); } private void SuspendSizeSync() { this.suspendSyncSizeCount++; } private void ResumeSizeSync() { this.suspendSyncSizeCount--; } internal override bool ShouldSerializeBackColor() { if (control != null) { return control.ShouldSerializeBackColor(); } return base.ShouldSerializeBackColor(); } internal override bool ShouldSerializeForeColor() { if (control != null) { return control.ShouldSerializeForeColor(); } return base.ShouldSerializeForeColor(); } internal override bool ShouldSerializeFont() { if (control != null) { return control.ShouldSerializeFont(); } return base.ShouldSerializeFont(); } internal override bool ShouldSerializeRightToLeft() { if (control != null) { return control.ShouldSerializeRightToLeft(); } return base.ShouldSerializeRightToLeft(); } // Our implementation of ISite: // Since the Control which is wrapped by ToolStripControlHost is a runtime instance, there is no way of knowing // whether the control is in runtime or designtime. // This implementation of ISite would be set to Control.Site when ToolStripControlHost.Site is set at DesignTime. (Refer to Site property on ToolStripControlHost) // This implementation just returns the DesigMode property to be ToolStripControlHost's DesignMode property. // Everything else is pretty much default implementation. private class StubSite : ISite { IComponent comp = null; IComponent owner = null; public StubSite(Component control, Component host) { comp = control as IComponent; owner = host as IComponent; } // The component sited by this component site. /// /// IComponent ISite.Component { get { return comp; } } // The container in which the component is sited. ///When implemented by a class, gets the component associated with the ///. /// IContainer ISite.Container { get { return owner.Site.Container; } } // Indicates whether the component is in design mode. ///When implemented by a class, gets the container associated with the ///. /// bool ISite.DesignMode { get { return owner.Site.DesignMode; } } // The name of the component. // ///When implemented by a class, determines whether the component is in design mode. ////// String ISite.Name { get { return owner.Site.Name; } set { owner.Site.Name = value; } } ///When implemented by a class, gets or sets the name of /// the component associated with the ///. /// Returns the requested service. /// object IServiceProvider.GetService(Type service) { if (service == null) { throw new ArgumentNullException("service"); } if (owner.Site != null) { return owner.Site.GetService(service); } return null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlArrayAttribute.cs
- HtmlMeta.cs
- OdbcConnectionPoolProviderInfo.cs
- DataGridViewColumnCollectionEditor.cs
- ConfigXmlCDataSection.cs
- ISCIIEncoding.cs
- MarkupWriter.cs
- TemplateBamlTreeBuilder.cs
- Lazy.cs
- ObjectListItemCollection.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- SafeNativeMethodsMilCoreApi.cs
- DbMetaDataCollectionNames.cs
- ImageEditor.cs
- InfoCardClaimCollection.cs
- PathSegment.cs
- Baml2006ReaderContext.cs
- Substitution.cs
- GC.cs
- SendMailErrorEventArgs.cs
- TransactionContextManager.cs
- TransactedReceiveScope.cs
- DbParameterCollectionHelper.cs
- PropertyGrid.cs
- ClientData.cs
- handlecollector.cs
- KnownBoxes.cs
- CssStyleCollection.cs
- XmlQueryOutput.cs
- ArrayEditor.cs
- EntityViewGenerator.cs
- InputChannelBinder.cs
- AuthenticatingEventArgs.cs
- RoleManagerEventArgs.cs
- SoapExtensionImporter.cs
- Separator.cs
- PropertyChange.cs
- Transform3D.cs
- XmlToDatasetMap.cs
- SiteMapNodeItem.cs
- HtmlElement.cs
- EnumMemberAttribute.cs
- UnsignedPublishLicense.cs
- VisualStyleTypesAndProperties.cs
- QueryReaderSettings.cs
- FloaterParaClient.cs
- DataControlFieldCollection.cs
- SafeNativeMethods.cs
- TextTreeUndoUnit.cs
- BrushValueSerializer.cs
- DbSetClause.cs
- ZipIOLocalFileBlock.cs
- _HeaderInfoTable.cs
- ChannelEndpointElementCollection.cs
- HtmlLabelAdapter.cs
- LinqDataSourceHelper.cs
- HostAdapter.cs
- SqlDependencyUtils.cs
- ITreeGenerator.cs
- SqlTypesSchemaImporter.cs
- MetadataPropertyvalue.cs
- UnknownBitmapEncoder.cs
- Error.cs
- ElementNotAvailableException.cs
- SecurityPolicySection.cs
- OleDbCommandBuilder.cs
- StringTraceRecord.cs
- PathGradientBrush.cs
- JournalNavigationScope.cs
- ProfileInfo.cs
- AttributeExtensions.cs
- ObjectDataSourceView.cs
- CmsUtils.cs
- RuntimeHelpers.cs
- XmlTextAttribute.cs
- NamespaceQuery.cs
- SymbolType.cs
- SoapReflectionImporter.cs
- DoubleAnimation.cs
- ImageField.cs
- StringFunctions.cs
- SqlFacetAttribute.cs
- MemberRelationshipService.cs
- RecommendedAsConfigurableAttribute.cs
- Helper.cs
- TargetException.cs
- StateMachineWorkflowInstance.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- PropertyValueChangedEvent.cs
- CommandDevice.cs
- AllMembershipCondition.cs
- TypeNameConverter.cs
- Axis.cs
- JsonFormatGeneratorStatics.cs
- EventLogPermissionEntryCollection.cs
- VirtualDirectoryMappingCollection.cs
- WebColorConverter.cs
- HashMembershipCondition.cs
- ShapingWorkspace.cs
- DirectionalLight.cs