From 163a8c13d64b0f588499793aec780350d829b0d2 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Fri, 18 Jun 2010 16:32:20 +0000 Subject: [PATCH] Implement LaTeX output for "Copy as" actions. Code parts from brampton. Fixes issue #2020. --- res/icons/latex.png | Bin 0 -> 694 bytes source/helpers.pas | 26 ++++++++++ source/main.dfm | 114 +++++++++++++++++++++++++------------------- source/main.pas | 29 ++++++++++- 4 files changed, 118 insertions(+), 51 deletions(-) create mode 100644 res/icons/latex.png diff --git a/res/icons/latex.png b/res/icons/latex.png new file mode 100644 index 0000000000000000000000000000000000000000..22516426f3b63ae3fd440478845d00200287e1a5 GIT binary patch literal 694 zcmV;n0!jUeP)%1Z2;JOZu;|w6i zbP-w<0E~@|4PpHzNfSKJLsiMLj8C425g9^&v?xf^bO0Oy7(g5c5h2Smq?bV6rEpw# zB+&@q{QR7scXu?Oo|vAV24H!48F3uG9von;Wpi_rot+)FwzdWU={H4Du(q}a!0PHM z&1RF+volV8pT)&R?(gsMeV>hu4JIci{|3}*HADoAK}3k-nAw>bs?{pK@3X$X&f(!9 zl}cq~BLjdD>An{b5hf-kxVpN+_k9)?76^iXTCK*($w}AfBft^i@$r!$2)MkwL`0aH znqqu>oc;ZM%H=XED=X~n?Qwm5J&d5L088P^i~bHnwbp8qB)Yx5tw9iI7>2sLyQ@(Y zX{*)JcDt={92dZnst&hME|tjh9O>=8QmN2rG_ck(H#f)Y>np8Ri&Ck?@$qp3xE)Cl z$ML}3TC2~`&l*LM#&N9ec3UqlF0|9>XuV#40A>NBs_y_jVUi@8rm1FGrbSU`mSq}- zq2AowXuV#4@I0^D7mon4JRb=2Jl8zWwI~YB^IW4SDvpkhzQ1?wAJhBJpL>`8s$1ZP c_8j~52Yww=bC;uWr2qf`07*qoM6N<$f;lxdwg3PC literal 0 HcmV?d00001 diff --git a/source/helpers.pas b/source/helpers.pas index 01500c2d..f6ab2079 100644 --- a/source/helpers.pas +++ b/source/helpers.pas @@ -87,6 +87,7 @@ type procedure GridToCsv(Grid: TVirtualStringTree; Separator, Encloser, Terminator: String; S: TStream); procedure GridToXml(Grid: TVirtualStringTree; S: TStream); procedure GridToSql(Grid: TVirtualStringTree; S: TStream); + procedure GridToLaTeX(Grid: TVirtualStringTree; S: TStream); function BestTableName(Data: TMySQLQuery): String; function esc2ascii(str: String): String; function urlencode(url: String): String; @@ -937,6 +938,31 @@ begin end; +{*** + Converts grid contents to LaTeX table. + @param Grid Object which holds data to export +} +procedure GridToLaTeX(Grid: TVirtualStringTree; S: TStream); +var + i: Integer; + tmp: String; +begin + tmp := '\begin{tabular}{'; + // Columns + for i:=0 to Grid.Header.Columns.Count-1 do begin + // Skip hidden key columns + if not (coVisible in Grid.Header.Columns[i].Options) then + Continue; + // Add header item. + tmp := tmp + ' c '; + end; + tmp := tmp + '}\r\n'; + StreamWrite(S, tmp); + GridToCsv(Grid, ' & ', '', '\\ \r\n', s); + StreamWrite(S, '\end{tabular}\r\n'); +end; + + function BestTableName(Data: TMySQLQuery): String; begin // Get table name from result if possible. Used by GridToXYZ() functions. diff --git a/source/main.dfm b/source/main.dfm index fd4e0a21..6854f42e 100644 --- a/source/main.dfm +++ b/source/main.dfm @@ -1850,6 +1850,9 @@ object MainForm: TMainForm object CopyAsSQLdata: TMenuItem Action = actCopyAsSQL end + object CopyselectedrowsasLaTextable1: TMenuItem + Action = actCopyAsLaTex + end object Exportdata1: TMenuItem Action = actExportData end @@ -2016,6 +2019,13 @@ object MainForm: TMainForm ImageIndex = 48 OnExecute = actCopyAsXMLExecute end + object actCopyAsLaTex: TAction + Category = 'Export/Import' + Caption = 'Copy selected rows as LaTex table' + Enabled = False + ImageIndex = 153 + OnExecute = actCopyAsLaTexExecute + end object actExportData: TAction Category = 'Export/Import' Caption = 'Export grid data as CSV, HTML, XML or SQL ...' @@ -2641,133 +2651,133 @@ object MainForm: TMainForm Left = 104 Top = 160 Bitmap = { - 494C010199009C00040010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 + 494C01019A009C00040010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000007002000001002000000000000070 0200000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000024000000520000 + 0052000000520000005200000052000000520000005200000052000000290000 + 0001000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000052FDFDFCFFFBFB + FBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFFFDFDFDFFF7F7F7FE888888CA0000 + 002E000000010000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000002B73A8FF296FA4FF286CA0FF2669 9CFF246598FF226294FF205F91FF1E5C8DFF1D5A8AFF1C5888FF1B5686FF1B56 - 86FF1B5686FF1B5686FF1B5686FF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 86FF1B5686FF1B5686FF1B5686FF1B5686FF0000000000000052FAFAF9FFF7F7 + F7FFFAFAFAFFFBFBFBFFFCFCFCFFFEFEFEFFFCFCFCFFF1F1F1FFD4D4D4FF9A9A + 9AE00000002F0000000100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000002D76ACFF5198C7FF4D93C3FF4B90 C2FF4B8EC0FF4B8EC0FFC0E9EAFF76CDDFFF74CDDFFFABE1E7FF4783BAFF4580 - B9FF437DB7FF437CB7FF467EB8FF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + B9FF437DB7FF437CB7FF467EB8FF1B5686FF0000000000000052F9F9F9FFF7F7 + F7FFFAFAFAFFF7F7F7FFEFEFEFFFF8F8F8FFF9F9F9FFEEEEEEFFC9C9C9FFF5F5 + F5FF9A9A9AE00000002E00000001000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000002F79AFFF5099C7FF3982B4FF296F A4FF286CA0FF26699CFF246598FF226294FF205F91FF1E5C8DFF1D5A8AFF1C58 - 88FF1B5686FF2B669AFF447DB7FF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 88FF1B5686FF2B669AFF447DB7FF1B5686FF0000000000000052F9F9F9FFF6F6 + F6FFF9F9F9FFFBFBFBFF9D9D9DFFAEAEAEFFA5A5A5FFCACACAFFEBEBEBFFD4D4 + D4FFDBDBDBFF878787C900000029000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000317CB3FF519CC9FF2D76ACFF76E4 A1FF74E39FFF72E39EFF70E29CFF6EE29BFF6CE29AFF6BE199FF69E198FF67E1 - 96FF66E095FF1B5686FF447EB8FF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 96FF66E095FF1B5686FF447EB8FF1B5686FF0000000000000052F2F2F1FFF1F1 + F0FFF7F7F7FFFAFAFAFF7D7D7DFFE3E3E3FFF1F1F1FF989898FFF8F8F8FFEAEA + EAFFEEEEEEFFF8F8F8FE00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000327EB6FF52A0CBFF2F79AFFF55DD 8AFF54DC88FF78E4A2FF76E4A1FF74E39FFF4EDA81FF4DDA7EFF4BD97CFF4AD9 - 7AFF49D879FF1C5888FF4582B9FF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 7AFF49D879FF1C5888FF4582B9FF1B5686FF0000000000000052ECECECFFD7D7 + D7FF545454FFC5C5C5FF828282FFCACACAFFADADADFF878787FFBBBBBBFFFAFA + FAFF565656FFD0D0D0FF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003381B8FF55A4CDFF317CB3FF69C9 5AFF3BBA2FFF4ED572FF46CA58FF23CD58FF53BF46FFA8BD57FFE4A73AFFFC9F - 2EFFFF9B2CFF1D5A8AFF4886BCFF1B5686FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 2EFFFF9B2CFF1D5A8AFF4886BCFF1B5686FF0000000000000052EAEAE9FFF3F3 + F3FF717171FFF8F8F8FF808080FFAEAEAEFFA2A2A2FFE4E4E4FFB3B3B3FF9B9B + 9BFFBCBCBCFFFEFEFEFF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF58A8CFFF327EB6FF6ECB 5EFF6CCB5DFF3AB926FF3CB92BFFD9BF63FFFFBA62FFFFB960FFFFB85EFFFFB7 - 5DFFFFB65BFF1E5C8DFF4A8ABEFF1C5888FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 5DFFFFB65BFF1E5C8DFF4A8ABEFF1C5888FF0000000000000052E8E8E8FFF2F2 + F1FF717170FFF6F6F6FF727272FFDDDDDDFFE0E0E0FF9F9F9FFFD0D0D0FF6161 + 61FFFCFCFCFFFCFCFCFF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF58AAD1FF3381B8FF72CE 62FF3DBD29FF3DBC29FFEFC169FFFFBF68FFFFBD66FFFFBC65FFE4C486FF98C8 - AEFF61D9EBFF205F91FF4B8DBFFF1D5A8AFF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + AEFF61D9EBFF205F91FF4B8DBFFF1D5A8AFF0000000000000052AFAFAFFFF0F0 + EFFF707070FFF4F4F4FF797979FFB0B0AFFFB1B1B1FFDDDDDDFF6A6A6AFFB8B8 + B8FFDDDDDDFFFCFCFCFF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF58ACD1FF3483BAFF94BD 31FF93BC30FFD8C86BFFFFC36EFFFFC26CFFFFC16BFFFFC069FF9ECCB4FF5EDE - F8FF85E5F9FF226294FF4B8FC1FF1E5C8DFF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + F8FF85E5F9FF226294FF4B8FC1FF1E5C8DFF0000000000000052B1B1B1FF8C8C + 8BFF707070FF949494FF949494FFECECECFFEFEFEEFF969696FF8D8D8DFFF6F6 + F6FF747474FFE7E7E7FF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF58ADD3FF3483BAFFFFC8 74FFFFC773FFFFC772FFFFC571FFFFC470FFFFC36FFFFFC36EFF6EDEEEFF8DE7 - FAFF8BE7FAFF246598FF4C92C2FF205F91FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + FAFF8BE7FAFF246598FF4C92C2FF205F91FF0000000000000052EAEAEAFFECEC + EBFFEEEEEDFFEAEAE9FFF2F2F1FFF3F3F2FFF4F4F4FFF5F5F5FFF6F6F6FFF7F7 + F6FFEFEFEFFFFAFAFAFF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF59B0D4FF4294C3FF3483 BAFF3483BAFF3381B8FF327EB6FF317CB3FF2F79AFFF2D76ACFF2B73A8FF296F - A4FF286CA0FF367BADFF4E96C4FF226294FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + A4FF286CA0FF367BADFF4E96C4FF226294FF0000000000000052EAEAE9FFE9E9 + E8FFE8E8E7FFE6E6E5FFEFEFEFFFF1F1F0FFF2F2F1FFF3F3F2FFF3F3F3FFEEEE + EEFFE9E9E9FFF9F9F9FF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF5DB3D6FF5AB0D4FF59AF D4FF58AED3FF5AADD3FF5AADD2FF5AAAD1FF59A9D0FF57A7CFFF55A3CDFF52A0 - CBFF519EC9FF519CC9FF539CC8FF246598FF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + CBFF519EC9FF519CC9FF539CC8FF246598FF0000000000000052F0EFEFFFE4E4 + E3FFE7E6E5FFEAEAE9FFEDEDECFFEEEEEDFFEFEFEEFFF0F0EFFFF0F0EFFFEEEE + EEFFEEEEEEFFF8F8F8FF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003483BAFF3483BAFF3483BAFF3483 BAFF3483BAFF3483BAFF3483BAFF3381B8FF327EB6FF317CB3FF2F79AFFF2D76 - ACFF2B73A8FF296FA4FF286CA0FF26699CFF0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + ACFF2B73A8FF296FA4FF286CA0FF26699CFF0000000000000052F9F8F8FFF2F2 + F2FFF4F3F3FFF4F4F4FFF5F5F5FFF6F6F6FFF7F7F6FFF7F7F7FFF7F7F7FFF7F7 + F7FFF7F7F7FFFBFBFBFF00000052000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000001F000000520000 + 0052000000520000005200000052000000520000005200000052000000520000 + 0052000000520000005200000024000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -8149,6 +8159,9 @@ object MainForm: TMainForm object CopygriddataasSQL2: TMenuItem Action = actCopyAsSQL end + object CopyselectedrowsasLaTextable2: TMenuItem + Action = actCopyAsLaTex + end end object Exportdata2: TMenuItem Action = actExportData @@ -8257,7 +8270,8 @@ object MainForm: TMainForm DefaultExt = 'csv' Filter = 'CSV-Files (*.csv)|*.csv|Hypertext-Files (*.html)|*.html|XML-File' + - 's (*.xml)|*.xml|SQL script (*.sql)|*.sql' + 's (*.xml)|*.xml|SQL script (*.sql)|*.sql|LaTeX table (*.latex)|*' + + '.latex' Options = [ofOverwritePrompt, ofEnableSizing] OnTypeChange = SaveDialogExportDataTypeChange Left = 40 diff --git a/source/main.pas b/source/main.pas index 5d6c32e8..91916c73 100644 --- a/source/main.pas +++ b/source/main.pas @@ -486,6 +486,9 @@ type btnPreviewClose: TToolButton; actDataSaveBlobToFile: TAction; SaveBLOBtofile1: TMenuItem; + actCopyAsLaTex: TAction; + CopyselectedrowsasLaTextable1: TMenuItem; + CopyselectedrowsasLaTextable2: TMenuItem; procedure actCreateDBObjectExecute(Sender: TObject); procedure menuConnectionsPopup(Sender: TObject); procedure actExitApplicationExecute(Sender: TObject); @@ -781,6 +784,7 @@ type procedure spltPreviewMoved(Sender: TObject); procedure actDataSaveBlobToFileExecute(Sender: TObject); procedure DataGridColumnResize(Sender: TVTHeader; Column: TColumnIndex); + procedure actCopyAsLaTexExecute(Sender: TObject); private LastHintMousepos: TPoint; LastHintControlIndex: Integer; @@ -2321,12 +2325,32 @@ begin end; + +procedure TMainForm.actCopyAsLaTexExecute(Sender: TObject); +var + S: TMemoryStream; +begin + // Copy data in focused grid as LaTex table + Screen.Cursor := crHourglass; + S := TMemoryStream.Create; + try + GridToLatex(ActiveGrid, S); + StreamToClipboard(S, S, True); + finally + ShowStatusMsg('Freeing data...'); + S.Free; + ShowStatusMsg; + Screen.Cursor := crDefault; + end; +end; + + procedure TMainForm.actExportDataExecute(Sender: TObject); var Dialog: TSaveDialog; FS: TFileStream; begin - // Save data in current dataset as CSV, HTML or XML + // Save data in current dataset into various text file formats Dialog := SaveDialogExportData; Dialog.FileName := BestTableName(GridResult(ActiveGrid)); Dialog.Title := 'Export result set from '+Dialog.Filename+'...'; @@ -2338,6 +2362,7 @@ begin 2: GridToHtml(ActiveGrid, FS); 3: GridToXml(ActiveGrid, FS); 4: GridToSql(ActiveGrid, FS); + 5: GridToLaTex(ActiveGrid, FS); end; finally ShowStatusMsg('Freeing data...'); @@ -4201,6 +4226,7 @@ begin actCopyAsHTML.Enabled := inDataOrQueryTabNotEmpty; actCopyAsXML.Enabled := inDataOrQueryTabNotEmpty; actCopyAsSQL.Enabled := inDataOrQueryTabNotEmpty; + actCopyAsLaTex.Enabled := inDataOrQueryTabNotEmpty; actExportData.Enabled := inDataOrQueryTabNotEmpty; actDataSetNull.Enabled := inDataOrQueryTab and Assigned(Results) and Assigned(Grid.FocusedNode); @@ -5069,6 +5095,7 @@ begin 2: DefaultExt := 'html'; 3: DefaultExt := 'xml'; 4: DefaultExt := 'sql'; + 5: DefaultExt := 'latex'; end; end; end;