BSOne.SFC/Tocsg.Module/PatternManager/FManagerPattern.pas

286 lines
6.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit FManagerPattern;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VirtualTrees, Vcl.ExtCtrls,
Vcl.Buttons, ManagerPattern, Vcl.Menus, Vcl.Imaging.pngimage,
System.ImageList, Vcl.ImgList, PngImageList, Vcl.StdCtrls;
type
PPtnEnt = ^TPtnEnt;
TPtnEnt = record
Info: TPatternEnt;
end;
TFrmManagerPattern = class(TFrame)
pnClient: TPanel;
pnTop: TPanel;
vtList: TVirtualStringTree;
btnAdd: TSpeedButton;
btnMod: TSpeedButton;
btnDel: TSpeedButton;
popFun: TPopupMenu;
miAdd: TMenuItem;
miMod: TMenuItem;
miDel: TMenuItem;
imgList: TPngImageList;
procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree;
var NodeDataSize: Integer);
procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
procedure vtListGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle;
var HintText: string);
procedure btnAddClick(Sender: TObject);
procedure btnModClick(Sender: TObject);
procedure btnDelClick(Sender: TObject);
procedure vtListContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
private
{ Private declarations }
MgPtn_: TManagerPattern;
bSelectMode_: Boolean;
public
{ Public declarations }
Constructor Create(aOwner: TComponent); override;
Destructor Destroy; override;
procedure SetSelectMode;
procedure SaveUseInfo;
procedure RefreshList;
end;
implementation
uses
Tocsg.VTUtil, DPatternInfo, Tocsg.Safe, Define;
{$R *.dfm}
Constructor TFrmManagerPattern.Create(aOwner: TComponent);
begin
Inherited Create(aOwner);
bSelectMode_ := false;
MgPtn_ := TManagerPattern.Create;
RefreshList;
end;
Destructor TFrmManagerPattern.Destroy;
begin
FreeAndNil(MgPtn_);
Inherited;
end;
procedure TFrmManagerPattern.SetSelectMode;
begin
bSelectMode_ := true;
// pnTop.Visible := false;
// vtList.PopupMenu := nil;
// miMod.Enabled := false;
end;
procedure TFrmManagerPattern.SaveUseInfo;
var
pNode: PVirtualNode;
pData: PPtnEnt;
begin
if not bSelectMode_ then
exit;
vtList.BeginUpdate;
try
pNode := vtList.GetFirst;
while pNode <> nil do
begin
pData := vtList.GetNodeData(pNode);
pData.Info.SetUse(pNode.CheckState = csCheckedNormal);
pNode := vtList.GetNext(pNode);
end;
finally
vtList.EndUpdate;
end;
MgPtn_.Save;
end;
procedure TFrmManagerPattern.RefreshList;
procedure AddPatternEnt(pParentNode: PVirtualNode; aEnt: TPatternEnt);
var
pNode: PVirtualNode;
pData: PPtnEnt;
i: Integer;
begin
pData := VT_AddChildDataN(vtList, pNode, pParentNode);
if bSelectMode_ then
begin
pNode.CheckType := ctCheckBox;
if aEnt.Use then
pNode.CheckState := csCheckedNormal;
end;
pData.Info := aEnt;
for i := 0 to aEnt.ChildList.Count - 1 do
AddPatternEnt(pNode, aEnt.ChildList[i]);
end;
var
i: Integer;
begin
vtList.BeginUpdate;
try
VT_Clear(vtList);
// MgPtn_.LangId := 1;
for i := 0 to MgPtn_.EntList.Count - 1 do
AddPatternEnt(nil, MgPtn_.EntList[i]);
VT_ExpandAll(vtList, true);
finally
vtList.EndUpdate;
end;
end;
procedure TFrmManagerPattern.btnAddClick(Sender: TObject);
var
pNode, pCNode: PVirtualNode;
pData: PPtnEnt;
Ent,
ParentEnt: TPatternEnt;
dlg: TDlgNameInfo;
begin
vtList.BeginUpdate;
try
pNode := vtList.GetFirstSelected;
if pNode <> nil then
begin
pData := vtList.GetNodeData(pNode);
ParentEnt := pData.Info;
end else
ParentEnt := nil;
Guard(dlg, TDlgNameInfo.Create(Self));
if dlg.ShowModal = mrOk then
begin
Ent := TPatternEnt.Create(MgPtn_, ParentEnt);
dlg.SavePatternInfo(Ent);
if ParentEnt <> nil then
ParentEnt.ChildList.Add(Ent)
else
MgPtn_.EntList.Add(Ent);
MgPtn_.Save;
pData := VT_AddChildDataN(vtList, pCNode, pNode);
pData.Info := Ent;
if bSelectMode_ then
pCNode.CheckType := ctCheckBox;
end;
finally
vtList.EndUpdate;
end;
end;
procedure TFrmManagerPattern.btnDelClick(Sender: TObject);
var
pNode: PVirtualNode;
pData, pPData: PPtnEnt;
i: Integer;
begin
vtList.BeginUpdate;
try
pNode := vtList.GetFirstSelected;
if pNode = nil then
exit;
if MessageBox(Handle, PChar('<27><><EFBFBD><EFBFBD><EFBFBD>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?'),
PChar(APP_TITLE), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
pData := vtList.GetNodeData(pNode);
if pNode.Parent <> vtList.RootNode then
begin
pPData := vtList.GetNodeData(pNode.Parent);
i := pPData.Info.ChildList.IndexOf(pData.Info);
if i <> -1 then
begin
pPData.Info.ChildList.Delete(i);
vtList.DeleteNode(pNode);
end;
end else begin
i := MgPtn_.EntList.IndexOf(pData.Info);
if i <> -1 then
begin
MgPtn_.EntList.Delete(i);
vtList.DeleteNode(pNode);
end;
end;
MgPtn_.Save;
finally
vtList.EndUpdate;
end;
end;
procedure TFrmManagerPattern.btnModClick(Sender: TObject);
var
pNode: PVirtualNode;
dlg: TDlgNameInfo;
pData: PPtnEnt;
begin
vtList.BeginUpdate;
try
pNode := vtList.GetFirstSelected;
if pNode = nil then
exit;
pData := vtList.GetNodeData(pNode);
Guard(dlg, TDlgNameInfo.Create(Self, pData.Info));
if dlg.ShowModal = mrOk then
begin
dlg.SavePatternInfo(pData.Info);
MgPtn_.Save;
end;
finally
vtList.EndUpdate;
end;
end;
procedure TFrmManagerPattern.vtListContextPopup(Sender: TObject;
MousePos: TPoint; var Handled: Boolean);
begin
miMod.Visible := vtList.GetNodeAt(MousePos) <> nil;
miDel.Visible := miMod.Visible;
end;
procedure TFrmManagerPattern.vtListGetHint(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex;
var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string);
begin
HintText := vtList.Text[Node, Column];
end;
procedure TFrmManagerPattern.vtListGetNodeDataSize(Sender: TBaseVirtualTree;
var NodeDataSize: Integer);
begin
NodeDataSize := SizeOf(TPtnEnt);
end;
procedure TFrmManagerPattern.vtListGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
pData: PPtnEnt;
nCnt: Integer;
begin
if Column = 0 then
begin
pData := Sender.GetNodeData(Node);
nCnt := pData.Info.PatternCount;
if nCnt > 0 then
CellText := Format('%s (%d)', [pData.Info.Name, pData.Info.PatternCount])
else
CellText := pData.Info.Name;
end;
end;
end.