From: Vadim Zeitlin Date: Sat, 8 Dec 2012 00:37:21 +0000 (+0000) Subject: Add a wxHtmlTag helper parsing both absolute values and percents. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/e0e4b2b0e95c737ac7de5d10cf701ad74e34a124 Add a wxHtmlTag helper parsing both absolute values and percents. This allows to avoid some code duplication in different handlers. Closes #14868. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73142 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/html/htmltag.h b/include/wx/html/htmltag.h index 35ab27a6c5..4ff2164beb 100644 --- a/include/wx/html/htmltag.h +++ b/include/wx/html/htmltag.h @@ -104,6 +104,8 @@ public: // Convenience functions: bool GetParamAsColour(const wxString& par, wxColour *clr) const; bool GetParamAsInt(const wxString& par, int *clr) const; + bool GetParamAsIntOrPercent(const wxString& param, + int* value, bool& isPercent) const; // Scans param like scanf() functions family does. // Example : ScanParam("COLOR", "\"#%X\"", &clr); diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 7bf1fa8d2e..bf5b298a46 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -587,6 +587,38 @@ bool wxHtmlTag::GetParamAsInt(const wxString& par, int *clr) const return true; } +bool +wxHtmlTag::GetParamAsIntOrPercent(const wxString& par, + int* value, + bool& isPercent) const +{ + const wxString param = GetParam(par); + if ( param.empty() ) + return false; + + wxString num; + if ( param.EndsWith("%", &num) ) + { + isPercent = true; + } + else + { + isPercent = false; + num = param; + } + + long lValue; + if ( !num.ToLong(&lValue) ) + return false; + + if ( lValue > INT_MAX || lValue < INT_MIN ) + return false; + + *value = static_cast(lValue); + + return true; +} + wxString wxHtmlTag::GetAllParams() const { // VS: this function is for backward compatibility only, diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp index 87aa320f80..6394fa1b2b 100644 --- a/src/html/m_image.cpp +++ b/src/html/m_image.cpp @@ -676,16 +676,16 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA") if (tag.HasParam(wxT("WIDTH"))) { - wxString param = tag.GetParam(wxT("WIDTH")); - wxSscanf(param.c_str(), wxT("%i"), &w); - if (param.EndsWith(wxT("%"))) { - if (w < 0) - w = 0; - else if (w > 100) - w = 100; - wpercent = true; + if (tag.GetParamAsIntOrPercent(wxT("WIDTH"), &w, wpercent)) + { + if (wpercent) + { + if (w < 0) + w = 0; + else if (w > 100) + w = 100; + } } - } if (tag.HasParam(wxT("HEIGHT"))) diff --git a/src/html/m_tables.cpp b/src/html/m_tables.cpp index 825329b2ca..1b96963be3 100644 --- a/src/html/m_tables.cpp +++ b/src/html/m_tables.cpp @@ -702,19 +702,18 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") { if (tag.HasParam(wxT("WIDTH"))) { - wxString wd = tag.GetParam(wxT("WIDTH")); - - if (!wd.empty() && wd[wd.length()-1] == wxT('%')) - { - int width = 0; - wxSscanf(wd.c_str(), wxT("%i%%"), &width); - m_Table->SetWidthFloat(width, wxHTML_UNITS_PERCENT); - } - else + int width = 0; + bool wpercent = false; + if (tag.GetParamAsIntOrPercent(wxT("WIDTH"), &width, wpercent)) { - int width = 0; - wxSscanf(wd.c_str(), wxT("%i"), &width); - m_Table->SetWidthFloat((int)(m_WParser->GetPixelScale() * width), wxHTML_UNITS_PIXELS); + if (wpercent) + { + m_Table->SetWidthFloat(width, wxHTML_UNITS_PERCENT); + } + else + { + m_Table->SetWidthFloat((int)(m_WParser->GetPixelScale() * width), wxHTML_UNITS_PIXELS); + } } } else