Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / WinForms / Managed / System / WinForms / ToolStripDropTargetManager.cs / 1305376 / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CounterCreationData.cs
- AssociatedControlConverter.cs
- Calendar.cs
- Comparer.cs
- Compiler.cs
- PerfCounterSection.cs
- webclient.cs
- HandoffBehavior.cs
- InlineCollection.cs
- XpsS0ValidatingLoader.cs
- LoginUtil.cs
- SelectQueryOperator.cs
- CodeMethodReturnStatement.cs
- ExpressionLexer.cs
- ObjectRef.cs
- RankException.cs
- DrawingDrawingContext.cs
- AndMessageFilterTable.cs
- TagPrefixAttribute.cs
- TextTreeNode.cs
- WebPartMinimizeVerb.cs
- QilIterator.cs
- ObjectStateFormatter.cs
- _UriSyntax.cs
- DateTimeSerializationSection.cs
- RotateTransform3D.cs
- ColumnTypeConverter.cs
- SymLanguageVendor.cs
- Size.cs
- BinaryReader.cs
- DataGridAutoGeneratingColumnEventArgs.cs
- AdornerDecorator.cs
- ValidationPropertyAttribute.cs
- ScrollItemProviderWrapper.cs
- _KerberosClient.cs
- LateBoundBitmapDecoder.cs
- _SecureChannel.cs
- ListBox.cs
- AddInToken.cs
- SQLBinaryStorage.cs
- BindingContext.cs
- ScrollBarRenderer.cs
- Attributes.cs
- FixedNode.cs
- ipaddressinformationcollection.cs
- SystemNetHelpers.cs
- Viewport3DVisual.cs
- LicenseProviderAttribute.cs
- JsonDataContract.cs
- documentsequencetextpointer.cs
- securestring.cs
- ServiceMemoryGates.cs
- DataGridHelper.cs
- ResolveDuplex11AsyncResult.cs
- ReadOnlyDataSourceView.cs
- AndCondition.cs
- UriTemplateClientFormatter.cs
- HexParser.cs
- ProcessModelSection.cs
- DockProviderWrapper.cs
- altserialization.cs
- SqlDataSourceCache.cs
- HMACSHA384.cs
- TextAutomationPeer.cs
- Policy.cs
- TreeNodeSelectionProcessor.cs
- GenericUriParser.cs
- HttpListenerResponse.cs
- XmlSchemaAttributeGroup.cs
- RewritingSimplifier.cs
- Perspective.cs
- MappedMetaModel.cs
- DateTimeStorage.cs
- TemplatedMailWebEventProvider.cs
- CustomWebEventKey.cs
- SurrogateChar.cs
- EntityDesignerDataSourceView.cs
- OutputCacheProfile.cs
- MgmtConfigurationRecord.cs
- CreateParams.cs
- DataGridViewMethods.cs
- GridView.cs
- TracedNativeMethods.cs
- SmiMetaData.cs
- EmbossBitmapEffect.cs
- TransformedBitmap.cs
- Solver.cs
- BinaryObjectReader.cs
- ListViewAutomationPeer.cs
- MarkedHighlightComponent.cs
- TranslateTransform.cs
- ActiveDocumentEvent.cs
- RC2CryptoServiceProvider.cs
- XmlLanguage.cs
- DataViewManager.cs
- UnionQueryOperator.cs
- LoginCancelEventArgs.cs
- TokenizerHelper.cs
- ManagedFilter.cs
- FreeFormDesigner.cs