fpspreadsheet: Add stream variant of PageLayout.AddHeaderImage and .AddFooterImage

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4558 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-03-15 21:01:01 +00:00
parent 6adaa12975
commit 46d14f5cfe

View File

@ -5,7 +5,7 @@ unit fpsPageLayout;
interface
uses
SysUtils, fpsTypes;
Classes, SysUtils, fpsTypes;
type
{@@ Class defining parameters for printing by the Office applications }
@ -58,10 +58,20 @@ type
function HasHeader: Boolean;
{ Images embedded in header and/or footer }
procedure AddHeaderImage(AHeaderIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFilename: String);
function AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
const AFilename: String): Integer; overload;
function AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
AStream: TStream): Integer; overload;
procedure AddHeaderImage(AHeaderIndex: Integer; ASection: TsHeaderFooterSectionIndex;
AImageIndex: Integer); overload;
function AddFooterImage(AFooterIndex: Integer; ASection: TsHeaderFooterSectionIndex;
const AFilename: String): Integer; overload;
function AddFooterImage(AFooterIndex: integer; ASection: TsHeaderFooterSectionIndex;
AStream: TStream): Integer; overload;
procedure AddFooterImage(AFooterIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFilename: String);
ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer); overload;
procedure GetImageSections(out AHeaderTags, AFooterTags: String);
function HasHeaderFooterImages: Boolean;
@ -259,46 +269,159 @@ begin
FPrintranges[i] := ASource.FPrintRanges[i];
end;
procedure TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFilename: String);
{@@ ----------------------------------------------------------------------------
Adds an image to the header.
@param AHeaderIndex 0 = header of first page, 1 = header of odd pages,
2 = 2 header of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AFileName Name of the file containing the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFilename: String): Integer;
var
book: TsWorkbook;
idx: Integer;
s: Array[TsHeaderFooterSectionIndex] of String;
begin
if FWorksheet = nil then
raise Exception.Create('[TsPageLayout.AddHeaderImage] Worksheet is nil.');
book := TsWorksheet(FWorksheet).Workbook;
idx := book.FindEmbeddedObj(AFilename);
if idx = -1 then
idx := book.AddEmbeddedObj(AFilename);
if idx = -1 then // Image not found? Unsupported file format?
exit;
FHeaderImages[ASection].Index := idx;
SplitHeaderFooterText(FHeaders[AHeaderIndex], s[hfsLeft], s[hfsCenter], s[hfsRight]);
s[ASection] := s[ASection] + '&G';
FHeaders[AHeaderIndex] := JoinHeaderFooterText(s[hfsLeft], s[hfsCenter], s[hfsRight]);
Result := book.FindEmbeddedObj(AFilename);
if Result = -1 then
Result := book.AddEmbeddedObj(AFilename);
if Result > -1 then
AddHeaderImage(AHeaderIndex, ASection, Result);
end;
procedure TsPageLayout.AddFooterImage(AFooterIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFileName: String);
{@@ ----------------------------------------------------------------------------
Adds an image to the header.
@param AHeaderIndex 0 = header of first page, 1 = header of odd pages,
2 = 2 header of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AStream Stream from which the image is read and copied
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
ASection: TsHeaderFooterSectionIndex; AStream: TStream): Integer;
var
book: TsWorkbook;
begin
if FWorksheet = nil then
raise Exception.Create('[TsPageLayout.AddHeaderImage] Worksheet is nil.');
book := TsWorksheet(FWorksheet).Workbook;
Result := book.AddEmbeddedObj(AStream);
if Result > -1 then
AddHeaderImage(AHeaderIndex, ASection, Result);
end;
{@@ ----------------------------------------------------------------------------
Adds an image to the header.
@param AHeaderIndex 0 = header of first page, 1 = header of odd pages,
2 = 2 header of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the header.
@param AImageIndex Index of the image data into the workbooks EmbeddedObjList
-------------------------------------------------------------------------------}
procedure TsPageLayout.AddHeaderImage(AHeaderIndex: Integer;
ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer);
var
s: Array[TsHeaderFooterSectionIndex] of string;
begin
FHeaderImages[ASection].Index := AImageIndex;
SplitHeaderFooterText(FHeaders[AHeaderIndex], s[hfsLeft], s[hfsCenter], s[hfsRight]);
// Add the symbol &G only once!
if (pos('&G', s[ASection]) < 1) or (pos('&g', s[ASection]) < 1) then begin
s[ASection] := s[ASection] + '&G';
FHeaders[AHeaderIndex] := JoinHeaderFooterText(s[hfsLeft], s[hfsCenter], s[hfsRight]);
end;
end;
{@@ ----------------------------------------------------------------------------
Adds an image to the footer,
@param AFooterIndex 0 = footer of first page, 1 = footer of odd pages,
2 = 2 footer of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AFilename Name of the file containing the image
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddFooterImage(AFooterIndex: Integer;
ASection: TsHeaderFooterSectionIndex; const AFileName: String): Integer;
var
book: TsWorkbook;
idx: Integer;
s: Array[TsHeaderFooterSectionIndex] of String;
begin
if FWorksheet = nil then
raise Exception.Create('[TsPageLayout.AddFooterImage] Worksheet is nil.');
book := TsWorksheet(FWorksheet).Workbook;
idx := book.FindEmbeddedObj(AFilename);
if idx = -1 then
idx := book.AddEmbeddedObj(AFilename);
if idx = -1 then // Image not found? Unsupported file format?
Result := book.FindEmbeddedObj(AFilename);
if Result = -1 then
Result := book.AddEmbeddedObj(AFilename);
if Result = -1 then // Image not found? Unsupported file format?
exit;
FFooterImages[ASection].Index := idx;
AddFooterImage(AFooterIndex, ASection, Result);
end;
{@@ ----------------------------------------------------------------------------
Adds an image to the footer,
@param AFooterIndex 0 = footer of first page, 1 = footer of odd pages,
2 = 2 footer of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AStream Stream from which the image is copied
@return Index of the image data in the workbook's EmbeddedObjList. Useful
if the same image will be used in another header or footer.
-------------------------------------------------------------------------------}
function TsPageLayout.AddFooterImage(AFooterIndex: Integer;
ASection: TsHeaderFooterSectionIndex; AStream: TStream): Integer;
var
book: TsWorkbook;
begin
if FWorksheet = nil then
raise Exception.Create('[TsPageLayout.AddFooterImage] Worksheet is nil.');
book := TsWorksheet(FWorksheet).Workbook;
Result := book.AddEmbeddedObj(AStream);
if Result > -1 then
AddFooterImage(AFooterIndex, ASection, Result);
end;
{@@ ----------------------------------------------------------------------------
Adds an image to the footer,
@param AFooterIndex 0 = footer of first page, 1 = footer of odd pages,
2 = 2 footer of even pages
@param ASection Specifies whether the image is inserted in the left
(hfsLeft), center (hfsCenter) or right (hfsRight) part
of the footer.
@param AImageIndex Index of the image data into the workbooks EmbeddedObjList
-------------------------------------------------------------------------------}
procedure TsPageLayout.AddFooterImage(AFooterIndex: Integer;
ASection: TsHeaderFooterSectionIndex; AImageIndex: Integer);
var
s: Array[TsHeaderFooterSectionIndex] of string;
begin
FFooterImages[ASection].Index := AImageIndex;
SplitHeaderFooterText(FFooters[AFooterIndex], s[hfsLeft], s[hfsCenter], s[hfsRight]);
// Add the symbol &G only once!
if (pos('&G', s[ASection]) < 1) or (pos('&g', s[ASection]) < 1) then begin
s[ASection] := s[ASection] + '&G';
FFooters[AFooterIndex] := JoinHeaderFooterText(s[hfsLeft], s[hfsCenter], s[hfsRight]);
end;
end;
{@@ ----------------------------------------------------------------------------