📄 jvqpagelisttreeview.pas
字号:
end;
end;
*)
procedure ResetSiblingFolders(Node: TTreeNode; ImageIndex, SelectedIndex: Integer; Recurse: Boolean = False);
var
N: TTreeNode;
begin
N := Node.getPrevSibling;
while Assigned(N) do
begin
if N.HasChildren then
begin
N.ImageIndex := ImageIndex;
N.SelectedIndex := SelectedIndex;
if Recurse then
ResetSiblingFolders(N.getFirstChild, ImageIndex, SelectedIndex, Recurse);
end;
N := N.getPrevSibling;
end;
N := Node.getNextSibling;
while Assigned(N) do
begin
if N.HasChildren then
begin
N.ImageIndex := ImageIndex;
N.SelectedIndex := SelectedIndex;
if Recurse then
ResetSiblingFolders(N.getFirstChild, ImageIndex, SelectedIndex, Recurse);
end;
N := N.getNextSibling;
end;
end;
//=== { TJvCustomPageListTreeView } ==========================================
constructor TJvCustomPageListTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FLinks := TJvPageLinks.Create;
FLinks.FTreeView := Self;
ReadOnly := True;
end;
destructor TJvCustomPageListTreeView.Destroy;
begin
FLinks.Free;
inherited Destroy;
end;
function TJvCustomPageListTreeView.CanChange(Node: TTreeNode): Boolean;
begin
Result := True;
if Result and Assigned(Node) and Assigned(FPageList) then
Result := FPageList.CanChange(TJvPageIndexNode(Node).PageIndex);
end;
procedure TJvCustomPageListTreeView.Change(Node: TTreeNode);
var
I: Integer;
begin
inherited Change(Node);
if Assigned(FPageList) and Assigned(Node) then
begin
I := TJvPageIndexNode(Node).PageIndex;
if (I >= 0) and (I < FPageList.GetPageCount) then
FPageList.SetActivePageIndex(I)
else
if (PageDefault >= 0) and (PageDefault < FPageList.GetPageCount) then
FPageList.SetActivePageIndex(PageDefault)
else
FPageList.SetActivePageIndex(-1);
end;
end;
function TJvCustomPageListTreeView.CreateNode: TTreeNode;
begin
Result := TJvPageIndexNode.Create(Items);
TJvPageIndexNode(Result).PageIndex := PageDefault;
end;
function TJvCustomPageListTreeView.CreateNodes: TTreeNodes;
begin
if (FItems = nil) and not (csDestroying in ComponentState) then
FItems := TJvPageIndexNodes.Create(Self);
Result := FItems;
end;
procedure TJvCustomPageListTreeView.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
begin
if AComponent.IsImplementorOf(PageList) then
PageList := nil;
end;
end;
procedure TJvCustomPageListTreeView.SetPageDefault(const Value: Integer);
var
N: TTreeNode;
begin
if FPageDefault <> Value then
begin
N := Items.GetFirstNode;
while Assigned(N) do
begin
if TJvPageIndexNode(N).PageIndex = FPageDefault then
TJvPageIndexNode(N).PageIndex := Value;
N := N.GetNext;
end;
FPageDefault := Value;
end;
end;
procedure TJvCustomPageListTreeView.SetLinks(const Value: TJvPageLinks);
begin
// FLinks.Assign(Value);
end;
procedure TJvCustomPageListTreeView.SetPageList(const Value: IPageList);
begin
if FPageList <> Value then
begin
ReferenceInterface(FPageList, opRemove);
FPageList := Value;
ReferenceInterface(FPageList, opInsert);
end;
end;
function TJvCustomPageListTreeView.GetItems: TJvPageIndexNodes;
begin
Result := TJvPageIndexNodes(CreateNodes);
end;
procedure TJvCustomPageListTreeView.SetItems(const Value: TJvPageIndexNodes);
begin
inherited Items := Value;
end;
//=== { TJvPageIndexNode } ===================================================
procedure TJvPageIndexNode.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TJvPageIndexNode then
PageIndex := TJvPageIndexNode(Source).PageIndex;
end;
procedure TJvPageIndexNode.SetPageIndex(const Value: Integer);
begin
if FPageIndex <> Value then
begin
FPageIndex := Value;
if (TreeView is TJvCustomSettingsTreeView) and (Parent <> nil) and
(Parent.getFirstChild = Self) and not HasChildren then
TJvPageIndexNode(Parent).PageIndex := Value;
end;
end;
//=== { TJvPageIndexNodes } ==================================================
procedure TJvPageIndexNodes.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('Links', ReadData, WriteData, True);
end;
procedure TJvPageIndexNodes.ReadData(Stream: TStream);
var
APageIndex, ACount: Integer;
LNode: TTreeNode;
LHandleAllocated: Boolean;
begin
LHandleAllocated := Owner.HandleAllocated;
if LHandleAllocated then
BeginUpdate;
try
Stream.Read(ACount, SizeOf(ACount));
if ACount > 0 then
begin
LNode := GetFirstNode;
while Assigned(LNode) and (ACount > 0) do
begin
Stream.Read(APageIndex, SizeOf(APageIndex));
TJvPageIndexNode(LNode).PageIndex := APageIndex;
LNode := LNode.GetNext;
Dec(ACount);
end;
// read any "left-overs" (should never happen)
while ACount > 0 do
begin
Stream.Read(APageIndex, SizeOf(APageIndex));
Dec(ACount);
end;
end;
finally
if LHandleAllocated then
EndUpdate;
end;
end;
procedure TJvPageIndexNodes.WriteData(Stream: TStream);
var
Node: TTreeNode;
APageIndex: Integer;
ACount: Integer;
begin
ACount := Count;
Stream.Write(ACount, SizeOf(Count));
if ACount > 0 then
begin
Node := GetFirstNode;
while (Node <> nil) do
begin
APageIndex := TJvPageIndexNode(Node).PageIndex;
Stream.Write(APageIndex, SizeOf(APageIndex));
Node := Node.GetNext;
end;
end;
end;
//=== { TJvSettingsTreeImages } ==============================================
constructor TJvSettingsTreeImages.Create;
begin
inherited Create;
FCollapsedIndex := 0;
FExpandedIndex := 1;
FSelectedIndex := 2;
FImageIndex := -1;
end;
//=== { TJvCustomSettingsTreeView } ==========================================
constructor TJvCustomSettingsTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FNodeImages := TJvSettingsTreeImages.Create;
FNodeImages.TreeView := Self;
AutoExpand := True;
ShowButtons := False;
ReadOnly := True;
end;
destructor TJvCustomSettingsTreeView.Destroy;
begin
FNodeImages.TreeView := nil;
FNodeImages.Free;
inherited Destroy;
end;
function TJvCustomSettingsTreeView.CanChange(Node: TTreeNode): Boolean;
begin
Result := inherited CanChange(Node);
if Result and (Selected <> nil) and not Selected.HasChildren then // Selected is the previous selected node
begin
Selected.ImageIndex := FNodeImages.ImageIndex;
Selected.SelectedIndex := FNodeImages.ImageIndex;
end;
end;
procedure TJvCustomSettingsTreeView.Change(Node: TTreeNode);
begin
inherited Change(Node);
if not AutoExpand and Node.Expanded then
Node.Expand(False); // refresh node and children
end;
procedure TJvCustomSettingsTreeView.Collapse(Node: TTreeNode);
begin
inherited Collapse(Node);
if Node.HasChildren then
begin
Node.ImageIndex := FNodeImages.CollapsedIndex;
Node.SelectedIndex := FNodeImages.CollapsedIndex;
end;
end;
procedure TJvCustomSettingsTreeView.Delete(Node: TTreeNode);
begin
inherited Delete(Node);
if Node = FLastSelected then
FLastSelected := nil;
end;
procedure TJvCustomSettingsTreeView.Expand(Node: TTreeNode);
var
N: TTreeNode;
R: TRect;
begin
if Node.HasChildren then
begin
if AutoExpand then
ResetSiblingFolders(Node, FNodeImages.CollapsedIndex, FNodeImages.CollapsedIndex, True);
Node.ImageIndex := FNodeImages.ExpandedIndex;
Node.SelectedIndex := FNodeImages.ExpandedIndex;
N := Node.getFirstChild;
if (N <> nil) and not N.HasChildren then
begin
ResetPreviousNode(N);
N.ImageIndex := FNodeImages.SelectedIndex;
N.SelectedIndex := FNodeImages.SelectedIndex;
R := N.DisplayRect;
QWindows.InvalidateRect(Handle, @R, True);
SetPreviousNode(N);
end;
end;
inherited Expand(Node);
end;
procedure TJvCustomSettingsTreeView.Loaded;
begin
inherited Loaded;
if Items.Count > 0 then
begin
ResetSiblingFolders(Items[0], FNodeImages.CollapsedIndex, FNodeImages.CollapsedIndex, True);
Items[0].MakeVisible;
end;
end;
procedure TJvCustomSettingsTreeView.ResetPreviousNode(NewNode: TTreeNode);
var
R: TRect;
begin
if (FLastSelected <> nil) and (FLastSelected <> NewNode) and
(NewNode <> nil) and not NewNode.HasChildren then
begin
FLastSelected.ImageIndex := FNodeImages.ImageIndex;
FLastSelected.SelectedIndex := FNodeImages.ImageIndex;
R := FLastSelected.DisplayRect;
QWindows.InvalidateRect(Handle, @R, True);
end;
end;
procedure TJvCustomSettingsTreeView.SetImageSelection(const Value: TJvSettingsTreeImages);
begin
// FNodeImages := Value;
end;
procedure TJvCustomSettingsTreeView.SetPreviousNode(NewNode: TTreeNode);
begin
FLastSelected := NewNode;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQPageListTreeView.pas,v $';
Revision: '$Revision: 1.17 $';
Date: '$Date: 2005/02/06 14:06:16 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -