Index: CHANGES.txt ================================================================== --- CHANGES.txt +++ CHANGES.txt @@ -1,5 +1,19 @@ +Version 0.13.0 +2024-01-11 + +[Feature] Support for hdtbl. +[Changed] Build extras and build preprocessors are now listed in a multi-select box. +[Improved] If no error has occurred, the log file will contain a success message. +[Improved] The default font looked gross on macOS. This should be better now. +[Bugfix] Calling troff over the system default shell now, potentially finding more paths. +[Improved] BuildDocument uses a simpler execution approach now. +[Feature] macOS Cmd+X/C/V are supported now. +[Feature] Added a loading window so you won't think groffstudio would procrastinate. + +------------------------------- + Version 0.12.0 2022-03-14 [Feature] If the installed version of troff is not detected as groff, a warning is displayed. [Changed] On platforms which probably use a package manager (currently, Linux and BSDs), the "update check" checkbox is disabled and the related libraries are not referenced. Index: README.md ================================================================== --- README.md +++ README.md @@ -2,11 +2,11 @@ You know what was missing with `groff`? A good alternative to TeXstudio. Here we go. ## Screenshot -![Screenshot](https://i.imgur.com/MXLYfwq.png) +![Screenshot](https://i.imgur.com/GNu2M6n.png) ## Features * Written in Lazarus (Free Pascal). * Should be cross-platform (but Windows support is mediocre yet). Index: src/buildoutputwindow.lfm ================================================================== --- src/buildoutputwindow.lfm +++ src/buildoutputwindow.lfm @@ -5,11 +5,11 @@ Width = 168 BorderStyle = bsDialog Caption = 'building' ClientHeight = 80 ClientWidth = 168 - LCLVersion = '2.3.0.0' + LCLVersion = '3.99.0.0' object Label1: TLabel Left = 32 Height = 37 Top = 16 Width = 117 Index: src/buildoutputwindow.pas ================================================================== --- src/buildoutputwindow.pas +++ src/buildoutputwindow.pas @@ -18,11 +18,11 @@ {$mode ObjFPC}{$H+} interface uses - Classes, SysUtils, Forms, StdCtrls, Process; + Classes, SysUtils, Forms, StdCtrls, Process, Dialogs; type { TBuildStatusWindow } @@ -42,60 +42,36 @@ {$R *.lfm} function TBuildStatusWindow.BuildDocument(CommandLine: String; LogFile: String): Boolean; var - p: TProcess; - n: LongInt; str: String; lh: TextFile; -begin - p := TProcess.Create(nil); - p.Options := p.Options + [poUsePipes, poStderrToOutPut]; - -{$IFDEF WINDOWS} - p.Executable := 'cmd'; - p.Parameters.Add('/c'); -{$ENDIF} -{$IFDEF UNIX} - p.Executable := 'sh'; - p.Parameters.Add('-c'); -{$ENDIF} - p.Parameters.Add(CommandLine); - p.Execute; + ret: Boolean; +begin +{$IFDEF WINDOWS} + ret := RunCommand('cmd', ['/c', CommandLine], str, [], swoHIDE); +{$ELSE} + ret := RunCommand('sh', ['-c', CommandLine], str, [], swoHIDE); +{$ENDIF} + + if Length(str) = 0 then str := 'No problems have occurred. :-)'; if LogFile <> '' then begin AssignFile(lh, LogFile); - Rewrite(lh); - - while p.Running do - begin - n := p.Output.Read(str, 2048); - if n > 0 then - begin - writeln(lh, str); - end - else Sleep(100); - end; - - { We might have some buffer contents left. } - repeat - n := p.Output.Read(str, 2048); - if n > 0 then - begin - writeln(lh, str); - end; - until n <= 0; - - CloseFile(lh); - end; - - result := p.ExitStatus > 0; - p.Free; + try + ReWrite(lh); + Write(lh, str); + finally + CloseFile(lh); + end; + end; { Close the status window: } Close; + + Result := ret; end; end. Index: src/groffstudio.lpi ================================================================== --- src/groffstudio.lpi +++ src/groffstudio.lpi @@ -20,19 +20,22 @@ - + + + + @@ -74,10 +77,18 @@ + + + + + + + + @@ -88,19 +99,20 @@ - + + Index: src/groffstudio.lpr ================================================================== --- src/groffstudio.lpr +++ src/groffstudio.lpr @@ -1,25 +1,51 @@ -program groffstudio; - -{$mode objfpc}{$H+} - -uses - {$IFDEF UNIX} - cthreads, - {$ENDIF} - {$IFDEF HASAMIGA} - athreads, - {$ENDIF} - Interfaces, // this includes the LCL widgetset - Forms, lazcontrols, Unit1, Helpers, BuildOutputWindow - { you can add units after this }; - -{$R *.res} - -begin - RequireDerivedFormResource:=True; - Application.Scaled:=True; - Application.Initialize; - Application.CreateForm(TMainForm, MainForm); - Application.Run; -end. - +program groffstudio; + +{ + The contents of this file are subject to the terms of the + Common Development and Distribution License, Version 1.1 only + (the "License"). You may not use this file except in compliance + with the License. + + See the file LICENSE in this distribution for details. + A copy of the CDDL is also available via the Internet at + https://spdx.org/licenses/CDDL-1.1.html + + When distributing Covered Code, include this CDDL HEADER in each + file and include the contents of the LICENSE file from this + distribution. +} + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, + Forms, lazcontrols, Unit1, Helpers, BuildOutputWindow, Splashscreen; + +{$R *.res} + +var + Splash: TSplashscreenWindow; + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + Application.Initialize; + + { Load the loading screen } + Splash := TSplashscreenWindow.Create(Application); + Splash.Show; + Splash.Update; + Application.ProcessMessages; + + Application.CreateForm(TMainForm, MainForm); + + Splash.Close; + Application.Run; +end. + ADDED src/splashscreen.lfm Index: src/splashscreen.lfm ================================================================== --- src/splashscreen.lfm +++ src/splashscreen.lfm @@ -0,0 +1,20 @@ +object SplashscreenWindow: TSplashscreenWindow + Left = 493 + Height = 80 + Top = 160 + Width = 168 + BorderStyle = bsNone + Caption = 'preparing' + ClientHeight = 80 + ClientWidth = 168 + FormStyle = fsSplash + object Label1: TLabel + Left = 16 + Height = 37 + Top = 16 + Width = 141 + Caption = 'preparing ...' + Font.Height = -27 + ParentFont = False + end +end ADDED src/splashscreen.pas Index: src/splashscreen.pas ================================================================== --- src/splashscreen.pas +++ src/splashscreen.pas @@ -0,0 +1,42 @@ +unit Splashscreen; + +{ + The contents of this file are subject to the terms of the + Common Development and Distribution License, Version 1.1 only + (the "License"). You may not use this file except in compliance + with the License. + + See the file LICENSE in this distribution for details. + A copy of the CDDL is also available via the Internet at + https://spdx.org/licenses/CDDL-1.1.html + + When distributing Covered Code, include this CDDL HEADER in each + file and include the contents of the LICENSE file from this + distribution. +} + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; + +type + + { TSplashscreenWindow } + + TSplashscreenWindow = class(TForm) + Label1: TLabel; + private + + public + + end; + +implementation + +{$R *.lfm} + +end. + Index: src/unit1.lfm ================================================================== --- src/unit1.lfm +++ src/unit1.lfm @@ -1,22 +1,22 @@ object MainForm: TMainForm - Left = 2381 + Left = 1073 Height = 692 Top = 99 - Width = 981 + Width = 847 Caption = 'groffstudio' ClientHeight = 692 - ClientWidth = 981 + ClientWidth = 847 DefaultMonitor = dmPrimary + Position = poScreenCenter OnClose = FormClose OnCreate = FormCreate - LCLVersion = '2.3.0.0' object MainStatusBar: TStatusBar Left = 0 Height = 23 Top = 669 - Width = 981 + Width = 847 Panels = < item Text = 'file name with save status' Width = 200 end @@ -32,33 +32,33 @@ end object ExtendedNotebook1: TExtendedNotebook Left = 8 Height = 662 Top = 8 - Width = 961 + Width = 827 ActivePage = tsEdit Anchors = [akTop, akLeft, akRight, akBottom] Style = tsFlatButtons TabIndex = 0 TabOrder = 1 object tsEdit: TTabSheet Caption = 'edit a groff document' ClientHeight = 631 - ClientWidth = 953 + ClientWidth = 819 ParentFont = False object GroupBox1: TGroupBox Left = 10 Height = 66 Top = 560 - Width = 933 + Width = 799 Align = alBottom BorderSpacing.Left = 10 BorderSpacing.Right = 10 BorderSpacing.Bottom = 5 Caption = 'build' ClientHeight = 46 - ClientWidth = 929 + ClientWidth = 795 TabOrder = 0 object Label1: TLabel Left = 184 Height = 15 Top = -4 @@ -81,170 +81,134 @@ ) TabOrder = 0 Text = '[ select ]' end object Label2: TLabel - Left = 806 + Left = 672 Height = 15 Top = -4 Width = 78 Anchors = [akTop, akRight] Caption = 'output format:' ParentColor = False end object rdPs: TRadioButton - Left = 807 + Left = 673 Height = 19 Top = 16 Width = 71 Anchors = [akTop, akRight] Caption = 'PostScript' - OnChange = rdPsChange TabOrder = 1 end object rdPdf: TRadioButton - Left = 887 + Left = 753 Height = 19 Top = 16 Width = 39 Anchors = [akTop, akRight] Caption = 'PDF' - OnChange = rdPdfChange TabOrder = 2 end object Label3: TLabel - Left = 424 + Left = 419 Height = 15 Top = -4 Width = 76 Anchors = [akTop, akRight] Caption = 'preprocessors:' ParentColor = False end - object chkEqn: TCheckBox - Left = 480 - Height = 19 - Top = 16 - Width = 38 - Anchors = [akTop, akRight] - Caption = 'eqn' - TabOrder = 3 - end - object chkPic: TCheckBox - Left = 566 - Height = 19 - Top = 16 - Width = 34 - Anchors = [akTop, akRight] - Caption = 'pic' - TabOrder = 4 - end - object chkTbl: TCheckBox - Left = 654 - Height = 19 - Top = 16 - Width = 32 - Anchors = [akTop, akRight] - Caption = 'tbl' - TabOrder = 5 - end - object chkGrn: TCheckBox - Left = 524 - Height = 19 - Top = 16 - Width = 36 - Anchors = [akTop, akRight] - Caption = 'grn' - TabOrder = 6 - end - object chkChem: TCheckBox - Left = 424 - Height = 19 - Top = 16 - Width = 48 - Anchors = [akTop, akRight] - Caption = 'chem' - TabOrder = 7 - end - object chkRefer: TCheckBox - Left = 606 - Height = 19 - Top = 16 - Width = 42 - Anchors = [akTop, akRight] - Caption = 'refer' - TabOrder = 8 - end object Label4: TLabel - Left = 707 + Left = 544 Height = 15 Top = -4 Width = 34 Anchors = [akTop, akRight] Caption = 'extras:' ParentColor = False end - object chkPdfMark: TCheckBox - Left = 708 - Height = 19 - Top = 16 - Width = 63 - Anchors = [akTop, akRight] - Caption = 'Pdfmark' - Enabled = False - TabOrder = 9 - end object btnBuild: TButton Left = 0 Height = 29 Top = 10 Width = 75 Caption = 'build' Color = clLime Enabled = False Font.Style = [fsBold, fsItalic] - OnClick = btnBuildClick ParentFont = False - TabOrder = 10 + TabOrder = 3 + OnClick = btnBuildClick end object chkLogFile: TCheckBox Left = 80 Height = 19 Hint = 'If enabled, a log file containing the groff output will be placed alongside the source document.' Top = 16 Width = 68 Caption = 'log to file' Enabled = False - TabOrder = 11 + TabOrder = 4 + end + object chkBoxPreprocessors: TCheckComboBox + Left = 419 + Height = 22 + Top = 15 + Width = 100 + Anchors = [akTop, akRight] + ItemHeight = 16 + Items.Strings = ( + 'chem' + 'eqn' + 'grn' + 'pic' + 'refer' + 'tbl' + ) + TabOrder = 5 + end + object chkBoxExtras: TCheckComboBox + Left = 544 + Height = 22 + Top = 15 + Width = 100 + Anchors = [akTop, akRight] + ItemHeight = 16 + Items.Strings = ( + 'hdtbl' + 'Pdfmark' + ) + TabOrder = 6 end end object btnSaveGroff: TButton - Left = 868 + Left = 734 Height = 28 Top = 528 Width = 75 Anchors = [akRight, akBottom] Caption = 'save' Font.Style = [fsBold] - OnClick = btnSaveGroffClick ParentFont = False TabOrder = 1 + OnClick = btnSaveGroffClick end object btnLoadGroff: TButton - Left = 787 + Left = 653 Height = 28 Top = 528 Width = 75 Anchors = [akRight, akBottom] Caption = 'load' Font.Style = [fsBold] - OnClick = btnLoadGroffClick ParentFont = False TabOrder = 2 + OnClick = btnLoadGroffClick end object Label5: TLabel - Left = 331 + Left = 197 Height = 15 Top = 541 Width = 438 Anchors = [akRight, akBottom] Caption = 'note that everything build-related will be stored in the document''s storage directory' @@ -255,21 +219,21 @@ end inline SynEdit1: TSynEdit Left = 10 Height = 523 Top = 0 - Width = 933 + Width = 799 Anchors = [akTop, akLeft, akRight, akBottom] Font.CharSet = 4 Font.Height = -13 - Font.Name = 'Consolas' + Font.Name = 'Andale Mono' Font.Pitch = fpFixed Font.Quality = fqCleartypeNatural ParentColor = False ParentFont = False TabOrder = 3 - Gutter.Width = 55 + Gutter.Width = 57 Gutter.MouseActions = <> RightGutter.Width = 0 RightGutter.MouseActions = <> Keystrokes = < item @@ -689,16 +653,28 @@ ShortCut = 57380 end item Command = ecColSelEditorBottom ShortCut = 57379 + end + item + Command = ecPaste + ShortCut = 4182 + end + item + Command = ecCopy + ShortCut = 4163 + end + item + Command = ecCut + ShortCut = 4184 end> MouseActions = <> MouseTextActions = <> MouseSelActions = <> - Options = [eoAutoIndent, eoGroupUndo, eoHideRightMargin, eoSmartTabs, eoTabsToSpaces, eoTrimTrailingSpaces, eoDragDropEditing, eoDoubleClickSelectsLine] - Options2 = [eoEnhanceEndKey, eoFoldedCopyPaste, eoPersistentBlock, eoOverwriteBlock, eoAcceptDragDropEditing] + Options = [eoAutoIndent, eoEnhanceHomeKey, eoGroupUndo, eoHideRightMargin, eoKeepCaretX, eoSmartTabs, eoTabsToSpaces, eoTrimTrailingSpaces, eoDragDropEditing, eoDoubleClickSelectsLine] + Options2 = [eoEnhanceEndKey, eoPersistentBlock, eoOverwriteBlock, eoAcceptDragDropEditing] MouseOptions = [emDragDropEditing, emDoubleClickSelectsLine] VisibleSpecialChars = [vscSpace, vscTabAtLast] SelectedColor.BackPriority = 50 SelectedColor.ForePriority = 50 SelectedColor.FramePriority = 50 @@ -723,11 +699,11 @@ object SynGutterMarks1: TSynGutterMarks Width = 24 MouseActions = <> end object SynGutterLineNumber1: TSynGutterLineNumber - Width = 15 + Width = 17 MouseActions = <> MarkupInfo.Background = clBtnFace MarkupInfo.Foreground = clNone DigitCount = 2 ShowOnlyLineNumbersMultiplesOf = 1 @@ -757,28 +733,28 @@ end end object tsSettings: TTabSheet Caption = 'groffstudio settings' ClientHeight = 631 - ClientWidth = 953 + ClientWidth = 819 object chkAutoSaveBuildSettings: TCheckBox Left = 0 Height = 19 Top = 16 Width = 309 Caption = 'save and restore the chosen build settings for next time' TabOrder = 0 end object btnSaveSettings: TButton - Left = 864 + Left = 730 Height = 25 Top = 600 Width = 91 Anchors = [akRight, akBottom] Caption = 'save settings' - OnClick = btnSaveSettingsClick TabOrder = 1 + OnClick = btnSaveSettingsClick end object Label14: TLabel Left = 0 Height = 15 Top = 80 @@ -796,23 +772,23 @@ end end object tsGroff: TTabSheet Caption = 'groff version' ClientHeight = 631 - ClientWidth = 953 + ClientWidth = 819 object GroupBox2: TGroupBox Left = 20 Height = 57 Top = 566 - Width = 913 + Width = 779 Align = alBottom BorderSpacing.Left = 20 BorderSpacing.Right = 20 BorderSpacing.Bottom = 8 Caption = 'groff for Windows' ClientHeight = 37 - ClientWidth = 909 + ClientWidth = 775 TabOrder = 0 object Label6: TLabel Left = 8 Height = 15 Top = 8 @@ -822,33 +798,33 @@ end object edtOnlineGroffVersionWindows: TEdit Left = 136 Height = 15 Top = 8 - Width = 676 + Width = 542 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 0 Text = 'fetching ...' end object btnDownloadGroffWindows: TButton - Left = 820 + Left = 686 Height = 25 Top = 5 Width = 80 Anchors = [akTop, akRight] Caption = 'download it' - OnClick = btnDownloadGroffWindowsClick TabOrder = 1 + OnClick = btnDownloadGroffWindowsClick end end object Label7: TLabel Left = 8 - Height = 15 + Height = 30 Top = 8 - Width = 941 + Width = 807 Anchors = [akTop, akLeft, akRight] Caption = 'as you might guess, groffstudio requires a working installation of groff. this page performs the basic checks for you. note that on windows, everything is harder than it should. :-)' Constraints.MaxHeight = 582 ParentColor = False WordWrap = True @@ -863,21 +839,21 @@ end object edtGroffInstalledVersion: TEdit Left = 144 Height = 15 Top = 56 - Width = 805 + Width = 671 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 1 end object lblTroffCommandNotFound: TLabel Left = 8 Height = 45 Top = 112 - Width = 940 + Width = 806 Anchors = [akTop, akLeft, akRight] Caption = 'groff was not found. in order to use groffstudio, you absolutely need groff in your PATH variable. on unix and unix-like systems, you''ll need to edit the $PATH variable. on windows, i warmly recommend the Rapid Environment Editor for that.'#13#10'please exit groffstudio at your nearest convenience and adjust your PATH variables. then try again.' Font.Color = clRed ParentColor = False ParentFont = False @@ -886,11 +862,11 @@ end object edtGroffstudioInstalledVersion: TEdit Left = 144 Height = 15 Top = 77 - Width = 805 + Width = 671 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 2 end @@ -904,11 +880,11 @@ end end object tsAbout: TTabSheet Caption = 'about groffstudio' ClientHeight = 631 - ClientWidth = 953 + ClientWidth = 819 object lblAboutProductName: TLabel Left = 0 Height = 61 Top = 16 Width = 315 @@ -958,11 +934,11 @@ end object mLicense: TMemo Left = 0 Height = 418 Top = 216 - Width = 960 + Width = 826 Anchors = [akTop, akLeft, akRight] ScrollBars = ssAutoBoth TabOrder = 0 end object lblWebsite: TLabel Index: src/unit1.pas ================================================================== --- src/unit1.pas +++ src/unit1.pas @@ -19,12 +19,12 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, - ExtCtrls, Buttons, ExtendedNotebook, SynEdit, fphttpclient, - RegExpr, LCLIntf, LCLType, IniPropStorage, Process, Helpers, fileinfo, + ExtCtrls, Buttons, ExtendedNotebook, SynEdit, fphttpclient, RegExpr, LCLIntf, + LCLType, IniPropStorage, ComboEx, Process, Helpers, fileinfo, {$IF DEFINED(WINDOWS)} winpeimagereader, opensslsockets, {$ELSEIF DEFINED(DARWIN)} machoreader, ssockets, sslsockets, sslbase, opensslsockets, {$ELSEIF DEFINED(LINUX)} @@ -40,20 +40,15 @@ btnSaveGroff: TButton; btnLoadGroff: TButton; btnBuild: TButton; btnDownloadGroffWindows: TButton; btnSaveSettings: TButton; + chkBoxExtras: TCheckComboBox; + chkBoxPreprocessors: TCheckComboBox; chkUpdateCheckOnStart: TCheckBox; chkLogFile: TCheckBox; chkAutoSaveBuildSettings: TCheckBox; - chkPdfMark: TCheckBox; - chkRefer: TCheckBox; - chkChem: TCheckBox; - chkGrn: TCheckBox; - chkTbl: TCheckBox; - chkPic: TCheckBox; - chkEqn: TCheckBox; cmbMacro: TComboBox; edtGroffInstalledVersion: TEdit; edtGroffstudioInstalledVersion: TEdit; edtOnlineGroffVersionWindows: TEdit; ExtendedNotebook1: TExtendedNotebook; @@ -98,12 +93,10 @@ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure lblFossilRepoClick(Sender: TObject); procedure lblGithubRepoClick(Sender: TObject); procedure lblWebsiteClick(Sender: TObject); - procedure rdPdfChange(Sender: TObject); - procedure rdPsChange(Sender: TObject); procedure SynEdit1Change(Sender: TObject); {$IFDEF DARWIN} procedure GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler); {$ENDIF} private @@ -145,11 +138,15 @@ {$IFDEF DARWIN} HTTPClient: TFPHttpClient; {$ENDIF} begin // What's the current running groff version? - if RunCommand('troff', ['--version'], GroffOutputVersion) then + {$IFDEF WINDOWS} + if RunCommand('cmd', ['/c', 'troff --version'], GroffOutputVersion, [], swoHIDE) then + {$ELSE} + if RunCommand('/bin/sh', ['-c', 'troff --version'], GroffOutputVersion, [], swoHIDE) then + {$ENDIF} begin edtGroffInstalledVersion.Text := GroffOutputVersion; if pos('GNU', GroffOutputVersion) = 0 then ShowMessage('groffstudio thinks that your installed version of troff is not GNU troff.' + LineEnding + 'If this is correct, you are advised to fix this before continuing.' + LineEnding + @@ -188,17 +185,18 @@ if storeBuildSettings then begin chkLogFile.Checked := iniStorage.ReadBoolean('BuildLogFile', False); cmbMacro.Text := iniStorage.ReadString('BuildChosenMacro', '[ select ]'); - chkChem.Checked := iniStorage.ReadBoolean('BuildUseChem', False); - chkEqn.Checked := iniStorage.ReadBoolean('BuildUseEqn', False); - chkGrn.Checked := iniStorage.ReadBoolean('BuildUseGrn', False); - chkPic.Checked := iniStorage.ReadBoolean('BuildUsePic', False); - chkRefer.Checked := iniStorage.ReadBoolean('BuildUseRefer', False); - chkTbl.Checked := iniStorage.ReadBoolean('BuildUseTbl', False); - chkPdfMark.Checked := iniStorage.ReadBoolean('BuildUsePdfMark', False); + chkBoxPreprocessors.Checked[0] := iniStorage.ReadBoolean('BuildUseChem', False); + chkBoxPreprocessors.Checked[1] := iniStorage.ReadBoolean('BuildUseEqn', False); + chkBoxPreprocessors.Checked[2] := iniStorage.ReadBoolean('BuildUseGrn', False); + chkBoxPreprocessors.Checked[3] := iniStorage.ReadBoolean('BuildUsePic', False); + chkBoxPreprocessors.Checked[4] := iniStorage.ReadBoolean('BuildUseRefer', False); + chkBoxPreprocessors.Checked[5] := iniStorage.ReadBoolean('BuildUseTbl', False); + chkBoxExtras.Checked[0] := iniStorage.ReadBoolean('BuildUseHdtbl', False); + chkBoxExtras.Checked[1] := iniStorage.ReadBoolean('BuildUsePdfMark', False); rdPs.Checked := iniStorage.ReadBoolean('BuildToPostscript', False); rdPdf.Checked := iniStorage.ReadBoolean('BuildToPDF', False); end; // What's the latest available version? @@ -298,20 +296,10 @@ procedure TMainForm.lblWebsiteClick(Sender: TObject); begin OpenURL('https://groff.tuxproject.de'); end; -procedure TMainForm.rdPdfChange(Sender: TObject); -begin - chkPdfMark.Enabled := True; -end; - -procedure TMainForm.rdPsChange(Sender: TObject); -begin - chkPdfMark.Enabled := False; -end; - procedure TMainForm.SynEdit1Change(Sender: TObject); begin // Set the "Changed" mark: MainStatusBar.Panels[0].Text := '* ' + currentGroffFileName; unsavedChanges := True; @@ -340,27 +328,29 @@ // Build the parameters: buildOpts := 'groff'; // - Macro: - if cmbMacro.SelText <> '' then buildOpts := buildOpts + ' -' + cmbMacro.SelText; + if LeftStr(cmbMacro.Text, 1) = 'm' then buildOpts := buildOpts + ' -' + cmbMacro.Text; // - Enforce UTF-8: buildOpts := buildOpts + ' -Kutf8'; // - Preprocessors: - if chkChem.Checked then buildOpts := buildOpts + ' -chem'; - if chkEqn.Checked then buildOpts := buildOpts + ' -eqn'; - if chkGrn.Checked then buildOpts := buildOpts + ' -grn'; - if chkPic.Checked then buildOpts := buildOpts + ' -pic'; - if chkRefer.Checked then buildOpts := buildOpts + ' -refer'; - if chkTbl.Checked then buildOpts := buildOpts + ' -tbl'; + if chkBoxPreprocessors.Checked[0] then buildOpts := buildOpts + ' -chem'; + if chkBoxPreprocessors.Checked[1] then buildOpts := buildOpts + ' -eqn'; + if chkBoxPreprocessors.Checked[2] then buildOpts := buildOpts + ' -grn'; + if chkBoxPreprocessors.Checked[3] then buildOpts := buildOpts + ' -pic'; + if chkBoxPreprocessors.Checked[4] then buildOpts := buildOpts + ' -refer'; + if chkBoxPreprocessors.Checked[5] then buildOpts := buildOpts + ' -tbl'; + + if chkBoxExtras.Checked[0] then buildOpts := buildOpts + ' -mhdtbl'; // - PDF-specifics: if rdPdf.Checked then begin buildOpts := buildOpts + ' -Tpdf'; - if chkPdfMark.Checked then buildOpts := buildOpts + ' -mpdfmark'; + if chkBoxExtras.Checked[1] then buildOpts := buildOpts + ' -mpdfmark'; outputFileName := currentGroffFilePath + '.pdf'; end else outputFileName := currentGroffFilePath + '.ps'; // - Input file: @@ -437,17 +427,18 @@ procedure TMainForm.btnSaveSettingsClick(Sender: TObject); begin // Store the build settings: iniStorage.WriteString('BuildChosenMacro', cmbMacro.Text); iniStorage.WriteBoolean('BuildLogFile', chkLogFile.Checked); - iniStorage.WriteBoolean('BuildUseChem', chkChem.Checked); - iniStorage.WriteBoolean('BuildUseEqn', chkEqn.Checked); - iniStorage.WriteBoolean('BuildUseGrn', chkGrn.Checked); - iniStorage.WriteBoolean('BuildUsePic', chkPic.Checked); - iniStorage.WriteBoolean('BuildUseRefer', chkRefer.Checked); - iniStorage.WriteBoolean('BuildUseTbl', chkTbl.Checked); - iniStorage.WriteBoolean('BuildUsePdfMark', chkPdfMark.Checked); + iniStorage.WriteBoolean('BuildUseChem', chkBoxPreprocessors.Checked[0]); + iniStorage.WriteBoolean('BuildUseEqn', chkBoxPreprocessors.Checked[1]); + iniStorage.WriteBoolean('BuildUseGrn', chkBoxPreprocessors.Checked[2]); + iniStorage.WriteBoolean('BuildUsePic', chkBoxPreprocessors.Checked[3]); + iniStorage.WriteBoolean('BuildUseRefer', chkBoxPreprocessors.Checked[4]); + iniStorage.WriteBoolean('BuildUseTbl', chkBoxPreprocessors.Checked[5]); + iniStorage.WriteBoolean('BuildUseHdtbl', chkBoxExtras.Checked[0]); + iniStorage.WriteBoolean('BuildUsePdfMark', chkBoxExtras.Checked[1]); iniStorage.WriteBoolean('BuildToPostscript', rdPs.Checked); iniStorage.WriteBoolean('BuildToPDF', rdPDF.Checked); // Store the IDE settings: iniStorage.WriteBoolean('AutoSaveBuildSettings', chkAutoSaveBuildSettings.Checked);