📄 jvdataprovider.pas
字号:
The context-less list does not allow moving of items. }
procedure ItemMove(OldIndex, NewIndex: Integer);
{ Determines if the item is streamable. }
function IsStreamableItem(Item: IJvDataItem): Boolean; virtual;
function ScanForID(Items: IJvDataItems; ID: string; Recursive: Boolean): IJvDataItem;
{ Streaming methods }
procedure DefineProperties(Filer: TFiler); override;
procedure ReadItems(Reader: TReader);
procedure WriteItems(Writer: TWriter);
procedure ReadItem(Reader: TReader);
procedure WriteItem(Writer: TWriter; Item: IJvDataItem);
{ IJvDataItems methods }
function GetCount: Integer; virtual; abstract;
function GetItem(I: Integer): IJvDataItem; virtual; abstract;
function GetItemByID(ID: string): IJvDataItem;
function GetItemByIndexPath(IndexPath: array of Integer): IJvDataItem;
function GetParent: IJvDataItem; virtual;
function GetProvider: IJvDataProvider;
function GetImplementer: TObject;
function IsDynamic: Boolean; virtual;
procedure ContextDestroying(Context: IJvDataContext); dynamic;
{ IJvDataIDSearch methods }
function FindByID(ID: string; const Recursive: Boolean = False): IJvDataItem;
public
constructor Create; overload; virtual;
constructor Create(const Provider: IJvDataProvider); overload; virtual;
constructor Create(const Parent: IJvDataItem); overload; virtual;
procedure BeforeDestruction; override;
end;
TJvBaseDataItemsRenderer = class(TJvDataItemsAggregatedObject, IJvDataItemsRenderer)
protected
procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Item: IJvDataItem; State: TProviderDrawStates); virtual; abstract;
function DoMeasureItem(ACanvas: TCanvas; Item: IJvDataItem): TSize; virtual; abstract;
{ IJvDataItemsRenderer methods }
procedure DrawItemByIndex(ACanvas: TCanvas; var ARect: TRect; Index: Integer;
State: TProviderDrawStates); virtual;
function MeasureItemByIndex(ACanvas: TCanvas; Index: Integer): TSize; virtual;
procedure DrawItem(ACanvas: TCanvas; var ARect: TRect; Item: IJvDataItem;
State: TProviderDrawStates); virtual;
function MeasureItem(ACanvas: TCanvas; Item: IJvDataItem): TSize; virtual;
function AvgItemSize(ACanvas: TCanvas): TSize; virtual; abstract;
end;
TJvBaseDataItemsManagement = class(TJvDataItemsAggregatedObject, IJvDataItemsManagement)
protected
{ IJvDataItemManagement methods }
function Add(Item: IJvDataItem): IJvDataItem; virtual; abstract;
function New: IJvDataItem; virtual; abstract;
procedure Clear; virtual; abstract;
procedure Delete(Index: Integer); virtual; abstract;
procedure Remove(var Item: IJvDataItem); virtual; abstract;
end;
TJvBaseDataItemsImagesImpl = class(TJvDataItemsAggregatedObject, IJvDataItemsImages)
protected
{ IJvDataItemImages methods }
function GetDisabledImages: TCustomImageList; virtual; abstract;
procedure SetDisabledImages(const Value: TCustomImageList); virtual; abstract;
function GetHotImages: TCustomImageList; virtual; abstract;
procedure SetHotImages(const Value: TCustomImageList); virtual; abstract;
function GetImages: TCustomImageList; virtual; abstract;
procedure SetImages(const Value: TCustomImageList); virtual; abstract;
end;
// Standard item implementers
TJvDataItemTextImpl = class(TJvBaseDataItemTextImpl)
private
FCaption: string;
protected
function GetCaption: string; override;
procedure SetCaption(const Value: string); override;
function Editable: Boolean; override;
published
property Caption: string read GetCaption write SetCaption;
end;
{ Context sensitive text implementation: Retrieves/Sets the caption linked to the currently
selected context. The implementation provides in a default caption that is not linked to any
context. If there's no active context set at the provider; this caption will be retrieved/set.
If the active context set at the provider has no caption linked to it, the standard caption
is retrieved, but a new link is added when the caption is changed. }
TJvDataItemContextTextImpl = class(TJvDataItemTextImpl, IJvDataContextSensitive)
private
FContextStrings: TStringList;
protected
function GetCaption: string; override;
procedure SetCaption(const Value: string); override;
function Editable: Boolean; override;
public
constructor Create(AOwner: TExtensibleInterfacedPersistent); override;
destructor Destroy; override;
procedure RevertToAncestor; dynamic;
function IsEqualToAncestor: Boolean; dynamic;
end;
TJvDataItemImageImpl = class(TJvBaseDataItemImageImpl)
private
FAlignment: TAlignment;
FImageIndex: Integer;
FSelectedIndex: Integer;
protected
function GetAlignment: TAlignment; override;
procedure SetAlignment(Value: TAlignment); override;
function GetImageIndex: Integer; override;
procedure SetImageIndex(Index: Integer); override;
function GetSelectedIndex: Integer; override;
procedure SetSelectedIndex(Value: Integer); override;
published
property Alignment: TAlignment read GetAlignment write SetAlignment default taLeftJustify;
property ImageIndex: Integer read GetImageIndex write SetImageIndex default 0;
property SelectedIndex: Integer read GetSelectedIndex write SetSelectedIndex default 0;
end;
TJvBaseDataItemSubItems = class(TJvDataItemAggregatedObject, IJvDataItems)
private
FItems: IJvDataItems;
protected
property Items: IJvDataItems read FItems implements IJvDataItems;
public
constructor Create(AOwner: TExtensibleInterfacedPersistent; AItems: TJvBaseDataItems); reintroduce; virtual;
procedure BeforeDestruction; override;
function GetInterface(const IID: TGUID; out Obj): Boolean; override;
end;
TJvCustomDataItemTextRenderer = class(TJvBaseDataItemRenderer)
protected
procedure Draw(ACanvas: TCanvas; var ARect: TRect; State: TProviderDrawStates); override;
function Measure(ACanvas: TCanvas): TSize; override;
end;
TJvCustomDataItemRenderer = class(TJvBaseDataItemRenderer)
protected
procedure Draw(ACanvas: TCanvas; var ARect: TRect; State: TProviderDrawStates); override;
function Measure(ACanvas: TCanvas): TSize; override;
end;
TJvCustomDataItemStates = class(TJvBaseDataItemStates)
private
FEnabled: TDataItemState;
FChecked: TDataItemState;
FVisible: TDataItemState;
protected
procedure InitStatesUsage(UseEnabled, UseChecked, UseVisible: Boolean);
function Get_Enabled: TDataItemState; override;
procedure Set_Enabled(Value: TDataItemState); override;
function Get_Checked: TDataItemState; override;
procedure Set_Checked(Value: TDataItemState); override;
function Get_Visible: TDataItemState; override;
procedure Set_Visible(Value: TDataItemState); override;
published
property Enabled: TDataItemState read Get_Enabled write Set_Enabled;
property Checked: TDataItemState read Get_Checked write Set_Checked;
property Visible: TDataItemState read Get_Visible write Set_Visible;
end;
// Standard items implementers
TJvCustomDataItemsTextRenderer = class(TJvBaseDataItemsRenderer)
protected
procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Item: IJvDataItem;
State: TProviderDrawStates); override;
function DoMeasureItem(ACanvas: TCanvas; Item: IJvDataItem): TSize; override;
function AvgItemSize(ACanvas: TCanvas): TSize; override;
end;
TJvCustomDataItemsRenderer = class(TJvBaseDataItemsRenderer)
protected
procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Item: IJvDataItem;
State: TProviderDrawStates); override;
function DoMeasureItem(ACanvas: TCanvas; Item: IJvDataItem): TSize; override;
function AvgItemSize(ACanvas: TCanvas): TSize; override;
end;
TJvDataItemsList = class(TJvBaseDataItems)
private
FList: TObjectList;
protected
procedure InternalAdd(Item: IJvDataItem); override;
function IsDynamic: Boolean; override;
function GetCount: Integer; override;
function GetItem(I: Integer): IJvDataItem; override;
public
constructor Create; override;
destructor Destroy; override;
property List: TObjectList read FList;
end;
TJvBaseDataItemsListManagement = class(TJvBaseDataItemsManagement)
protected
function Add(Item: IJvDataItem): IJvDataItem; override;
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Remove(var Item: IJvDataItem); override;
end;
TJvCustomDataItemsImages = class(TJvBaseDataItemsImagesImpl)
private
FDisabledImages: TCustomImageList;
FHotImages: TCustomImageList;
FImages: TCustomImageList;
protected
function GetDisabledImages: TCustomImageList; override;
procedure SetDisabledImages(const Value: TCustomImageList); override;
function GetHotImages: TCustomImageList; override;
procedure SetHotImages(const Value: TCustomImageList); override;
function GetImages: TCustomImageList; override;
procedure SetImages(const Value: TCustomImageList); override;
published
property DisabledImages: TCustomImageList read GetDisabledImages write SetDisabledImages;
property HotImages: TCustomImageList read GetHotImages write SetHotImages;
property Images: TCustomImageList read GetImages write SetImages;
end;
// Generic data provider implementation
TJvCustomDataProvider = class(TJvComponent, IUnknown,
{$IFDEF COMPILER5} IInterfaceComponentReference, {$ENDIF} IJvDataProvider)
private
FDataItems: IJvDataItems;
FDataContextsImpl: TJvBaseDataContexts;
FDataContextsIntf: IJvDataContexts;
FNotifiers: TInterfaceList;
FTreeItems: TJvDataProviderTree;
FConsumerStack: TInterfaceList;
FContextStack: TInterfaceList;
FContexts: TJvDataProviderContexts;
protected
function QueryInterface(const IID: TGUID; out Obj): HRESULT; override;
procedure Changing(ChangeReason: TDataProviderChangeReason; Source: IUnknown = nil);
procedure Changed(ChangeReason: TDataProviderChangeReason; Source: IUnknown = nil);
class function PersistentDataItems: Boolean; virtual;
class function ItemsClass: TJvDataItemsClass; virtual;
class function ContextsClass: TJvDataContextsClass; virtual;
class function ContextsManagerClass: TJvDataContextsManagerClass; virtual;
procedure DefineProperties(Filer: TFiler); override;
procedure ReadRoot(Reader: TReader);
procedure WriteRoot(Writer: TWriter);
procedure ReadContexts(Reader: TReader);
procedure WriteContexts(Writer: TWriter);
procedure ReadContext(Reader: TReader; Index: Integer);
procedure WriteContext(Writer: TWriter; AContext: IJvDataContext);
procedure AddToArray(var ClassArray: TClassArray; AClass: TClass);
procedure DeleteFromArray(var ClassArray: TClassArray; Index: Integer);
function IndexOfClass(AClassArray: TClassArray; AClass: TClass): Integer;
procedure RemoveFromArray(var ClassArray: TClassArray; AClass: TClass);
function IsTreeProvider: Boolean; dynamic;
function GetDataItemsImpl: TJvBaseDataItems;
{$IFDEF COMPILER5}
{ IInterfaceComponentReference }
function GetComponent: TComponent;
{$ENDIF COMPILER5}
{ IDataProvider }
function GetItems: IJvDataItems; virtual;
procedure RegisterChangeNotify(ANotify: IJvDataProviderNotify); dynamic;
procedure UnregisterChangeNotify(ANotify: IJvDataProviderNotify); dynamic;
function ConsumerClasses: TClassArray; dynamic;
procedure SelectConsumer(Consumer: IJvDataConsumer);
function SelectedConsumer: IJvDataConsumer;
procedure ReleaseConsumer;
procedure SelectContext(Context: IJvDataContext);
function SelectedContext: IJvDataContext;
procedure ReleaseContext;
procedure ContextAdded(Context: IJvDataContext); dynamic;
procedure ContextDestroying(Context: IJvDataContext); dynamic;
procedure ConsumerDestroying(Consumer: IJvDataConsumer); dynamic;
function AllowProviderDesigner: Boolean; dynamic;
function AllowContextManager: Boolean; dynamic;
function GetNotifierCount: Integer;
function GetNotifier(Index: Integer): IJvDataProviderNotify;
function GetImplementer: TObject;
property DataItemsImpl: TJvBaseDataItems read GetDataItemsImpl;
property DataContextsImpl: TJvBaseDataContexts read FDataContextsImpl;
property Items: TJvDataProviderTree read FTreeItems write FTreeItems stored False;
property Contexts: TJvDataProviderContexts read FContexts write FContexts stored False;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure BeforeDestruction; override;
function GetInterface(const IID: TGUID; out Obj): Boolean; virtual;
end;
// Basic context list
TJvBaseDataContexts = class(TExtensibleInterfacedPersistent, IJvDataContexts)
private
FProvider: IJvDataProvider;
FDsgnContext: IJvDataContext;
FAncestor: IJvDataContext;
protected
procedure DoAddContext(Context: IJvDataContext); virtual; abstract;
procedure DoDeleteContext(Index: Integer); virtual; abstract;
procedure DoRemoveContext(Context: IJvDataContext); virtual; abstract;
procedure DoClearContexts; virtual; abstract;
function Provider: IJvDataProvider;
function Ancestor: IJvDataContext;
function GetCount: Integer; virtual; abstract;
function GetContext(Index: Integer): IJvDataContext; virtual; abstract;
function GetContextByName(Name: string): IJvDataContext; virtual;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -