mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-15 22:22:44 +02:00
IDE, SourceEditor: Improved drag/drop tabs ( avoid missing mouse up events )
git-svn-id: trunk@22492 -
This commit is contained in:
parent
1f00732641
commit
4f99db414c
@ -439,10 +439,34 @@ type
|
||||
);
|
||||
TSourceNotebookStates = set of TSourceNotebookState;
|
||||
|
||||
TDragMoveTabEvent = procedure(Sender, Source: TObject; OldIndex, NewIndex: Integer) of object;
|
||||
|
||||
{ TDragableNotebook }
|
||||
|
||||
TDragableNotebook = class(TNoteBook)
|
||||
private
|
||||
FMouseDownTabIndex: Integer;
|
||||
FMouseWaitForDrag: Boolean;
|
||||
FMouseDownX: integer;
|
||||
FMouseDownY: integer;
|
||||
FOnDragMoveTab: TDragMoveTabEvent;
|
||||
protected
|
||||
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
||||
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
||||
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
||||
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
|
||||
var Accept: Boolean); override;
|
||||
property MouseDownTabIndex: Integer read FMouseDownTabIndex;
|
||||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
procedure DragDrop(Source: TObject; X, Y: Integer); override;
|
||||
property OnDragMoveTab: TDragMoveTabEvent read FOnDragMoveTab write FOnDragMoveTab;
|
||||
end;
|
||||
|
||||
{ TSourceNotebook }
|
||||
|
||||
TSourceNotebook = class(TSourceEditorWindowInterface)
|
||||
Notebook: TNoteBook;
|
||||
Notebook: TDragableNotebook;
|
||||
SrcPopUpMenu: TPopupMenu;
|
||||
StatusBar: TStatusBar;
|
||||
procedure AddBreakpointClicked(Sender: TObject);
|
||||
@ -541,10 +565,6 @@ type
|
||||
FProcessingCommand: boolean;
|
||||
FSourceEditorList: TList; // list of TSourceEditor
|
||||
FOnPopupMenu: TSrcEditPopupMenuEvent;
|
||||
FMouseDownTabIndex: Integer;
|
||||
FMouseWaitForDrag: Boolean;
|
||||
FMouseDownX: integer;
|
||||
FMouseDownY: integer;
|
||||
private
|
||||
// colors for the completion form (popup form, e.g. word completion)
|
||||
FActiveEditDefaultFGColor: TColor;
|
||||
@ -634,12 +654,7 @@ type
|
||||
|
||||
procedure NotebookMouseDown(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X,Y: Integer);
|
||||
procedure NotebookMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
|
||||
procedure NotebookMouseUp(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X,Y: Integer);
|
||||
procedure NotebookDragOver(Sender: TObject; Source: TObject; X, Y: Integer;
|
||||
State: TDragState; var Accept: Boolean);
|
||||
procedure NotebookDragDrop(Sender: TObject; Source: TObject; X, Y: Integer);
|
||||
procedure NotebookDragTabMove(Sender, Source: TObject; OldIndex, NewIndex: Integer);
|
||||
|
||||
// hintwindow stuff
|
||||
procedure HintTimer(Sender: TObject);
|
||||
@ -3437,8 +3452,6 @@ begin
|
||||
Caption := locWndSrcEditor;
|
||||
KeyPreview:=true;
|
||||
FProcessingCommand := false;
|
||||
FMouseDownTabIndex := -1;
|
||||
FMouseWaitForDrag := False;
|
||||
|
||||
SourceEditorWindow:=Self;
|
||||
|
||||
@ -4269,7 +4282,7 @@ Begin
|
||||
{$IFDEF IDE_DEBUG}
|
||||
writeln('[TSourceNotebook.CreateNotebook] B');
|
||||
{$ENDIF}
|
||||
Notebook := TNotebook.Create(self);
|
||||
Notebook := TDragableNotebook.Create(self);
|
||||
{$IFDEF IDE_DEBUG}
|
||||
writeln('[TSourceNotebook.CreateNotebook] C');
|
||||
{$ENDIF}
|
||||
@ -4298,10 +4311,7 @@ Begin
|
||||
OnPageChanged := @NotebookPageChanged;
|
||||
OnCloseTabClicked:=@CloseTabClicked;
|
||||
OnMouseDown:=@NotebookMouseDown;
|
||||
OnMouseMove := @NotebookMouseMove;
|
||||
OnMouseUp:=@NotebookMouseUp;
|
||||
OnDragOver := @NotebookDragOver;
|
||||
OnDragDrop := @NotebookDragDrop;
|
||||
OnDragMoveTab := @NotebookDragTabMove;
|
||||
ShowHint:=true;
|
||||
OnShowHint:=@NotebookShowTabHint;
|
||||
{$IFDEF IDE_DEBUG}
|
||||
@ -6519,64 +6529,18 @@ procedure TSourceNotebook.NotebookMouseDown(Sender: TObject; Button: TMouseButto
|
||||
var
|
||||
TabIndex: Integer;
|
||||
begin
|
||||
TabIndex:=Notebook.TabIndexAtClientPos(Point(X,Y));
|
||||
FMouseDownTabIndex:=-1;
|
||||
FMouseWaitForDrag := False;
|
||||
FMouseDownX := X;
|
||||
FMouseDownY := Y;
|
||||
case Button of
|
||||
mbLeft: begin
|
||||
FMouseDownTabIndex:=TabIndex;
|
||||
FMouseWaitForDrag := True;
|
||||
end;
|
||||
mbMiddle: begin
|
||||
if TabIndex>=0 then
|
||||
CloseClicked(Notebook.Page[TabIndex])
|
||||
end;
|
||||
if (Button = mbMiddle) then begin
|
||||
TabIndex:=Notebook.TabIndexAtClientPos(Point(X,Y));
|
||||
if TabIndex>=0 then
|
||||
CloseClicked(Notebook.Page[TabIndex])
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.NotebookMouseMove(Sender: TObject; Shift: TShiftState;
|
||||
X, Y: Integer);
|
||||
procedure TSourceNotebook.NotebookDragTabMove(Sender, Source: TObject; OldIndex,
|
||||
NewIndex: Integer);
|
||||
begin
|
||||
if (FMouseWaitForDrag) and
|
||||
( (Abs(fMouseDownX - X) >= GetSystemMetrics(SM_CXDRAG)) or
|
||||
(Abs(fMouseDownY - Y) >= GetSystemMetrics(SM_CYDRAG)) )
|
||||
then begin
|
||||
FMouseWaitForDrag := False;
|
||||
BeginDrag(true);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.NotebookMouseUp(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
FMouseWaitForDrag := False;
|
||||
FMouseDownTabIndex:=-1;
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.NotebookDragOver(Sender: TObject; Source: TObject;
|
||||
X, Y: Integer; State: TDragState; var Accept: Boolean);
|
||||
var
|
||||
TabIndex: Integer;
|
||||
begin
|
||||
TabIndex:=Notebook.TabIndexAtClientPos(Point(X,Y));
|
||||
if (Source = self) then
|
||||
Accept := (TabIndex >= 0) and (TabIndex <> FMouseDownTabIndex);
|
||||
end;
|
||||
|
||||
procedure TSourceNotebook.NotebookDragDrop(Sender: TObject; Source: TObject;
|
||||
X, Y: Integer);
|
||||
var
|
||||
TabIndex: Integer;
|
||||
begin
|
||||
if (Source = self) then begin
|
||||
TabIndex := Notebook.TabIndexAtClientPos(Point(X,Y));
|
||||
if (FMouseDownTabIndex>=0) and (TabIndex>=0) and (TabIndex<>FMouseDownTabIndex)
|
||||
then
|
||||
MoveEditor(FMouseDownTabIndex,TabIndex);
|
||||
end;
|
||||
FMouseDownTabIndex:=-1;
|
||||
if (Source = Sender) then
|
||||
MoveEditor(OldIndex, NewIndex);
|
||||
end;
|
||||
|
||||
Procedure TSourceNotebook.NotebookPageChanged(Sender: TObject);
|
||||
@ -7292,6 +7256,77 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{ TDragableNotebook }
|
||||
|
||||
procedure TDragableNotebook.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
|
||||
Y: Integer);
|
||||
begin
|
||||
inherited MouseDown(Button, Shift, X, Y);
|
||||
FMouseDownTabIndex := TabIndexAtClientPos(Point(X,Y));
|
||||
FMouseWaitForDrag := False;
|
||||
FMouseDownX := X;
|
||||
FMouseDownY := Y;
|
||||
if (Button = mbLeft) and (FMouseDownTabIndex >= 0) then begin
|
||||
FMouseWaitForDrag := True;
|
||||
MouseCapture := True;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDragableNotebook.MouseMove(Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
inherited MouseMove(Shift, X, Y);
|
||||
if (FMouseWaitForDrag) and
|
||||
( (Abs(fMouseDownX - X) >= GetSystemMetrics(SM_CXDRAG)) or
|
||||
(Abs(fMouseDownY - Y) >= GetSystemMetrics(SM_CYDRAG)) )
|
||||
then begin
|
||||
FMouseWaitForDrag := False;
|
||||
BeginDrag(true);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDragableNotebook.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
MouseCapture := False;
|
||||
FMouseWaitForDrag := False;
|
||||
inherited MouseUp(Button, Shift, X, Y);
|
||||
end;
|
||||
|
||||
procedure TDragableNotebook.DragOver(Source: TObject; X, Y: Integer; State: TDragState;
|
||||
var Accept: Boolean);
|
||||
var
|
||||
TabIndex: Integer;
|
||||
begin
|
||||
inherited DragOver(Source, X, Y, State, Accept);
|
||||
// currently limited to source=self => extendable to allow dragging tabs from other notebooks
|
||||
if (Source = self) and (FMouseDownTabIndex >= 0) then begin
|
||||
TabIndex := TabIndexAtClientPos(Point(X,Y));
|
||||
Accept := (TabIndex >= 0) and (TabIndex <> FMouseDownTabIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TDragableNotebook.Create(TheOwner: TComponent);
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
FMouseWaitForDrag := False;
|
||||
end;
|
||||
|
||||
procedure TDragableNotebook.DragDrop(Source: TObject; X, Y: Integer);
|
||||
var
|
||||
TabIndex: Integer;
|
||||
begin
|
||||
inherited DragDrop(Source, X, Y);
|
||||
|
||||
if assigned(FOnDragMoveTab) and (Source is TDragableNotebook) and
|
||||
(TDragableNotebook(Source).MouseDownTabIndex >= 0)
|
||||
then begin
|
||||
TabIndex := TabIndexAtClientPos(Point(X,Y));
|
||||
if (TabIndex >= 0) and ( (Source <> self) or (TabIndex <> MouseDownTabIndex) )
|
||||
then
|
||||
FOnDragMoveTab(Self, Source, TDragableNotebook(Source).MouseDownTabIndex,
|
||||
TabIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
initialization
|
||||
InternalInit;
|
||||
{$I sourceeditor.lrs}
|
||||
|
Loading…
Reference in New Issue
Block a user