diff options
Diffstat (limited to 'win32/ScintillaWin.cxx')
| -rw-r--r-- | win32/ScintillaWin.cxx | 61 | 
1 files changed, 32 insertions, 29 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 62d87fd9d..6d7f1268d 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -183,6 +183,7 @@ class ScintillaWin :  	enum { invalidTimerID, standardTimerID, idleTimerID }; +	virtual bool DragThreshold(Point ptStart, Point ptNow);  	virtual void StartDrag();  	sptr_t WndPaint(uptr_t wParam);  	sptr_t HandleComposition(uptr_t wParam, sptr_t lParam); @@ -224,6 +225,7 @@ class ScintillaWin :  	void FullPaint();  	void FullPaintDC(HDC dc);  	bool IsCompatibleDC(HDC dc); +	DWORD EffectFromState(DWORD grfKeyState);  	virtual int SetScrollInfo(int nBar, LPCSCROLLINFO lpsi, BOOL bRedraw);  	virtual bool GetScrollInfo(int nBar, LPSCROLLINFO lpsi); @@ -335,7 +337,15 @@ HWND ScintillaWin::MainHWND() {  	return reinterpret_cast<HWND>(wMain.GetID());  } +bool ScintillaWin::DragThreshold(Point ptStart, Point ptNow) { +	int xMove = abs(ptStart.x - ptNow.x); +	int yMove = abs(ptStart.y - ptNow.y); +	return (xMove > ::GetSystemMetrics(SM_CXDRAG)) || +		(yMove > ::GetSystemMetrics(SM_CYDRAG)); +} +  void ScintillaWin::StartDrag() { +	inDragDrop = ddDragging;  	DWORD dwEffect = 0;  	dropWentOutside = true;  	IDataObject *pDataObject = reinterpret_cast<IDataObject *>(&dob); @@ -352,7 +362,7 @@ void ScintillaWin::StartDrag() {  			ClearSelection();  		}  	} -	inDragDrop = false; +	inDragDrop = ddNone;  	SetDragPosition(invalidPosition);  } @@ -696,7 +706,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  	case WM_SETCURSOR:  		if (LoWord(lParam) == HTCLIENT) { -			if (inDragDrop) { +			if (inDragDrop == ddDragging) {  				DisplayCursor(Window::cursorUp);  			} else {  				// Display regular (drag) cursor over selection @@ -868,8 +878,8 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  		capturedMouse = false;  		return 0; -        // These are not handled in Scintilla and its faster to dispatch them here. -        // Also moves time out to here so profile doesn't count lots of empty message calls. +	// These are not handled in Scintilla and its faster to dispatch them here. +	// Also moves time out to here so profile doesn't count lots of empty message calls.  	case WM_MOVE:  	case WM_MOUSEACTIVATE: @@ -1978,6 +1988,20 @@ bool ScintillaWin::IsCompatibleDC(HDC hOtherDC) {  	return isCompatible;  } +DWORD ScintillaWin::EffectFromState(DWORD grfKeyState) { +	// These are the Wordpad semantics. +	DWORD dwEffect; +	if (inDragDrop == ddDragging)	// Internal defaults to move +		dwEffect = DROPEFFECT_MOVE; +	else +		dwEffect = DROPEFFECT_COPY; +	if (grfKeyState & MK_ALT) +		dwEffect = DROPEFFECT_MOVE; +	if (grfKeyState & MK_CONTROL) +		dwEffect = DROPEFFECT_COPY; +	return dwEffect; +} +  /// Implement IUnknown  STDMETHODIMP ScintillaWin::QueryInterface(REFIID riid, PVOID *ppv) {  	*ppv = NULL; @@ -2020,14 +2044,7 @@ STDMETHODIMP ScintillaWin::DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyStat  		return S_OK;  	} -	if (inDragDrop)	// Internal defaults to move -		*pdwEffect = DROPEFFECT_MOVE; -	else -		*pdwEffect = DROPEFFECT_COPY; -	if (grfKeyState & MK_ALT) -		*pdwEffect = DROPEFFECT_MOVE; -	if (grfKeyState & MK_CONTROL) -		*pdwEffect = DROPEFFECT_COPY; +	*pdwEffect = EffectFromState(grfKeyState);  	return S_OK;  } @@ -2037,15 +2054,8 @@ STDMETHODIMP ScintillaWin::DragOver(DWORD grfKeyState, POINTL pt, PDWORD pdwEffe  		return S_OK;  	} -	// These are the Wordpad semantics. -	if (inDragDrop)	// Internal defaults to move -		*pdwEffect = DROPEFFECT_MOVE; -	else -		*pdwEffect = DROPEFFECT_COPY; -	if (grfKeyState & MK_ALT) -		*pdwEffect = DROPEFFECT_MOVE; -	if (grfKeyState & MK_CONTROL) -		*pdwEffect = DROPEFFECT_COPY; +	*pdwEffect = EffectFromState(grfKeyState); +  	// Update the cursor.  	POINT rpt = {pt.x, pt.y};  	::ScreenToClient(MainHWND(), &rpt); @@ -2061,14 +2071,7 @@ STDMETHODIMP ScintillaWin::DragLeave() {  STDMETHODIMP ScintillaWin::Drop(LPDATAOBJECT pIDataSource, DWORD grfKeyState,                                  POINTL pt, PDWORD pdwEffect) { -	if (inDragDrop)	// Internal defaults to move -		*pdwEffect = DROPEFFECT_MOVE; -	else -		*pdwEffect = DROPEFFECT_COPY; -	if (grfKeyState & MK_ALT) -		*pdwEffect = DROPEFFECT_MOVE; -	if (grfKeyState & MK_CONTROL) -		*pdwEffect = DROPEFFECT_COPY; +	*pdwEffect = EffectFromState(grfKeyState);  	if (pIDataSource == NULL)  		return E_POINTER;  | 
