]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_pre.cpp
[ 1563875 ] wxTreeCtrl::FindItem asserts when item not found
[wxWidgets.git] / src / html / m_pre.cpp
index 5a5a3ecb0167c8e1fd4f7532dc34c0a1f8de4e88..675d916321d83829df17a55e1acd3193f3b0ae8b 100644 (file)
@@ -1,29 +1,23 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        m_pre.cpp
+// Name:        src/html/m_pre.cpp
 // Purpose:     wxHtml module for <PRE> ... </PRE> tag (code citation)
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Vaclav Slavik
 // Purpose:     wxHtml module for <PRE> ... </PRE> tag (code citation)
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Vaclav Slavik
-// Licence:     wxWindows Licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include "wx/wxprec.h"
 
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-#if wxUSE_HTML
-#ifdef __BORDLANDC__
-#pragma hdrstop
+#ifdef __BORLANDC__
+    #pragma hdrstop
 #endif
 
 #endif
 
+#if wxUSE_HTML && wxUSE_STREAMS
+
 #ifndef WXPRECOMP
 #ifndef WXPRECOMP
-#include "wx/wx.h"
 #endif
 
 #endif
 
-
 #include "wx/html/forcelnk.h"
 #include "wx/html/m_templ.h"
 
 #include "wx/html/forcelnk.h"
 #include "wx/html/m_templ.h"
 
 
 FORCE_LINK_ME(m_pre)
 
 
 FORCE_LINK_ME(m_pre)
 
-
-//-----------------------------------------------------------------------------
-// wxHtmlCodeCell
-//-----------------------------------------------------------------------------
-
-class wxHtmlPRECell : public wxHtmlCell
+// replaces '\t', ' ' and '\n' with HTML markup:
+static wxString LINKAGEMODE HtmlizeWhitespaces(const wxString& str)
 {
 {
-    private:
-        wxString** m_Text;
-                // list of wxString objects.
-        int m_LinesCnt;
-                // number of lines
-        int m_LineHeight;
-                // height of single line of text
-
-    public:
-        wxHtmlPRECell(const wxString& s, wxDC& dc);
-        ~wxHtmlPRECell();
-        void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
-};
-
-
-wxHtmlPRECell::wxHtmlPRECell(const wxString& s, wxDC& dc) : wxHtmlCell()
-{
-    wxStringTokenizer tokenizer(s, "\n");
-    wxString tmp;
-    long int x, z;
-    int i;
-
-    m_LineHeight = dc.GetCharHeight();
-    m_LinesCnt = 0;
-    m_Text = NULL;
-    m_Width = m_Height = 0;
-
-    i = 0;
-    while (tokenizer.HasMoreTokens()) {
-        if (i % 10 == 0) m_Text = (wxString**) realloc(m_Text, sizeof(wxString*) * (i + 10));
-        tmp = tokenizer.NextToken();
-        tmp.Replace(wxT("&copy;"), wxT("(c)"), TRUE);
-        tmp.Replace(wxT("&nbsp;"), wxT(" "), TRUE);
-        tmp.Replace(wxT("&quot;"), wxT("\""), TRUE);
-        tmp.Replace(wxT("&lt;"), wxT("<"), TRUE);
-        tmp.Replace(wxT("&gt;"), wxT(">"), TRUE);
-        tmp.Replace(wxT("&amp;"), wxT("&"), TRUE);
-        tmp.Replace(wxT("\t"), wxT("        "), TRUE);
-        tmp.Replace(wxT("\r"), wxT(""), TRUE);
-        m_Text[i++] = new wxString(tmp);
-
-        dc.GetTextExtent(tmp, &x, &z, &z);
-        if (x > m_Width) m_Width = x;
-        m_Height += m_LineHeight;
-        m_LinesCnt++;
+    wxString out;
+    size_t len = str.Len();
+    size_t linepos = 0;
+    for (size_t i = 0; i < len; i++)
+    {
+        switch (str[i])
+        {
+            case wxT('<'):
+                while (i < len && str[i] != wxT('>'))
+                {
+                    out << str[i++];
+                    linepos++;
+                }
+                out << wxT('>');
+                linepos++;
+                break;
+            case wxT(' '):
+                out << wxT("&nbsp;");
+                linepos++;
+                break;
+            case wxT('\n'):
+                out << wxT("<br>");
+                linepos = 0;
+                break;
+            case wxT('\t'):
+                {
+                    for (size_t j = 8 - linepos % 8; j > 0; j--)
+                        out << wxT("&nbsp;");
+                    linepos += 8 - linepos % 8;
+                }
+                break;
+            default:
+                out << str[i];
+                linepos++;
+                break;
+        }
     }
     }
+    return out;
 }
 
 
 }
 
 
