📄 jvqprovidertreelistframe.pas
字号:
FUseVirtualRoot := Value;
if not Value then
FVirtualRoot := nil
else
GenerateVirtualRoot;
ConsumerChanged(Provider, ccrViewChange);
end;
end;
function TfmeJvProviderTreeList.GetViewList: IJvDataConsumerViewList;
begin
Supports(Provider as IJvDataConsumer, IJvDataConsumerViewList, Result);
end;
function TfmeJvProviderTreeList.UsingVirtualRoot: Boolean;
begin
Result := UseVirtualRoot and (FVirtualRoot <> nil);
end;
procedure TfmeJvProviderTreeList.UpdateColumnSize;
begin
lvProvider.Columns[0].Width := lvProvider.ClientWidth;
lvProvider.Invalidate;
end;
procedure TfmeJvProviderTreeList.NotifyConsumerItemSelect;
var
Item: IJvDataItem;
begin
if lvProvider.Selected <> nil then
Item := GetDataItem(lvProvider.Selected.Index)
else
Item := nil;
if Provider.Slave <> nil then
Provider.Slave.ItemSelected(Item);
Provider.ItemSelected(Item);
end;
procedure TfmeJvProviderTreeList.UpdateSelectedItem;
begin
NotifyConsumerItemSelect;
DoItemSelect;
end;
procedure TfmeJvProviderTreeList.ConsumerChanged(Sender: TJvDataConsumer;
Reason: TJvDataConsumerChangeReason);
begin
if csDestroying in ComponentState then
Exit;
if UseVirtualRoot and not UsingVirtualRoot then
GenerateVirtualRoot;
if Reason in [ccrProviderSelect, ccrViewChange] then
UpdateViewList;
if (lvProvider.Items.Count > 0) and (Reason = ccrViewChange) then
with lvProvider do
UpdateItems(TopItem.Index, TopItem.Index + GetVisibleRowCount(lvProvider));
lvProvider.Invalidate;
end;
procedure TfmeJvProviderTreeList.GenerateVirtualRoot;
begin
FVirtualRoot := DoGetVirtualRoot;
end;
function TfmeJvProviderTreeList.GetDataItem(Index: Integer): IJvDataItem;
begin
Provider.Enter;
try
if UsingVirtualRoot and (Index = 0) then
Result := FVirtualRoot
else
if (Index >= Ord(UsingVirtualRoot)) and ((Index - Ord(UsingVirtualRoot)) < GetViewList.Count) then
Result := GetViewList.Item(Index - Ord(UsingVirtualRoot));
finally
Provider.Leave;
end;
end;
function TfmeJvProviderTreeList.LocateID(ID: string): Integer;
begin
Provider.Enter;
try
if UsingVirtualRoot and AnsiSameText(ID, FVirtualRoot.GetID) then
Result := 0
else
begin
Result := GetViewList.IndexOfID(ID);
if UsingVirtualRoot and (Result >= 0) then
Inc(Result);
end;
finally
Provider.Leave;
end;
end;
procedure TfmeJvProviderTreeList.SelectItemID(ID: string);
var
I: Integer;
begin
if ID = '' then
I := -1
else
I := LocateID(ID);
if I > -1 then
begin
lvProvider.Items[I].Selected := True;
lvProvider.Items[I].Focused := True;
end
else
lvProvider.Selected := nil;
UpdateSelectedItem;
end;
function TfmeJvProviderTreeList.GetSelectedIndex: Integer;
begin
if lvProvider.Selected = nil then
Result := -1
else
Result := lvProvider.Selected.Index;
end;
procedure TfmeJvProviderTreeList.UpdateViewList;
begin
end;
procedure TfmeJvProviderTreeList.lvProviderCustomDrawItem(
Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
ACanvas: TCanvas;
ARect: TRect;
BtnWdth: Integer;
MidX, MidY: Integer;
begin
ARect := Item.DisplayRect;
ARect.Right := Sender.ClientRect.Right;
ACanvas := TControlCanvas.Create;
TControlCanvas(ACanvas).Control := Sender;
try
ACanvas.Start;
DefaultDraw := False;
if Item.Selected then
begin
ACanvas.Brush.Color := clHighlight;
ACanvas.Brush.Style := bsSolid;
ACanvas.Font.Color := clHighlightText;
ACanvas.FillRect(ARect);
end
else
begin
ACanvas.Brush.Color := clWindow;
ACanvas.Brush.Style := bsSolid;
ACanvas.Font.Color := clWindowText;
ACanvas.FillRect(ARect);
end;
BtnWdth := Succ(ARect.Bottom - ARect.Top) + 2;
ARect.Left := ARect.Left + (BtnWdth * 1);
if (UsingVirtualRoot and (Item.Index = 0)) or
GetViewList.ItemHasChildren(Item.Index - Ord(UsingVirtualRoot)) then
begin
with ACanvas do
begin
MidX := ARect.Left + (BtnWdth - 3) div 2;
MidY := ARect.Top + (BtnWdth - 3) div 2;
Pen.Color := ACanvas.Font.Color;
Pen.Style := psSolid;
Pen.Width := 1;
MoveTo(ARect.Left + 3, ARect.Top + 3);
LineTo(ARect.Left + BtnWdth - 6, ARect.Top + 3);
LineTo(ARect.Left + BtnWdth - 6, ARect.Top + BtnWdth - 6);
LineTo(ARect.Left + 3, ARect.Top + BtnWdth - 6);
LineTo(ARect.Left + 3, ARect.Top + 3);
MoveTo(ARect.Left + 5, MidY);
LineTo(ARect.Left + BtnWdth - 7, MidY);
if (not UsingVirtualRoot or (Item.Index <> 0)) and
not GetViewList.ItemIsExpanded(Item.Index - Ord(UsingVirtualRoot)) then
begin
MoveTo(MidX, ARect.Top + 5);
LineTo(MidX, ARect.Top + BtnWdth - 7);
end;
end;
end;
ARect.Left := ARect.Left + BtnWdth;
DrawText(ACanvas.Handle, TCaption(Item.Caption), Length(Item.Caption), ARect,
DT_SINGLELINE + DT_LEFT + DT_END_ELLIPSIS);
ACanvas.Stop;
finally
ACanvas.Free;
end;
end;
procedure TfmeJvProviderTreeList.lvProviderData(Sender: TObject;
Item: TListItem);
var
DataItem: IJvDataItem;
ItemText: IJvDataItemText;
begin
if (Provider.ProviderIntf = nil) or
((Item.Index - Ord(UsingVirtualRoot)) >= GetViewList.Count) then
Exit;
Provider.Enter;
try
if UsingVirtualRoot and (Item.Index = 0) then
begin
DataItem := FVirtualRoot;
end
else
begin
DataItem := GetViewList.Item(Item.Index - Ord(UsingVirtualRoot));
end;
if DataItem <> nil then
begin
if Supports(DataItem, IJvDataItemText, ItemText) then
Item.Caption := ItemText.Caption
else
begin
if DataItem = FVirtualRoot then
Item.Caption := RsDataItemRootCaption
else
Item.Caption := RsDataItemNoTextIntf;
end;
end
finally
Provider.Leave;
end;
end;
procedure TfmeJvProviderTreeList.lvProviderDblClick(Sender: TObject);
begin
Provider.Enter;
try
if lvProvider.Selected <> nil then
if lvProvider.Selected.Index >= Ord(UsingVirtualRoot) then
GetViewList.ToggleItem(lvProvider.Selected.Index - Ord(UsingVirtualRoot));
finally
Provider.Leave;
end;
end;
procedure TfmeJvProviderTreeList.lvProviderMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Item: Integer;
ItemLevel: Integer;
TmpRect: TRect;
begin
Provider.Enter;
try
Item := GetItemIndexAt(lvProvider, X, Y);
if Item <> -1 then
begin
if UsingVirtualRoot and (Item = 0) then
ItemLevel := 0
else
ItemLevel := GetViewList.ItemLevel(Item - Ord(UsingVirtualRoot)) + Ord(UsingVirtualRoot);
TmpRect := lvProvider.Items[Item].DisplayRect;
TmpRect.Right := TmpRect.Left + (Succ((TmpRect.Bottom - TmpRect.Top) + 2) * Succ(ItemLevel));
if (X < TmpRect.Right) and (X > TmpRect.Right - ((TmpRect.Bottom - TmpRect.Top) + 2)) then
if Item >= Ord(UsingVirtualRoot) then
GetViewList.ToggleItem(Item - Ord(UsingVirtualRoot));
end;
finally
Provider.Leave;
end;
end;
procedure TfmeJvProviderTreeList.lvProviderResize(Sender: TObject);
begin
UpdateColumnSize;
end;
procedure TfmeJvProviderTreeList.lvProviderSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
begin
UpdateSelectedItem;
if Selected then
FLastSelectIdx := Item.Index
else
FLastSelectIdx := -1;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -