@@ -40,10 +40,12 @@ btnSaveGroff: TButton; btnLoadGroff: TButton; btnBuild: TButton; btnDownloadGroffWindows: TButton; btnSaveSettings: TButton; + chkKeepPostscriptFile: TCheckBox; + chkUseGhostscript: TCheckBox; chkBoxExtras: TCheckComboBox; chkBoxPreprocessors: TCheckComboBox; chkUpdateCheckOnStart: TCheckBox; chkLogFile: TCheckBox; chkAutoSaveBuildSettings: TCheckBox; @@ -52,10 +54,11 @@ edtGroffstudioInstalledVersion: TEdit; edtOnlineGroffVersionWindows: TEdit; ExtendedNotebook1: TExtendedNotebook; GroupBox1: TGroupBox; GroupBox2: TGroupBox; + GroupBox3: TGroupBox; iniStorage: TIniPropStorage; Label1: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; @@ -88,10 +91,11 @@ procedure btnBuildClick(Sender: TObject); procedure btnDownloadGroffWindowsClick(Sender: TObject); procedure btnLoadGroffClick(Sender: TObject); procedure btnSaveGroffClick(Sender: TObject); procedure btnSaveSettingsClick(Sender: TObject); + procedure chkUseGhostscriptChange(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure lblFossilRepoClick(Sender: TObject); procedure lblGithubRepoClick(Sender: TObject); procedure lblWebsiteClick(Sender: TObject); @@ -105,10 +109,11 @@ currentGroffFileName: string; unsavedChanges: boolean; {$IFDEF WINDOWS} latestGroffWindowsUrl: String; {$ENDIF} + // Settings: storeBuildSettings: boolean; updateCheck: boolean; public end; @@ -122,15 +127,13 @@ var MainForm: TMainForm; BuildWindow: TBuildStatusWindow; hasGroff: boolean; - GroffOutputVersion: string; - {$IFDEF WINDOWS} hasGhostscript: boolean; + GroffOutputVersion: string; ps2pdfOutput: string; - {$ENDIF} implementation {$R *.lfm} @@ -151,24 +154,32 @@ begin hasGroff := True; MainForm.edtGroffInstalledVersion.Text := GroffOutputVersion; end; - {$IFDEF WINDOWS} - // Try to find ps2pdf (Windows-only): + // Try to find ps2pdf: if pos('ps2pdf', ps2pdfOutput) = 0 then begin + {$IFDEF WINDOWS} + // ps2pdf is mandatory on Windows. ShowMessage('On Windows, for creating PDF files, you need Ghostscript installed.' - + LineEnding + 'Sadly, groffstudio could not find ps2pdf.exe in your %PATH%, so ' - + 'writing PDF files will not be supported.'); - hasGhostscript := False; + + LineEnding + 'Sadly, groffstudio could not find ps2pdf.bat in your %PATH%, so ' + + 'writing PDF files will not be supported. Please install Ghostscript and make sure ' + + 'that the folder that contains ps2pdf.bat is in your %PATH%.'); MainForm.rdPdf.Enabled := False; + {$ENDIF} + hasGhostscript := False; + MainForm.chkUseGhostscript.Checked := False; + MainForm.chkUseGhostscript.Enabled := False; end else begin hasGhostscript := True; + {$IFDEF WINDOWS} MainForm.rdPdf.Enabled := True; + MainForm.chkUseGhostscript.Checked := True; + {$ENDIF} + MainForm.chkUseGhostscript.Enabled := True; end; - {$ENDIF} end; procedure TDetectGroffThread.Execute; begin FreeOnTerminate := True; @@ -177,10 +188,11 @@ RunCommand('cmd', ['/c', 'troff --version'], GroffOutputVersion, [], swoHIDE); RunCommand('cmd', ['/c', 'ps2pdf'], ps2pdfOutput, [], swoHIDE); {$ELSE} RunCommand('/bin/sh', ['-c', 'troff --version'], GroffOutputVersion, [], swoHIDE); + RunCommand('/bin/sh', ['-c', 'ps2pdf'], ps2pdfOutput, [], swoHIDE); {$ENDIF} Synchronize(@UpdateUI); end; { TMainForm } @@ -211,10 +223,16 @@ try mLicense.Lines.LoadFromStream(ResStream); finally ResStream.Free; end; + + {$IFNDEF WINDOWS} + // Ghostscript is not optional on Windows. + // On other platforms, let's use the stored setting. + chkUseGhostscript.Checked := iniStorage.ReadBoolean('UseGhostscript', False); + {$ENDIF} // Restore the settings iniStorage.Restore; storeBuildSettings := iniStorage.ReadBoolean('AutoSaveBuildSettings', False); chkAutoSaveBuildSettings.Checked := storeBuildSettings; @@ -397,11 +415,11 @@ {$IFNDEF WINDOWS} // On Windows, we use a two-step program: // 1) Output to PostScript, // 2) ps2pdf to PDF. // This is because there is no pdfroff.exe. Requires Ghostscript. - if rdPdf.Checked then + if rdPdf.Checked and not chkUseGhostscript.Checked then begin buildOpts := buildOpts + ' -Tpdf'; if chkBoxExtras.Checked[1] then buildOpts := buildOpts + ' -mpdfmark'; outputFileName := currentGroffFilePath + '.pdf'; end @@ -419,20 +437,24 @@ // Build: buildSuccess := BuildWindow.BuildDocument(buildOpts, logFileName); {$IFDEF WINDOWS} if buildSuccess and hasGhostscript and rdPdf.Checked then + {$ELSE} + // On non-Windows systems, Ghostscript is entirely optional. + if buildSuccess and hasGhostscript and chkUseGhostscript.Checked and rdPdf.Checked then + {$ENDIF} begin // Invoke ps2pdf: buildOpts := 'ps2pdf'; // outputFileName is still the .ps file. Just use it as the input name. buildOpts := buildOpts + ' ' + outputFileName; buildSuccess := BuildWindow.BuildDocument(buildOpts, logFileName); - if buildSuccess then - DeleteFile(outputFileName); // get rid of the .ps file + + if buildSuccess and not chkKeepPostscriptFile.Checked then; + DeleteFile(outputFileName); // get rid of the .ps fil end; - {$ENDIF} if buildSuccess then MainStatusBar.Panels[1].Text := 'build successful' else MainStatusBar.Panels[1].Text := 'build problem'; @@ -515,12 +537,21 @@ // Store the IDE settings: iniStorage.WriteBoolean('AutoSaveBuildSettings', chkAutoSaveBuildSettings.Checked); iniStorage.WriteBoolean('AutoUpdateCheck', chkUpdateCheckOnStart.Checked); + // Store the PDF settings: + iniStorage.WriteBoolean('UseGhostscript', chkUseGhostscript.Checked); + iniStorage.WriteBoolean('KeepPsFile', chkKeepPostscriptFile.Checked); + iniStorage.Save; end; + +procedure TMainForm.chkUseGhostscriptChange(Sender: TObject); +begin + chkKeepPostscriptFile.Enabled := chkUseGhostscript.Checked; +end; procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); var Reply, BoxStyle: integer; begin