]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmltag.cpp
Add accelerator back to label in GetItemLabel
[wxWidgets.git] / src / html / htmltag.cpp
index 98a1ff4fba8b485f36ac821d0a03407d9dec0a76..05b9c77a2539221f269cc60298ca156d72c171b9 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        htmltag.cpp
+// Name:        src/html/htmltag.cpp
 // Purpose:     wxHtmlTag class (represents single tag)
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
@@ -9,23 +9,23 @@
 
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-#if wxUSE_HTML
-
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
-#ifndef WXPRECOMP
-#endif
+#if wxUSE_HTML
 
 #include "wx/html/htmltag.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/colour.h"
+    #include "wx/wxcrtvararg.h"
+#endif
+
 #include "wx/html/htmlpars.h"
-#include "wx/colour.h"
 #include <stdio.h> // for vsscanf
 #include <stdarg.h>
 
-
 //-----------------------------------------------------------------------------
 // wxHtmlTagsCache
 //-----------------------------------------------------------------------------
@@ -61,18 +61,25 @@ bool wxIsCDATAElement(const wxChar *tag)
 wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
 {
     const wxChar *src = source.c_str();
-    int lng = source.Length();
+    int lng = source.length();
     wxChar tagBuffer[256];
 
     m_Cache = NULL;
     m_CacheSize = 0;
     m_CachePos = 0;
 
-    int pos = 0;
-    while (pos < lng)
+    for ( int pos = 0; pos < lng; pos++ )
     {
         if (src[pos] == wxT('<'))   // tag found:
         {
+            // don't cache comment tags
+            wxString::const_iterator iter = source.begin() + pos;
+            if ( wxHtmlParser::SkipCommentTag(iter, source.end()) )
+            {
+                pos = iter - source.begin();
+                continue;
+            }
+
             if (m_CacheSize % CACHE_INCREMENT == 0)
                 m_Cache = (wxHtmlCacheItem*) realloc(m_Cache, (m_CacheSize + CACHE_INCREMENT) * sizeof(wxHtmlCacheItem));
             int tg = m_CacheSize++;
@@ -169,8 +176,6 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
                 }
             }
         }
-
-        pos++;
     }
 
     // ok, we're done, now we'll free .Name members of cache - we don't need it anymore:
@@ -402,7 +407,15 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const
 }
 
 int wxHtmlTag::ScanParam(const wxString& par,
-                         const wxChar *format,
+                         const char *format,
+                         void *param) const
+{
+    wxString parval = GetParam(par);
+    return wxSscanf(parval, format, param);
+}
+
+int wxHtmlTag::ScanParam(const wxString& par,
+                         const wchar_t *format,
                          void *param) const
 {
     wxString parval = GetParam(par);
@@ -411,25 +424,16 @@ int wxHtmlTag::ScanParam(const wxString& par,
 
 bool wxHtmlTag::GetParamAsColour(const wxString& par, wxColour *clr) const
 {
+    wxCHECK_MSG( clr, false, _T("invalid colour argument") );
+
     wxString str = GetParam(par);
 
-    if (str.empty()) return false;
-    if (str.GetChar(0) == wxT('#'))
+    // handle colours defined in HTML 4.0 first:
+    if (str.length() > 1 && str[0] != _T('#'))
     {
-        unsigned long tmp;
-        if (ScanParam(par, wxT("#%lX"), &tmp) != 1)
-            return false;
-        *clr = wxColour((unsigned char)((tmp & 0xFF0000) >> 16),
-                        (unsigned char)((tmp & 0x00FF00) >> 8),
-                        (unsigned char)(tmp & 0x0000FF));
-        return true;
-    }
-    else
-    {
-        // Handle colours defined in HTML 4.0:
-        #define HTML_COLOUR(name,r,g,b)                 \
+        #define HTML_COLOUR(name, r, g, b)              \
             if (str.IsSameAs(wxT(name), false))         \
-                { *clr = wxColour(r,g,b); return true; }
+                { clr->Set(r, g, b); return true; }
         HTML_COLOUR("black",   0x00,0x00,0x00)
         HTML_COLOUR("silver",  0xC0,0xC0,0xC0)
         HTML_COLOUR("gray",    0x80,0x80,0x80)
@@ -449,6 +453,13 @@ bool wxHtmlTag::GetParamAsColour(const wxString& par, wxColour *clr) const
         #undef HTML_COLOUR
     }
 
+    // then try to parse #rrggbb representations or set from other well
+    // known names (note that this doesn't strictly conform to HTML spec,
+    // but it doesn't do real harm -- but it *must* be done after the standard
+    // colors are handled above):
+    if (clr->Set(str))
+        return true;
+
     return false;
 }