📄 syneditprint.pas
字号:
Attr := FHighLighter.GetTokenAttribute;
if Assigned(Attr) then
begin
FCanvas.Font.Style := Attr.Style;
if FColors then
begin
AColor := Attr.Foreground;
if AColor = clNone then
AColor := FFont.Color;
FCanvas.Font.Color := AColor;
AColor := Attr.Background;
if AColor = clNone then
AColor := FDefaultBG;
FCanvas.Brush.Color := AColor;
end
else
begin
FCanvas.Font.Color := fFontColor;
FCanvas.Brush.Color := FDefaultBG;
end;
end
else
begin
FCanvas.Font.Color := fFontColor; // djlp 2000-09-20
FCanvas.Brush.Color := FDefaultBG;
end;
Handled := False;
if Assigned(AList) then
begin
if (LCount < AList.Count) then
begin
//Split between tokens:
if (TokenPos >= TWrapPos(AList[LCount]).Index) then
begin
LCount := LCount + 1;
TokenStart := TokenPos;
FYPos := FYPos + FLineHeight;
end
else
begin
//Split in the middle of a token:
if (TokenPos + Length(Token) > TWrapPos(AList[LCount]).Index) then begin
Handled := True;
SplitToken;
end;
end;
end;
end;
{$IFNDEF SYN_CLX}
if not Handled then
ClippedTextOut(FMargins.PLeft + (TokenPos - TokenStart) * FCharWidth, FYPos, Token);
{$ENDIF}
FHighLighter.Next;
end;
RestoreCurrentFont;
end
else
begin
Lines := TStringList.Create;
try
OldWrapPos := 0;
if Assigned(AList) then
for i := 0 to AList.Count - 1 do
begin
WrapPos := TWrapPos(AList[i]).Index;
if i = 0 then
AStr := Copy(Text, 1, WrapPos)
else
AStr := Copy(Text, OldWrapPos + 1, WrapPos - OldWrapPos);
Lines.Add(AStr);
OldWrapPos := WrapPos;
end;
if Length(Text) > 0 then
Lines.Add(Copy(Text, OldWrapPos + 1, MaxInt));
for i := 0 to Lines.Count - 1 do
begin
ClippedTextOut(FMargins.PLeft, FYPos, Lines[i]);
if i < Lines.Count - 1 then
FYPos := FYPos + FLineHeight;
end;
finally
Lines.Free;
end
end
end;
procedure TSynEditPrint.WriteLine(Text: string);
//Prints a line of text
var
StrWidth: integer;
begin
if FLineNumbers then WriteLineNumber;
StrWidth := FCanvas.TextWidth(Text);
{Note that MaxWidth is calculated, using FTestString found in CalcPages -
else the length is not calculated correctly when prewiewing and the
zoom is different from 0.25,0.5,1,2,4 (as for example 1.20) - WHY???
}
if Wrap and (StrWidth > FMaxWidth) then
HandleWrap(Text, FMaxWidth)
else
TextOut(Text, nil);
FYPos := FYPos + FLineHeight;
end;
procedure TSynEditPrint.PrintPage(Num: Integer);
//Prints a page
var
i, iEnd: Integer;
iSelStart, iSelLen: integer;
begin
PrintStatus(psNewPage, Num, FAbort);
if not FAbort then begin
{begin} // djlp 2000-09-20
FCanvas.Brush.Color := Color;
with FMargins do
FCanvas.FillRect(Rect(PLeft, PTop, PRight, PBottom));
{end} // djlp 2000-09-20
FMargins.InitPage(FCanvas, Num, FPrinterInfo, FLineNumbers,
FLineNumbersInMargin, FLines.Count - 1 + FLineOffset);
FHeader.Print(FCanvas, Num + FPageOffset);
if FPages.Count > 0 then begin
FYPos := FMargins.PTop;
if Num = FPageCount then
iEnd := FLines.Count - 1
else
iEnd := TPageLine(FPages[Num]).FirstLine - 1;
for i := TPageLine(FPages[Num - 1]).FirstLine to iEnd do begin
FLineNumber := i + 1;
if (not fSelectedOnly or ((i >= fBlockBegin.Line - 1) and (i <= fBlockEnd.Line - 1))) then begin
if (not fSelectedOnly or (fSelMode = smLine)) then
WriteLine(Lines[i])
else
begin
if (fSelMode = smColumn) or (i = fBlockBegin.Line -1) then
iSelStart := fBlockBegin.Char
else
iSelStart := 1;
if (fSelMode = smColumn) or (i = fBlockEnd.Line -1) then
iSelLen := fBlockEnd.Char - iSelStart
else
iSelLen := MaxInt;
WriteLine( Copy( Lines[i], iSelStart, iSelLen ) );
end;
PrintLine(i + 1, Num);
end;
end;
end;
FFooter.Print(FCanvas, Num + FPageOffset);
end;
end;
procedure TSynEditPrint.UpdatePages(ACanvas: TCanvas);
//Update pages (called explicitly by preview component)
begin
FCanvas := ACanvas;
FPrinterInfo.UpdatePrinter;
InitPrint;
end;
procedure TSynEditPrint.PrintToCanvas(ACanvas: TCanvas; PageNumber: Integer);
//Print to specified canvas. Used by preview component
begin
FAbort := False;
FPrinting := False;
FCanvas := ACanvas;
PrintPage(PageNumber);
end;
procedure TSynEditPrint.Print;
begin
PrintRange(1, -1);
end;
procedure TSynEditPrint.PrintRange(StartPage, EndPage: Integer);
//Prints the pages in the specified range
var
i, ii: Integer;
begin
if fSelectedOnly and not fSelAvail then // jj 2001-07-23
exit;
FPrinting := True;
FAbort := False;
// The next part sets the document title that is used by the printer queue.
if FDocTitle <> '' then //JJV 2000-10-13
Printer.Title := FDocTitle
else
Printer.Title := FTitle;
Printer.BeginDoc;
PrintStatus(psBegin, StartPage, FAbort);
UpdatePages(Printer.Canvas);
for ii:=1 to Copies do begin //EK 10/16/01
i := StartPage;
if EndPage < 0 then
EndPage := FPageCount;
while (i <= EndPage) and (not FAbort) do begin
PrintPage(i);
if ((i < EndPage) or (ii<Copies)) and not(FAbort) then //DDH 2001-10-25
Printer.NewPage;
i := i + 1;
end;
end;
if not(FAbort) then //DDH 2001-10-25
PrintStatus(psEnd, EndPage, FAbort);
Printer.EndDoc;
FPrinting := False;
end;
procedure TSynEditPrint.PrintLine(LineNumber, PageNumber: Integer);
//Fires the OnPrintLine event
begin
if Assigned(FOnPrintLine) then
FOnPrintLine(Self, LineNumber, PageNumber);
end;
procedure TSynEditPrint.PrintStatus(Status: TSynPrintStatus;
PageNumber: integer; var Abort: boolean);
//Fires the OnPrintStatus event
begin
Abort := False;
if Assigned(FOnPrintStatus) then
FOnPrintStatus(Self, Status, PageNumber, Abort);
if Abort then begin
if FPrinting then
Printer.Abort;
end;
end;
function TSynEditPrint.GetPageCount: Integer;
{Returns total page count. If pages hasn't been counted before,
then a UpdatePages is called with a temporary canvas}
var
TmpCanvas: TCanvas;
{$IFNDEF SYN_CLX}
DC: HDC;
{$ENDIF}
begin
Result := 0;
if FPagesCounted then
Result := FPageCount
else begin
TmpCanvas := TCanvas.Create;
try
{************}
{$IFNDEF SYN_CLX}
DC := GetDC(0);
try
if DC <> 0 then
begin
TmpCanvas.Handle := DC;
UpdatePages(TmpCanvas);
TmpCanvas.Handle := 0;
Result := FPageCount;
FPagesCounted := True;
end;
finally
ReleaseDC(0, DC);
end;
{$ENDIF}
finally
TmpCanvas.Free;
end;
end;
end;
procedure TSynEditPrint.SetSynEdit(const Value: TCustomSynEdit);
begin
// Lines := Value.Lines; // sb 2001-11-09
HighLighter := Value.Highlighter;
Font := Value.Font;
FTabWidth := Value.TabWidth;
Lines := Value.Lines; // sb 2001-11-09
fSelAvail := Value.SelAvail; // jj 2001-07-23
fBlockBegin := Value.BlockBegin;
fBlockEnd := Value.BlockEnd;
fSelMode := Value.SelectionMode;
end;
procedure TSynEditPrint.LoadFromStream(AStream: TStream);
var
bufSize: Integer;
buffer: PChar;
begin
FHeader.LoadFromStream(AStream);
FFooter.LoadFromStream(AStream);
FMargins.LoadFromStream(AStream);
with AStream do begin
Read(bufSize, SizeOf(bufSize));
GetMem(buffer, bufSize+1);
try
Read(buffer^, bufSize);
buffer[bufSize] := #0;
FTitle := buffer;
finally
FreeMem(buffer);
end;
Read(bufSize, SizeOf(bufSize));
GetMem(buffer, bufSize+1);
try
Read(buffer^, bufSize);
buffer[bufSize] := #0;
FDocTitle := buffer;
finally
FreeMem(buffer);
end;
Read(FWrap, SizeOf(FWrap));
Read(FHighlight, SizeOf(FHighlight));
Read(FColors, SizeOf(FColors));
Read(FLineNumbers, SizeOf(FLineNumbers));
Read(FLineOffset, SizeOf(FLineOffset));
Read(FPageOffset, SizeOf(FPageOffset));
end;
end;
procedure TSynEditPrint.SaveToStream(AStream: TStream);
var
aLen: Integer;
begin
FHeader.SaveToStream(AStream);
FFooter.SaveToStream(AStream);
FMargins.SaveToStream(AStream);
with AStream do begin
aLen := Length(FTitle);
Write(aLen, SizeOf(aLen));
Write(PChar(FTitle)^, aLen);
aLen := Length(FDocTitle);
Write(aLen, SizeOf(aLen));
Write(PChar(FDocTitle)^, aLen);
Write(FWrap, SizeOf(FWrap));
Write(FHighlight, SizeOf(FHighlight));
Write(FColors, SizeOf(FColors));
Write(FLineNumbers, SizeOf(FLineNumbers));
Write(FLineOffset, SizeOf(FLineOffset));
Write(FPageOffset, SizeOf(FPageOffset));
end;
end;
procedure TSynEditPrint.SetFooter(const Value: TFooter);
begin
FFooter.Assign(Value);
end;
procedure TSynEditPrint.SetHeader(const Value: THeader);
begin
FHeader.Assign(Value);
end;
procedure TSynEditPrint.SetMargins(const Value: TSynEditPrintMargins);
begin
FMargins.Assign(Value);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -