mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-28 10:02:14 +00:00
UPD: Further tabs handling.
This commit is contained in:
parent
00897ecaed
commit
cb0e55e9fe
6 changed files with 221 additions and 197 deletions
120
src/fmain.pas
120
src/fmain.pas
|
|
@ -400,8 +400,8 @@ type
|
|||
procedure seLogWindowSpecialLineColors(Sender: TObject; Line: integer;
|
||||
var Special: boolean; var FG, BG: TColor);
|
||||
|
||||
function FramepnlFileBeforeChangeDirectory(Sender: TObject; const NewDir : String): Boolean;
|
||||
procedure FramepnlFileAfterChangeDirectory(Sender: TObject; const NewDir : String);
|
||||
function FramepnlFileBeforeChangeDirectory(Sender: TCustomPage; const NewDir : String): Boolean;
|
||||
procedure FramepnlFileAfterChangeDirectory(Sender: TCustomPage; const NewDir : String);
|
||||
procedure edtCommandKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
procedure edtCommandEnter(Sender: TObject);
|
||||
|
|
@ -444,6 +444,7 @@ type
|
|||
Function ActiveFrame: TFileView; // get Active frame
|
||||
Function NotActiveFrame: TFileView; // get NotActive frame :)
|
||||
function ActiveNotebook: TFileViewNotebook;
|
||||
function NotActiveNotebook: TFileViewNotebook;
|
||||
function FrameLeft: TFileView;
|
||||
function FrameRight: TFileView;
|
||||
procedure AppException(Sender: TObject; E: Exception);
|
||||
|
|
@ -470,8 +471,7 @@ type
|
|||
procedure CreateDrivesMenu;
|
||||
procedure DrivesMenuClick(Sender: TObject);
|
||||
procedure CreateDiskPanel(dskPanel : TKASToolBar);
|
||||
procedure CreatePanel(sType: String; AOwner:TWinControl; APanel:TFilePanelSelect;
|
||||
FileSource: TFileSource);
|
||||
function CreateFileView(sType: String; FileSource: TFileSource; Page: TFileViewPage): TFileView;
|
||||
function RemovePage(ANoteBook: TFileViewNotebook; iPageIndex:Integer): LongInt;
|
||||
procedure LoadTabs(ANoteBook: TFileViewNotebook);
|
||||
procedure SaveTabs(ANoteBook: TFileViewNotebook);
|
||||
|
|
@ -528,12 +528,23 @@ var
|
|||
{$ENDIF}
|
||||
|
||||
procedure TfrmMain.FormCreate(Sender: TObject);
|
||||
|
||||
function CreateNotebook(aParent: TWinControl; aSide: TFilePanelSelect): TFileViewNotebook;
|
||||
begin
|
||||
Result := TFileViewNotebook.Create(aParent, aSide);
|
||||
|
||||
Result.OnCloseTabClicked := @NotebookCloseTabClicked;
|
||||
Result.OnMouseDown := @nbPageMouseDown;
|
||||
Result.OnMouseUp := @nbPageMouseUp;
|
||||
Result.OnPageChanged := @nbPageChanged;
|
||||
end;
|
||||
|
||||
var
|
||||
slCommandHistory: TStringListEx;
|
||||
i: Integer;
|
||||
begin
|
||||
nbLeft := TFileViewNotebook.Create(pnlLeft);
|
||||
nbRight := TFileViewNotebook.Create(pnlRight);
|
||||
nbLeft := CreateNotebook(pnlLeft, fpLeft);
|
||||
nbRight := CreateNotebook(pnlRight, fpRight);
|
||||
|
||||
HiddenToTray := False;
|
||||
|
||||
|
|
@ -1343,9 +1354,9 @@ begin
|
|||
|
||||
// Check lock option items.
|
||||
Index := pmTabMenu.Items.IndexOf(miToggleLockTab);
|
||||
pmTabMenu.Items.Items[Index].Checked := (NoteBook.Page[TabNr].Tag = 1);
|
||||
pmTabMenu.Items.Items[Index].Checked := (NoteBook.Page[TabNr].LockState = tlsLockedPath);
|
||||
Index := pmTabMenu.Items.IndexOf(miToggleLockDcaTab);
|
||||
pmTabMenu.Items.Items[Index].Checked := (NoteBook.Page[TabNr].Tag = 2);
|
||||
pmTabMenu.Items.Items[Index].Checked := (NoteBook.Page[TabNr].LockState = tlsResettingPath);
|
||||
|
||||
pmTabMenu.Parent := NoteBook;
|
||||
pmTabMenu.Tag := TabNr;
|
||||
|
|
@ -1572,6 +1583,18 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TfrmMain.NotActiveNotebook: TFileViewNotebook;
|
||||
begin
|
||||
case PanelSelected of
|
||||
fpLeft:
|
||||
Result := nbRight;
|
||||
fpRight:
|
||||
Result := nbLeft;
|
||||
else
|
||||
assert(false,'Bad active notebook');
|
||||
end;
|
||||
end;
|
||||
|
||||
function TfrmMain.FrameLeft: TFileView;
|
||||
begin
|
||||
Result := nbLeft.ActiveView;
|
||||
|
|
@ -2266,10 +2289,10 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TfrmMain.FramepnlFileBeforeChangeDirectory(Sender: TObject; const NewDir: String): Boolean;
|
||||
function TfrmMain.FramepnlFileBeforeChangeDirectory(Sender: TCustomPage; const NewDir: String): Boolean;
|
||||
var
|
||||
ANoteBook: TFileViewNotebook;
|
||||
Page: TFileViewPage;
|
||||
Page, NewPage: TFileViewPage;
|
||||
Panel: TFilePanelSelect;
|
||||
begin
|
||||
Result:= True;
|
||||
|
|
@ -2283,23 +2306,16 @@ begin
|
|||
|
||||
ANoteBook := Page.Notebook;
|
||||
|
||||
if ANoteBook = LeftTabs then
|
||||
Panel := fpLeft
|
||||
else if ANoteBook = RightTabs then
|
||||
Panel := fpRight
|
||||
else
|
||||
Exit;
|
||||
|
||||
// Create same type
|
||||
//CreatePanel(ActiveFrame.Type, AddPage(NoteBook), Panel,
|
||||
// ActiveFrame.FileSource.Type.Create(sPath));
|
||||
|
||||
ActiveFrame.SetFocus;
|
||||
NewPage := ANoteBook.AddPage;
|
||||
Page.FileView.Clone(NewPage);
|
||||
NewPage.FileView.CurrentPath := NewDir;
|
||||
NewPage.MakeActive;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.FramepnlFileAfterChangeDirectory(Sender: TObject; const NewDir: String);
|
||||
procedure TfrmMain.FramepnlFileAfterChangeDirectory(Sender: TCustomPage; const NewDir: String);
|
||||
var
|
||||
ANoteBook : TFileViewNotebook;
|
||||
Page: TFileViewPage;
|
||||
|
|
@ -2312,10 +2328,7 @@ begin
|
|||
if Page.LockState = tlsNormal then // if not locked tab
|
||||
begin
|
||||
sCaption := GetLastDir(ExcludeTrailingPathDelimiter(NewDir));
|
||||
if (tb_text_length_limit in gDirTabOptions) and (Length(sCaption) > gDirTabLimit) then
|
||||
Page.Caption:= Copy(sCaption, 1, gDirTabLimit) + '...'
|
||||
else
|
||||
Page.Caption := sCaption;
|
||||
Page.UpdateCaption(sCaption);
|
||||
end;
|
||||
|
||||
// update file system watcher directory
|
||||
|
|
@ -2477,30 +2490,27 @@ begin
|
|||
AddSpecialButtons(dskPanel);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.CreatePanel(sType: String; AOwner: TWinControl; APanel:TFilePanelSelect; FileSource: TFileSource);
|
||||
function TfrmMain.CreateFileView(sType: String; FileSource: TFileSource;
|
||||
Page: TFileViewPage): TFileView;
|
||||
var
|
||||
FileView: TFileView = nil;
|
||||
Panel: TFilePanelSelect;
|
||||
begin
|
||||
// This function should be changed to a separate TFileView factory.
|
||||
|
||||
if sType = 'columns' then
|
||||
begin
|
||||
FileView := TColumnsFileView.Create(AOwner, FileSource);
|
||||
Result := TColumnsFileView.Create(Page, FileSource);
|
||||
end
|
||||
else
|
||||
Exit;
|
||||
|
||||
with FileView do
|
||||
begin
|
||||
PanelSelect := APanel; // should be removed when notebook will be custom class
|
||||
// and will store where each view is (left or right)
|
||||
{
|
||||
do this with observer pattern:
|
||||
Result := nil;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
// Set before changing directory.
|
||||
with Result do
|
||||
begin
|
||||
OnBeforeChangeDirectory := @FramepnlFileBeforeChangeDirectory;
|
||||
OnAfterChangeDirectory := @FramepnlFileAfterChangeDirectory;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -2511,7 +2521,7 @@ begin
|
|||
(iPageIndex >= 0) and
|
||||
(iPageIndex < ANoteBook.PageCount) then
|
||||
begin
|
||||
if ANoteBook.Page[iPageIndex].Tag > 0 then
|
||||
if ANoteBook.Page[iPageIndex].LockState <> tlsNormal then
|
||||
case msgYesNoCancel(Format(rsMsgCloseLockedTab, [ANoteBook.Page[iPageIndex].Caption])) of
|
||||
mmrNo:
|
||||
Exit(1);
|
||||
|
|
@ -2519,20 +2529,9 @@ begin
|
|||
Exit(2);
|
||||
end;
|
||||
|
||||
ANoteBook.Pages.Delete(iPageIndex);
|
||||
|
||||
if (nboMultiLine in ANoteBook.Options) and
|
||||
ANoteBook.ClientRectNeedsInterfaceUpdate then
|
||||
begin
|
||||
// The height of the tabs (nr of lines) has changed.
|
||||
// Recalculate size of each page.
|
||||
ANoteBook.InvalidateClientRectCache(False);
|
||||
ANoteBook.ReAlign;
|
||||
end;
|
||||
|
||||
ANoteBook.RemovePage(iPageIndex);
|
||||
Result:= 0;
|
||||
end;
|
||||
ANoteBook.ShowTabs:= ((ANoteBook.PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.ReLoadTabs(ANoteBook: TFileViewNotebook);
|
||||
|
|
@ -2566,8 +2565,7 @@ var
|
|||
I, J: Integer;
|
||||
sIndex,
|
||||
TabsSection: String;
|
||||
fpsPanel: TFilePanelSelect;
|
||||
sCurrentDir,
|
||||
sCurrentDir,
|
||||
sPath, sColumnSet,
|
||||
sCaption: String;
|
||||
iActiveTab: Integer;
|
||||
|
|
@ -2576,12 +2574,10 @@ begin
|
|||
if ANoteBook = nbLeft then
|
||||
begin
|
||||
TabsSection:= 'lefttabs';
|
||||
fpsPanel:= fpLeft;
|
||||
end
|
||||
else
|
||||
begin
|
||||
TabsSection:= 'righttabs';
|
||||
fpsPanel:= fpRight;
|
||||
end;
|
||||
|
||||
I:= 0;
|
||||
|
|
@ -2609,19 +2605,17 @@ begin
|
|||
|
||||
Page := ANoteBook.AddPage;
|
||||
|
||||
CreatePanel('columns', Page, fpsPanel,
|
||||
TFileSystemFileSource.Create(sPath));
|
||||
if not Assigned(CreateFileView('columns', TFileSystemFileSource.Create(sPath), Page)) then
|
||||
begin
|
||||
ANoteBook.RemovePage(Page);
|
||||
continue;
|
||||
end;
|
||||
|
||||
Page.LockState := TTabLockState(gIni.ReadInteger(TabsSection, sIndex + '_options', 0));
|
||||
if Page.LockState = tlsResettingPath then // if locked tab with directory change
|
||||
Page.LockPath := sPath;
|
||||
|
||||
if sCaption <> '' then
|
||||
if (tb_text_length_limit in gDirTabOptions) and (Length(sCaption) > gDirTabLimit) then
|
||||
Page.Caption := Copy(sCaption, 1, gDirTabLimit) + '...'
|
||||
else
|
||||
Page.Caption := sCaption;
|
||||
|
||||
Page.UpdateCaption(sCaption);
|
||||
Page.FileView.LoadConfiguration(TabsSection, StrToInt(sIndex));
|
||||
|
||||
Inc(I);
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ type
|
|||
|
||||
destructor Destroy; override;
|
||||
|
||||
function Clone: TColumnsFileView; override;
|
||||
function Clone(NewParent: TWinControl): TColumnsFileView; override;
|
||||
procedure CloneTo(FileView: TFileView); override;
|
||||
|
||||
{en
|
||||
|
|
@ -1150,11 +1150,9 @@ procedure TColumnsFileView.SetCurrentPath(NewPath: String);
|
|||
begin
|
||||
if NewPath <> '' then
|
||||
begin
|
||||
{
|
||||
if Assigned(FOnBeforeChangeDirectory) then
|
||||
if not FOnBeforeChangeDirectory(fOwner, NewDirectory) then
|
||||
if Assigned(OnBeforeChangeDirectory) then
|
||||
if not OnBeforeChangeDirectory(Parent as TCustomPage, NewPath) then
|
||||
Exit;
|
||||
}
|
||||
{
|
||||
if not FileSource.ChangePath(NewPath) then
|
||||
begin
|
||||
|
|
@ -1177,10 +1175,9 @@ begin
|
|||
MakeFileSourceFileList;
|
||||
|
||||
UpdatePathLabel;
|
||||
{
|
||||
if Assigned(FOnAfterChangeDirectory) then
|
||||
FOnAfterChangeDirectory(fOwner, fActiveDir);
|
||||
}
|
||||
|
||||
if Assigned(OnAfterChangeDirectory) then
|
||||
OnAfterChangeDirectory(Parent as TCustomPage, CurrentPath);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -2136,7 +2133,7 @@ begin
|
|||
SetFocus;
|
||||
UpDatelblInfo;
|
||||
frmMain.EnableHotkeys(True);
|
||||
frmMain.SelectedPanel := PanelSelect;
|
||||
frmMain.SelectedPanel := (NotebookPage as TFileViewPage).Notebook.Side;
|
||||
end;
|
||||
|
||||
procedure TColumnsFileView.RedrawGrid;
|
||||
|
|
@ -2553,7 +2550,6 @@ begin
|
|||
pnlFooter.Parent:=Self;
|
||||
pnlFooter.Align:=alBottom;
|
||||
|
||||
pnlFooter.Width:=AOwner.Width;
|
||||
pnlFooter.Anchors:=[akLeft, akRight, akBottom];
|
||||
pnlFooter.Height:=20;
|
||||
pnlFooter.Top:=Height-20;
|
||||
|
|
@ -2643,13 +2639,13 @@ begin
|
|||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TColumnsFileView.Clone: TColumnsFileView;
|
||||
function TColumnsFileView.Clone(NewParent: TWinControl): TColumnsFileView;
|
||||
var
|
||||
FileSourceCloned: TFileSource;
|
||||
begin
|
||||
FileSourceCloned := FileSource.Clone;
|
||||
try
|
||||
Result := TColumnsFileView.Create(Parent, FileSourceCloned);
|
||||
Result := TColumnsFileView.Create(NewParent, FileSourceCloned);
|
||||
CloneTo(Result);
|
||||
except
|
||||
FreeAndNil(FileSourceCloned);
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ type
|
|||
constructor Create; override;
|
||||
constructor Create(Path: String); overload;
|
||||
|
||||
function Clone: TFileSystemFileSource; overload;
|
||||
procedure CloneTo(FileSource: TFileSource); overload;
|
||||
function Clone: TFileSystemFileSource; override;
|
||||
procedure CloneTo(FileSource: TFileSource); override;
|
||||
|
||||
class function GetSupportedFileProperties: TFilePropertiesTypes; override;
|
||||
class function GetOperationsTypes: TFileSourceOperationTypes; override;
|
||||
|
|
|
|||
|
|
@ -5,11 +5,14 @@ unit uFileView;
|
|||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Controls,
|
||||
Classes, SysUtils, Controls, ExtCtrls,
|
||||
uFile, uFileSource, uFilePanelSelect, uMethodsList;
|
||||
|
||||
type
|
||||
|
||||
TOnBeforeChangeDirectory = function (FileView: TCustomPage; const NewDir : String): Boolean of object;
|
||||
TOnAfterChangeDirectory = procedure (FileView: TCustomPage; const NewDir : String) of object;
|
||||
|
||||
{en
|
||||
Base class for any view of a file or files.
|
||||
There should always be at least one file displayed on the view.
|
||||
|
|
@ -24,13 +27,15 @@ type
|
|||
}
|
||||
FFileSource: TFileSource;
|
||||
|
||||
// It should be independent of left/right side in the future.
|
||||
FPanelSelect: TFilePanelSelect;
|
||||
|
||||
FMethods: TMethodsList;
|
||||
|
||||
FOnBeforeChangeDirectory : TOnBeforeChangeDirectory;
|
||||
FOnAfterChangeDirectory : TOnAfterChangeDirectory;
|
||||
|
||||
function GetCurrentAddress: String;
|
||||
|
||||
function GetNotebookPage: TCustomPage;
|
||||
|
||||
protected
|
||||
function GetCurrentPath: String; virtual;
|
||||
procedure SetCurrentPath(NewPath: String); virtual;
|
||||
|
|
@ -44,7 +49,7 @@ type
|
|||
|
||||
destructor Destroy; override;
|
||||
|
||||
function Clone: TFileView; virtual;
|
||||
function Clone(NewParent: TWinControl): TFileView; virtual;
|
||||
procedure CloneTo(FileView: TFileView); virtual;
|
||||
|
||||
// Retrieves files from file source again and displays the new list of files.
|
||||
|
|
@ -62,7 +67,6 @@ type
|
|||
property CurrentPath: String read GetCurrentPath write SetCurrentPath;
|
||||
property CurrentAddress: String read GetCurrentAddress;
|
||||
property FileSource: TFileSource read FFileSource write FFileSource;
|
||||
property PanelSelect: TFilePanelSelect read FPanelSelect write FPanelSelect;
|
||||
{en
|
||||
Currently active file.
|
||||
There should always be at least one file in the view at any time, but
|
||||
|
|
@ -81,6 +85,10 @@ type
|
|||
Caller is responsible for freeing the list.
|
||||
}
|
||||
property SelectedFiles: TFiles read GetSelectedFiles;
|
||||
|
||||
property NotebookPage: TCustomPage read GetNotebookPage;
|
||||
property OnBeforeChangeDirectory : TOnBeforeChangeDirectory read FOnBeforeChangeDirectory write FOnBeforeChangeDirectory;
|
||||
property OnAfterChangeDirectory : TOnAfterChangeDirectory read FOnAfterChangeDirectory write FOnAfterChangeDirectory;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
|
@ -102,7 +110,7 @@ begin
|
|||
FreeAndNil(FMethods);
|
||||
end;
|
||||
|
||||
function TFileView.Clone: TFileView;
|
||||
function TFileView.Clone(NewParent: TWinControl): TFileView;
|
||||
begin
|
||||
raise Exception.Create('Cannot create object of abstract class');
|
||||
end;
|
||||
|
|
@ -113,10 +121,16 @@ begin
|
|||
begin
|
||||
// FFileSource should have been passed to FileView constructor already.
|
||||
// FMethods are created in FileView constructor.
|
||||
FileView.FPanelSelect := FPanelSelect;
|
||||
FileView.OnBeforeChangeDirectory := OnBeforeChangeDirectory;
|
||||
FileView.OnAfterChangeDirectory := OnAfterChangeDirectory;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TFileView.GetNotebookPage: TCustomPage;
|
||||
begin
|
||||
Result := Parent as TCustomPage;
|
||||
end;
|
||||
|
||||
function TFileView.GetCurrentAddress: String;
|
||||
begin
|
||||
Result := IncludeTrailingPathDelimiter(FFileSource.CurrentAddress);
|
||||
|
|
|
|||
119
src/uacts.pas
119
src/uacts.pas
|
|
@ -602,13 +602,12 @@ end;
|
|||
|
||||
procedure TActs.DoNewTab(Notebook: TFileViewNotebook);
|
||||
var
|
||||
PanelSelected: TFilePanelSelect;
|
||||
NewPage: TFileViewPage;
|
||||
begin
|
||||
// Create a new panel in notebook.
|
||||
{
|
||||
CreatePanel(AddPage(Notebook), fpLeft/fpRight, ActiveFrame.CurrentPath);
|
||||
ActiveFrame.SetFocus;
|
||||
}
|
||||
NewPage := Notebook.AddPage;
|
||||
Notebook.ActiveView.Clone(NewPage);
|
||||
NewPage.MakeActive;
|
||||
NewPage.UpdateCaption(GetLastDir(ExcludeTrailingPathDelimiter(NewPage.FileView.CurrentPath)));
|
||||
end;
|
||||
|
||||
//------------------------------------------------------
|
||||
|
|
@ -787,41 +786,39 @@ begin
|
|||
end;
|
||||
|
||||
procedure TActs.cm_TargetEqualSource(param:string);
|
||||
var
|
||||
NewPage: TFileViewPage;
|
||||
begin
|
||||
with FrmMain do
|
||||
with frmMain do
|
||||
begin
|
||||
{
|
||||
if ActiveFrame.pnlFile.PanelMode = pmArchive then
|
||||
NotActiveFrame.pnlFile.CurrentPath:= ExtractFilePath(ActiveFrame.pnlFile.VFS.ArcFullName)
|
||||
else
|
||||
NotActiveFrame.pnlFile.CurrentPath:= ActiveFrame.pnlFile.CurrentPath;
|
||||
}
|
||||
NotActiveNotebook.ActivePage.FileView := nil;
|
||||
ActiveFrame.Clone(NotActiveNotebook.ActivePage);
|
||||
NotActiveNotebook.ActivePage.UpdateCaption(GetLastDir(
|
||||
ExcludeTrailingPathDelimiter(NotActiveNotebook.ActivePage.FileView.CurrentPath)));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TActs.cm_LeftEqualRight(param: string);
|
||||
var
|
||||
NewPage: TFileViewPage;
|
||||
begin
|
||||
with FrmMain do
|
||||
with frmMain do
|
||||
begin
|
||||
{
|
||||
if FrameRight.pnlFile.PanelMode = pmArchive then
|
||||
FrameLeft.pnlFile.CurrentPath:= ExtractFilePath(FrameRight.pnlFile.VFS.ArcFullName)
|
||||
else
|
||||
FrameLeft.pnlFile.CurrentPath:= FrameRight.pnlFile.CurrentPath;
|
||||
}
|
||||
LeftTabs.ActivePage.FileView := nil;
|
||||
FrameRight.Clone(LeftTabs.ActivePage);
|
||||
LeftTabs.ActivePage.UpdateCaption(GetLastDir(ExcludeTrailingPathDelimiter(LeftTabs.ActivePage.FileView.CurrentPath)));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TActs.cm_RightEqualLeft(param: string);
|
||||
var
|
||||
NewPage: TFileViewPage;
|
||||
begin
|
||||
with FrmMain do
|
||||
with frmMain do
|
||||
begin
|
||||
{
|
||||
if FrameLeft.pnlFile.PanelMode = pmArchive then
|
||||
FrameRight.pnlFile.CurrentPath:= ExtractFilePath(FrameLeft.pnlFile.VFS.ArcFullName)
|
||||
else
|
||||
FrameRight.pnlFile.CurrentPath:= FrameLeft.pnlFile.CurrentPath;
|
||||
}
|
||||
RightTabs.ActivePage.FileView := nil;
|
||||
FrameLeft.Clone(RightTabs.ActivePage);
|
||||
RightTabs.ActivePage.UpdateCaption(GetLastDir(ExcludeTrailingPathDelimiter(RightTabs.ActivePage.FileView.CurrentPath)));
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -1052,70 +1049,26 @@ end;
|
|||
|
||||
procedure TActs.cm_NextTab(param: string);
|
||||
begin
|
||||
with frmMain do
|
||||
begin
|
||||
case SelectedPanel of
|
||||
fpLeft: begin
|
||||
if LeftTabs.PageIndex=LeftTabs.PageCount-1 then
|
||||
LeftTabs.PageIndex:=0
|
||||
else
|
||||
LeftTabs.PageIndex:=LeftTabs.PageIndex+1;
|
||||
end;
|
||||
|
||||
fpRight: begin
|
||||
if RightTabs.PageIndex=RightTabs.PageCount-1 then
|
||||
RightTabs.PageIndex:=0
|
||||
else
|
||||
RightTabs.PageIndex:=RightTabs.PageIndex+1;
|
||||
end;
|
||||
end;
|
||||
ActiveFrame.SetFocus;
|
||||
end;
|
||||
frmMain.ActiveNotebook.ActivateNextTab;
|
||||
end;
|
||||
|
||||
procedure TActs.cm_PrevTab(param: string);
|
||||
begin
|
||||
with frmMain do
|
||||
begin
|
||||
case SelectedPanel of
|
||||
fpLeft: begin
|
||||
if LeftTabs.PageIndex=0 then
|
||||
LeftTabs.PageIndex:=LeftTabs.PageCount-1
|
||||
else
|
||||
LeftTabs.PageIndex:=LeftTabs.PageIndex-1;
|
||||
end;
|
||||
|
||||
fpRight: begin
|
||||
if RightTabs.PageIndex=0 then
|
||||
RightTabs.PageIndex:=RightTabs.PageCount-1
|
||||
else
|
||||
RightTabs.PageIndex:=RightTabs.PageIndex-1;
|
||||
end;
|
||||
end;
|
||||
ActiveFrame.SetFocus;
|
||||
end;
|
||||
frmMain.ActiveNotebook.ActivatePrevTab;
|
||||
end;
|
||||
|
||||
procedure TActs.cm_ToggleLockTab(param: string);
|
||||
var
|
||||
nbNoteBook: TFileViewNotebook;
|
||||
PanelSelected: TFilePanelSelect;
|
||||
begin
|
||||
with frmMain do
|
||||
begin
|
||||
if param = 'LeftTabs' then
|
||||
PanelSelected:= fpLeft
|
||||
nbNoteBook := LeftTabs
|
||||
else if param = 'RightTabs' then
|
||||
PanelSelected:= fpRight
|
||||
nbNoteBook := RightTabs
|
||||
else
|
||||
PanelSelected:= SelectedPanel;
|
||||
|
||||
case PanelSelected of
|
||||
fpLeft:
|
||||
nbNoteBook:= LeftTabs;
|
||||
fpRight:
|
||||
nbNoteBook:= RightTabs;
|
||||
end;
|
||||
nbNoteBook := ActiveNotebook;
|
||||
|
||||
DoToggleLockTab(nbNoteBook.ActivePage);
|
||||
end;
|
||||
|
|
@ -1124,23 +1077,15 @@ end;
|
|||
procedure TActs.cm_ToggleLockDcaTab(param: string);
|
||||
var
|
||||
nbNoteBook: TFileViewNotebook;
|
||||
PanelSelected: TFilePanelSelect;
|
||||
begin
|
||||
with frmMain do
|
||||
begin
|
||||
if param = 'LeftTabs' then
|
||||
PanelSelected:= fpLeft
|
||||
nbNoteBook := LeftTabs
|
||||
else if param = 'RightTabs' then
|
||||
PanelSelected:= fpRight
|
||||
nbNoteBook := RightTabs
|
||||
else
|
||||
PanelSelected:= SelectedPanel;
|
||||
|
||||
case PanelSelected of
|
||||
fpLeft:
|
||||
nbNoteBook:= LeftTabs;
|
||||
fpRight:
|
||||
nbNoteBook:= RightTabs;
|
||||
end;
|
||||
nbNoteBook := ActiveNotebook;
|
||||
|
||||
DoToggleLockDcaTab(nbNoteBook.ActivePage);
|
||||
end;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ interface
|
|||
|
||||
uses
|
||||
Classes, SysUtils, Controls, ExtCtrls,
|
||||
uFileView;
|
||||
uFileView, uFilePanelSelect;
|
||||
|
||||
type
|
||||
|
||||
|
|
@ -31,6 +31,10 @@ type
|
|||
Retrieves the file view on this page.
|
||||
}
|
||||
function GetFileView: TFileView;
|
||||
{en
|
||||
Frees current file view and assigns a new one.
|
||||
}
|
||||
procedure SetFileView(aFileView: TFileView);
|
||||
{en
|
||||
Retrieves notebook on which this page is.
|
||||
}
|
||||
|
|
@ -41,9 +45,12 @@ type
|
|||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
|
||||
procedure MakeActive;
|
||||
procedure UpdateCaption(NewCaption: String);
|
||||
|
||||
property LockState: TTabLockState read FLockState write SetLockState;
|
||||
property LockPath: String read FLockPath write FLockPath;
|
||||
property FileView: TFileView read GetFileView;
|
||||
property FileView: TFileView read GetFileView write SetFileView;
|
||||
property Notebook: TFileViewNotebook read GetNotebook;
|
||||
|
||||
end;
|
||||
|
|
@ -52,6 +59,8 @@ type
|
|||
|
||||
TFileViewNotebook = class(TCustomNotebook)
|
||||
private
|
||||
FNotebookSide: TFilePanelSelect;
|
||||
|
||||
function GetActivePage: TFileViewPage;
|
||||
function GetActiveView: TFileView;
|
||||
function GetFileViewOnPage(Index: Integer): TFileView;
|
||||
|
|
@ -59,17 +68,21 @@ type
|
|||
|
||||
procedure SetMultilineTabs(Multiline: Boolean);
|
||||
|
||||
procedure CloseTabClickedEvent(Sender: TObject);
|
||||
|
||||
public
|
||||
constructor Create(ParentControl: TWinControl); reintroduce;
|
||||
constructor Create(ParentControl: TWinControl;
|
||||
NotebookSide: TFilePanelSelect); reintroduce;
|
||||
|
||||
function AddPage: TFileViewPage;
|
||||
procedure RemovePage(Index: Integer);
|
||||
procedure RemovePage(var aPage: TFileViewPage);
|
||||
procedure ActivatePrevTab;
|
||||
procedure ActivateNextTab;
|
||||
|
||||
property ActivePage: TFileViewPage read GetActivePage;
|
||||
property ActiveView: TFileView read GetActiveView;
|
||||
property Page[Index: Integer]: TFileViewPage read GetPage;
|
||||
property View[Index: Integer]: TFileView read GetFileViewOnPage; default;
|
||||
property Side: TFilePanelSelect read FNotebookSide;
|
||||
|
||||
published
|
||||
property OnMouseDown;
|
||||
|
|
@ -91,6 +104,28 @@ begin
|
|||
inherited Create(TheOwner);
|
||||
end;
|
||||
|
||||
procedure TFileViewPage.MakeActive;
|
||||
var
|
||||
aFileView: TFileView;
|
||||
begin
|
||||
Notebook.PageIndex := PageIndex;
|
||||
|
||||
aFileView := FileView;
|
||||
if Assigned(aFileView) then
|
||||
aFileView.SetFocus;
|
||||
end;
|
||||
|
||||
procedure TFileViewPage.UpdateCaption(NewCaption: String);
|
||||
begin
|
||||
if NewCaption <> '' then
|
||||
begin
|
||||
if (tb_text_length_limit in gDirTabOptions) and (Length(NewCaption) > gDirTabLimit) then
|
||||
Caption := Copy(NewCaption, 1, gDirTabLimit) + '...'
|
||||
else
|
||||
Caption := NewCaption;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFileViewPage.UpdateTabLockState;
|
||||
var
|
||||
NewCaption: String;
|
||||
|
|
@ -114,6 +149,25 @@ begin
|
|||
Result := nil;
|
||||
end;
|
||||
|
||||
procedure TFileViewPage.SetFileView(aFileView: TFileView);
|
||||
var
|
||||
i: Integer;
|
||||
aComponent: TComponent;
|
||||
begin
|
||||
while ComponentCount > 0 do
|
||||
begin
|
||||
aComponent := Components[0];
|
||||
RemoveComponent(aComponent);
|
||||
aComponent.Free;
|
||||
end;
|
||||
|
||||
if Assigned(aFileView) then
|
||||
begin
|
||||
InsertComponent(aFileView);
|
||||
aFileView.Parent := Self;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TFileViewPage.GetNotebook: TFileViewNotebook;
|
||||
begin
|
||||
Result := Parent as TFileViewNotebook;
|
||||
|
|
@ -127,7 +181,8 @@ end;
|
|||
|
||||
// -- TFileViewNotebook -------------------------------------------------------
|
||||
|
||||
constructor TFileViewNotebook.Create(ParentControl: TWinControl);
|
||||
constructor TFileViewNotebook.Create(ParentControl: TWinControl;
|
||||
NotebookSide: TFilePanelSelect);
|
||||
begin
|
||||
PageClass := TFileViewPage;
|
||||
inherited Create(ParentControl);
|
||||
|
|
@ -136,10 +191,7 @@ begin
|
|||
Align := alClient;
|
||||
TabStop := False;
|
||||
|
||||
OnCloseTabClicked := @CloseTabClickedEvent;
|
||||
OnMouseDown := @frmMain.nbPageMouseDown;
|
||||
OnMouseUp := @frmMain.nbPageMouseUp;
|
||||
OnPageChanged := @frmMain.nbPageChanged;
|
||||
FNotebookSide := NotebookSide;
|
||||
end;
|
||||
|
||||
function TFileViewNotebook.GetActivePage: TFileViewPage;
|
||||
|
|
@ -174,15 +226,6 @@ begin
|
|||
Result := TFileViewPage(CustomPage(Index));
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.CloseTabClickedEvent(Sender: TObject);
|
||||
begin
|
||||
with (Sender As TFileViewPage) do
|
||||
if PageIndex <> -1 then
|
||||
begin
|
||||
//RemovePage(Parent as TFileViewNotebook, PageIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.SetMultilineTabs(Multiline: Boolean);
|
||||
begin
|
||||
if (nbcMultiline in GetCapabilities) and
|
||||
|
|
@ -211,19 +254,51 @@ end;
|
|||
|
||||
function TFileViewNotebook.AddPage: TFileViewPage;
|
||||
var
|
||||
x: Integer;
|
||||
PageNr: Integer;
|
||||
begin
|
||||
x := PageCount;
|
||||
|
||||
Pages.Add(IntToStr(x));
|
||||
|
||||
// if bSetActive then
|
||||
// ANoteBook.ActivePage := IntToStr(x);
|
||||
|
||||
Result := TFileViewPage(CustomPage(x));
|
||||
PageNr := Pages.Add(IntToStr(PageCount));
|
||||
Result := GetPage(PageNr);
|
||||
|
||||
ShowTabs:= ((PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs;
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.RemovePage(Index: Integer);
|
||||
begin
|
||||
Pages.Delete(Index);
|
||||
|
||||
if (nboMultiLine in Options) and
|
||||
ClientRectNeedsInterfaceUpdate then
|
||||
begin
|
||||
// The height of the tabs (nr of lines) has changed.
|
||||
// Recalculate size of each page.
|
||||
InvalidateClientRectCache(False);
|
||||
ReAlign;
|
||||
end;
|
||||
|
||||
ShowTabs:= ((PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs;
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.RemovePage(var aPage: TFileViewPage);
|
||||
begin
|
||||
RemovePage(aPage.PageIndex);
|
||||
aPage := nil;
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.ActivatePrevTab;
|
||||
begin
|
||||
if PageIndex = PageCount - 1 then
|
||||
Page[0].MakeActive
|
||||
else
|
||||
Page[PageIndex + 1].MakeActive;
|
||||
end;
|
||||
|
||||
procedure TFileViewNotebook.ActivateNextTab;
|
||||
begin
|
||||
if PageIndex = 0 then
|
||||
Page[PageCount - 1].MakeActive
|
||||
else
|
||||
Page[PageIndex - 1].MakeActive;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue