ubrowsefolders.pas
来自「FMA is a free1 powerful phone editing to」· PAS 代码 · 共 332 行
PAS
332 行
unit uBrowseFolders;
{
*******************************************************************************
* Descriptions: Implementation for FMA Folder Browseing
* $Source: /cvsroot/fma/fma/Attic/uBrowseFolders.pas,v $
* $Locker: $
*
* Todo:
*
* Change Log:
* $Log: uBrowseFolders.pas,v $
*
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, TntComCtrls, StdCtrls, TntStdCtrls, VirtualTrees;
type
TBrowseSelectionChangeEvent = procedure(Sender: TObject; Node: PVirtualNode;
var EnableOKButton: boolean; var EnableNewFolder: boolean) of object;
TfrmBrowseFolders = class(TForm)
lblPath: TTntLabel;
btnNewFolder: TTntButton;
btnOK: TTntButton;
btnCancel: TTntButton;
TntLabel1: TTntLabel;
tvFolders: TVirtualStringTree;
procedure FormCreate(Sender: TObject);
procedure btnNewFolderClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure tvFoldersGetNodeDataSize(Sender: TBaseVirtualTree;
var NodeDataSize: Integer);
procedure tvFoldersGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
procedure tvFoldersGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
procedure tvFoldersChange(Sender: TBaseVirtualTree;
Node: PVirtualNode);
private
{ Private declarations }
FRootNode: PVirtualNode;
FOnSelect: TBrowseSelectionChangeEvent;
FNewFolder: boolean;
function Get_Selected: WideString;
procedure Set_Selected(const Value: WideString);
procedure Set_NewOK(const Value: boolean);
procedure Set_RootNode(const Value: PVirtualNode);
function AddExplorerNode(ParentNode,Node: PVirtualNode):PVirtualNode;
protected
procedure DoInitTree;
public
{ Public declarations }
AllowCurrent: boolean;
function FindNodeWithPath(path: WideString): PVirtualNode;
procedure AddNodes(Parent: PVirtualNode);
property OnSelectionChange: TBrowseSelectionChangeEvent read FOnSelect write FOnSelect;
property RootNode: PVirtualNode read FRootNode write Set_RootNode;
property SelectedNodePath: WideString read Get_Selected write Set_Selected;
property AllowNewFolder: boolean read FNewFolder write Set_NewOK;
end;
var
frmBrowseFolders: TfrmBrowseFolders;
implementation
uses
gnugettext, gnugettexthelpers,
Unit1, uInputQuery, uDialogs;
{$R *.dfm}
const
FLastSelected: WideString = '';
{ TfrmBrowseFolders }
procedure TfrmBrowseFolders.DoInitTree;
begin
tvFolders.Clear;
AddNodes(FRootNode);
end;
procedure TfrmBrowseFolders.AddNodes(Parent: PVirtualNode);
var
n: PVirtualNode;
begin
if FRootNode = nil then
FRootNode := Parent;
tvFolders.BeginUpdate;
try
n := AddExplorerNode(nil,Parent);
if Assigned(n) then
tvFolders.Expanded[n] := true;
finally
tvFolders.EndUpdate;
end;
end;
function TfrmBrowseFolders.AddExplorerNode(ParentNode,Node: PVirtualNode):PVirtualNode;
var
data, data2: PFmaExplorerNode;
Cname: WideString;
begin
Result := nil;
data := Form1.ExplorerNew.GetNodeData(Node);
Cname := data.Text;
if vsVisible in Node.States then begin
Result := tvFolders.AddChild(ParentNode);
if Assigned(Result) then begin
data := Form1.ExplorerNew.GetNodeData(Node);
data2 := tvFolders.GetNodeData(Result);
data2.Data := Node;
data2.ImageIndex := data.ImageIndex;
data2.StateIndex := data.StateIndex;
data2.Text := Cname;
Node := Node.FirstChild;
while Node<>nil do begin
AddExplorerNode(Result, Node);
Node := Node.NextSibling;
end;
end;
end;
end;
function TfrmBrowseFolders.Get_Selected: WideString;
var
data: PFmaExplorerNode;
begin
Result := '';
if tvFolders.SelectedCount > 0 then
begin
data := tvFolders.GetNodeData(tvFolders.GetFirstSelected);
Result := Form1.ExplorerNodePath(PVirtualNode(data.Data));
end;
end;
procedure TfrmBrowseFolders.Set_RootNode(const Value: PVirtualNode);
begin
FRootNode := Value;
DoInitTree;
end;
procedure TfrmBrowseFolders.Set_Selected(const Value: WideString);
function FindNodeIn(Root: PVirtualNode): PVirtualNode;
var
node, node2: PVirtualNode;
data: PFmaExplorerNode;
begin
Result := nil;
node := Root.FirstChild;
while node <> nil do begin
data := tvFolders.GetNodeData(node);
if WideCompareStr(Value,Form1.ExplorerNodePath(data.Data)) = 0 then begin
Result := node;
break;
end;
node := node.NextSibling;
end;
if not Assigned(Result) then begin
node2 := Root.FirstChild;
while not Assigned(Result) and Assigned(node2) do begin
Result := FindNodeIn(node2);
node2 := node2.NextSibling;
end;
end;
if Assigned(Result) then begin
tvFolders.Expanded[Root] := True;
tvFolders.Selected[Result] := True;
end;
end;
begin
lblPath.Caption := '';
tvFolders.ClearSelection;
if tvFolders.RootNodeCount <> 0 then begin
if not Assigned(FindNodeIn(tvFolders.GetFirst)) then begin
{ If no selection, use Root node as default one }
tvFolders.Selected[tvFolders.GetFirst] := True;
end;
FLastSelected := SelectedNodePath;
//tvFoldersChange(tvFolders,tvFolders.FocusedNode);
end;
end;
procedure TfrmBrowseFolders.FormCreate(Sender: TObject);
begin
gghTranslateComponent(self);
AllowCurrent := True;
TntLabel1.Font.Style := TntLabel1.Font.Style + [fsBold];
lblPath.Left := TntLabel1.Left + TntLabel1.Width + 8;
end;
function TfrmBrowseFolders.FindNodeWithPath(path: WideString): PVirtualNode;
function FindIt(root: PVirtualNode): PVirtualNode;
var
node: PVirtualNode;
data: PFmaExplorerNode;
begin
Result := nil;
if Assigned(root) then begin
if root <> tvFolders.RootNode then begin
data := tvFolders.GetNodeData(root);
if WideCompareStr(path,Form1.ExplorerNodePath(data.Data)) = 0 then
Result := root;
end;
node := root.FirstChild;
while Assigned(node) and not Assigned(Result) do begin
Result := FindIt(node);
node := node.NextSibling;
end;
end;
end;
begin
Result := FindIt(tvFolders.RootNode);
end;
procedure TfrmBrowseFolders.tvFoldersChange(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
EnableOK,EnableNew: Boolean;
EData: PFmaExplorerNode;
begin
{ now we have in FmaExplorerNode.Data pointer to original node in Form1.ExplorerNew }
EData := Sender.GetNodeData(tvFolders.GetFirstSelected);
if EData = nil then begin
btnOK.Enabled := false;
btnOK.Default := btnOK.Enabled;
btnNewFolder.Visible := false;
btnNewFolder.Enabled := false;
Exit;
end;
lblPath.Caption := Form1.ExplorerNodePath(EData.Data);
EnableOK := True;
EnableNew := False;
if Assigned(FOnSelect) then begin
EData := Sender.GetNodeData(FindNodeWithPath(SelectedNodePath));
{ FOnSelect will always have Form1.ExplorerNew's node as argument }
FOnSelect(Sender,EData.Data,EnableOK,EnableNew);
end;
{ Do not allow selecting current Explorer's node }
EData := Sender.GetNodeData(Sender.GetFirstSelected);
if not AllowCurrent and (EData.Data = Form1.ExplorerNew.GetFirstSelected) then
EnableOK := False;
btnOK.Enabled := EnableOK;
btnOK.Default := btnOK.Enabled;
btnNewFolder.Visible := FNewFolder and Assigned(FindNodeWithPath(SelectedNodePath));
btnNewFolder.Enabled := EnableNew;
end;
procedure TfrmBrowseFolders.Set_NewOK(const Value: boolean);
begin
FNewFolder := Value;
btnNewFolder.Visible := Value and Assigned(FindNodeWithPath(SelectedNodePath));
end;
procedure TfrmBrowseFolders.btnNewFolderClick(Sender: TObject);
var
w,n: WideString;
data: PFmaExplorerNode;
begin
w := '';
if WideInputQuery(_('Create Folder'),_('Enter folder name:'),w) then
if Trim(w) <> '' then begin
data := tvFolders.GetNodeData(FindNodeWithPath(SelectedNodePath));
if Form1.FindExplorerChildNode(w,data.Data) = nil then begin
Form1.SMSNewFolder(data.Data,w);
n := SelectedNodePath;
DoInitTree;
SelectedNodePath := n;
if tvFolders.GetFirstSelected <> nil then begin
tvFolders.IsVisible[tvFolders.GetFirstSelected] := true;
tvFolders.Expanded[tvFolders.GetFirstSelected] := true;
end;
end
else
MessageDlgW(_('Folder alerady exists.'),mtError,MB_OK);
end
else
MessageDlgW(_('You have to enter folder name.'),mtError,MB_OK);
end;
procedure TfrmBrowseFolders.FormShow(Sender: TObject);
begin
SelectedNodePath := FLastSelected;
if tvFolders.GetFirstSelected <> nil then
tvFolders.IsVisible[tvFolders.GetFirstSelected] := true;
end;
procedure TfrmBrowseFolders.btnOKClick(Sender: TObject);
begin
FLastSelected := SelectedNodePath;
end;
procedure TfrmBrowseFolders.tvFoldersGetNodeDataSize(
Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
NodeDataSize := Sizeof(TFmaExplorerNode);
end;
procedure TfrmBrowseFolders.tvFoldersGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
EData: PFmaExplorerNode;
begin
EData := Sender.GetNodeData(Node);
if Assigned(EData) then CellText := EData.Text;
end;
procedure TfrmBrowseFolders.tvFoldersGetImageIndex(
Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
var
EData: PFmaExplorerNode;
begin
EData := Sender.GetNodeData(Node);
if Assigned(EData) then ImageIndex := EData.ImageIndex;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?