📄 syneditprintheaderfooter.pas
字号:
{-------------------------------------------------------------------------------
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/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynEditPrintHeaderFooter.pas, released 2000-06-01.
The Initial Author of the Original Code is Morten J. Skovrup.
Portions written by Morten J. Skovrup are copyright 2000 Morten J. Skovrup.
Portions written by Michael Hieke are copyright 2000 Michael Hieke.
All Rights Reserved.
Contributors to the SynEdit project are listed in the Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id: SynEditPrintHeaderFooter.pas,v 1.6 2005/01/08 17:04:28 specu Exp $
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
Known Issues:
-------------------------------------------------------------------------------}
{-------------------------------------------------------------------------------
CONTENTS:
Classes handling info about headers and footers.
THeaderFooterItem:
Class handling an item in a header or footer. An item has a text,Font,
LineNumber and Alignment (i.e. two items can be on the same line but have
different fonts). Used internally.
THeaderFooter:
Collection of THeaderFooterItem's
Design-time properties:
FrameTypes : Frame around header or footer - can be any combination of:
ftLine : Line under header or line above footer
ftBox : Box around header or footer
ftShaded : Filled box (without frame) around header or footer.
ShadedColor : Fill color if ftShaded is in FrameTypes
LineColor : Color of line or box if ftLine or ftBox is in FrameTypes
DefaultFont : Default font for THeaderFooterItem's. This can be used to
set the header/footer font once for all items.
RomanNumbers : Print page numbers as Roman numbers.
MirrorPosition : Mirror position of left/right aligned THeaderFooterItem's
Can be used when printing 2-sided.
Run-time methods:
function Add(Text: string; Font: TFont;
Alignment: TAlignment;
LineNumber: Integer) : Integer;
Add a THeaderFooterItem. If Font is nil or not specified then DefaultFont
is used. Returned value is the index of the added item.
The Text parameter can contain the following macros:
$PAGECOUNT$ : Print total number of pages
$PAGENUM$ : Print current page number
$TITLE$ : Print the title
$DATE$ : Print the date
$TIME$ : Print the time
$DATETIME$ : Print the date and then the time
$TIMEDATE$ : Print the time and then the date
procedure Delete(Index : Integer);
Delete THeaderFooterItem with index Index.
procedure Clear;
Clear all THeaderFooterItems.
function Count : Integer;
Returns number of THeaderFooterItems.
function Get(Index : Integer) : THeaderFooterItem;
Returns THeaderFooterItem with Index.
procedure SetPixPrInch(Value : Integer);
Corrects the PixPerInch property of fonts. Used internally by
TSynEditPrint.
procedure InitPrint(ACanvas : TCanvas;NumPages : Integer; Title : string;
Margins : TSynEditPrintMargins);
Prepares the header or footer for printing. Used internally by
TSynEditPrint.
procedure Print(ACanvas : TCanvas; PageNum : Integer = 0);
Prints the header or footer. Used internally by TSynEditPrint.
-------------------------------------------------------------------------------}
{$IFNDEF QSYNEDITPRINTHEADERFOOTER}
unit SynEditPrintHeaderFooter;
{$ENDIF}
{$M+}
{$I SynEdit.inc}
interface
uses
{$IFDEF SYN_CLX}
Qt,
QGraphics,
QSynEditPrintTypes,
QSynEditPrintMargins,
{$ELSE}
Windows,
Graphics,
SynEditPrintTypes,
SynEditPrintMargins,
{$ENDIF}
Classes,
SysUtils;
type
//An item in a header or footer. An item has a text,Font,LineNumber and
//Alignment (i.e. two items can be on the same line but have different
//fonts).
THeaderFooterItem = class
private
FText: string;
FFont: TFont;
FLineNumber: Integer;
FAlignment: TAlignment;
{Used to store the original Index when the item was added - the index
might change when the list is sorted}
FIndex: Integer;
{begin} //gp 2000-06-24
function GetAsString: string;
procedure SetAsString(const Value: string);
{end} //gp 2000-06-24
procedure SetFont(const Value: TFont);
public
constructor Create;
destructor Destroy; override;
function GetText(NumPages, PageNum: Integer; Roman: Boolean;
Title, ATime, ADate: string): string;
procedure LoadFromStream(AStream: TStream);
procedure SaveToStream(AStream: TStream);
public
property Alignment: TAlignment read FAlignment write FAlignment;
property AsString: string read GetAsString write SetAsString; //gp 2000-06-24
property Font: TFont read FFont write SetFont;
property LineNumber: Integer read FLineNumber write FLineNumber;
property Text: string read FText write FText;
end;
THeaderFooterType = (hftHeader, hftFooter);
//Used internally to calculate line height and font-base-line for header and
//footer
TLineInfo = class
public
LineHeight: Integer;
MaxBaseDist: Integer;
end;
//The header/footer class
THeaderFooter = class(TPersistent)
private
//Indicates if header and footer
FType: THeaderFooterType;
FFrameTypes: TFrameTypes;
FShadedColor: TColor;
FLineColor: TColor;
FItems: TList;
FDefaultFont: TFont;
FDate, FTime: string;
FNumPages: Integer;
FTitle: string;
FMargins: TSynEditPrintMargins;
FFrameHeight: Integer;
FOldPen: TPen;
FOldBrush: TBrush;
FOldFont: TFont;
FRomanNumbers: Boolean;
FLineInfo: TList;
FLineCount: Integer;
FMirrorPosition: Boolean;
procedure SetDefaultFont(const Value: TFont);
procedure DrawFrame(ACanvas: TCanvas);
procedure CalcHeight(ACanvas: TCanvas);
procedure SaveFontPenBrush(ACanvas: TCanvas);
procedure RestoreFontPenBrush(ACanvas: TCanvas);
{begin} //gp 2000-06-24
function GetAsString: string;
procedure SetAsString(const Value: string);
{end} //gp 2000-06-24
public
constructor Create;
destructor Destroy; override;
function Add(Text: string; Font: TFont; Alignment: TAlignment;
LineNumber: Integer): Integer;
procedure Delete(Index: Integer);
procedure Clear;
function Count: Integer;
function Get(Index: Integer): THeaderFooterItem;
procedure SetPixPrInch(Value: Integer);
procedure InitPrint(ACanvas: TCanvas; NumPages: Integer; Title: string;
Margins: TSynEditPrintMargins);
procedure Print(ACanvas: TCanvas; PageNum: Integer);
procedure Assign(Source: TPersistent); override;
procedure FixLines;
property AsString: string read GetAsString write SetAsString; //gp 2000-06-24
procedure LoadFromStream(AStream: TStream);
procedure SaveToStream(AStream: TStream);
published
property FrameTypes: TFrameTypes read FFrameTypes write FFrameTypes
default [ftLine];
property ShadedColor: TColor read FShadedColor write FShadedColor
default clSilver;
property LineColor: TColor read FLineColor write FLineColor default clBlack;
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property RomanNumbers: Boolean read FRomanNumbers write FRomanNumbers
default False;
property MirrorPosition: Boolean read FMirrorPosition write FMirrorPosition
default False;
end;
//The header and footer - does nothing but set the value of FType in
//THeaderFooter
THeader = class(THeaderFooter)
public
constructor Create;
end;
TFooter = class(THeaderFooter)
public
constructor Create;
end;
{$IFNDEF SYN_COMPILER_3_UP}
TFontCharSet = 0..255;
{$ENDIF}
implementation
uses
{$IFDEF SYN_COMPILER_4_UP}
Math,
{$ENDIF}
{$IFDEF SYN_CLX}
QSynEditMiscProcs;
{$ELSE}
SynEditMiscProcs;
{$ENDIF}
{begin} //gp 2000-06-24
// Helper routine for AsString processing.
function GetFirstEl(var value: string; delim: char): string;
var
p: integer;
begin
p := Pos(delim, value);
if p = 0 then
p := Length(value) + 1;
Result := Copy(value, 1, p - 1);
Delete(value, 1, p);
end;
{end} //gp 2000-06-24
{ THeaderFooterItem }
constructor THeaderFooterItem.Create;
begin
inherited;
FFont := TFont.Create;
end;
destructor THeaderFooterItem.Destroy;
begin
inherited;
FFont.Free;
end;
{begin} //gp 2000-06-24
// Returns string representation of THeaderFooterItem to alleviate storing
// items into external storage (registry, ini file).
function THeaderFooterItem.GetAsString: string;
begin
Result :=
EncodeString(FText) + '/' +
{$IFDEF SYN_COMPILER_3_UP}
{$IFDEF SYN_CLX}
IntToStr(Ord(FFont.Charset)) + '/' +
{$ELSE}
IntToStr(FFont.Charset) + '/' +
{$ENDIF}
{$ELSE}
IntToStr(DEFAULT_CHARSET)+'/' +
{$ENDIF}
IntToStr(FFont.Color) + '/' +
IntToStr(FFont.Height) + '/' +
EncodeString(FFont.Name) + '/' +
IntToStr(Ord(FFont.Pitch)) + '/' +
IntToStr(FFont.PixelsPerInch) + '/' +
IntToStr(FFont.Size) + '/' +
IntToStr(byte(FFont.Style)) + '/' +
IntToStr(FLineNumber) + '/' +
IntToStr(Ord(FAlignment));
end;
{end} //gp 2000-06-24
function THeaderFooterItem.GetText(NumPages, PageNum: Integer;
Roman: Boolean; Title, ATime, ADate: string): string;
{This is basically copied from original SynEditPrint.pas. Returns the
header/footer text with macros expanded}
var
Len, Start, Run: Integer;
AStr: string;
procedure DoAppend(AText: string);
begin
Result := Result + AText;
end;
procedure TryAppend(var First: Integer; After: Integer);
begin
if After > First then begin
DoAppend(Copy(AStr, First, After - First));
First := After;
end;
end;
function TryExecuteMacro: Boolean;
var
Macro: string;
begin
Result := TRUE;
Macro := UpperCase(Copy(FText, Start, Run - Start + 1));
if Macro = '$PAGENUM$' then begin
if Roman then
DoAppend(IntToRoman(PageNum))
else
DoAppend(IntToStr(PageNum));
Exit;
end;
if Macro = '$PAGECOUNT$' then begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -