]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_pre.cpp
fixes for page positioning for notebooks with wxNB_MULTILINE style (closes bugs 70909...
[wxWidgets.git] / src / html / m_pre.cpp
index a474a1ec385af0b07b05f00ce3d70bd810cf816b..2594df910c95e2f811f134a38b0099e3f079d585 100644 (file)
@@ -7,7 +7,7 @@
 // Licence:     wxWindows Licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows Licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation
 #endif
 
 #pragma implementation
 #endif
 
 
 #include "wx/defs.h"
 #if wxUSE_HTML && wxUSE_STREAMS
 
 #include "wx/defs.h"
 #if wxUSE_HTML && wxUSE_STREAMS
-#ifdef __BORDLANDC__
+#ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 
 #ifndef WXPRECOMP
 #pragma hdrstop
 #endif
 
 #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)
 
+// replaces '\t', ' ' and '\n' with HTML markup:
+static wxString LINKAGEMODE HtmlizeWhitespaces(const wxString& str)
+{
+    wxString out;
+    size_t len = str.Len();
+    for (size_t i = 0; i < len; i++)
+    {
+        switch (str[i])
+        {
+            case wxT('<'):
+                while (i < len && str[i] != wxT('>'))
+                    out << str[i++];
+                out << wxT('>');
+                break;
+            case wxT(' '):
+                out << wxT("&nbsp;");
+                break;
+            case wxT('\n'):
+                out << wxT("<br>");
+                break;
+            case wxT('\t'):
+                {
+                    for (size_t j = 8 - i%8; j > 0; j--)
+                        out << wxT("&nbsp;");
+                }
+                break;
+            default:
+                out << str[i];
+                break;
+        }
+    }
+    return out;
+}
+
+
 //-----------------------------------------------------------------------------
 // The list handler:
 //-----------------------------------------------------------------------------
 
 
 TAG_HANDLER_BEGIN(PRE, "PRE")
 //-----------------------------------------------------------------------------
 // The list handler:
 //-----------------------------------------------------------------------------
 
 
 TAG_HANDLER_BEGIN(PRE, "PRE")
+    TAG_HANDLER_CONSTR(PRE) { }
 
     TAG_HANDLER_PROC(tag)
     {
 
     TAG_HANDLER_PROC(tag)
     {
@@ -60,23 +94,21 @@ TAG_HANDLER_BEGIN(PRE, "PRE")
 
         m_WParser->CloseContainer();
         c = m_WParser->OpenContainer();
 
         m_WParser->CloseContainer();
         c = m_WParser->OpenContainer();
+        c->SetWidthFloat(tag);
+        c = m_WParser->OpenContainer();
         c->SetAlignHor(wxHTML_ALIGN_LEFT);
         c->SetAlignHor(wxHTML_ALIGN_LEFT);
+        c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP);
 
 
-        wxString src, srcMid;
-
-        src = *m_WParser->GetSource();
-        srcMid = src.Mid(tag.GetBeginPos(), 
-                         tag.GetEndPos1() - tag.GetBeginPos());
-        srcMid.Replace(wxT("\t"), wxT("        "));
-        srcMid.Replace(wxT(" "), wxT("&nbsp;"));
-        srcMid.Replace(wxT("\n"), wxT("<br>"));
-
+        wxString srcMid =
+            m_WParser->GetSource()->Mid(tag.GetBeginPos(),
+                                        tag.GetEndPos1() - tag.GetBeginPos());
         // It is safe to temporarily change the source being parsed,
         // provided we restore the state back after parsing
         // It is safe to temporarily change the source being parsed,
         // provided we restore the state back after parsing
-        m_Parser->SetSource(srcMid);
+        m_Parser->SetSourceAndSaveState(HtmlizeWhitespaces(srcMid));
         m_Parser->DoParsing();
         m_Parser->DoParsing();
-        m_Parser->SetSource(src);
-        
+        m_Parser->RestoreState();
+
+        m_WParser->CloseContainer();
         m_WParser->CloseContainer();
         c = m_WParser->OpenContainer();
 
         m_WParser->CloseContainer();
         c = m_WParser->OpenContainer();