Implement LaTeX output for "Copy as" actions. Code parts from brampton. Fixes issue #2020.

This commit is contained in:
Ansgar Becker
2010-06-18 16:32:20 +00:00
parent 875d8a78de
commit 163a8c13d6
4 changed files with 118 additions and 51 deletions

BIN
res/icons/latex.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

View File

@@ -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.

View File

@@ -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

View File

@@ -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;