📄 jvqcontextprovider.pas
字号:
end
else
ParentList := Self;
GetProvider.Changing(pcrAdd, ParentList);
end;
pcrContextDelete:
begin
{ Source is the IJvDataContext that is about to be destroyed. }
CtxItem := Find(IJvDataContext(Source), True);
GetProvider.Changing(pcrDelete, CtxItem);
end;
pcrContextUpdate:
begin
{ Source is the IJvDataContext that is about to be changed. }
CtxItem := Find(IJvDataContext(Source), True);
GetProvider.Changing(pcrUpdateItem, CtxItem);
end;
end;
end;
procedure TContextRootItems.DataProviderChanged(ADataProvider: IJvDataProvider;
AReason: TDataProviderChangeReason; Source: IUnknown);
var
CtxItem: IJvDataItem;
ParentList: IJvDataItems;
begin
case AReason of
pcrContextAdd:
begin
{ Source contains the IJvDataContext that was just added. }
CtxItem := Find(IJvDataContext(Source), True);
GetProvider.Changed(pcrAdd, CtxItem);
end;
pcrContextDelete:
begin
{ Source is the IJvDataContext from which the item was just removed or nil if the removed
context was at the root. }
if Source <> nil then
begin
CtxItem := Find(IJvDataContext(Source), True);
if CtxItem <> nil then
begin
if not Supports(CtxItem, IJvDataItems, ParentList) then
ParentList := Self;
end
else
ParentList := Self;
end
else
ParentList := Self;
GetProvider.Changed(pcrDelete, ParentList);
end;
pcrContextUpdate:
begin
{ Source is the IJvDataContext that has changed. }
CtxItem := Find(IJvDataContext(Source), True);
GetProvider.Changed(pcrUpdateItem, CtxItem);
end;
end;
end;
function TContextRootItems.GetContexts: IJvDataContexts;
var
ParentCtx: IJvDataContext;
begin
if GetParent <> nil then
begin
if Supports(GetParent, IJvDataContext, ParentCtx) then
Supports(ParentCtx, IJvDataContexts, Result);
end
else
Supports(ClientProvider, IJvDataContexts, Result);
end;
//=== { TContextItem } =======================================================
constructor TContextItem.CreateCtx(AOwner: IJvDataItems; AContext: IJvDataContext);
begin
Create(AOwner);
FContext := AContext;
end;
function TContextItem.GetContext: IJvDataContext;
begin
Result := FContext;
end;
function TContextItem.GetCaption: string;
begin
if Context <> nil then
Result := Context.Name
else
Result := RsContextItemEmptyCaption;
end;
procedure TContextItem.SetCaption(const Value: string);
var
CtxMan: IJvDataContextManager;
begin
if Context <> nil then
begin
if Supports(Context, IJvDataContextManager, CtxMan) then
begin
if Context.Name <> Value then
begin
GetItems.GetProvider.Changing(pcrUpdateItem, Self as IJvDataItem);
CtxMan.SetName(Value);
GetItems.GetProvider.Changed(pcrUpdateItem, Self as IJvDataItem);
end;
end;
end
else
raise EJVCLException.CreateRes(@RsENoContextAssigned);
end;
function TContextItem.Editable: Boolean;
begin
Result := True;
end;
procedure TContextItem.InitID;
var
S: string;
Ctx: IJvDataContext;
begin
S := GetContext.Name;
Ctx := GetContext.Contexts.Ancestor;
while Ctx <> nil do
begin
S := Ctx.Name + '\' + S;
Ctx := Ctx.Contexts.Ancestor;
end;
SetID('CTX:' + S);
end;
function TContextItem.IsDeletable: Boolean;
begin
if GetContext <> nil then
Result := GetContext.IsDeletable
else
Result := True;
end;
//=== { TContextItemsManager } ===============================================
function TContextItemsManager.GetContexts: IJvDataContexts;
var
ICI: IJvDataContextItems;
begin
if Supports(Items, IJvDataContextItems, ICI) then
Result := ICI.GetContexts
else
Result := nil;
end;
function TContextItemsManager.Add(Item: IJvDataItem): IJvDataItem;
var
Contexts: IJvDataContexts;
Mngr: IJvDataContextsManager;
CtxItem: IJvDataContextItem;
begin
Contexts := GetContexts;
if (Contexts <> nil) and Supports(Contexts, IJvDataContextsManager, Mngr) then
begin
if Supports(Item, IJvDataContextItem, CtxItem) then
Result := Item
else
raise EJVCLException.CreateRes(@RsENoContextItem);
end;
end;
function TContextItemsManager.New: IJvDataItem;
var
Contexts: IJvDataContexts;
Mngr: IJvDataContextsManager;
begin
Contexts := GetContexts;
if (Contexts <> nil) and Supports(Contexts, IJvDataContextsManager, Mngr) then
Result := Add(TContextItem.CreateCtx(Items, Mngr.New));
end;
procedure TContextItemsManager.Clear;
var
Contexts: IJvDataContexts;
Mngr: IJvDataContextsManager;
begin
Contexts := GetContexts;
if (Contexts <> nil) and Supports(Contexts, IJvDataContextsManager, Mngr) then
Mngr.Clear;
end;
procedure TContextItemsManager.Delete(Index: Integer);
var
Item: IJvDataItem;
begin
Item := Items.GetItem(Index);
if Item <> nil then
Remove(Item);
end;
procedure TContextItemsManager.Remove(var Item: IJvDataItem);
var
Contexts: IJvDataContexts;
Mngr: IJvDataContextsManager;
CtxItem: IJvDataContextItem;
Ctx: IJvDataContext;
begin
Contexts := GetContexts;
if (Contexts <> nil) and Supports(Contexts, IJvDataContextsManager, Mngr) then
begin
if Supports(Item, IJvDataContextItem, CtxItem) then
begin
Ctx := CtxItem.GetContext;
Item := nil;
CtxItem := nil;
Mngr.Delete(Ctx);
end;
end;
end;
//=== { TJvContextProvider } =================================================
function TJvContextProvider.GetProviderIntf: IJvDataProvider;
begin
Result := TContextRootItems(DataItemsImpl).ClientProvider;
end;
procedure TJvContextProvider.SetProviderIntf(Value: IJvDataProvider);
begin
if Value <> ProviderIntf then
TContextRootItems(DataItemsImpl).ClientProvider := Value;
end;
function TJvContextProvider.GetProviderComp: TComponent;
var
ICR: IInterfaceComponentReference;
begin
if Supports(ProviderIntf, IInterfaceComponentReference, ICR) then
Result := ICR.GetComponent
else
Result := nil;
end;
procedure TJvContextProvider.SetProviderComp(Value: TComponent);
var
PI: IJvDataProvider;
ICR: IInterfaceComponentReference;
begin
if (Value = nil) or Supports(Value, IJvDataProvider, PI) then
begin
if (Value = nil) or Supports(Value, IInterfaceComponentReference, ICR) then
ProviderIntf := PI
else
raise EJVCLException.CreateRes(@RsENotSupportedIInterfaceComponentReference);
end
else
raise EJVCLException.CreateRes(@RsENotSupportedIJvDataProvider);
end;
class function TJvContextProvider.ItemsClass: TJvDataItemsClass;
begin
Result := TContextRootItems;
end;
function TJvContextProvider.ConsumerClasses: TClassArray;
begin
Result := inherited ConsumerClasses;
AddToArray(Result, TJvContextProviderServerNotify);
end;
//=== { TJvContextProviderServerNotify } =====================================
procedure TJvContextProviderServerNotify.ItemSelected(Value: IJvDataItem);
var
CtxItem: IJvDataContextItem;
Ctx: IJvDataContext;
I: Integer;
ConCtx: IJvDataConsumerContext;
begin
// First we allow the default behavior to take place
inherited ItemSelected(Value);
// Now we find out which context is selected and update the linked client consumers accordingly.
if Supports(Value, IJvDataContextItem, CtxItem) then
Ctx := CtxItem.GetContext
else
Ctx := nil;
for I := 0 to Clients.Count - 1 do
if Supports(Clients[I], IJvDataConsumerContext, ConCtx) then
ConCtx.SetContext(Ctx);
end;
function TJvContextProviderServerNotify.IsValidClient(Client: IJvDataConsumerClientNotify): Boolean;
var
ClientProv: IJvDataProvider;
ConsumerProv: IJvDataConsumerProvider;
begin
{ Only allow client consumers who's Provider points to the ClientProvider of the context
provider this consumer is linked to. }
ClientProv := (ConsumerImpl.ProviderIntf as IJvDataContextProvider).ClientProvider;
Result := Supports(Client, IJvDataConsumerProvider, ConsumerProv) and
(ConsumerProv.GetProvider = ClientProv);
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQContextProvider.pas,v $';
Revision: '$Revision: 1.14 $';
Date: '$Date: 2004/09/07 23:11:16 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
RegisterClasses([TJvContextProviderServerNotify]);
{$IFDEF UNITVERSIONING}
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -