public HRESULT QueryAcceptData(IComDataObject lpdataobj, IntPtr lpcfFormat, RECO reco, BOOL fReally, IntPtr hMetaPict) { Debug.WriteLineIf(RichTextDbg.TraceVerbose, "IRichEditOleCallback::QueryAcceptData(reco=" + reco + ")"); if (reco == RECO.DROP) { if (owner.AllowDrop || owner.EnableAutoDragDrop) { MouseButtons b = Control.MouseButtons; Keys k = Control.ModifierKeys; User32.MK keyState = 0; // Due to the order in which we get called, we have to set up the keystate here. // First GetDragDropEffect is called with grfKeyState == 0, and then // QueryAcceptData is called. Since this is the time we want to fire // OnDragEnter, but we have yet to get the keystate, we set it up ourselves. if ((b & MouseButtons.Left) == MouseButtons.Left) { keyState |= User32.MK.LBUTTON; } if ((b & MouseButtons.Right) == MouseButtons.Right) { keyState |= User32.MK.RBUTTON; } if ((b & MouseButtons.Middle) == MouseButtons.Middle) { keyState |= User32.MK.MBUTTON; } if ((k & Keys.Control) == Keys.Control) { keyState |= User32.MK.CONTROL; } if ((k & Keys.Shift) == Keys.Shift) { keyState |= User32.MK.SHIFT; } lastDataObject = new DataObject(lpdataobj); if (!owner.EnableAutoDragDrop) { lastEffect = DragDropEffects.None; } var e = new DragEventArgs(lastDataObject, (int)keyState, Control.MousePosition.X, Control.MousePosition.Y, DragDropEffects.All, lastEffect); if (fReally == 0) { // we are just querying // We can get here without GetDragDropEffects actually being called first. // This happens when you drag/drop between two rtb's. Say you drag from rtb1 to rtb2. // GetDragDropEffects will first be called for rtb1, then QueryAcceptData for rtb1 just // like in the local drag case. Then you drag into rtb2. rtb2 will first be called in this method, // and not GetDragDropEffects. Now lastEffect is initialized to None for rtb2, so we would not allow // the drag. Thus we need to set the effect here as well. e.Effect = ((keyState & User32.MK.CONTROL) == User32.MK.CONTROL) ? DragDropEffects.Copy : DragDropEffects.Move; owner.OnDragEnter(e); } else { owner.OnDragDrop(e); lastDataObject = null; } lastEffect = e.Effect; if (e.Effect == DragDropEffects.None) { Debug.WriteLineIf(RichTextDbg.TraceVerbose, "\tCancel data"); return(HRESULT.E_FAIL); } else { Debug.WriteLineIf(RichTextDbg.TraceVerbose, "\tAccept data"); return(HRESULT.S_OK); } } else { Debug.WriteLineIf(RichTextDbg.TraceVerbose, "\tCancel data, allowdrop == false"); lastDataObject = null; return(HRESULT.E_FAIL); } } else { return(HRESULT.E_NOTIMPL); } }
public HRESULT GetClipboardData(ref Richedit.CHARRANGE lpchrg, RECO reco, IntPtr lplpdataobj) { Debug.WriteLineIf(RichTextDbg.TraceVerbose, "IRichEditOleCallback::GetClipboardData"); return(HRESULT.E_NOTIMPL); }