]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmlcell.cpp
Update bug in wxListCtrl,
[wxWidgets.git] / src / html / htmlcell.cpp
index 6979805f45fd302dc65e6dc5dad703716a108a75..f9f50db98f1534d5481509e73380945766220aac 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "wx/wxprec.h"
 
+#include "wx/defs.h"
 #if wxUSE_HTML
 
 #ifdef __BORDLANDC__
 // wxHtmlCell
 //-----------------------------------------------------------------------------
 
+wxHtmlCell::wxHtmlCell() : wxObject() 
+{
+    m_Next = NULL; 
+    m_Parent = NULL; 
+    m_Width = m_Height = m_Descent = 0; 
+    m_CanLiveOnPagebreak = TRUE;
+    m_Link = NULL;
+}
+
+wxHtmlCell::~wxHtmlCell() 
+{
+    if (m_Link) delete m_Link; 
+    if (m_Next) delete m_Next;
+}
+
 
 void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
                               bool WXUNUSED(left),
                               bool WXUNUSED(middle),
                               bool WXUNUSED(right))
 {
-    wxString lnk = GetLink(x, y);
-    if (lnk != wxEmptyString)
+    wxHtmlLinkInfo *lnk = GetLink(x, y);
+    if (lnk != NULL)
         ((wxHtmlWindow*)parent) -> OnLinkClicked(lnk);
         // note : this overcasting is legal because parent is *always* wxHtmlWindow
 }
@@ -48,7 +64,6 @@ void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
 
 bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
 {
-
     if ((!m_CanLiveOnPagebreak) && 
                 m_PosY < *pagebreak && m_PosY + m_Height > *pagebreak) {
         *pagebreak = m_PosY;
@@ -64,6 +79,13 @@ bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
 
 
 
+void wxHtmlCell::SetLink(const wxHtmlLinkInfo& link) 
+{
+    if (m_Link) delete m_Link;
+    m_Link = new wxHtmlLinkInfo(link);
+}
+
+
 
 //-----------------------------------------------------------------------------
 // wxHtmlWordCell
@@ -72,11 +94,27 @@ bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
 wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell()
 {
     m_Word = word;
-    m_Word.Replace("&nbsp;", " ", TRUE);
-    m_Word.Replace("&quot;", "\"", TRUE);
-    m_Word.Replace("&lt;", "<", TRUE);
-    m_Word.Replace("&gt;", ">", TRUE);
-    m_Word.Replace("&amp;", "&", TRUE);
+    
+    if (m_Word.Find(wxT('&')) != -1) 
+    {
+        static wxChar* substitutions[][3] = 
+                {
+                    { wxT("&nbsp;"), wxT("&nbsp "), wxT(" ") },
+                    { wxT("&copy;"), wxT("&copy "), wxT("(c)") },
+                    { wxT("&quot;"), wxT("&quot "), wxT("\"") },
+                    { wxT("&lt;"), wxT("&lt "), wxT("<") },
+                    { wxT("&gt;"), wxT("&gt "), wxT(">") },
+                    { wxT("&amp;"), wxT("&amp "), wxT("&")  /*this one should be last one*/ },
+                    { NULL, NULL, NULL }
+                };
+
+        for (int i = 0; substitutions[i][0] != NULL; i++) 
+        {
+            m_Word.Replace(substitutions[i][0], substitutions[i][2], TRUE);
+            m_Word.Replace(substitutions[i][1], substitutions[i][2], TRUE);
+        }
+    }
+
     dc.GetTextExtent(m_Word, &m_Width, &m_Height, &m_Descent);
     SetCanLiveOnPagebreak(FALSE);
 }
@@ -327,7 +365,7 @@ void wxHtmlContainerCell::DrawInvisible(wxDC& dc, int x, int y)
 
 
 
-wxString wxHtmlContainerCell::GetLink(int x, int y) const
+wxHtmlLinkInfo *wxHtmlContainerCell::GetLink(int x, int y) const
 {
     wxHtmlCell *c = m_Cells;
     int cx, cy, cw, ch;
@@ -339,7 +377,7 @@ wxString wxHtmlContainerCell::GetLink(int x, int y) const
             return c -> GetLink(x - cx, y - cy);
         c = c -> GetNext();
     }
-    return wxEmptyString;
+    return NULL;
 }
 
 
@@ -359,33 +397,33 @@ void wxHtmlContainerCell::InsertCell(wxHtmlCell *f)
 
 void wxHtmlContainerCell::SetAlign(const wxHtmlTag& tag)
 {
-    if (tag.HasParam("ALIGN")) {
-        wxString alg = tag.GetParam("ALIGN");
+    if (tag.HasParam(wxT("ALIGN"))) {
+        wxString alg = tag.GetParam(wxT("ALIGN"));
         alg.MakeUpper();
-        if (alg == "CENTER")
+        if (alg == wxT("CENTER"))
             SetAlignHor(wxHTML_ALIGN_CENTER);
-        else if (alg == "LEFT")
+        else if (alg == wxT("LEFT"))
             SetAlignHor(wxHTML_ALIGN_LEFT);
-        else if (alg == "RIGHT")
+        else if (alg == wxT("RIGHT"))
             SetAlignHor(wxHTML_ALIGN_RIGHT);
     }
 }
 
 
 
-void wxHtmlContainerCell::SetWidthFloat(const wxHtmlTag& tag)
+void wxHtmlContainerCell::SetWidthFloat(const wxHtmlTag& tag, double pixel_scale)
 {
-    if (tag.HasParam("WIDTH")) {
+    if (tag.HasParam(wxT("WIDTH"))) {
         int wdi;
-        wxString wd = tag.GetParam("WIDTH");
+        wxString wd = tag.GetParam(wxT("WIDTH"));
 
-        if (wd[wd.Length()-1] == '%') {
-            sscanf(wd.c_str(), "%i%%", &wdi);
+        if (wd[wd.Length()-1] == wxT('%')) {
+            wxSscanf(wd.c_str(), wxT("%i%%"), &wdi);
             SetWidthFloat(wdi, wxHTML_UNITS_PERCENT);
         }
         else {
-            sscanf(wd.c_str(), "%i", &wdi);
-            SetWidthFloat(wdi, wxHTML_UNITS_PIXELS);
+            wxSscanf(wd.c_str(), wxT("%i"), &wdi);
+            SetWidthFloat((int)(pixel_scale * (double)wdi), wxHTML_UNITS_PIXELS);
         }
     }
 }
@@ -462,13 +500,13 @@ void wxHtmlColourCell::DrawInvisible(wxDC& dc, int x, int y)
 
 void wxHtmlFontCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
 {
-    dc.SetFont(*m_Font);
+    dc.SetFont(m_Font);
     wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
 }
 
 void wxHtmlFontCell::DrawInvisible(wxDC& dc, int x, int y)
 {
-    dc.SetFont(*m_Font);
+    dc.SetFont(m_Font);
     wxHtmlCell::DrawInvisible(dc, x, y);
 }