373 lines
10 KiB
Plaintext
373 lines
10 KiB
Plaintext
unit rdFileBrowse;
|
|
|
|
interface
|
|
|
|
{$include rtcDefs.inc}
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Variants, Classes,
|
|
Graphics, Controls, Forms, Dialogs, StdCtrls,
|
|
Buttons, ComCtrls, ExtCtrls,
|
|
|
|
{$IFDEF IDE_XE3up}
|
|
UITypes,
|
|
{$ENDIF}
|
|
|
|
rtcpFileExplore, rtcpFileTransUI, ShellAPI, Menus;
|
|
|
|
type
|
|
TrdFileBrowser = class(TForm)
|
|
Panel1: TPanel;
|
|
Panel3: TPanel;
|
|
eDirectory: TEdit;
|
|
eFilesList: TRtcPFileExplorer;
|
|
btnReload: TSpeedButton;
|
|
Panel5: TPanel;
|
|
btnViewStyle: TSpeedButton;
|
|
DownLabel: TLabel;
|
|
btnBack: TSpeedButton;
|
|
pmFiles: TPopupMenu;
|
|
mnNewFolder: TMenuItem;
|
|
mnRefresh: TMenuItem;
|
|
N2: TMenuItem;
|
|
mnDelete: TMenuItem;
|
|
mnDownload: TMenuItem;
|
|
N1: TMenuItem;
|
|
Panel2: TPanel;
|
|
eCommand: TEdit;
|
|
btnExecute: TSpeedButton;
|
|
eParams: TEdit;
|
|
btnDownload: TImage;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure MyOnFileList(Sender:TRtcPFileTransferUI);
|
|
procedure eFilesListDirectoryChange(Sender: TObject; const FileName: String);
|
|
procedure btnReloadClick(Sender: TObject);
|
|
procedure btnViewStyleClick(Sender: TObject);
|
|
procedure eDirectoryKeyPress(Sender: TObject; var Key: Char);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure DownLabelDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
procedure DownLabelDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
procedure eFilesListDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
procedure eFilesListFileOpen(Sender: TObject; const FileName: String);
|
|
procedure btnBackClick(Sender: TObject);
|
|
procedure mnRefreshClick(Sender: TObject);
|
|
procedure mnNewFolderClick(Sender: TObject);
|
|
procedure eFilesListEdited(Sender: TObject; Item: TListItem;
|
|
var S: String);
|
|
procedure eFilesListEditing(Sender: TObject; Item: TListItem;
|
|
var AllowEdit: Boolean);
|
|
procedure mnDownloadClick(Sender: TObject);
|
|
procedure mnDeleteClick(Sender: TObject);
|
|
procedure eFilesListSelectItem(Sender: TObject; Item: TListItem;
|
|
Selected: Boolean);
|
|
procedure btnExecuteClick(Sender: TObject);
|
|
procedure eFilesListDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
private
|
|
MyUI:TRtcPFileTransferUI;
|
|
FBeforeClose: TNotifyEvent;
|
|
function GetUI: TRtcPFileTransferUI;
|
|
procedure SetUI(const Value: TRtcPFileTransferUI);
|
|
{ Private declarations }
|
|
|
|
protected
|
|
// declare our DROPFILES message handler
|
|
procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES;
|
|
procedure CreateParams(Var params: TCreateParams); override;
|
|
|
|
public
|
|
{ Public declarations }
|
|
property UI:TRtcPFileTransferUI read GetUI write SetUI;
|
|
property BeforeClose:TNotifyEvent read FBeforeClose write FBeforeClose;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
procedure TrdFileBrowser.CreateParams(Var params: TCreateParams);
|
|
begin
|
|
inherited CreateParams( params );
|
|
params.ExStyle := params.ExStyle or WS_EX_APPWINDOW;
|
|
params.WndParent := GetDeskTopWindow;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.AcceptFiles( var msg : TMessage );
|
|
const
|
|
cnMaxFileNameLen = 1024;
|
|
var
|
|
i,
|
|
nCount : integer;
|
|
acFileName : array [0..cnMaxFileNameLen] of char;
|
|
myFileName : string;
|
|
begin
|
|
if not assigned(myUI.Module) then MessageBeep(0);
|
|
|
|
// find out how many files we're accepting
|
|
nCount := DragQueryFile( msg.WParam,
|
|
$FFFFFFFF,
|
|
acFileName,
|
|
cnMaxFileNameLen );
|
|
|
|
try
|
|
// query Windows one at a time for the file name
|
|
for i := 0 to nCount-1 do
|
|
begin
|
|
DragQueryFile( msg.WParam, i, acFileName, cnMaxFileNameLen );
|
|
|
|
if assigned(myUI.Module) then
|
|
begin
|
|
myFileName:=acFileName;
|
|
myUI.Send(myFileName,eDirectory.Text);
|
|
end;
|
|
end;
|
|
finally
|
|
// let Windows know that you're done
|
|
DragFinish( msg.WParam );
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.FormCreate(Sender: TObject);
|
|
begin
|
|
// tell Windows that you're
|
|
// accepting drag and drop files
|
|
DragAcceptFiles( Handle, True );
|
|
|
|
DownLabel.Caption:=DownLabel.Caption+#13#10+
|
|
'Drag Files or Folders from the remote File Explorer (above) HERE to download them to your INBOX folder.';
|
|
end;
|
|
|
|
function TrdFileBrowser.GetUI: TRtcPFileTransferUI;
|
|
begin
|
|
Result:=MyUI;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.SetUI(const Value: TRtcPFileTransferUI);
|
|
begin
|
|
if Value<>MyUI then
|
|
begin
|
|
if assigned(myUI) then
|
|
MyUI.OnFileList:=nil;
|
|
myUI:=Value;
|
|
if assigned(myUI) then
|
|
begin
|
|
Caption:=myUI.UserName+' - File Explorer';
|
|
MyUI.OnFileList:=MyOnFileList;
|
|
myUI.GetFileList('',''); // load remote drives list to initialize
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.MyOnFileList(Sender: TRtcPFileTransferUI);
|
|
begin
|
|
eDirectory.Text:=Sender.FolderName;
|
|
eFilesList.UpdateFileList(Sender.FolderName,Sender.FolderData);
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListDirectoryChange(Sender: TObject; const FileName: String);
|
|
begin
|
|
if assigned(myUI) then
|
|
myUI.GetFileList(FileName,'');
|
|
end;
|
|
|
|
procedure TrdFileBrowser.btnReloadClick(Sender: TObject);
|
|
begin
|
|
if assigned(myUI) then
|
|
myUI.GetFileList(eDirectory.Text,'');
|
|
end;
|
|
|
|
procedure TrdFileBrowser.btnViewStyleClick(Sender: TObject);
|
|
begin
|
|
eFilesList.RefreshColumns; // a work-around for D2009 AV bug
|
|
case eFilesList.ViewStyle of
|
|
vsIcon: eFilesList.ViewStyle:=vsSmallIcon;
|
|
vsSmallIcon: eFilesList.ViewStyle:=vsList;
|
|
vsList: eFilesList.ViewStyle:=vsReport;
|
|
else eFilesList.ViewStyle:=vsIcon;
|
|
end;
|
|
eFilesList.RefreshColumns; // a work-around for D2009 non-updating view
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eDirectoryKeyPress(Sender: TObject; var Key: Char);
|
|
begin
|
|
if Key=#13 then
|
|
begin
|
|
Key:=#0;
|
|
btnReloadClick(Sender);
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
begin
|
|
if assigned(FBeforeClose) then
|
|
FBeforeClose(Self);
|
|
CanClose:=True;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.FormClose(Sender: TObject; var Action: TCloseAction);
|
|
begin
|
|
Action:=caFree;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.FormDestroy(Sender: TObject);
|
|
begin
|
|
DragAcceptFiles(Handle, False);
|
|
end;
|
|
|
|
procedure TrdFileBrowser.DownLabelDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
begin
|
|
Accept:=(Source=eFilesList) and (eFilesList.Directory<>'');
|
|
end;
|
|
|
|
procedure TrdFileBrowser.DownLabelDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
var
|
|
myFiles:TStringList;
|
|
a:integer;
|
|
begin
|
|
if assigned(myUI) then
|
|
begin
|
|
myFiles:=eFilesList.SelectedFiles;
|
|
if myFiles.Count>0 then
|
|
for a:=0 to myFiles.Count-1 do
|
|
myUI.Fetch(myFiles.Strings[a]);
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListFileOpen(Sender: TObject; const FileName: String);
|
|
begin
|
|
if assigned(myUI) then
|
|
if MessageDlg('Download file'#13#10+'"'+FileName+'"?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
|
|
myUI.Fetch(FileName);
|
|
end;
|
|
|
|
procedure TrdFileBrowser.btnBackClick(Sender: TObject);
|
|
begin
|
|
eFilesList.OneLevelUp;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.mnRefreshClick(Sender: TObject);
|
|
begin
|
|
btnReloadClick(Sender);
|
|
end;
|
|
|
|
procedure TrdFileBrowser.mnNewFolderClick(Sender: TObject);
|
|
begin
|
|
if assigned(myUI) and (eFilesList.Directory<>'') then
|
|
begin
|
|
myUI.Cmd_NewFolder(IncludeTrailingBackslash(eFilesList.Directory)+'New Folder');
|
|
myUI.GetFileList(eFilesList.Directory,'');
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListEdited(Sender: TObject; Item: TListItem; var S: String);
|
|
var
|
|
dir, newS:String;
|
|
begin
|
|
if assigned(myUI) then
|
|
begin
|
|
dir:=eFilesList.GetFileName(Item);
|
|
if (dir<>'') and (dir<>'..') then
|
|
begin
|
|
eFilesList.SetFileName(Item,S);
|
|
newS:=ExtractFilePath(dir)+S;
|
|
myUI.Cmd_FileRename(dir, newS);
|
|
eCommand.Text:=S;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListEditing(Sender: TObject; Item: TListItem; var AllowEdit: Boolean);
|
|
begin
|
|
AllowEdit:=assigned(myUI) and (eFilesList.Directory<>'') and (Item.Caption<>'..');
|
|
end;
|
|
|
|
procedure TrdFileBrowser.mnDownloadClick(Sender: TObject);
|
|
var
|
|
myFiles:TStringList;
|
|
a:integer;
|
|
begin
|
|
if assigned(myUI) then
|
|
begin
|
|
myFiles:=eFilesList.SelectedFiles;
|
|
if myFiles.Count>0 then
|
|
for a:=0 to myFiles.Count-1 do
|
|
myUI.Fetch(myFiles.Strings[a]);
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.mnDeleteClick(Sender: TObject);
|
|
var
|
|
myFiles:TStringList;
|
|
s:String;
|
|
a:integer;
|
|
begin
|
|
if assigned(myUI) then
|
|
begin
|
|
myFiles:=eFilesList.SelectedFiles;
|
|
if myFiles.Count>0 then
|
|
begin
|
|
s:='Delete the following File(s) and/or Folder(s)?';
|
|
for a:=0 to myFiles.Count-1 do
|
|
s:=s+#13#10+ExtractFileName(myFiles.Strings[a]);
|
|
|
|
if MessageDlg(s,mtWarning,[mbYes,mbNo],0)=mrYes then
|
|
begin
|
|
for a:=0 to myFiles.Count-1 do
|
|
myUI.Cmd_FileDelete(myFiles.Strings[a]);
|
|
myUI.GetFileList(eFilesList.Directory,'');
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
|
|
begin
|
|
if Selected and (eFilesList.GetFileName(Item)<>'..') then
|
|
eCommand.Text:=ExtractFileName(eFilesList.GetFileName(Item))
|
|
else
|
|
eCommand.Text:='';
|
|
end;
|
|
|
|
procedure TrdFileBrowser.btnExecuteClick(Sender: TObject);
|
|
begin
|
|
if assigned(myUI) then
|
|
myUI.Cmd_Execute(IncludeTrailingBackslash(eFilesList.Directory)+eCommand.Text,eParams.Text);
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
begin
|
|
Accept:=(Source=eFilesList) and (eFilesList.Directory<>'');
|
|
end;
|
|
|
|
procedure TrdFileBrowser.eFilesListDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
var
|
|
myFiles:TStringList;
|
|
newDir:String;
|
|
a:integer;
|
|
begin
|
|
if assigned(myUI) then
|
|
begin
|
|
newDir:=eFilesList.GetFileName(eFilesList.GetItemAt(X,Y));
|
|
if newDir<>'' then
|
|
begin
|
|
if newDir='..' then
|
|
newDir:=IncludeTrailingBackslash(eFilesList.Directory)+'..\'
|
|
else
|
|
newDir:=IncludeTrailingBackslash(newDir);
|
|
myFiles:=eFilesList.SelectedFiles;
|
|
if myFiles.Count>0 then
|
|
begin
|
|
for a:=0 to myFiles.Count-1 do
|
|
myUI.Cmd_FileMove(myFiles.Strings[a],newDir+ExtractFileName(myFiles.Strings[a]));
|
|
myUI.GetFileList(eFilesList.Directory,'');
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end.
|