diff --git a/ctl/ctlSQLBox.cpp b/ctl/ctlSQLBox.cpp index 6e5eec4..26c8eae 100644 --- a/ctl/ctlSQLBox.cpp +++ b/ctl/ctlSQLBox.cpp @@ -30,6 +30,7 @@ #include "utils/FormatterSQL.h" #include "utils/dlgTransformText.h" #include "utils/TableColsMap.h" +#include "utils/PreviewHtml.h" #include "wx/display.h" wxString ctlSQLBox::sqlKeywords; @@ -662,18 +663,7 @@ void ctlSQLBox::OnFuncHelp(wxCommandEvent& ev) { for (int i = tmp.Len()-1; i >=0; i--) key+=tmp[i]; } delete m_PopupHelp; - wxSize rr(450, 370); - m_PopupHelp = new popuphelp(this->GetParent(), key, fh,p,rr); - if (m_PopupHelp && m_PopupHelp->IsValid() && rr != m_PopupHelp->GetSizePopup()) { - // recreate with new size - rr = m_PopupHelp->GetSizePopup(); - delete m_PopupHelp; - m_PopupHelp = new popuphelp(this->GetParent(), key, fh, p, rr); - - } - if (m_PopupHelp && m_PopupHelp->IsValid()) { - //m_PopupHelp->UpdateWindowUI(true); - wxSize top_sz=m_PopupHelp->GetSizePopup(); + // screen size wxPoint posScreen; wxSize sizeScreen; const int displayNum = wxDisplay::GetFromPoint(p); @@ -689,6 +679,23 @@ void ctlSQLBox::OnFuncHelp(wxCommandEvent& ev) { posScreen = wxPoint(0, 0); sizeScreen = wxGetDisplaySize(); } + + wxSize rr(450, 370); + bool bigtext=key.Len() > MAX_TEXT_LEN_COLORIZE; + if (bigtext) { + rr.x=(int) sizeScreen.x*0.8;rr.y=sizeScreen.y*0.7; + } + m_PopupHelp = new popuphelp(this->GetParent(), key, fh,p,rr); + if (m_PopupHelp && m_PopupHelp->IsValid() && rr != m_PopupHelp->GetSizePopup() && !bigtext) { + // recreate with new size + rr = m_PopupHelp->GetSizePopup(); + delete m_PopupHelp; + m_PopupHelp = new popuphelp(this->GetParent(), key, fh, p, rr); + + } + if (m_PopupHelp && m_PopupHelp->IsValid()) { + //m_PopupHelp->UpdateWindowUI(true); + wxSize top_sz=m_PopupHelp->GetSizePopup(); wxSize top_new(top_sz); wxPoint oldp(p); if (p.x + top_new.x > sizeScreen.x) p.x = sizeScreen.x - top_new.x - 20; @@ -1809,8 +1816,9 @@ wxString ctlSQLBox::TextToHtml(int start, int end,bool isAddNewLine, const std:: wxString fontName = fntSQLBox.GetFaceName(); wxString sz; sz.Printf("%d", fntSQLBox.GetPixelSize().GetHeight()); - + int lenstr = selText.Length(); //str = wxT("
"); + str.Alloc(lenstr*2); str = wxString::Format("
", fontName, sz, fontName); int k = 0; int l = 1; @@ -1818,7 +1826,7 @@ wxString ctlSQLBox::TextToHtml(int start, int end,bool isAddNewLine, const std:: if (isAddNewLine) newline = L"\u2936
"; //if (isAddNewLine) newline = L"⤶
"; //if (isAddNewLine) newline = L"
\x0b78"; - int lenstr = selText.Length(); + int IndexObj=0; int pos=999999999; wxString obj; @@ -1829,7 +1837,9 @@ wxString ctlSQLBox::TextToHtml(int start, int end,bool isAddNewLine, const std:: int st = GetStyleAt(startp); if (st < 34) tColor = frColor[st].GetAsString(wxC2S_HTML_SYNTAX); if (prevColor != tColor) { - str = str + wxT("
"); + str+= wxT(""); prevColor = tColor; } //str.append(str[k].GetValue()); @@ -1866,7 +1876,7 @@ wxString ctlSQLBox::TextToHtml(int start, int end,bool isAddNewLine, const std:: str += lstr; lstr=""; } - str = str + wxT("
"); + str+= wxT("
"); return str; } void ctlSQLBox::Copy() { diff --git a/ctl/ctlSQLGrid.cpp b/ctl/ctlSQLGrid.cpp index 2229744..8b248cf 100644 --- a/ctl/ctlSQLGrid.cpp +++ b/ctl/ctlSQLGrid.cpp @@ -889,6 +889,13 @@ void ctlSQLGrid::OnShowPopup(wxThreadEvent& event) { bgColor = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); } bg = bgColor.GetAsString(wxC2S_HTML_SYNTAX); + long long lenstr=s.Len(); + bool bigtext=lenstr >MAX_TEXT_LEN_COLORIZE; + if (lenstr > MAX_TEXT_LEN_WARNING) { + wxString h = NumToStrHuman(wxLongLong(lenstr)); + if (wxMessageBox(wxString::Format(_("The line size is [ %s ] characters, do you want to continue?"),h ), _("Confirm"), wxYES_NO, this)!=wxYES) return; + + } // parse context wxRegEx r(L"(?im)(select|from|where|set|insert|into|delete)\\b", wxRE_NEWLINE); int cnt = 0; @@ -904,7 +911,7 @@ void ctlSQLGrid::OnShowPopup(wxThreadEvent& event) { } cnt = unic.size(); } - if (cnt >= 2) { + if (cnt >= 2 && !bigtext) { wxString q = s; wxString html; ctlSQLBox* box = new ctlSQLBox((wxWindow*) winMain, CTL_SQLQUERY, wxDefaultPosition, wxSize(0, 0), wxTE_MULTILINE | wxTE_RICH2); @@ -924,11 +931,32 @@ void ctlSQLGrid::OnShowPopup(wxThreadEvent& event) { s = tt; } delete m_Popup; + // screen size + wxPoint posScreen; + wxSize sizeScreen; + const int displayNum = wxDisplay::GetFromPoint(p); + if (displayNum != wxNOT_FOUND) + { + const wxRect rectScreen = wxDisplay(displayNum).GetGeometry(); + posScreen = rectScreen.GetPosition(); + sizeScreen = rectScreen.GetSize(); + } + else // outside of any display? + { + // just use the primary one then + posScreen = wxPoint(0, 0); + sizeScreen = wxGetDisplaySize(); + } + wxSize rr(350, 70); + + if (bigtext) { + rr.x=(int) sizeScreen.x*0.8;rr.y=sizeScreen.y*0.7; + } FunctionPGHelper fh(s); wxString key = "content"; m_Popup = new popuphelp(this, key, &fh, p, rr); - if (m_Popup && m_Popup->IsValid() && rr != m_Popup->GetSizePopup()) { + if (m_Popup && m_Popup->IsValid() && rr != m_Popup->GetSizePopup() && !bigtext) { // recreate with new size rr = m_Popup->GetSizePopup(); delete m_Popup; @@ -938,21 +966,6 @@ void ctlSQLGrid::OnShowPopup(wxThreadEvent& event) { if (m_Popup && m_Popup->IsValid()) { //m_PopupHelp->UpdateWindowUI(true); wxSize top_sz = m_Popup->GetSizePopup(); - wxPoint posScreen; - wxSize sizeScreen; - const int displayNum = wxDisplay::GetFromPoint(p); - if (displayNum != wxNOT_FOUND) - { - const wxRect rectScreen = wxDisplay(displayNum).GetGeometry(); - posScreen = rectScreen.GetPosition(); - sizeScreen = rectScreen.GetSize(); - } - else // outside of any display? - { - // just use the primary one then - posScreen = wxPoint(0, 0); - sizeScreen = wxGetDisplaySize(); - } wxSize top_new(top_sz); wxPoint oldp(p); if (p.x + top_new.x > sizeScreen.x) p.x = sizeScreen.x - top_new.x - 20; diff --git a/include/utils/PreviewHtml.h b/include/utils/PreviewHtml.h index 99c2aab..fa14a7d 100644 --- a/include/utils/PreviewHtml.h +++ b/include/utils/PreviewHtml.h @@ -1,6 +1,8 @@ #pragma once #include +#define MAX_TEXT_LEN_COLORIZE 32000 +#define MAX_TEXT_LEN_WARNING 500000 #define PREVIEW_SEP 1 #define PREVIEW_DIGITS 2 #define PREVIEW_WORD 4 @@ -8,9 +10,9 @@ #define PREVIEW_ENDFIELD 16 #define PREVIEW_ENDROW 32 #define PREVIEW_QUOTE 64 -#define CHKFLAG(val,par) ((val & par)>0) +#define CHKFLAG2(val,par) ((val & par)>0) enum class fmtpreview { - AUTO, AUTOVACCUM,CSV + AUTO, AUTOVACCUM,CSV,SIMPLE_TEXT }; struct Element { @@ -61,8 +63,8 @@ private: wxString tmp = savestr; tmp=escapeHtml(tmp,true); tmp.Replace(" ", " "); - if (CHKFLAG(flag, PREVIEW_ENDROW)) tmp = "
"; - if (CHKFLAG(flag, PREVIEW_DIGITS)) { + if (CHKFLAG2(flag, PREVIEW_ENDROW)) tmp = "
"; + if (CHKFLAG2(flag, PREVIEW_DIGITS)) { int l = savestr.Length(); if (l > 4 && !savestr.Contains('.')) { int dl = 3; @@ -92,7 +94,7 @@ private: tmp = t; } - if (CHKFLAG(flag, PREVIEW_QUOTE)) { + if (CHKFLAG2(flag, PREVIEW_QUOTE)) { wxString t = wxString::Format("%s",quotecolor,tmp); tmp = t; } @@ -111,7 +113,7 @@ private: bool f2 = is_what_find & 2; bool r1 = false; bool r2 = false; - if (f1 && CHKFLAG(t.flags, flag_find)) { + if (f1 && CHKFLAG2(t.flags, flag_find)) { r1 = true; } if (f2 && t.src==value_find ) { diff --git a/utils/PreviewHtml.cpp b/utils/PreviewHtml.cpp index c16796e..d12bf2a 100644 --- a/utils/PreviewHtml.cpp +++ b/utils/PreviewHtml.cpp @@ -71,13 +71,10 @@ wxString PreviewHtml::Preview(const wxString& txt, fmtpreview type) { iscsv = true; } else if (fmt == fmtpreview::AUTO) { - //CSVTokenizer tk(txt); - //int nfield = 0; - //while (tk.HasMoreTokens()) { - // wxString field = tk.GetNextToken(); - // nfield++; - //} - //if (nfield>1) iscsv = true; + if (txt.Len()>MAX_TEXT_LEN_COLORIZE) { + // simple format + fmt = fmtpreview::SIMPLE_TEXT; + } } // prepare csv std::vector strlist; @@ -124,6 +121,15 @@ wxString PreviewHtml::Preview(const wxString& txt, fmtpreview type) { int startstr = -1; while (pos < len) { c = tmpstr[pos++]; + if (fmt == fmtpreview::SIMPLE_TEXT) { + if (c=='&') html+="&"; + else if (c=='<') html+="<"; + else if (c=='>') html+=">"; + //else if (c==' ') html+=" "; + else if (c=='\n') html+="
"; + html+=c; + continue; + } bool isquote = c == '"'; if (quote) { if (prevchar == c && isquote) { @@ -220,7 +226,7 @@ wxString PreviewHtml::Preview(const wxString& txt, fmtpreview type) { while (pp > 0 && pp > p) { pp--; Element t2 = tokens[pp]; - if (CHKFLAG(t2.flags, PREVIEW_SEP) && t2.src.StartsWith(":")) { + if (CHKFLAG2(t2.flags, PREVIEW_SEP) && t2.src.StartsWith(":")) { // Right bound title if (pp - p > 0) { tokens[p].html = "" + tokens[p].html; @@ -239,7 +245,7 @@ wxString PreviewHtml::Preview(const wxString& txt, fmtpreview type) { wxString tit="field"+wxString::Format("%d",nf+1); if (strlist.size() == 26) tit = titles_log[nf]; tit = "" + tit + ""; - html=html+tit+"" + generateHtml() + ""; + html+=tit+"" + generateHtml() + ""; } else html+= generateHtml(); // tokens -> html diff --git a/utils/misc.cpp b/utils/misc.cpp index 31b4004..9af20da 100644 --- a/utils/misc.cpp +++ b/utils/misc.cpp @@ -196,9 +196,9 @@ wxString NumToStrHuman(wxLongLong value) { ddiv = ddiv / 1000; if (ddiv == 0) return wxEmptyString; } - if (ddiv == 1000000000) s = "Bi"; - else if (ddiv == 1000000) s = "Mi"; - else if (ddiv == 1000) s = "ths"; + if (ddiv == 1000000000) s = _("Bi"); + else if (ddiv == 1000000) s = _("Mi"); + else if (ddiv == 1000) s = _("ths"); else return wxEmptyString; wxLongLong m = value % ddiv; @@ -1483,3 +1483,28 @@ bool make_identifier(const wxString &strname, wxString &s, wxString &n, bool isl } else {if (islower) s=s.MakeLower();} return true; } +/* +class DirCopyTraverser: public wxDirTraverser { +public: + DirCopyTraverser(const wxString &destBase): m_destBase(destBase) {} + virtual wxDirTraverseResult OnFile(const wxString &file) wxOVERRIDE { + wxFileName srcFile(file); + //wxString relativePath=srcFile.GetPath(wxPATH_DOS,true); + srcFile.MakeRelativeTo(m_destBase); + wxString destFile=m_destBase+wxFileName::GetPathSeparator()+srcFile.GetFullName(); + wxFileName destDir(destFile); + destDir.RemoveLastDir(); + if (!destDir.DirExists()) destDir.Mkdir(wxS_DIR_DEFAULT,wxPATH_MKDIR_FULL); + if (!wxCopyFile(file,destFile,true)) { + wxLogError("Error copy file %s",file); + return wxDIR_STOP; + } + return wxDIR_CONTINUE; + } + virtual wxDirTraverseResult OnDir(const wxString &file) wxOVERRIDE { + return 0; + } +private: + wxString m_destBase; +} +*/ \ No newline at end of file