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 / ToolStripDropTargetManager.cs / 1 / ToolStripDropTargetManager.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms { using System; using System.ComponentModel; using System.Drawing; using System.Diagnostics; using System.Threading; using System.Runtime.InteropServices; using System.Security; using System.Globalization; ////// Why do we have this class? Well it seems that RegisterDropTarget /// requires an HWND to back it's IDropTargets. Since some ToolStripItems /// do not have HWNDS, this guy's got to figure out who the event was /// really supposed to go to and pass it on to it. /// internal class ToolStripDropTargetManager : IDropTarget { private IDropTarget lastDropTarget; private ToolStrip owner; #if DEBUG private bool dropTargetIsEntered; #endif #if DEBUG internal static readonly TraceSwitch DragDropDebug = new TraceSwitch("DragDropDebug", "Debug ToolStrip DragDrop code"); #else internal static readonly TraceSwitch DragDropDebug; #endif ////// Summary of ToolStripDropTargetManager. /// /// public ToolStripDropTargetManager(ToolStrip owner) { this.owner = owner; if (owner == null) { throw new ArgumentNullException("owner"); } } ////// Summary of EnsureRegistered. /// /// public void EnsureRegistered(IDropTarget dropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Ensuring drop target registered"); SetAcceptDrops(true); } ////// Summary of EnsureUnRegistered. /// /// public void EnsureUnRegistered(IDropTarget dropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Attempting to unregister droptarget"); for (int i = 0; i < owner.Items.Count; i++) { if (owner.Items[i].AllowDrop) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "An item still has allowdrop set to true - cant unregister"); return; // can't unregister this as a drop target unless everyone is done. } } if (owner.AllowDrop || owner.AllowItemReorder) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "The ToolStrip has AllowDrop or AllowItemReorder set to true - cant unregister"); return; // can't unregister this as a drop target if ToolStrip is still accepting drops } SetAcceptDrops(false); owner.DropTargetManager = null; } ////// Takes a screen point and converts it into an item. May return null. /// /// /// private ToolStripItem FindItemAtPoint(int x, int y) { return owner.GetItemAt(owner.PointToClient(new Point(x,y))); } ////// Summary of OnDragEnter. /// /// public void OnDragEnter(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG ENTER] =============="); // If we are supporting Item Reordering // and this is a ToolStripItem - snitch it. if (owner.AllowItemReorder && e.Data.GetDataPresent(typeof(ToolStripItem))) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ItemReorderTarget taking this..."); lastDropTarget = owner.ItemReorderDropTarget; } else { ToolStripItem item = FindItemAtPoint(e.X, e.Y); if ((item != null) && (item.AllowDrop)) { // the item wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStripItem taking this: " + item.ToString()); lastDropTarget = ((IDropTarget)item); } else if (owner.AllowDrop) { // the winbar wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStrip taking this because AllowDrop set to true."); lastDropTarget = ((IDropTarget)owner); } else { // There could be one item that says "AllowDrop == true" which would turn // on this drop target manager. If we're not over that particular item - then // just null out the last drop target manager. // the other valid reason for being here is that we've done an AllowItemReorder // and we dont have a ToolStripItem contain within the data (say someone drags a link // from IE over the ToolStrip) Debug.WriteLineIf(DragDropDebug.TraceVerbose, "No one wanted it."); lastDropTarget = null; } } if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragEnter on target..."); #if DEBUG dropTargetIsEntered=true; #endif lastDropTarget.OnDragEnter(e); } } ////// Summary of OnDragOver. /// /// public void OnDragOver(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG OVER] =============="); IDropTarget newDropTarget = null; // If we are supporting Item Reordering // and this is a ToolStripItem - snitch it. if (owner.AllowItemReorder && e.Data.GetDataPresent(typeof(ToolStripItem))) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ItemReorderTarget taking this..."); newDropTarget = owner.ItemReorderDropTarget; } else { ToolStripItem item = FindItemAtPoint(e.X, e.Y); if ((item != null) && (item.AllowDrop)) { // the item wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStripItem taking this: " + item.ToString()); newDropTarget = ((IDropTarget)item); } else if (owner.AllowDrop) { // the winbar wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStrip taking this because AllowDrop set to true."); newDropTarget = ((IDropTarget)owner); } else { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "No one wanted it."); newDropTarget = null; } } // if we've switched drop targets - then // we need to create drag enter and leave events if (newDropTarget != lastDropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "NEW DROP TARGET!"); UpdateDropTarget(newDropTarget, e); } // now call drag over if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragOver on target..."); lastDropTarget.OnDragOver(e); } } ////// Summary of OnDragLeave. /// /// public void OnDragLeave(System.EventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG LEAVE] =============="); if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragLeave on current target..."); #if DEBUG dropTargetIsEntered=false; #endif lastDropTarget.OnDragLeave(e); } #if DEBUG else { Debug.Assert(!dropTargetIsEntered, "Why do we have an entered droptarget and NO lastDropTarget?"); } #endif lastDropTarget = null; } ////// Summary of OnDragDrop. /// /// public void OnDragDrop(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG DROP] =============="); if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragDrop on current target..."); lastDropTarget.OnDragDrop(e); } else { Debug.Assert(false, "Why is lastDropTarget null?"); } lastDropTarget = null; } ////// Used to actually register the control as a drop target. /// ////// private void SetAcceptDrops(bool accept) { if (owner.AllowDrop && accept) { // if the owner has set AllowDrop to true then demand Clipboard permissions. // else its us, and we can assert them. IntSecurity.ClipboardRead.Demand(); } if (accept && owner.IsHandleCreated) { try { if (Application.OleRequired() != System.Threading.ApartmentState.STA) { throw new ThreadStateException(SR.GetString(SR.ThreadMustBeSTA)); } if (accept) { Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, "Registering as drop target: " + owner.Handle.ToString()); // Register int n = UnsafeNativeMethods.RegisterDragDrop(new HandleRef(owner, owner.Handle), (UnsafeNativeMethods.IOleDropTarget)(new DropTarget(this))); Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, " ret:" + n.ToString(CultureInfo.InvariantCulture)); if (n != 0 && n != NativeMethods.DRAGDROP_E_ALREADYREGISTERED) { throw new Win32Exception(n); } } else { IntSecurity.ClipboardRead.Assert(); try { Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, "Revoking drop target: " + owner.Handle.ToString()); // Revoke int n = UnsafeNativeMethods.RevokeDragDrop(new HandleRef(owner, owner.Handle)); Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, " ret:" + n.ToString(CultureInfo.InvariantCulture)); if (n != 0 && n != NativeMethods.DRAGDROP_E_NOTREGISTERED) { throw new Win32Exception(n); } } finally { CodeAccessPermission.RevertAssert(); } } } catch (Exception e) { throw new InvalidOperationException(SR.GetString(SR.DragDropRegFailed), e); } } } /// /// if we have a new active item, fire drag leave and /// enter. This corresponds to the case where you /// are dragging between items and havent actually /// left the ToolStrip's client area. /// /// /// private void UpdateDropTarget(IDropTarget newTarget, DragEventArgs e) { if (newTarget != lastDropTarget) { // tell the last drag target you've left if (lastDropTarget != null) { OnDragLeave(new EventArgs()); } lastDropTarget = newTarget; if (newTarget != null) { DragEventArgs dragEnterArgs = new DragEventArgs(e.Data, e.KeyState, e.X, e.Y, e.AllowedEffect, e.Effect); dragEnterArgs.Effect = DragDropEffects.None; // tell the next drag target you've entered OnDragEnter(dragEnterArgs); } } } } } // 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.ComponentModel; using System.Drawing; using System.Diagnostics; using System.Threading; using System.Runtime.InteropServices; using System.Security; using System.Globalization; ////// Why do we have this class? Well it seems that RegisterDropTarget /// requires an HWND to back it's IDropTargets. Since some ToolStripItems /// do not have HWNDS, this guy's got to figure out who the event was /// really supposed to go to and pass it on to it. /// internal class ToolStripDropTargetManager : IDropTarget { private IDropTarget lastDropTarget; private ToolStrip owner; #if DEBUG private bool dropTargetIsEntered; #endif #if DEBUG internal static readonly TraceSwitch DragDropDebug = new TraceSwitch("DragDropDebug", "Debug ToolStrip DragDrop code"); #else internal static readonly TraceSwitch DragDropDebug; #endif ////// Summary of ToolStripDropTargetManager. /// /// public ToolStripDropTargetManager(ToolStrip owner) { this.owner = owner; if (owner == null) { throw new ArgumentNullException("owner"); } } ////// Summary of EnsureRegistered. /// /// public void EnsureRegistered(IDropTarget dropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Ensuring drop target registered"); SetAcceptDrops(true); } ////// Summary of EnsureUnRegistered. /// /// public void EnsureUnRegistered(IDropTarget dropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Attempting to unregister droptarget"); for (int i = 0; i < owner.Items.Count; i++) { if (owner.Items[i].AllowDrop) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "An item still has allowdrop set to true - cant unregister"); return; // can't unregister this as a drop target unless everyone is done. } } if (owner.AllowDrop || owner.AllowItemReorder) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "The ToolStrip has AllowDrop or AllowItemReorder set to true - cant unregister"); return; // can't unregister this as a drop target if ToolStrip is still accepting drops } SetAcceptDrops(false); owner.DropTargetManager = null; } ////// Takes a screen point and converts it into an item. May return null. /// /// /// private ToolStripItem FindItemAtPoint(int x, int y) { return owner.GetItemAt(owner.PointToClient(new Point(x,y))); } ////// Summary of OnDragEnter. /// /// public void OnDragEnter(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG ENTER] =============="); // If we are supporting Item Reordering // and this is a ToolStripItem - snitch it. if (owner.AllowItemReorder && e.Data.GetDataPresent(typeof(ToolStripItem))) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ItemReorderTarget taking this..."); lastDropTarget = owner.ItemReorderDropTarget; } else { ToolStripItem item = FindItemAtPoint(e.X, e.Y); if ((item != null) && (item.AllowDrop)) { // the item wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStripItem taking this: " + item.ToString()); lastDropTarget = ((IDropTarget)item); } else if (owner.AllowDrop) { // the winbar wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStrip taking this because AllowDrop set to true."); lastDropTarget = ((IDropTarget)owner); } else { // There could be one item that says "AllowDrop == true" which would turn // on this drop target manager. If we're not over that particular item - then // just null out the last drop target manager. // the other valid reason for being here is that we've done an AllowItemReorder // and we dont have a ToolStripItem contain within the data (say someone drags a link // from IE over the ToolStrip) Debug.WriteLineIf(DragDropDebug.TraceVerbose, "No one wanted it."); lastDropTarget = null; } } if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragEnter on target..."); #if DEBUG dropTargetIsEntered=true; #endif lastDropTarget.OnDragEnter(e); } } ////// Summary of OnDragOver. /// /// public void OnDragOver(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG OVER] =============="); IDropTarget newDropTarget = null; // If we are supporting Item Reordering // and this is a ToolStripItem - snitch it. if (owner.AllowItemReorder && e.Data.GetDataPresent(typeof(ToolStripItem))) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ItemReorderTarget taking this..."); newDropTarget = owner.ItemReorderDropTarget; } else { ToolStripItem item = FindItemAtPoint(e.X, e.Y); if ((item != null) && (item.AllowDrop)) { // the item wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStripItem taking this: " + item.ToString()); newDropTarget = ((IDropTarget)item); } else if (owner.AllowDrop) { // the winbar wants this event Debug.WriteLineIf(DragDropDebug.TraceVerbose, "ToolStrip taking this because AllowDrop set to true."); newDropTarget = ((IDropTarget)owner); } else { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "No one wanted it."); newDropTarget = null; } } // if we've switched drop targets - then // we need to create drag enter and leave events if (newDropTarget != lastDropTarget) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "NEW DROP TARGET!"); UpdateDropTarget(newDropTarget, e); } // now call drag over if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragOver on target..."); lastDropTarget.OnDragOver(e); } } ////// Summary of OnDragLeave. /// /// public void OnDragLeave(System.EventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG LEAVE] =============="); if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragLeave on current target..."); #if DEBUG dropTargetIsEntered=false; #endif lastDropTarget.OnDragLeave(e); } #if DEBUG else { Debug.Assert(!dropTargetIsEntered, "Why do we have an entered droptarget and NO lastDropTarget?"); } #endif lastDropTarget = null; } ////// Summary of OnDragDrop. /// /// public void OnDragDrop(DragEventArgs e) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "[DRAG DROP] =============="); if (lastDropTarget != null) { Debug.WriteLineIf(DragDropDebug.TraceVerbose, "Calling OnDragDrop on current target..."); lastDropTarget.OnDragDrop(e); } else { Debug.Assert(false, "Why is lastDropTarget null?"); } lastDropTarget = null; } ////// Used to actually register the control as a drop target. /// ////// private void SetAcceptDrops(bool accept) { if (owner.AllowDrop && accept) { // if the owner has set AllowDrop to true then demand Clipboard permissions. // else its us, and we can assert them. IntSecurity.ClipboardRead.Demand(); } if (accept && owner.IsHandleCreated) { try { if (Application.OleRequired() != System.Threading.ApartmentState.STA) { throw new ThreadStateException(SR.GetString(SR.ThreadMustBeSTA)); } if (accept) { Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, "Registering as drop target: " + owner.Handle.ToString()); // Register int n = UnsafeNativeMethods.RegisterDragDrop(new HandleRef(owner, owner.Handle), (UnsafeNativeMethods.IOleDropTarget)(new DropTarget(this))); Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, " ret:" + n.ToString(CultureInfo.InvariantCulture)); if (n != 0 && n != NativeMethods.DRAGDROP_E_ALREADYREGISTERED) { throw new Win32Exception(n); } } else { IntSecurity.ClipboardRead.Assert(); try { Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, "Revoking drop target: " + owner.Handle.ToString()); // Revoke int n = UnsafeNativeMethods.RevokeDragDrop(new HandleRef(owner, owner.Handle)); Debug.WriteLineIf(CompModSwitches.DragDrop.TraceInfo, " ret:" + n.ToString(CultureInfo.InvariantCulture)); if (n != 0 && n != NativeMethods.DRAGDROP_E_NOTREGISTERED) { throw new Win32Exception(n); } } finally { CodeAccessPermission.RevertAssert(); } } } catch (Exception e) { throw new InvalidOperationException(SR.GetString(SR.DragDropRegFailed), e); } } } /// /// if we have a new active item, fire drag leave and /// enter. This corresponds to the case where you /// are dragging between items and havent actually /// left the ToolStrip's client area. /// /// /// private void UpdateDropTarget(IDropTarget newTarget, DragEventArgs e) { if (newTarget != lastDropTarget) { // tell the last drag target you've left if (lastDropTarget != null) { OnDragLeave(new EventArgs()); } lastDropTarget = newTarget; if (newTarget != null) { DragEventArgs dragEnterArgs = new DragEventArgs(e.Data, e.KeyState, e.X, e.Y, e.AllowedEffect, e.Effect); dragEnterArgs.Effect = DragDropEffects.None; // tell the next drag target you've entered OnDragEnter(dragEnterArgs); } } } } } // 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
- ChooseAction.cs
- reliableinputsessionchannel.cs
- TypeExtensions.cs
- _HelperAsyncResults.cs
- SoapSchemaMember.cs
- WebPartUserCapability.cs
- XPathDocumentBuilder.cs
- ListArgumentProvider.cs
- srgsitem.cs
- StaticExtension.cs
- InputBindingCollection.cs
- HyperLinkField.cs
- DeferredTextReference.cs
- CreateRefExpr.cs
- DataGridBoolColumn.cs
- BitStack.cs
- OrderedDictionaryStateHelper.cs
- base64Transforms.cs
- SmiSettersStream.cs
- InstancePersistenceException.cs
- Animatable.cs
- CustomValidator.cs
- SpecularMaterial.cs
- DayRenderEvent.cs
- HostedTcpTransportManager.cs
- OpenTypeMethods.cs
- TreeNodeCollectionEditorDialog.cs
- EventLogPropertySelector.cs
- Encoder.cs
- _ChunkParse.cs
- ResourceManager.cs
- DashStyle.cs
- PageThemeCodeDomTreeGenerator.cs
- DataKey.cs
- WebPartPersonalization.cs
- SiteMapProvider.cs
- UIPermission.cs
- OrderByLifter.cs
- GridViewCommandEventArgs.cs
- RuntimeConfigurationRecord.cs
- RegexCaptureCollection.cs
- DataBindingList.cs
- MultiBindingExpression.cs
- TextInfo.cs
- CallInfo.cs
- SortExpressionBuilder.cs
- XhtmlBasicSelectionListAdapter.cs
- TraceFilter.cs
- BindingList.cs
- StreamInfo.cs
- GB18030Encoding.cs
- RecognitionEventArgs.cs
- StorageRoot.cs
- String.cs
- SecurityTokenProvider.cs
- DataTableMappingCollection.cs
- DeadCharTextComposition.cs
- DataTablePropertyDescriptor.cs
- QualificationDataAttribute.cs
- ConsoleEntryPoint.cs
- SqlReferenceCollection.cs
- TypographyProperties.cs
- CharEntityEncoderFallback.cs
- AttributedMetaModel.cs
- SimpleBitVector32.cs
- RegexWorker.cs
- FixedDSBuilder.cs
- DbBuffer.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- XmlSchemaType.cs
- Stacktrace.cs
- WebPartEditorApplyVerb.cs
- WsdlWriter.cs
- WindowsFormsSectionHandler.cs
- RecognitionResult.cs
- LongSumAggregationOperator.cs
- VectorValueSerializer.cs
- XmlWriterSettings.cs
- Scripts.cs
- NumericUpDown.cs
- ImageMapEventArgs.cs
- ScanQueryOperator.cs
- SelfIssuedAuthRSAPKCS1SignatureDeformatter.cs
- dtdvalidator.cs
- TouchPoint.cs
- AutoFocusStyle.xaml.cs
- Floater.cs
- AutomationProperties.cs
- EventEntry.cs
- IApplicationTrustManager.cs
- ProviderCommandInfoUtils.cs
- SchemaSetCompiler.cs
- WorkflowApplicationAbortedEventArgs.cs
- SystemIcmpV6Statistics.cs
- DesignTimeParseData.cs
- LogicalExpressionEditor.cs
- SystemWebSectionGroup.cs
- XmlArrayItemAttributes.cs
- XmlIlVisitor.cs
- SessionStateSection.cs