Add action CopyTableToHtml

Копирование результатов запроса в буфер обмена в виде таблицы html.
This commit is contained in:
lsv 2023-02-02 10:36:55 +05:00
parent 8771f32058
commit 83e372aae5
11 changed files with 168 additions and 66 deletions

View file

@ -1293,66 +1293,70 @@ void ctlSQLBox::OnMarginClick(wxStyledTextEvent &event)
event.Skip();
}
wxString ctlSQLBox::TextToHtml(int start, int end) {
wxColor frColor[40];
wxString str;
wxColour frc = settings->GetSQLBoxColourForeground();
wxString selText = GetTextRange(start,end);
if (settings->GetSQLBoxUseSystemForeground())
{
frc = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
}
for (int i = 0; i < 34; ++i)
{
frColor[i] = StyleGetForeground(i);
if (i > 0 && i < 12)
//StyleSetForeground(i, settings->GetSQLBoxColour(i));
frColor[i] = StyleGetForeground(i);
else
frColor[i] = frc;
//StyleSetBackground(i, bgColor);
//StyleSetFont(i, fntSQLBox);
}
//<h1 style="color:blue;">
int endp = end;
int startp = start;
wxString prevColor = wxEmptyString;
wxString tColor;
wxFont fntSQLBox = settings->GetSQLFont();
wxString fontName = fntSQLBox.GetFaceName();
wxString sz;
sz.Printf("%d", fntSQLBox.GetPixelSize().GetHeight());
str = wxT("<div style=\"font-family: ") + fontName + wxT("; font-size: " + sz + "px\"><font>");
int k = 0;
int l = 1;
while (startp < endp) {
int st = GetStyleAt(startp);
if (st < 34) tColor = frColor[st].GetAsString(wxC2S_HTML_SYNTAX);
if (prevColor != tColor) {
str = str + wxT("</font><font color=\"") + tColor + wxT("\">");
prevColor = tColor;
}
//str.append(str[k].GetValue());
l = 1;
if (!selText[k].IsAscii()) l++;
int s = 0;
char c = selText[k].GetValue();
if (c == '\r') { startp = startp + l; k++; continue; };
if (c == '\n') { str += wxT("<br>"); startp = startp + l; k++; continue; };
if (c == 9) s = 5;
if (c == 32) s = 1;
if (s > 0) for (int tt = 0; tt < s; tt++) str += wxT("&nbsp;");
else str += selText[k];
startp = startp + l; k++;
}
str = str + wxT("</font></div>");
return str;
}
void ctlSQLBox::Copy() {
wxString selText = GetSelectedText();
if (!selText.IsEmpty())
{
wxColor frColor[40];
wxString str;
wxColour frc = settings->GetSQLBoxColourForeground();
if (settings->GetSQLBoxUseSystemForeground())
{
frc = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
}
for (int i = 0; i < 34; ++ i )
{
frColor[i]=StyleGetForeground(i);
if (i > 0 && i < 12)
//StyleSetForeground(i, settings->GetSQLBoxColour(i));
frColor[i]=StyleGetForeground(i);
else
frColor[i]=frc;
//StyleSetBackground(i, bgColor);
//StyleSetFont(i, fntSQLBox);
}
//<h1 style="color:blue;">
int endp=GetSelectionEnd();
int startp=GetSelectionStart();
wxString prevColor=wxEmptyString;
wxString tColor;
wxFont fntSQLBox = settings->GetSQLFont();
wxString fontName = fntSQLBox.GetFaceName();
wxString sz;
sz.Printf("%d",fntSQLBox.GetPixelSize().GetHeight() );
str=wxT("<div style=\"font-family: ")+fontName+wxT("; font-size: "+sz+"px\"><font>");
int k=0;
int l=1;
while (startp<endp) {
int st = GetStyleAt(startp);
if (st<34) tColor=frColor[st].GetAsString(wxC2S_HTML_SYNTAX);
if (prevColor!=tColor) {
str=str+wxT("</font><font color=\"")+tColor+wxT("\">");
prevColor=tColor;
}
//str.append(str[k].GetValue());
l=1;
if (!selText[k].IsAscii()) l++;
int s=0;
char c = selText[k].GetValue();
if (c == '\r') { startp = startp + l; k++; continue; };
if (c == '\n') { str += wxT("<br>"); startp = startp + l; k++; continue; };
if (c==9) s=5;
if (c==32) s=1;
if (s>0) for (int tt=0;tt<s;tt++) str+=wxT("&nbsp;");
else str+=selText[k];
startp=startp+l; k++;
}
str=str+wxT("</font></div>");
str = TextToHtml(GetSelectionStart(), GetSelectionEnd());
if (wxTheClipboard->Open())
{

View file

@ -21,6 +21,7 @@
#include "frm/frmExport.h"
#include <wx/regex.h>
#include "ctl/ctlSQLResult.h"
#include "utils/misc.h"
#define EXTRAEXTENT_HEIGHT 6
#define EXTRAEXTENT_WIDTH 6
@ -390,6 +391,72 @@ void selMerge::setArrayColumns(int row, wxArrayInt& columns) {
columns.Add(k);
}
};
int ctlSQLGrid::CopyTableToHtml(wxString htmlquery) {
wxString htm = "<html>"
"<head>"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n"
"<style type = \"text/css\">\n"
"#maket { width: 90%; border-collapse: collapse;}\n"
"TD { vertical-align: top; border: 1px solid; padding: 2px; }\n"
;
int s = htmlquery.find('"');
int e = htmlquery.find('"', s + 1);
if (s>0 && e>s) {
wxString fnt = htmlquery.SubString(s + 1, e - 1);
htm += "PRE { " + fnt + ";}\n";
}
if (GetSelectedCols().GetCount())
{
wxArrayInt cols = GetSelectedCols();
size_t numRows = GetNumberRows();
wxString bg = GetGridRowLabelWindow()->GetBackgroundColour().GetAsString(wxC2S_HTML_SYNTAX);
wxString head;
head= wxString::Format("<tr style=\"font-weight: bold; background: %s;\">", bg);
htm += wxString::Format("TD#cn { width: %dpx;font-weight: bold; background: %s;}\n", GetRowLabelSize(), bg);
head += wxString::Format("<td id=\"cn\"></td>");
for (int i = 0; i < cols.Count(); i++)
{
long columnPos = cols.Item(i);
int w = GetColWidth(columnPos);
htm += wxString::Format("TD#c%d { width: %dpx;}\n",i,w);
head += wxString::Format("<td id=\"c%d\">%s</td>", i, GetColumnName(columnPos));
}
head += "</tr>\n";
htm += "</style></head><body>";
htm += htmlquery;
htm += "<br><table cellspacing=\"0\" cellpadding=\"0\" id=\"maket\">";
// AppendColumnHeader(str, cols);
htm += head;
for (int i = 0; i < numRows; i++)
{
if (GetRowSize(i) == 0) continue;
htm+= "<tr>\n";
htm += wxString::Format("<td id=\"cn\"><pre>%d</pre></td>",i+1);
for (int c = 0; c < cols.Count(); c++) {
wxString text = GetCellValue(i, cols[c]);
htm += wxString::Format("<td id=\"c%d\"><pre>%s</pre></td>", c, escapeHtml(text,true));
}
htm += "</tr>\n";
//wxString cname = GetColumnName(cols[c]);
}
htm += "</table>";
}
else {
htm += "</style></head><body>"+ htmlquery+"</body></html>";
}
if (wxTheClipboard->Open())
{
wxDataObjectComposite* dataobj = new wxDataObjectComposite();
dataobj->Add(new wxTextDataObject(htm));
dataobj->Add(new wxHTMLDataObject(htm));
wxTheClipboard->SetData(dataobj);
wxTheClipboard->Close();
}
return 0;
}
int ctlSQLGrid::Copy(int gensql)
{
wxString str,tmp,linedelim="";

View file

@ -24,6 +24,7 @@
#include "utils/csvfiles.h"
#include "log/StorageModel.h"
#include "utils/utffile.h"
#include "utils/misc.h"
#include <wx/arrimpl.cpp>
#ifdef WIN32
@ -113,13 +114,6 @@ void frmLog::OnChangeSmart(wxCommandEvent& event) {
my_view->ModUserFilter("", "ChangeFilter", listUserFilter, contentFilter);
}
}
wxString escapeHtml(wxString text) {
text.Replace("&", "&amp;");
text.Replace("<", "&lt;");
text.Replace(">", "&gt;");
text.Replace("\n", "&para;<br>");
return text;
}
void frmLog::OnSendMail(wxCommandEvent& event) {
//wxMessageBox("send mail");
wxDataViewItem item;
@ -163,8 +157,8 @@ void frmLog::OnSendMail(wxCommandEvent& event) {
wxString r;
for (int i = 0; i < a.Count(); i++) {
templat = l;
le = escapeHtml(a[i++]);
r = escapeHtml(a[i]);
le = escapeHtml(a[i++],false);
r = escapeHtml(a[i],false);
int co = templat.Replace("$1", le);
co += templat.Replace("$2", r);
html.Append(templat);

View file

@ -122,6 +122,7 @@ BEGIN_EVENT_TABLE(frmQuery, pgFrame)
EVT_MENU(MNU_COPY_INSERT, frmQuery::OnCopy_Insert)
EVT_MENU(MNU_COPY_INLIST, frmQuery::OnCopy_InList)
EVT_MENU(MNU_COPY_WHERELIST, frmQuery::OnCopy_WhereList)
EVT_MENU(MNU_COPY_TABLEHTML, frmQuery::OnCopy_TableToHtml)
EVT_MENU(MNU_CLEAR_FILTER, frmQuery::OnClear_Filter)
EVT_MENU(MNU_CHECK_COLUMN_DATE, frmQuery::OnCheck_Column_Date)
EVT_MENU(MNU_COPY_LISTCOLTYPE, frmQuery::OnCopy_NameTypeCols)
@ -1695,10 +1696,14 @@ void frmQuery::OnCopy(wxCommandEvent &ev)
{
wxWindow *wnd = currentControl();
if (wnd == sqlQuery)
if (wnd == sqlQuery) {
sqlQuery->Copy();
else if (wnd == msgResult)
SetStatusText("Select query copy.", STATUSPOS_MSGS);
}
else if (wnd == msgResult) {
msgResult->Copy();
SetStatusText("select msgResult copy.", STATUSPOS_MSGS);
}
else if (wnd == msgHistory)
msgHistory->Copy();
else if (wnd == scratchPad)
@ -1712,6 +1717,7 @@ void frmQuery::OnCopy(wxCommandEvent &ev)
if (obj == sqlResult)
{
sqlResult->Copy(0);
SetStatusText("Result query copy.", STATUSPOS_MSGS);
break;
}
obj = obj->GetParent();
@ -2182,6 +2188,7 @@ void frmQuery::OnLabelRightClick(wxGridEvent &event)
xmenu->Append(MNU_COPY_LISTCOLTYPE, _("List columns header"), _("Copy list columns header"));
xmenu->Append(MNU_COPY_INLIST, _("IN list format copy"), _("Copy In list format."));
xmenu->Append(MNU_COPY_WHERELIST, _("WHERE list format copy"), _("Copy where list format."));
xmenu->Append(MNU_COPY_TABLEHTML, _("Copy table html format"), _("Copy table html format."));
xmenu->AppendSeparator();
xmenu->Append(MNU_AUTOCOLSPLOT, _("Draw plot LY(bar) or LXY or XYYY..."), _("Draw plot LY(bar) LXY or XYYY..."));
xmenu->Append(MNU_SUMMARY_COL, _("Summary"), _("Summary selected cells."));
@ -2190,6 +2197,7 @@ void frmQuery::OnLabelRightClick(wxGridEvent &event)
bool selcol = sqlResult->GetSelectedCols().GetCount() > 0;
xmenu->Enable(MNU_CHECK_COLUMN_DATE, selcol);
xmenu->Enable(MNU_COPY_LISTCOLTYPE, selcol);
xmenu->Enable(MNU_COPY_TABLEHTML, selcol);
xmenu->Enable(MNU_AUTOCOLSPLOT, sqlResult->IsSelection());
xmenu->Enable(MNU_SUMMARY_COL, sqlResult->IsSelection());
xmenu->Enable(MNU_COPY_INLIST, sqlResult->IsSelection());
@ -2239,6 +2247,23 @@ void frmQuery::OnCopy_WhereList(wxCommandEvent& ev)
SetStatusText(s, STATUSPOS_MSGS);
}
}
void frmQuery::OnCopy_TableToHtml(wxCommandEvent& ev)
{
// if (currentControl() == sqlResult)
{
wxString s = wxT("Table html format copy buffer.");
wxString q = sqlResult->sqlquerytext;
if (q.IsEmpty()) return;
ctlSQLBox *box = new ctlSQLBox(sqlNotebook, CTL_SQLQUERY, wxDefaultPosition, wxSize(0,0), wxTE_MULTILINE | wxTE_RICH2);
box->SetText(q);
box->Colourise(0, box->GetTextLength());
wxString html = box->TextToHtml(0, box->GetTextLength());
delete box;
sqlResult->CopyTableToHtml(html);
SetStatusText(s, STATUSPOS_MSGS);
}
}
void frmQuery::OnCellLeftDClick(wxGridEvent &event)
{
int row=event.GetRow();

View file

@ -51,6 +51,7 @@ public:
void Create(wxWindow *parent, wxWindowID id = -1, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = 0);
void HighlightBrace(int lb, int rb);
void SetDatabase(pgConn *db);
wxString TextToHtml(int start, int end);
void Copy();
void OnKeyDown(wxKeyEvent &event);
void OnAutoComplete(wxCommandEvent &event);

View file

@ -30,6 +30,7 @@ public:
{
return false;
}
int CopyTableToHtml(wxString htmlquery);
int Copy(int gensql);
virtual bool CheckRowPresent(int row)

View file

@ -217,6 +217,7 @@ private:
void OnCopy_Insert(wxCommandEvent &event);
void OnCopy_InList(wxCommandEvent& event);
void OnCopy_WhereList(wxCommandEvent& event);
void OnCopy_TableToHtml(wxCommandEvent& ev);
void OnClear_Filter(wxCommandEvent &event);
void OnCopy_NameTypeCols(wxCommandEvent& ev);
void OnCheck_Column_Date(wxCommandEvent& ev);

View file

@ -80,6 +80,7 @@ enum
MNU_COPY_INLIST,
MNU_COPY_LISTCOLTYPE,
MNU_COPY_WHERELIST,
MNU_COPY_TABLEHTML,
MNU_CLEAR_FILTER,
MNU_CHECK_COLUMN_DATE,
MNU_AUTOCOLSPLOT,

View file

@ -100,6 +100,7 @@ extern sysSettings *settings;
// Conversions
wxString BoolToStr(bool value); // english; used for config values
wxString DateToAnsiStr(const wxDateTime &datetime);
wxString escapeHtml(wxString text, bool pre);
bool StrToBool(const wxString &value); // english
long StrToLong(const wxString &value);

View file

@ -85,6 +85,13 @@ wxString BoolToStr(bool value)
return value ? wxT("true") : wxT("false");
}
wxString escapeHtml(wxString text, bool pre) {
text.Replace("&", "&amp;");
text.Replace("<", "&lt;");
text.Replace(">", "&gt;");
if (!pre) text.Replace("\n", "&para;<br>");
return text;
}
bool StrToBool(const wxString &value)

Binary file not shown.