SynEdit: Added threshold before starting selection by mouse-move. Avoid accidental selection.

git-svn-id: trunk@30071 -
This commit is contained in:
martin 2011-03-29 15:48:15 +00:00
parent 7382bb0de7
commit bde4fc65af

View File

@ -179,7 +179,7 @@ type
// Mouse-states // Mouse-states
sfLeftGutterClick, sfRightGutterClick, sfLeftGutterClick, sfRightGutterClick,
sfDblClicked, sfTripleClicked, sfQuadClicked, sfDblClicked, sfTripleClicked, sfQuadClicked,
sfWaitForDragging, sfIsDragging, sfMouseSelecting, sfMouseDoneSelecting, sfWaitForDragging, sfIsDragging, sfWaitForMouseSelecting, sfMouseSelecting, sfMouseDoneSelecting,
sfIgnoreUpClick sfIgnoreUpClick
); //mh 2000-10-30 ); //mh 2000-10-30
TSynStateFlags = set of TSynStateFlag; TSynStateFlags = set of TSynStateFlag;
@ -2591,7 +2591,7 @@ begin
Include(fStateFlags, sfMouseDoneSelecting); Include(fStateFlags, sfMouseDoneSelecting);
end; end;
MouseCapture := True; MouseCapture := True;
Include(fStateFlags, sfMouseSelecting); Include(fStateFlags, sfWaitForMouseSelecting);
end; end;
emcSelectWord: emcSelectWord:
begin begin
@ -2744,7 +2744,7 @@ begin
fStateFlags := fStateFlags - [sfDblClicked, sfTripleClicked, sfQuadClicked, fStateFlags := fStateFlags - [sfDblClicked, sfTripleClicked, sfQuadClicked,
sfLeftGutterClick, sfRightGutterClick, sfLeftGutterClick, sfRightGutterClick,
sfMouseSelecting, sfMouseDoneSelecting, sfWaitForMouseSelecting, sfMouseSelecting, sfMouseDoneSelecting,
sfWaitForDragging, sfIgnoreUpClick sfWaitForDragging, sfIgnoreUpClick
]; ];
@ -2802,14 +2802,20 @@ begin
LastMouseCaret := PixelsToRowColumn(Point(X,Y)); LastMouseCaret := PixelsToRowColumn(Point(X,Y));
UpdateCursor; UpdateCursor;
if (sfWaitForMouseSelecting in fStateFlags) and MouseCapture and
( (abs(fMouseDownX-X) >= MinMax(fCharWidth div 2, 2, 4)) or
(abs(fMouseDownY-Y) >= MinMax(fTextHeight div 2, 2, 4)) )
then
FStateFlags := FStateFlags - [sfWaitForMouseSelecting] + [sfMouseSelecting];
//debugln('TCustomSynEdit.MouseMove sfWaitForDragging=',dbgs(sfWaitForDragging in fStateFlags),' MouseCapture=',dbgs(MouseCapture),' GetCaptureControl=',DbgSName(GetCaptureControl)); //debugln('TCustomSynEdit.MouseMove sfWaitForDragging=',dbgs(sfWaitForDragging in fStateFlags),' MouseCapture=',dbgs(MouseCapture),' GetCaptureControl=',DbgSName(GetCaptureControl));
if MouseCapture and (sfWaitForDragging in fStateFlags) then begin if MouseCapture and (sfWaitForDragging in fStateFlags) then begin
if (Abs(fMouseDownX - X) >= GetSystemMetrics(SM_CXDRAG)) if (Abs(fMouseDownX - X) >= GetSystemMetrics(SM_CXDRAG))
or (Abs(fMouseDownY - Y) >= GetSystemMetrics(SM_CYDRAG)) or (Abs(fMouseDownY - Y) >= GetSystemMetrics(SM_CYDRAG))
then begin then begin
Exclude(fStateFlags, sfWaitForDragging); FStateFlags := FStateFlags
Exclude(fStateFlags, sfMouseSelecting); -[sfWaitForDragging, sfWaitForMouseSelecting, sfMouseSelecting]
Include(fStateFlags, sfIsDragging); + [sfIsDragging];
//debugln('TCustomSynEdit.MouseMove BeginDrag'); //debugln('TCustomSynEdit.MouseMove BeginDrag');
BeginDrag(true); BeginDrag(true);
end; end;
@ -2872,7 +2878,7 @@ begin
FBlockSelection.DecPersistentLock; FBlockSelection.DecPersistentLock;
end end
else else
if MouseCapture and (not(sfIsDragging in fStateFlags)) if MouseCapture and (fStateFlags * [sfIsDragging, sfWaitForMouseSelecting] = [])
then begin then begin
MouseCapture:=false; MouseCapture:=false;
fScrollTimer.Enabled := False; fScrollTimer.Enabled := False;
@ -2970,6 +2976,7 @@ begin
wasSelecting := (sfMouseDoneSelecting in fStateFlags); wasSelecting := (sfMouseDoneSelecting in fStateFlags);
ignoreUp := (sfIgnoreUpClick in fStateFlags); ignoreUp := (sfIgnoreUpClick in fStateFlags);
Exclude(fStateFlags, sfIsDragging); Exclude(fStateFlags, sfIsDragging);
Exclude(fStateFlags, sfWaitForMouseSelecting);
Exclude(fStateFlags, sfMouseSelecting); Exclude(fStateFlags, sfMouseSelecting);
Exclude(fStateFlags, sfMouseDoneSelecting); Exclude(fStateFlags, sfMouseDoneSelecting);
Exclude(fStateFlags, sfIgnoreUpClick); Exclude(fStateFlags, sfIgnoreUpClick);