Index: CHANGES.txt ================================================================== --- CHANGES.txt +++ CHANGES.txt @@ -1,5 +1,12 @@ +Version [next] + +[Feature] Support for hdtbl. +[Changed] Build extras and build preprocessors are now listed in a multi-select box. + +------------------------------- + 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: src/groffstudio.lpi ================================================================== --- src/groffstudio.lpi +++ src/groffstudio.lpi @@ -20,11 +20,11 @@ - + Index: src/unit1.lfm ================================================================== --- src/unit1.lfm +++ src/unit1.lfm @@ -1,22 +1,22 @@ object MainForm: TMainForm - Left = 2381 + Left = 2515 Height = 692 Top = 99 - Width = 981 + Width = 847 Caption = 'groffstudio' ClientHeight = 692 - ClientWidth = 981 + ClientWidth = 847 DefaultMonitor = dmPrimary 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,120 +81,54 @@ ) 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 @@ -202,25 +136,55 @@ Color = clLime Enabled = False Font.Style = [fsBold, fsItalic] OnClick = btnBuildClick ParentFont = False - TabOrder = 10 + TabOrder = 3 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 = 24 + 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 = 24 + 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' @@ -228,11 +192,11 @@ OnClick = btnSaveGroffClick ParentFont = False TabOrder = 1 end object btnLoadGroff: TButton - Left = 787 + Left = 653 Height = 28 Top = 528 Width = 75 Anchors = [akRight, akBottom] Caption = 'load' @@ -240,11 +204,11 @@ OnClick = btnLoadGroffClick ParentFont = False TabOrder = 2 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,11 +219,11 @@ 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.Pitch = fpFixed @@ -757,21 +721,21 @@ 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' @@ -796,23 +760,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,19 +786,19 @@ 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' @@ -842,13 +806,13 @@ TabOrder = 1 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 +827,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 +850,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 +868,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 +922,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 @@ -188,17 +181,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 +292,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; @@ -346,21 +330,23 @@ // - 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 +423,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);