mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 21:49:09 +02:00
* Allow registering of an icon for custom elements
git-svn-id: trunk@38821 -
This commit is contained in:
parent
af8348fba4
commit
6a30410f7b
@ -2147,19 +2147,26 @@ type
|
|||||||
TFPReportClassMapping = class(TObject)
|
TFPReportClassMapping = class(TObject)
|
||||||
private
|
private
|
||||||
FEditorClass: TFPReportElementEditorClass;
|
FEditorClass: TFPReportElementEditorClass;
|
||||||
|
FIConData: TBytes;
|
||||||
FImageRenderCallBack: TFPReportImageRenderCallBack;
|
FImageRenderCallBack: TFPReportImageRenderCallBack;
|
||||||
FMappingName: string;
|
FMappingName: string;
|
||||||
FReportElementClass: TFPReportElementClass;
|
FReportElementClass: TFPReportElementClass;
|
||||||
FRenderers : TFPReportElementRendererArray;
|
FRenderers : TFPReportElementRendererArray;
|
||||||
|
FStandard: Boolean;
|
||||||
public
|
public
|
||||||
Function IndexOfExportRenderer(AClass : TFPReportExporterClass) : Integer;
|
|
||||||
constructor Create(const AMappingName: string; AElementClass: TFPReportElementClass);
|
constructor Create(const AMappingName: string; AElementClass: TFPReportElementClass);
|
||||||
|
Procedure SetIconFromBytes(B : Array of Byte);
|
||||||
|
Function IndexOfExportRenderer(AClass : TFPReportExporterClass) : Integer;
|
||||||
Function AddRenderer(aExporterClass : TFPReportExporterClass; aCallback : TFPReportElementExporterCallBack) : TFPReportElementExporterCallBack;
|
Function AddRenderer(aExporterClass : TFPReportExporterClass; aCallback : TFPReportElementExporterCallBack) : TFPReportElementExporterCallBack;
|
||||||
Function FindRenderer(aClass : TFPReportExporterClass) : TFPReportElementExporterCallBack;
|
Function FindRenderer(aClass : TFPReportExporterClass) : TFPReportElementExporterCallBack;
|
||||||
property MappingName: string read FMappingName;
|
property MappingName: string read FMappingName;
|
||||||
Property ImageRenderCallback : TFPReportImageRenderCallBack Read FImageRenderCallBack Write FImageRenderCallBack;
|
Property ImageRenderCallback : TFPReportImageRenderCallBack Read FImageRenderCallBack Write FImageRenderCallBack;
|
||||||
property ReportElementClass: TFPReportElementClass read FReportElementClass;
|
property ReportElementClass: TFPReportElementClass read FReportElementClass;
|
||||||
|
// Class to edit the element visually
|
||||||
property EditorClass : TFPReportElementEditorClass Read FEditorClass Write FEditorClass;
|
property EditorClass : TFPReportElementEditorClass Read FEditorClass Write FEditorClass;
|
||||||
|
// element Icon data in PNG format, will be shown in menu editor.
|
||||||
|
property IconData : TBytes Read FIConData Write FIconData;
|
||||||
|
Property Standard : Boolean Read FStandard;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -2171,10 +2178,10 @@ type
|
|||||||
private
|
private
|
||||||
FList: TFPObjectList;
|
FList: TFPObjectList;
|
||||||
function GetM(Aindex : integer): TFPReportClassMapping;
|
function GetM(Aindex : integer): TFPReportClassMapping;
|
||||||
|
function GetMappingCount: Integer;
|
||||||
Protected
|
Protected
|
||||||
function IndexOfElementClass(const AElementClass: TFPReportElementClass): Integer;
|
function IndexOfElementClass(const AElementClass: TFPReportElementClass): Integer;
|
||||||
Function IndexOfElementName(const AElementName: string) : Integer;
|
Function IndexOfElementName(const AElementName: string) : Integer;
|
||||||
Property Mappings[Aindex : integer] : TFPReportClassMapping read GetM;
|
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -2186,12 +2193,14 @@ type
|
|||||||
procedure RegisterEditorClass(AReportElementClass: TFPReportElementClass; AEditorClass: TFPReportElementEditorClass);
|
procedure RegisterEditorClass(AReportElementClass: TFPReportElementClass; AEditorClass: TFPReportElementEditorClass);
|
||||||
procedure UnRegisterEditorClass(const AElementName: string; AEditorClass: TFPReportElementEditorClass);
|
procedure UnRegisterEditorClass(const AElementName: string; AEditorClass: TFPReportElementEditorClass);
|
||||||
procedure UnRegisterEditorClass(AReportElementClass: TFPReportElementClass; AEditorClass: TFPReportElementEditorClass);
|
procedure UnRegisterEditorClass(AReportElementClass: TFPReportElementClass; AEditorClass: TFPReportElementEditorClass);
|
||||||
procedure RegisterClass(const AElementName: string; AReportElementClass: TFPReportElementClass);
|
Function RegisterClass(const AElementName: string; AReportElementClass: TFPReportElementClass) : TFPReportClassMapping;
|
||||||
procedure RemoveClass(const AElementName: string);
|
procedure RemoveClass(const AElementName: string);
|
||||||
function CreateInstance(const AElementName: string; AOwner: TComponent): TFPReportElement; overload;
|
function CreateInstance(const AElementName: string; AOwner: TComponent): TFPReportElement; overload;
|
||||||
Function FindEditorClassForInstance(AInstance : TFPReportElement) : TFPReportElementEditorClass;
|
Function FindEditorClassForInstance(AInstance : TFPReportElement) : TFPReportElementEditorClass;
|
||||||
Function FindEditorClassForInstance(AClass : TFPReportElementClass) : TFPReportElementEditorClass ;
|
Function FindEditorClassForInstance(AClass : TFPReportElementClass) : TFPReportElementEditorClass ;
|
||||||
procedure AssignReportElementTypes(AStrings: TStrings);
|
procedure AssignReportElementTypes(AStrings: TStrings);
|
||||||
|
Property Mappings[Aindex : integer] : TFPReportClassMapping read GetM;
|
||||||
|
Property MappingCount : Integer Read GetMappingCount;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFPReportBandFactory }
|
{ TFPReportBandFactory }
|
||||||
@ -9993,8 +10002,12 @@ Var
|
|||||||
Img : TFPCustomImage;
|
Img : TFPCustomImage;
|
||||||
H,W : Integer;
|
H,W : Integer;
|
||||||
R : TFPReportRect;
|
R : TFPReportRect;
|
||||||
|
L : TFPReportLayout;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
L:=aElement.RTLayout;
|
||||||
|
if (L=Nil) then
|
||||||
|
L:=aElement.Layout;
|
||||||
// Actually, this could be cached using propertyhash...
|
// Actually, this could be cached using propertyhash...
|
||||||
C:=gElementFactory.FindRenderer(TFPReportExporterClass(self.ClassType),TFPReportElementClass(aElement.ClassType));
|
C:=gElementFactory.FindRenderer(TFPReportExporterClass(self.ClassType),TFPReportElementClass(aElement.ClassType));
|
||||||
if (C<>Nil) then
|
if (C<>Nil) then
|
||||||
@ -10006,15 +10019,15 @@ begin
|
|||||||
IC:=gElementFactory.FindImageRenderer(TFPReportElementClass(aElement.ClassType));
|
IC:=gElementFactory.FindImageRenderer(TFPReportElementClass(aElement.ClassType));
|
||||||
if Assigned(IC) then
|
if Assigned(IC) then
|
||||||
begin
|
begin
|
||||||
H := Round(aElement.RTLayout.Height * (aDPI / cMMperInch));
|
H := Round(L.Height * (aDPI / cMMperInch));
|
||||||
W := Round(aElement.RTLayout.Width * (aDPI / cMMperInch));
|
W := Round(L.Width * (aDPI / cMMperInch));
|
||||||
Img:=TFPCompactImgRGBA8Bit.Create(W,H);
|
Img:=TFPCompactImgRGBA8Bit.Create(W,H);
|
||||||
try
|
try
|
||||||
IC(aElement,Img);
|
IC(aElement,Img);
|
||||||
R.Left:=aBasePos.Left+AElement.RTLayout.Left;
|
R.Left:=aBasePos.Left+L.Left;
|
||||||
R.Top:=aBasePos.Top+AElement.RTLayout.Top;
|
R.Top:=aBasePos.Top+L.Top;
|
||||||
R.Width:=AElement.RTLayout.Width;
|
R.Width:=L.Width;
|
||||||
R.Height:=AElement.RTLayout.Height;
|
R.Height:=L.Height;
|
||||||
RenderImage(R,Img);
|
RenderImage(R,Img);
|
||||||
finally
|
finally
|
||||||
Img.Free;
|
Img.Free;
|
||||||
@ -10635,6 +10648,12 @@ begin
|
|||||||
FReportElementClass := AElementClass;
|
FReportElementClass := AElementClass;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TFPReportClassMapping.SetIconFromBytes(B: array of Byte);
|
||||||
|
begin
|
||||||
|
SetLength(FIConData,Length(B));
|
||||||
|
Move(B[0],FIconData[0],Length(B));
|
||||||
|
end;
|
||||||
|
|
||||||
function TFPReportClassMapping.AddRenderer(aExporterClass: TFPReportExporterClass; aCallback: TFPReportElementExporterCallBack ): TFPReportElementExporterCallBack;
|
function TFPReportClassMapping.AddRenderer(aExporterClass: TFPReportExporterClass; aCallback: TFPReportElementExporterCallBack ): TFPReportElementExporterCallBack;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -10674,6 +10693,11 @@ begin
|
|||||||
Result:=TFPReportClassMapping(FList[AIndex]);
|
Result:=TFPReportClassMapping(FList[AIndex]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFPReportElementFactory.GetMappingCount: Integer;
|
||||||
|
begin
|
||||||
|
Result:=FList.Count;
|
||||||
|
end;
|
||||||
|
|
||||||
function TFPReportElementFactory.IndexOfElementName(const AElementName: string): Integer;
|
function TFPReportElementFactory.IndexOfElementName(const AElementName: string): Integer;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -10805,13 +10829,16 @@ begin
|
|||||||
Mappings[i].EditorClass:=nil;
|
Mappings[i].EditorClass:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFPReportElementFactory.RegisterClass(const AElementName: string; AReportElementClass: TFPReportElementClass);
|
function TFPReportElementFactory.RegisterClass(const AElementName: string; AReportElementClass: TFPReportElementClass
|
||||||
|
): TFPReportClassMapping;
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
I:=IndexOfElementName(AElementName);
|
I:=IndexOfElementName(AElementName);
|
||||||
if I<>-1 then exit;
|
if I<>-1 then
|
||||||
FList.Add(TFPReportClassMapping.Create(AElementName, AReportElementClass));
|
exit;
|
||||||
|
Result:=TFPReportClassMapping.Create(AElementName, AReportElementClass);
|
||||||
|
FList.Add(Result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFPReportElementFactory.RemoveClass(const AElementName: string);
|
procedure TFPReportElementFactory.RemoveClass(const AElementName: string);
|
||||||
@ -12214,25 +12241,36 @@ begin
|
|||||||
DefaultBandRectangleColors[i] := fpgDarker(DefaultBandColors[i], 70);
|
DefaultBandRectangleColors[i] := fpgDarker(DefaultBandColors[i], 70);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Procedure RegisterStandardReportClasses;
|
||||||
|
|
||||||
|
Procedure DoReg(N : String; C : TFPReportElementClass);
|
||||||
|
|
||||||
|
begin
|
||||||
|
gElementFactory.RegisterClass(N,C).FStandard:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
DoReg('ReportTitleBand', TFPReportTitleBand);
|
||||||
|
DoReg('ReportSummaryBand', TFPReportSummaryBand);
|
||||||
|
DoReg('GroupHeaderBand', TFPReportGroupHeaderBand);
|
||||||
|
DoReg('GroupFooterBand', TFPReportGroupFooterBand);
|
||||||
|
DoReg('DataBand', TFPReportDataBand);
|
||||||
|
DoReg('ChildBand', TFPReportChildBand);
|
||||||
|
DoReg('PageHeaderBand', TFPReportPageHeaderBand);
|
||||||
|
DoReg('PageFooterBand', TFPReportPageFooterBand);
|
||||||
|
DoReg('DataHeaderBand', TFPReportDataHeaderBand);
|
||||||
|
DoReg('DataFooterBand', TFPReportDataFooterBand);
|
||||||
|
DoReg('ColumnHeaderBand', TFPReportColumnHeaderBand);
|
||||||
|
DoReg('ColumnFooterBand', TFPReportColumnFooterBand);
|
||||||
|
DoReg('Memo', TFPReportMemo);
|
||||||
|
DoReg('Image', TFPReportImage);
|
||||||
|
DoReg('Checkbox', TFPReportCheckbox);
|
||||||
|
DoReg('Shape', TFPReportShape);
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
uElementFactory := nil;
|
uElementFactory := nil;
|
||||||
gElementFactory.RegisterClass('ReportTitleBand', TFPReportTitleBand);
|
RegisterStandardReportClasses;
|
||||||
gElementFactory.RegisterClass('ReportSummaryBand', TFPReportSummaryBand);
|
|
||||||
gElementFactory.RegisterClass('GroupHeaderBand', TFPReportGroupHeaderBand);
|
|
||||||
gElementFactory.RegisterClass('GroupFooterBand', TFPReportGroupFooterBand);
|
|
||||||
gElementFactory.RegisterClass('DataBand', TFPReportDataBand);
|
|
||||||
gElementFactory.RegisterClass('ChildBand', TFPReportChildBand);
|
|
||||||
gElementFactory.RegisterClass('PageHeaderBand', TFPReportPageHeaderBand);
|
|
||||||
gElementFactory.RegisterClass('PageFooterBand', TFPReportPageFooterBand);
|
|
||||||
gElementFactory.RegisterClass('DataHeaderBand', TFPReportDataHeaderBand);
|
|
||||||
gElementFactory.RegisterClass('DataFooterBand', TFPReportDataFooterBand);
|
|
||||||
gElementFactory.RegisterClass('ColumnHeaderBand', TFPReportColumnHeaderBand);
|
|
||||||
gElementFactory.RegisterClass('ColumnFooterBand', TFPReportColumnFooterBand);
|
|
||||||
gElementFactory.RegisterClass('Memo', TFPReportMemo);
|
|
||||||
gElementFactory.RegisterClass('Image', TFPReportImage);
|
|
||||||
gElementFactory.RegisterClass('Checkbox', TFPReportCheckbox);
|
|
||||||
gElementFactory.RegisterClass('Shape', TFPReportShape);
|
|
||||||
SetupBandRectColors;
|
SetupBandRectColors;
|
||||||
|
|
||||||
finalization
|
finalization
|
||||||
|
@ -175,8 +175,53 @@ end;
|
|||||||
|
|
||||||
Procedure RegisterReportBarcode;
|
Procedure RegisterReportBarcode;
|
||||||
|
|
||||||
|
Const
|
||||||
|
icon : Array[0..687] of byte = (
|
||||||
|
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0,
|
||||||
|
0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31,243,255, 97, 0,
|
||||||
|
0, 2,119, 73, 68, 65, 84,120,156,141,147,189, 74, 92, 81, 20,133,
|
||||||
|
191,243,115,255,207,140,137,131, 78, 52, 97, 16, 11, 13, 72, 82, 72,
|
||||||
|
8, 24, 27, 11,155,188,131,149,181,146,202,135, 8, 41,132,188,129,
|
||||||
|
32,216, 8,118,226, 3,164, 21,196, 46, 54,153, 66, 13, 99, 38,113,
|
||||||
|
254,238,157,153,123,199,123, 82, 56,115, 73, 37, 89,176,224,176, 89,
|
||||||
|
103,237,195,222,103, 9,198, 56, 56, 56, 88, 95, 92, 92,124, 45,165,
|
||||||
|
20, 60, 1,107,173,173,215,235,223,183,182,182,190, 21,197,163,163,
|
||||||
|
163,207, 73,146,228, 73,146,216,255,100,126,120,120,248, 5, 64,108,
|
||||||
|
111,111,191, 92, 93, 93,173,135, 97,168,141, 49, 52, 26, 13,142,143,
|
||||||
|
143, 57, 61, 61,101,125,125,157, 82,169,196,206,206, 14,215,215,215,
|
||||||
|
156,156,156,176,187,187,203,205,205, 13,211,211,211, 15,151,151,151,
|
||||||
|
11,186, 82,169, 84,227, 56,214,214, 90,164,148,116,187, 93,126,253,
|
||||||
|
106, 2,112,119,119,199,112, 56, 36, 73, 18,226, 56,166,217,108,210,
|
||||||
|
235,245,136,227, 24,223,247, 85,181, 90,125, 33,133, 16, 76, 40,165,
|
||||||
|
68,107,141,235,186, 40,165,240, 60, 15,207,243, 80, 74,161,181,198,
|
||||||
|
113,156, 66, 7, 32,165, 20, 18, 40,138, 82,170,177,129, 83, 24,185,
|
||||||
|
174,139,214,186, 48,208, 90, 35,165, 66, 74,137,181, 22, 41, 30,157,
|
||||||
|
198, 93, 84,209, 77, 8, 81, 92, 82,106, 82,159,156,229,248, 21, 22,
|
||||||
|
141, 16,204,164, 41,230,247,111, 76,154,162, 90, 45,222,102, 25,226,
|
||||||
|
231, 79,222,141, 70,148, 71, 35,102, 91, 45,242, 78,135, 55, 89, 74,
|
||||||
|
165,217,100,116,127,143,137, 34,218, 8,180, 16,130, 56,138, 40, 55,
|
||||||
|
155, 68, 74, 97, 7, 3, 94,229, 57,162,223,103,193, 90, 76,158, 83,
|
||||||
|
74, 83,134, 89,198,124,158, 19,245,251,136, 52, 37, 14, 67, 72,146,
|
||||||
|
71, 3,171, 53,237, 90,141, 40,203,200,178,140,196,243,160, 82,161,
|
||||||
|
231,121, 8,207, 99, 84, 46,147,117,187,244, 93,151,254,212, 51,254,
|
||||||
|
184, 46,211, 74, 33,192, 74, 38, 51,240,125,226,106,149, 81,185, 76,
|
||||||
|
26,134, 48, 53,197, 32, 8, 24,134, 33,185, 49, 60, 24, 67, 28, 69,
|
||||||
|
244,102,103,208,227, 45, 33, 4, 18, 40,134,164, 28,135,158, 49, 12,
|
||||||
|
130, 0,164,100, 16, 4,164, 97,200,131,235, 50,116, 93, 26,229, 50,
|
||||||
|
74,235, 66,111,173, 69,118, 58,157,252,113,133,143,204,181,166, 21,
|
||||||
|
69, 0,164, 65, 64, 26, 4,228,142, 67,223,247, 17,142,195,191,218,
|
||||||
|
118,187,253,160, 47, 46, 46,126,172,172,172, 52,150,151,151,171, 65,
|
||||||
|
16, 96,140,225,253,135, 15, 0,172,110,108, 96, 74, 37,158,207,207,
|
||||||
|
99,125,159,181,181, 53,230,230,230,240, 60,143,219,219,219,198,249,
|
||||||
|
249,249, 15, 1,176,185,185,249,113,111,111,239,235,210,210,210,252,
|
||||||
|
83, 73,156,224,234,234,234,118,127,127,255,211,217,217,217,105, 17,
|
||||||
|
221, 90,173, 22,229,121,254,124,242, 77,159,136, 51, 74,169,251,122,
|
||||||
|
189, 30, 3,252, 5,131, 89, 18, 55,201,190,160,207, 0, 0, 0, 0,
|
||||||
|
73, 69, 78, 68,174, 66, 96,130);
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
gElementFactory.RegisterClass('Barcode',TFPReportBarcode);
|
gElementFactory.RegisterClass('Barcode',TFPReportBarcode).SetIconFromBytes(Icon);
|
||||||
// Fallback renderer
|
// Fallback renderer
|
||||||
gElementFactory.RegisterImageRenderer(TFPReportBarcode,@RenderBarcode);
|
gElementFactory.RegisterImageRenderer(TFPReportBarcode,@RenderBarcode);
|
||||||
end;
|
end;
|
||||||
|
@ -197,9 +197,19 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
Procedure RegisterReportQRCode;
|
Procedure RegisterReportQRCode;
|
||||||
|
Const
|
||||||
|
icon : Array[0..123] of byte = (
|
||||||
|
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0,
|
||||||
|
0, 0, 16, 0, 0, 0, 16, 1, 3, 0, 0, 0, 37, 61,109, 34, 0,
|
||||||
|
0, 0, 6, 80, 76, 84, 69, 0, 0, 0,255,255,255,165,217,159,221,
|
||||||
|
0, 0, 0, 49, 73, 68, 65, 84, 8,215, 99, 96,108, 96,168,221,199,
|
||||||
|
224,186, 8,138,128,108,160,200,255,255, 12,255,101, 24, 24, 69, 24,
|
||||||
|
106,191, 48,184,178, 48,184,202, 48,184, 62, 97,168,149, 96, 96,148,
|
||||||
|
0, 0, 95, 30, 13, 78,141,201,223,244, 0, 0, 0, 0, 73, 69, 78,
|
||||||
|
68,174, 66, 96,130);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
gElementFactory.RegisterClass('QRCode',TFPReportQRCode);
|
gElementFactory.RegisterClass('QRCode',TFPReportQRCode).SetIconFromBytes(Icon);
|
||||||
// Fallback renderer
|
// Fallback renderer
|
||||||
gElementFactory.RegisterImageRenderer(TFPReportQRCode,@RenderQRCode);
|
gElementFactory.RegisterImageRenderer(TFPReportQRCode,@RenderQRCode);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user