📄 jvqprovidertreelistframe.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvProviderTreeListFrame.pas, released on --.
The Initial Developer of the Original Code is Marcel Bestebroer
Portions created by Marcel Bestebroer are Copyright (C) 2002 - 2003 Marcel
Bestebroer
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvQProviderTreeListFrame.pas,v 1.14 2005/03/10 09:13:00 marquardt Exp $
unit JvQProviderTreeListFrame;
{$I jvcl.inc}
interface
uses
SysUtils, Classes,
QWindows, QMessages, QGraphics, QControls, QForms, QDialogs, QComCtrls,
JvQJCLUtils, JvQDataProvider, JvQDataProviderIntf;
type
TGetVirtualRootEvent = procedure(Sender: TObject; var AVirtualRoot: IJvDataItem) of object;
TMasterConsumer = class(TJvDataConsumer)
private
FSlave: TJvDataConsumer;
protected
OldOnChanged: TJvDataConsumerChangeEvent;
procedure SetSlave(Value: TJvDataConsumer);
procedure LimitSubServices(Sender: TJvDataConsumer;
var SubSvcClass: TJvDataConsumerAggregatedObjectClass);
procedure SlaveChanged(Sender: TJvDataConsumer; Reason: TJvDataConsumerChangeReason);
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
function ProviderIntf: IJvDataProvider; override;
procedure SetProviderIntf(Value: IJvDataProvider); override;
function ContextIntf: IJvDataContext; override;
procedure SetContextIntf(Value: IJvDataContext); override;
function GetInterface(const IID: TGUID; out Obj): Boolean; override;
property Slave: TJvDataConsumer read FSlave write SetSlave;
end;
TfmeJvProviderTreeList = class(TFrame)
lvProvider: TListView;
procedure lvProviderCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure lvProviderData(Sender: TObject; Item: TListItem);
procedure lvProviderDblClick(Sender: TObject);
procedure lvProviderMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure lvProviderResize(Sender: TObject);
procedure lvProviderSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
private
FConsumerSvc: TMasterConsumer;
FOnGetVirtualRoot: TGetVirtualRootEvent;
FOnItemSelect: TNotifyEvent;
FUseVirtualRoot: Boolean;
FLastSelectIdx: Integer;
protected
FVirtualRoot: IJvDataItem;
function DoGetVirtualRoot: IJvDataItem;
procedure DoItemSelect;
procedure SetUseVirtualRoot(Value: Boolean);
function GetViewList: IJvDataConsumerViewList;
function UsingVirtualRoot: Boolean;
procedure UpdateColumnSize;
procedure NotifyConsumerItemSelect;
procedure UpdateSelectedItem; virtual;
procedure ConsumerChanged(Sender: TJvDataConsumer; Reason: TJvDataConsumerChangeReason); virtual;
procedure GenerateVirtualRoot; dynamic;
property LastSelectIdx: Integer read FLastSelectIdx write FLastSelectIdx;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetDataItem(Index: Integer): IJvDataItem; virtual;
function LocateID(ID: string): Integer; virtual;
procedure SelectItemID(ID: string);
function GetSelectedIndex: Integer;
procedure UpdateViewList; virtual;
property OnGetVirtualRoot: TGetVirtualRootEvent read FOnGetVirtualRoot write FOnGetVirtualRoot;
property OnItemSelect: TNotifyEvent read FOnItemSelect write FOnItemSelect;
property Provider: TMasterConsumer read FConsumerSvc;
property UseVirtualRoot: Boolean read FUseVirtualRoot write SetUseVirtualRoot;
end;
implementation
uses
JvQDsgnConsts, JvQConsts, JvQJCLUtils;
{$R *.xfm}
function GetItemIndexAt(LV: TListView; X, Y: Integer): Integer;
var
Item: TListItem;
begin
if LV.HandleAllocated then
begin
Item := LV.GetItemAt(X, Y);
if Item <> nil then
Result := Item.Index
else
Result := -1;
end
else
Result := -1;
end;
function GetVisibleRowCount(LV: TListView): Integer;
var
Item1, Item2: TListItem;
begin
Result := LV.Items.Count;
Item1 := LV.TopItem;
if Item1 <> nil then
begin
Item2 := LV.GetItemAt(LV.Width div 2, LV.ClientHeight - 1);
if Item2 <> nil then
Result := Item2.Index - Item1.Index + 1;
end;
end;
//=== { TMasterConsumer } ====================================================
constructor TMasterConsumer.Create(AOwner: TComponent);
begin
inherited Create(AOwner, [DPA_ConsumerDisplaysList, DPA_RenderDisabledAsGrayed]);
BeforeCreateSubSvc := LimitSubServices;
end;
destructor TMasterConsumer.Destroy;
begin
Slave := nil;
inherited Destroy;
end;
procedure TMasterConsumer.SetSlave(Value: TJvDataConsumer);
var
CtxList: IJvDataContexts;
begin
if Value <> Slave then
begin
ProviderChanging;
Changing(ccrProviderSelect);
if Slave <> nil then
Slave.OnChanged := OldOnChanged;
FSlave := Value;
if Slave <> nil then
begin
OldOnChanged := Slave.OnChanged;
Slave.OnChanged := SlaveChanged;
end;
if NeedContextFixup then
FixupContext
else
begin
if Supports(ProviderIntf, IJvDataContexts, CtxList) and (CtxList.GetCount >0 ) then
SetContextIntf(CtxList.GetContext(0))
else
SetContextIntf(nil);
end;
ProviderChanged;
if NeedExtensionFixups then
FixupExtensions;
ViewChanged(nil);
Changed(ccrProviderSelect);
end;
end;
procedure TMasterConsumer.LimitSubServices(Sender: TJvDataConsumer;
var SubSvcClass: TJvDataConsumerAggregatedObjectClass);
begin
if (Slave <> nil) and not SubSvcClass.InheritsFrom(TJvDataConsumerContext) and
not SubSvcClass.InheritsFrom(TJvDataConsumerItemSelect) and
not SubSvcClass.InheritsFrom(TJvCustomDataConsumerViewList) then
SubSvcClass := nil;
end;
procedure TMasterConsumer.SlaveChanged(Sender: TJvDataConsumer;
Reason: TJvDataConsumerChangeReason);
begin
if Reason = ccrViewChange then
ViewChanged(nil);
Changed(Reason);
end;
function TMasterConsumer.ProviderIntf: IJvDataProvider;
begin
if Slave <> nil then
Result := Slave.ProviderIntf
else
Result := inherited ProviderIntf;
end;
procedure TMasterConsumer.SetProviderIntf(Value: IJvDataProvider);
begin
if Slave <> nil then
Slave.SetProviderIntf(Value)
else
inherited SetProviderIntf(Value);
end;
function TMasterConsumer.ContextIntf: IJvDataContext;
begin
if Slave <> nil then
Result := Slave.ContextIntf
else
Result := inherited ContextIntf;
end;
procedure TMasterConsumer.SetContextIntf(Value: IJvDataContext);
begin
if Slave <> nil then
Slave.SetContextIntf(Value)
else
inherited SetContextIntf(Value);
end;
function TMasterConsumer.GetInterface(const IID: TGUID; out Obj): Boolean;
begin
Result := inherited GetInterface(IID, Obj);
if not Result and not IsEqualGUID(IID, IJvDataConsumerItemSelect) and (Slave <> nil) then
Result := Slave.GetInterface(IID, Obj);
end;
//=== { TfmeJvProviderTreeList } =============================================
constructor TfmeJvProviderTreeList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FConsumerSvc := TMasterConsumer.Create(Self);
FConsumerSvc.OnChanged := ConsumerChanged;
end;
destructor TfmeJvProviderTreeList.Destroy;
begin
FreeAndNil(FConsumerSvc);
inherited Destroy;
end;
function TfmeJvProviderTreeList.DoGetVirtualRoot: IJvDataItem;
begin
Result := nil;
if Assigned(FOnGetVirtualRoot) then
FOnGetVirtualRoot(Self, Result);
end;
procedure TfmeJvProviderTreeList.DoItemSelect;
begin
if Assigned(FOnItemSelect) then
FOnItemSelect(Self);
end;
procedure TfmeJvProviderTreeList.SetUseVirtualRoot(Value: Boolean);
begin
if Value <> UseVirtualRoot then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -