📄 syneditprint.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: SynEditPrint.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.
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: SynEditPrint.pas,v 1.7 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:
Wrapping across page boundaries is not supported
-------------------------------------------------------------------------------}
{-------------------------------------------------------------------------------
CONTENTS:
Print controller component.
Allows setting margins, headers and footers.
Design time properties:
Header : Class property to set properties for headers -
see CSynEditHeaderFooter.pas
Footer : Class property to set properties for footers -
see CSynEditHeaderFooter.pas
Margins : Class property to set properties for margins -
see CSynEditPrintMargins.pas
Lines : The lines that should be printed (see also SynEdit the
property below)
Font : The font the lines should be printed in (see also SynEdit
the property below)
Title : A title - can be referenced in headers/footers by using the
$TITLE$ macro
Wrap : Wrap text to margins
Highlight : Highlight text
Colors : Print in colors
LineNumbers : Print line numbers
LineOffset : Value added to linenumbers when printing
PageOffset : Value added to pagenumbers when printing
OnPrintLine : Fired when a line is printed
OnPrintStatus : Fired at Beginning, End and when a new page is started
Highlighter : The highlighter used for highlighting the text (see also the
SynEdit property below)
LineNumbersInMargin : If true line numbers are printed in the left margin,
else left margin is increased by width of line
number text.
SelectedOnly : Print only the selected Area
Run-time properties:
DocTitle : Used to display the document name in the print queue monitor //JJV 2000-10-13
PrinterInfo : Read only. Returns info on printer (used internally)
PageCount : Returns the total number of pages;
SynEdit : By setting SynEdit to a specific TSynEdit component, the
properties Lines, Font and Highlighter are automatically
set to the corresponding values of the TSynEdit component
Run-time methods:
UpdatePages : Used internally by the TSynEditPrintPreview component
PrintToCanvas : Used internally by the TSynEditPrintPreview component
Print : Prints the contents of the Lines property
PrintRange(StartPage,EndPage) : Prints the specified page-range (both inclusive)
-------------------------------------------------------------------------------}
{$IFNDEF QSYNEDITPRINT}
unit SynEditPrint;
{$ENDIF}
{$M+}
{$I SynEdit.inc}
interface
uses
{$IFDEF SYN_CLX}
Qt,
QGraphics,
QPrinters,
Types,
QSynEdit,
QSynEditTypes,
QSynEditPrintTypes,
QSynEditPrintHeaderFooter,
QSynEditPrinterInfo,
QSynEditPrintMargins,
QSynEditMiscProcs,
QSynEditHighlighter,
{$ELSE}
Windows,
Graphics,
Printers,
SynEdit,
SynEditTypes,
SynEditPrintTypes,
SynEditPrintHeaderFooter,
SynEditPrinterInfo,
SynEditPrintMargins,
SynEditMiscProcs,
SynEditHighlighter,
{$ENDIF}
SysUtils,
Classes;
type
TPageLine =
class
public
FirstLine: Integer;
end;
//The actual print controller object
TSynEditPrint =
class(TComponent)
private
FCopies: integer; //EK 10/16/01
FFooter: TFooter;
FHeader: THeader;
FLines: TStrings;
FMargins: TSynEditPrintMargins;
FPageCount: Integer;
FFont: TFont;
FTitle: string;
FDocTitle: string; //JJV 2000-10-13
FPrinterInfo: TSynEditPrinterInfo;
FPages: TList;
FCanvas: TCanvas;
{************}
FCharWidth: Integer;
FMaxLeftChar: Integer;
FETODist: PIntArray;
FWrap: Boolean;
FOnPrintLine: TPrintLineEvent;
FOnPrintStatus: TPrintStatusEvent;
FYPos: Integer;
FLineHeight: Integer;
FHighlight: Boolean;
FColors: Boolean;
FHighlighter: TSynCustomHighlighter;
FOldFont: TFont;
FSynOK: Boolean;
FLineNumbers: Boolean;
FLineNumber: Integer;
FLineOffset: Integer;
FAbort: Boolean;
FPrinting: Boolean;
FDefaultBG: TColor;
FPageOffset: Integer;
FRangesOK: Boolean;
FMaxWidth: integer;
FMaxCol: Integer;
FPagesCounted: Boolean;
FLineNumbersInMargin: Boolean;
FTabWidth: integer;
fFontColor: TColor; // djlp 2000-09-20
fSelectedOnly: Boolean; // jj 2001-07-23
fSelAvail: Boolean;
fSelMode: TSynSelectionMode;
fBlockBegin: TBufferCoord;
fBlockEnd: TBufferCoord;
procedure CalcPages;
procedure SetLines(const Value: TStrings);
procedure SetFont(const Value: TFont);
procedure SetCharWidth(const Value: Integer);
procedure SetMaxLeftChar(const Value: Integer);
procedure PrintPage(Num: Integer);
procedure WriteLine(Text: string);
procedure WriteLineNumber;
procedure HandleWrap(Text: string; MaxWidth: Integer);
procedure TextOut(Text: string; AList: TList);
procedure SetHighlighter(const Value: TSynCustomHighlighter);
procedure RestoreCurrentFont;
procedure SaveCurrentFont;
procedure SetPixelsPrInch;
procedure InitPrint;
procedure InitRanges;
function GetPageCount: Integer;
procedure SetSynEdit(const Value: TCustomSynEdit);
procedure SetFooter(const Value: TFooter);
procedure SetHeader(const Value: THeader);
procedure SetMargins(const Value: TSynEditPrintMargins);
function ClipLineToRect(S: string; R: TRect): string;
protected
property MaxLeftChar: Integer read FMaxLeftChar write SetMaxLeftChar;
property CharWidth: Integer read FCharWidth write SetCharWidth;
procedure PrintStatus(Status: TSynPrintStatus; PageNumber: integer;
var Abort: boolean); virtual;
procedure PrintLine(LineNumber, PageNumber: Integer); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure UpdatePages(ACanvas: TCanvas);
procedure PrintToCanvas(ACanvas: TCanvas; PageNumber: Integer);
procedure Print;
procedure PrintRange(StartPage, EndPage: Integer);
property PrinterInfo: TSynEditPrinterInfo read FPrinterInfo;
property PageCount: Integer read GetPageCount;
property SynEdit: TCustomSynEdit write SetSynEdit;
procedure LoadFromStream(AStream: TStream);
procedure SaveToStream(AStream: TStream);
published
property Copies: integer read FCopies write FCopies;
property Header: THeader read FHeader write SetHeader;
property Footer: TFooter read FFooter write SetFooter;
property Margins: TSynEditPrintMargins read FMargins write SetMargins;
property Lines: TStrings read FLines write SetLines;
property Font: TFont read FFont write SetFont;
property Title: string read FTitle write FTitle;
property DocTitle: string read FDocTitle write FDocTitle; //JJV 2000-10-13
property Wrap: Boolean read FWrap write FWrap default True;
property Highlight: Boolean read FHighlight write FHighlight default True;
property SelectedOnly: Boolean read FSelectedOnly write FSelectedOnly // jj 2001-07-23
default False;
property Colors: Boolean read FColors write FColors default False;
property LineNumbers: Boolean read FLineNumbers write FLineNumbers
default False;
property LineOffset: Integer read FLineOffset write FLineOffset default 0;
property PageOffset: Integer read FPageOffset write FPageOffset default 0;
property OnPrintLine: TPrintLineEvent read FOnPrintLine write FOnPrintLine;
property OnPrintStatus: TPrintStatusEvent read FOnPrintStatus
write FOnPrintStatus;
property Highlighter: TSynCustomHighlighter read FHighlighter
write SetHighlighter;
property LineNumbersInMargin: Boolean read FLineNumbersInMargin
write FLineNumbersInMargin default False;
property TabWidth: integer read fTabWidth write fTabWidth; // djlp 2000-09-19
property Color: TColor read fDefaultBG write fDefaultBG; // djlp 2000-09-19
end;
implementation
{ TSynEditPrint }
constructor TSynEditPrint.Create(AOwner: TComponent);
begin
inherited;
FCopies := 1;
FFooter := TFooter.Create;
FHeader := THeader.Create;
FLines := TStringList.Create;
FMargins := TSynEditPrintMargins.Create;
FPrinterInfo := TSynEditPrinterInfo.Create;
FFont := TFont.Create;
FOldFont := TFont.Create;
FETODist := AllocMem(1);
MaxLeftChar := 1024;
FWrap := True;
FHighlight := True;
FColors := False;
FLineNumbers := False;
FLineOffset := 0;
FPageOffset := 0;
FLineNumbersInMargin := False;
FPages := TList.Create;
FTabWidth := 8;
FDefaultBG := clWhite; // djlp 2000-09-19
end;
destructor TSynEditPrint.Destroy;
var
i: Integer;
begin
FFooter.Free;
FHeader.Free;
FLines.Free;
FMargins.Free;
FPrinterInfo.Free;
FFont.Free;
FOldFont.Free;
for i := 0 to FPages.Count - 1 do
TPageLine(FPages[i]).Free;
FPages.Free;
FreeMem(FETODist);
inherited;
end;
procedure TSynEditPrint.SetLines(const Value: TStrings);
var
i,j: integer;
ConvertTabsProc: TConvertTabsProc;
TmpString: String;
begin
ConvertTabsProc := GetBestConvertTabsProc(FTabWidth);
with FLines do begin
BeginUpdate;
try
Clear;
for i := 0 to Value.Count - 1 do
begin
TmpString := ConvertTabsProc(Value[i], FTabWidth);
j := pos(TSynTabChar, TmpString);
While j > 0 do
begin
TmpString[j] := ' ';
j := pos(TSynTabChar, TmpString);
end;
Add(TmpString);
end;
finally
EndUpdate;
end;
end;
FRangesOK := False;
FPagesCounted := False;
end;
procedure TSynEditPrint.SetFont(const Value: TFont);
begin
FFont.Assign(Value);
FPagesCounted := False;
end;
procedure TSynEditPrint.SetCharWidth(const Value: Integer);
var
i: Integer;
begin
if FCharWidth <> Value then begin
FCharWidth := Value;
// Must have range checking turned off here!
for i := 0 to FMaxLeftChar - 1 do
{$IFOPT R+}{$DEFINE SYN_RESET_RANGE_CHECK}{$R-}{$ENDIF}
FETODist[i] := FCharWidth;
{$IFDEF SYN_RESET_RANGE_CHECK}{$R+}{$UNDEF SYN_RESET_RANGE_CHECK}{$ENDIF}
end;
end;
procedure TSynEditPrint.SetMaxLeftChar(const Value: Integer);
var
i: Integer;
begin
if FMaxLeftChar <> Value then begin
FMaxLeftChar := Value;
ReallocMem(FETODist, FMaxLeftChar * SizeOf(Integer));
for i := 0 to FMaxLeftChar - 1 do
{$IFOPT R+}{$DEFINE SYN_RESET_RANGE_CHECK}{$R-}{$ENDIF}
FETODist[i] := FCharWidth;
{$IFDEF SYN_RESET_RANGE_CHECK}{$R+}{$UNDEF SYN_RESET_RANGE_CHECK}{$ENDIF}
end;
end;
procedure TSynEditPrint.SetHighlighter(const Value: TSynCustomHighlighter);
begin
FHighlighter := Value;
FRangesOK := False;
FPagesCounted := False;
end;
procedure TSynEditPrint.InitPrint;
{ Initialize Font.PixelsPerInch, Character widths, Margins, Total Page count,
headers and footers}
var
TmpSize: Integer;
{$IFNDEF SYN_CLX}
TmpTextMetrics: TTextMetric;
{$ENDIF}
begin
// FDefaultBG := FCanvas.Brush.Color; // djlp 2000-09-20
fFontColor := FFont.Color; // djlp 2000-09-20
FCanvas.Font.Assign(FFont);
if not FPrinting then
begin
SetPixelsPrInch;
TmpSize := FCanvas.Font.Size;
FCanvas.Font.PixelsPerInch := FFont.PixelsPerInch;
FCanvas.Font.Size := TmpSize;
end;
{************}
// Calculate TextMetrics with the (probably) most wider text styles so text is
// never clipped (although potentially wasting space)
FCanvas.Font.Style := [fsBold, fsItalic, fsUnderline, fsStrikeOut];
{$IFDEF SYN_CLX}
CharWidth := FCanvas.TextWidth( 'W' );
FLineHeight := FCanvas.TextHeight( 'Wp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -