BSOne.SFC/Tocsg.Module/RemoteSupport/Modules/rdFileBrowse.pas

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.