mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-01 22:57:29 +02:00
262 lines
6.6 KiB
ObjectPascal
262 lines
6.6 KiB
ObjectPascal
unit opkman_categoriesfrm;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
|
StdCtrls, opkman_VirtualTrees;
|
|
|
|
type
|
|
|
|
{ TCategoriesFrm }
|
|
|
|
TCategoriesFrm = class(TForm)
|
|
bCancel: TButton;
|
|
bOk: TButton;
|
|
imTree: TImageList;
|
|
lbMessage: TLabel;
|
|
pnButtons: TPanel;
|
|
pnMessage: TPanel;
|
|
procedure bOkClick(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormKeyPress(Sender: TObject; var Key: char);
|
|
procedure lbMessageResize(Sender: TObject);
|
|
private
|
|
FVST: TVirtualStringTree;
|
|
FModRes: TModalResult;
|
|
FCategoriesCSV: String;
|
|
FLineAdded: Boolean;
|
|
procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String);
|
|
procedure VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
{%H-}Kind: TVTImageKind; Column: TColumnIndex; var {%H-}Ghosted: Boolean;
|
|
var ImageIndex: Integer);
|
|
procedure VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
|
|
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
|
|
procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
|
|
function CheckNode(const AName: String): Boolean;
|
|
public
|
|
procedure SetupControls;
|
|
procedure PopulateTree;
|
|
property CategoriesCSV: String read FCategoriesCSV write FCategoriesCSV;
|
|
end;
|
|
|
|
var
|
|
CategoriesFrm: TCategoriesFrm;
|
|
|
|
implementation
|
|
uses opkman_const, opkman_common;
|
|
{$R *.lfm}
|
|
|
|
type
|
|
PData = ^TData;
|
|
TData = record
|
|
FName: string[100];
|
|
FImageIndex: Integer;
|
|
end;
|
|
|
|
{ TCategoriesFrm }
|
|
|
|
procedure TCategoriesFrm.FormClose(Sender: TObject;
|
|
var CloseAction: TCloseAction);
|
|
begin
|
|
if FModRes <> mrNone then
|
|
ModalResult := FModRes;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.bOkClick(Sender: TObject);
|
|
var
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
begin
|
|
FCategoriesCSV := '';
|
|
Node := FVST.GetFirst;
|
|
while Assigned(Node) do
|
|
begin
|
|
Data := FVST.GetNodeData(Node);
|
|
if FVST.CheckState[Node] = csCheckedNormal then
|
|
begin
|
|
if FCategoriesCSV = '' then
|
|
FCategoriesCSV := Data^.FName
|
|
else
|
|
FCategoriesCSV := FCategoriesCSV + ', ' + Data^.FName;
|
|
end;
|
|
Node := FVST.GetNext(Node);
|
|
end;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.FormCreate(Sender: TObject);
|
|
begin
|
|
FVST := TVirtualStringTree.Create(nil);
|
|
with FVST do
|
|
begin
|
|
Parent := Self;
|
|
Align := alClient;
|
|
Anchors := [akLeft, akTop, akRight];
|
|
Images := imTree;
|
|
Color := clBtnFace;
|
|
DefaultNodeHeight := 25;
|
|
Indent := 0;
|
|
TabOrder := 1;
|
|
DefaultText := '';
|
|
Header.AutoSizeIndex := 0;
|
|
Header.Height := 25;
|
|
Colors.BorderColor := clBlack;
|
|
BorderSpacing.Top := 5;
|
|
BorderSpacing.Left := 10;
|
|
BorderSpacing.Right := 10;
|
|
with Header.Columns.Add do begin
|
|
Position := 0;
|
|
Width := 250;
|
|
Text := 'CategorieName';
|
|
end;
|
|
Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoShowSortGlyphs, hoAutoSpring];
|
|
Header.SortColumn := 0;
|
|
TabOrder := 1;
|
|
TreeOptions.MiscOptions := [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toCheckSupport];
|
|
TreeOptions.PaintOptions := [toHideFocusRect, toPopupMode, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages];
|
|
TreeOptions.SelectionOptions := [toFullRowSelect, toRightClickSelect];
|
|
TreeOptions.AutoOptions := [toAutoTristateTracking];
|
|
OnGetText := @VSTGetText;
|
|
OnGetImageIndex := @VSTGetImageIndex;
|
|
OnCompareNodes := @VSTCompareNodes;
|
|
OnFreeNode := @VSTFreeNode;
|
|
end;
|
|
FVST.NodeDataSize := SizeOf(TData);
|
|
end;
|
|
|
|
procedure TCategoriesFrm.FormDestroy(Sender: TObject);
|
|
begin
|
|
FVST.Clear;
|
|
FVST.Free;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.FormKeyPress(Sender: TObject; var Key: char);
|
|
begin
|
|
if Key = #13 then
|
|
begin
|
|
FModRes := mrYes;
|
|
Close;
|
|
end
|
|
else if Key = #27 then
|
|
begin
|
|
FModRes := mrNo;
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.lbMessageResize(Sender: TObject);
|
|
begin
|
|
pnMessage.Height := lbMessage.Top + lbMessage.Height + 5;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.VSTGetText(Sender: TBaseVirtualTree;
|
|
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
|
|
var CellText: String);
|
|
var
|
|
Data: PData;
|
|
begin
|
|
Data := FVST.GetNodeData(Node);
|
|
if Column = 0 then
|
|
CellText := Data^.FName;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.VSTGetImageIndex(Sender: TBaseVirtualTree;
|
|
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
|
|
var Ghosted: Boolean; var ImageIndex: Integer);
|
|
var
|
|
Data: PData;
|
|
begin
|
|
Data := FVST.GetNodeData(Node);
|
|
if Column = 0 then
|
|
ImageIndex := Data^.FImageIndex;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
|
|
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
|
|
var
|
|
Data1: PData;
|
|
Data2: PData;
|
|
begin
|
|
Data1 := Sender.GetNodeData(Node1);
|
|
Data2 := Sender.GetNodeData(Node2);
|
|
if Column = 0 then
|
|
Result := CompareText(Data1^.FName, Data2^.FName);
|
|
end;
|
|
|
|
procedure TCategoriesFrm.VSTFreeNode(Sender: TBaseVirtualTree;
|
|
Node: PVirtualNode);
|
|
var
|
|
Data: PData;
|
|
begin
|
|
Data := FVST.GetNodeData(Node);
|
|
Finalize(Data^);
|
|
end;
|
|
|
|
procedure TCategoriesFrm.SetupControls;
|
|
begin
|
|
FModRes := mrNone;
|
|
Caption := rsCategoriesFrm_Caption;
|
|
lbMessage.Caption := rsCategoriesFrm_lbMessage_Caption;
|
|
bOk.Caption := rsCategoriesFrm_bYes_Caption;
|
|
bCancel.Caption := rsCategoriesFrm_bCancel_Caption;
|
|
bOk.Top := (pnButtons.Height - bOk.Height) div 2;
|
|
bCancel.Top := (pnButtons.Height - bCancel.Height) div 2;
|
|
pnMessage.Height := lbMessage.Top + lbMessage.Height + 5;
|
|
end;
|
|
|
|
function TCategoriesFrm.CheckNode(const AName: String): Boolean;
|
|
var
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
begin
|
|
Result := False;
|
|
Node := FVST.GetFirst;
|
|
while Assigned(Node) do
|
|
begin
|
|
Data := FVST.GetNodeData(Node);
|
|
if UpperCase(Data^.FName) = UpperCase(AName) then
|
|
begin
|
|
FVST.CheckState[Node] := csCheckedNormal;
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
Node := FVST.GetNext(Node);
|
|
end;
|
|
end;
|
|
|
|
procedure TCategoriesFrm.PopulateTree;
|
|
var
|
|
I: Integer;
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
SL: TStringList;
|
|
begin
|
|
FLineAdded := True;
|
|
for I := 0 to MaxCategories - 1 do
|
|
begin
|
|
Node := FVST.AddChild(nil);
|
|
Node^.CheckType := ctTriStateCheckBox;
|
|
Data := FVST.GetNodeData(Node);
|
|
Data^.FName := Categories[I];
|
|
Data^.FImageIndex := -1;
|
|
end;
|
|
|
|
SL := TStringList.Create;
|
|
try
|
|
SL.Delimiter := ',';
|
|
SL.DelimitedText := FCategoriesCSV;
|
|
for I := 0 to SL.Count - 1 do
|
|
CheckNode(Trim(SL.Strings[I]));
|
|
finally
|
|
SL.Free;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|