-
-wxHtmlPRECell::~wxHtmlPRECell()
-{
-    for (int i = 0; i < m_LinesCnt; i++) delete m_Text[i];
-    free(m_Text);
-}
-
-
-void wxHtmlPRECell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
-{
-    for (int i = 0; i < m_LinesCnt; i++)
-        dc.DrawText(*(m_Text[i]), x + m_PosX, y + m_PosY + m_LineHeight * i);
-
-    wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
-}
-
-
-
-
 //-----------------------------------------------------------------------------
 // The list handler:
 //-----------------------------------------------------------------------------
 
 
 TAG_HANDLER_BEGIN(PRE, "PRE")
 //-----------------------------------------------------------------------------
 // The list handler:
 //-----------------------------------------------------------------------------
 
 
 TAG_HANDLER_BEGIN(PRE, "PRE")
+    TAG_HANDLER_CONSTR(PRE) { }
 
     TAG_HANDLER_PROC(tag)
     {
         wxHtmlContainerCell *c;
 
 
     TAG_HANDLER_PROC(tag)
     {
         wxHtmlContainerCell *c;
 
-        int fixed = m_WParser -> GetFontFixed(),
-            italic = m_WParser -> GetFontItalic(),
-            underlined = m_WParser -> GetFontUnderlined(),
-            bold = m_WParser -> GetFontBold(),
-            fsize = m_WParser -> GetFontSize();
-
-        m_WParser -> CloseContainer();
-        c = m_WParser -> OpenContainer();
-        c -> SetAlignHor(wxHTML_ALIGN_LEFT);
-        c -> SetIndent(m_WParser -> GetCharHeight(), wxHTML_INDENT_VERTICAL);
-
-        m_WParser -> SetFontUnderlined(FALSE);
-        m_WParser -> SetFontBold(FALSE);
-        m_WParser -> SetFontItalic(FALSE);
-        m_WParser -> SetFontFixed(TRUE);
-        m_WParser -> SetFontSize(3);
-        c -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
-
-        {
-            wxString cit;
-            wxEncodingConverter *encconv = m_WParser -> GetEncodingConverter();
-            cit = m_WParser -> GetSource() -> Mid(tag.GetBeginPos(), tag.GetEndPos1() - tag.GetBeginPos());
-            wxString cit2(encconv ? encconv -> Convert(cit) : cit);
-            c -> InsertCell(new wxHtmlPRECell(cit2, *(m_WParser -> GetDC())));
-        }
-
-        m_WParser -> SetFontUnderlined(underlined);
-        m_WParser -> SetFontBold(bold);
-        m_WParser -> SetFontItalic(italic);
-        m_WParser -> SetFontFixed(fixed);
-        m_WParser -> SetFontSize(fsize);
-        c -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
-
-        m_WParser -> CloseContainer();
-        m_WParser -> OpenContainer();
-        return TRUE;
+        int fixed = m_WParser->GetFontFixed(),
+            italic = m_WParser->GetFontItalic(),
+            underlined = m_WParser->GetFontUnderlined(),
+            bold = m_WParser->GetFontBold(),
+            fsize = m_WParser->GetFontSize();
+
+        c = m_WParser->GetContainer();
+        m_WParser->SetFontUnderlined(false);
+        m_WParser->SetFontBold(false);
+        m_WParser->SetFontItalic(false);
+        m_WParser->SetFontFixed(true);
+        m_WParser->SetFontSize(3);
+        c->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
+
+        m_WParser->CloseContainer();
+        c = m_WParser->OpenContainer();
+        c->SetWidthFloat(tag);
+        c = m_WParser->OpenContainer();
+        c->SetAlignHor(wxHTML_ALIGN_LEFT);
+        c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP);
+
+        wxString srcMid = m_WParser->GetInnerSource(tag);
+        ParseInnerSource(HtmlizeWhitespaces(srcMid));
+
+        m_WParser->CloseContainer();
+        m_WParser->CloseContainer();
+        c = m_WParser->OpenContainer();
+
+        m_WParser->SetFontUnderlined(underlined);
+        m_WParser->SetFontBold(bold);
+        m_WParser->SetFontItalic(italic);
+        m_WParser->SetFontFixed(fixed);
+        m_WParser->SetFontSize(fsize);
+        c->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
+
+        return true;
     }
 
 TAG_HANDLER_END(PRE)
     }
 
 TAG_HANDLER_END(PRE)