mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-11 08:18:15 +02:00
264 lines
7.1 KiB
ObjectPascal
264 lines
7.1 KiB
ObjectPascal
unit cocoaprndelegate;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$modeswitch objectivec1}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Math, MacOSAll, CocoaAll, OSPrinters, Printers, Dialogs,
|
|
PrintersDlgs;
|
|
|
|
type
|
|
|
|
{ PrintDialogDelegate }
|
|
|
|
PrintDialogDelegate = objcclass(NSObject)
|
|
private
|
|
_collate: boolean;
|
|
_copies, _firstPage, _lastPage: UInt32;
|
|
procedure RawPrintJobDidRun(panel: NSPrintPanel; returnCode:NSInteger; contextInfo:Pointer); message 'RawPrintJobDidRun:returnCode:contextInfo:';
|
|
procedure PrintJobDidRun(op:NSPrintOperation; success:boolean; contextInfo:Pointer); message 'PrintJobDidRun:success:contextInfo:';
|
|
procedure SetupPrinterDidRun(panel: NSPrintPanel; returnCode:NSInteger; contextInfo:Pointer); message 'SetupPrinterDidRun:returnCode:contextInfo:';
|
|
procedure UpdatePrinter(checkList:Boolean; returnCode:NSInteger); message 'UpdatePrinter:returnCode:';
|
|
procedure BackupPrintSettings; message 'BackupPrintSettings';
|
|
procedure PrintSettingsFromDialog; message 'PrintSettingsFromDialog';
|
|
procedure PrintSettingsToDialog; message 'PrintSettingsToDialog';
|
|
procedure RestorePrintSettings; message 'RestorePrintSettings';
|
|
public
|
|
response: TDialogResultEvent;
|
|
attachToWindow: NSWindow;
|
|
renderView: NSView;
|
|
sender: TObject;
|
|
printDialog: TPrintDialog;
|
|
onStartJob: TNotifyEvent;
|
|
|
|
function RunSetupPrinter: boolean; message 'RunSetupPrinter';
|
|
function RunPrintJob: boolean; message 'RunPrintJob';
|
|
end;
|
|
|
|
var
|
|
printDelegate: PrintDialogDelegate;
|
|
|
|
implementation
|
|
|
|
{ PrintDialogDelegate }
|
|
|
|
procedure PrintDialogDelegate.SetupPrinterDidRun(panel: NSPrintPanel;
|
|
returnCode: NSInteger; contextInfo: Pointer);
|
|
begin
|
|
UpdatePrinter(true, returnCode);
|
|
if Assigned(response) then
|
|
response(sender, returnCode=NSOKButton);
|
|
self.release;
|
|
end;
|
|
|
|
function PrintDialogDelegate.RunSetupPrinter: boolean;
|
|
var
|
|
PrintPanel: NSPrintPanel;
|
|
pInfo: NSPrintInfo;
|
|
res: NSInteger;
|
|
begin
|
|
PrintPanel := NSPrintPanel.printPanel;
|
|
//PrintPanel.setJobStyleHint(NSPrintNoPresetsJobStyleHint);
|
|
PrintPanel.setOptions((PrintPanel.options or NSPrintPanelShowsPaperSize) and not NSPrintPanelShowsPageRange);
|
|
PrintPanel.setDefaultButtonTitle(NSSTR('OK'));
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
if Assigned(response) and (attachToWindow<>nil) then
|
|
begin
|
|
PrintPanel.beginSheetWithPrintInfo_modalForWindow_delegate_didEndSelector_contextInfo(
|
|
pInfo,
|
|
attachToWindow,
|
|
self,
|
|
objcselector('SetupPrinterDidRun:returnCode:contextInfo:'),
|
|
nil
|
|
);
|
|
result := true;
|
|
end else
|
|
begin
|
|
res := PrintPanel.runModalWithPrintInfo(pInfo);
|
|
UpdatePrinter(true, res);
|
|
self.release;
|
|
end;
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.PrintJobDidRun(op: NSPrintOperation;
|
|
success: boolean; contextInfo: Pointer);
|
|
begin
|
|
if not success then
|
|
RestorePrintSettings
|
|
else
|
|
PrintSettingsToDialog;
|
|
|
|
if success and assigned(onStartJob) then
|
|
OnStartJob(sender);
|
|
|
|
if assigned(response) then
|
|
response(sender, success);
|
|
|
|
self.release;
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.RawPrintJobDidRun(panel: NSPrintPanel;
|
|
returnCode: NSInteger; contextInfo: Pointer);
|
|
var
|
|
success: boolean;
|
|
begin
|
|
success := (returnCode=NSOKButton);
|
|
PrintJobDidRun(nil, success, nil);
|
|
end;
|
|
|
|
function PrintDialogDelegate.RunPrintJob: boolean;
|
|
var
|
|
pInfo: NSPrintInfo;
|
|
printOp: NSPrintOperation;
|
|
printPanel: NSPrintPanel;
|
|
res: NSInteger;
|
|
begin
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
BackupPrintSettings;
|
|
PrintSettingsFromDialog;
|
|
|
|
if renderView=nil then
|
|
begin
|
|
printPanel := NSPrintPanel.printPanel;
|
|
if assigned(response) and (attachToWindow<>nil) then
|
|
begin
|
|
result := true;
|
|
printPanel.beginSheetWithPrintInfo_modalForWindow_delegate_didEndSelector_contextInfo(
|
|
pInfo,
|
|
attachToWindow,
|
|
self,
|
|
ObjCSelector('RawPrintJobDidRun:returnCode:contextInfo:'),
|
|
nil
|
|
);
|
|
end else
|
|
begin
|
|
res := printPanel.runModalWithPrintInfo(pInfo);
|
|
result := (res=NSOKButton);
|
|
PrintJobDidRun(nil, result, nil);
|
|
end;
|
|
end else
|
|
begin
|
|
printOp := NSPrintOperation.printOperationWithView_printInfo(renderView, pInfo);
|
|
if Assigned(response) and (attachToWindow<>nil) then
|
|
begin
|
|
result := true;
|
|
printOp.runOperationModalForWindow_delegate_didRunSelector_contextInfo(
|
|
attachToWindow,
|
|
self,
|
|
objcselector('PrintJobDidRun:success:contextInfo:'),
|
|
nil
|
|
);
|
|
end else
|
|
begin
|
|
result := printOP.runOperation;
|
|
PrintJobDidRun(printOp, result, nil);
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.UpdatePrinter(checkList:Boolean; returnCode: NSInteger);
|
|
var
|
|
CocoaPrinter: TCocoaPrinter;
|
|
begin
|
|
CocoaPrinter := Printer as TCocoaPrinter;
|
|
if checkList then
|
|
CocoaPrinter.CheckPrinterList;
|
|
if returnCode=NSOKButton then
|
|
CocoaPrinter.UpdatePrinter;
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.BackupPrintSettings;
|
|
var
|
|
pInfo: NSPrintInfo;
|
|
begin
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
_Collate := false;
|
|
_Copies := 1;
|
|
_firstPage := 1;
|
|
_lastPage := 1;
|
|
PMGetCollate(pInfo.PMPrintSettings, _Collate);
|
|
PMGetCopies(pInfo.PMPrintSettings, _Copies);
|
|
PMGetFirstPage(pInfo.PMPrintSettings, _firstPage);
|
|
PMGetLastPage(pInfo.PMPrintSettings, _lastPage);
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.PrintSettingsFromDialog;
|
|
var
|
|
PMin, PMax, PFrom, PTo: Integer;
|
|
pInfo: NSPrintInfo;
|
|
s: string;
|
|
begin
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
PMSetCollate(pInfo.PMPrintSettings, printDialog.Collate);
|
|
PMSetCopies(pInfo.PMPrintSettings, printDialog.Copies, False);
|
|
|
|
PMin := printDialog.MinPage;
|
|
PMax := Math.Max(PMin, printDialog.MaxPage);
|
|
PFrom := Math.Min(Math.Max(printDialog.FromPage, PMin), PMax);
|
|
PTo := Max(PFrom, Min(printDialog.ToPage, PMax));
|
|
PMSetPageRange(pInfo.PMPrintSettings, PMin, PMax);
|
|
|
|
if printDialog.PrintRange <> prAllPages then
|
|
begin
|
|
PMSetFirstPage(pInfo.PMPrintSettings, PFrom, False);
|
|
PMSetLastPage(pInfo.PMPrintSettings, PTo, False);
|
|
end;
|
|
// TODO: PrintToFile
|
|
|
|
pInfo.updateFromPMPrintSettings;
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.PrintSettingsToDialog;
|
|
var
|
|
pInfo: NSPrintInfo;
|
|
Collate: Boolean;
|
|
Copies, firstPage, lastPage: UInt32;
|
|
begin
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
PMGetCollate(pInfo.PMPrintSettings, Collate);
|
|
PMGetCopies(pInfo.PMPrintSettings, Copies);
|
|
PMGetFirstPage(pInfo.PMPrintSettings, firstPage);
|
|
PMGetLastPage(pInfo.PMPrintSettings, lastPage);
|
|
|
|
if lastPage>$FFFF then
|
|
begin
|
|
printDialog.PrintRange := prAllPages;
|
|
printDialog.FromPage := printDialog.MinPage;
|
|
printDialog.ToPage := printDialog.MaxPage;
|
|
end else
|
|
begin
|
|
printDialog.FromPage := firstPage;
|
|
printDialog.ToPage := lastPage;
|
|
end;
|
|
printDialog.Collate := Collate;
|
|
printDialog.Copies := Copies;
|
|
//TODO: PrintToFile
|
|
end;
|
|
|
|
procedure PrintDialogDelegate.RestorePrintSettings;
|
|
var
|
|
pInfo: NSPrintInfo;
|
|
begin
|
|
pInfo := NSPrintInfo.sharedPrintInfo;
|
|
|
|
PMSetCollate(pInfo.PMPrintSettings, _Collate);
|
|
PMSetCopies(pInfo.PMPrintSettings, _Copies, False);
|
|
PMSetFirstPage(pInfo.PMPrintSettings, _firstPage, False);
|
|
PMSetLastPage(pInfo.PMPrintSettings, _lastPage, False);
|
|
|
|
pInfo.updateFromPMPrintSettings;
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|