]> git.saurik.com Git - wxWidgets.git/blobdiff - user/wxLayout/wxlparser.cpp
a few more buglets
[wxWidgets.git] / user / wxLayout / wxlparser.cpp
index 08c2c61fb20283a055bdb9da09b7f9f6cf8074f3..ebd8be4aeef1e4459b8bfaabc9d59c7603ee3668 100644 (file)
@@ -10,7 +10,7 @@
 #   pragma implementation "wxlparser.h"
 #endif
 
-//#include "Mpch.h"
+#include "Mpch.h"
 #ifdef M_PREFIX
 #   include "gui/wxllist.h"
 #   include "gui/wxlparser.h"
@@ -26,7 +26,7 @@ inline static bool IsEndOfLine(const char *p, int mode)
    // in addition to Unix EOL convention we also (but not instead) understand
    // the DOS one under Windows
    return
-      ((mode & WXLO_EXPORT_WITH_MASK) == WXLO_EXPORT_WITH_CRLF) ?
+      (mode == WXLO_EXPORT_WITH_CRLF) ?
       ((*p == '\r') && (*(p + 1) == '\n')) 
       :
       (((*p == '\r') && (*(p + 1) == '\n'))||(*p == '\n'));
@@ -34,6 +34,8 @@ inline static bool IsEndOfLine(const char *p, int mode)
 
 void wxLayoutImportText(wxLayoutList *list, wxString const &str, int withflag)
 {
+   if(str.Length() == 0)
+      return;
    char * cptr = (char *)str.c_str(); // string gets changed only temporarily
    const char * begin = cptr;
    char  backup;
@@ -69,23 +71,27 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
    static char buffer[20];
    wxString html;
    
-   wxLayoutStyleInfo si;
-   cmd.GetStyle(&si);
+   wxLayoutStyleInfo *si = cmd.GetStyle();
 
    int size, sizecount;
    
    html += "<font ";
 
-   html +="color=";
-   sprintf(buffer,"\"#%02X%02X%02X\"", si.fg_red,si.fg_green,si.fg_blue);
-   html += buffer;
-
-
-   html += " bgcolor=";
-   sprintf(buffer,"\"#%02X%02X%02X\"", si.bg_red,si.bg_green,si.bg_blue);
-   html += buffer;
+   if(si->m_fg_valid)
+   {
+      html +="color=";
+      sprintf(buffer,"\"#%02X%02X%02X\"", si->m_fg.Red(),si->m_fg.Green(),si->m_fg.Blue());
+      html += buffer;
+   }
 
-   switch(si.family)
+   if(si->m_bg_valid)
+   {
+      html += " bgcolor=";
+      sprintf(buffer,"\"#%02X%02X%02X\"", si->m_bg.Red(),si->m_bg.Green(),si->m_bg.Blue());
+      html += buffer;
+   }
+   
+   switch(si->family)
    {
    case wxSWISS:
    case wxMODERN:
@@ -99,12 +105,12 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
    }
 
    size = BASE_SIZE; sizecount = 0;
-   while(size < si.size && sizecount < 5)
+   while(size < si->size && sizecount < 5)
    {
       sizecount ++;
       size = (size*12)/10;
    }
-   while(size > si.size && sizecount > -5)
+   while(size > si->size && sizecount > -5)
    {
       sizecount --;
       size = (size*10)/12;
@@ -118,96 +124,120 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
    if(styleInfo != NULL)
       html ="</font>"+html; // terminate any previous font command
 
-   if((si.weight == wxBOLD) && ( (!styleInfo) || (styleInfo->weight != wxBOLD)))
+   if((si->weight == wxBOLD) && ( (!styleInfo) || (styleInfo->weight != wxBOLD)))
       html += "<b>";
    else
-      if(si.weight != wxBOLD && ( styleInfo && (styleInfo->weight == wxBOLD)))
+      if(si->weight != wxBOLD && ( styleInfo && (styleInfo->weight == wxBOLD)))
          html += "</b>";
 
-   if(si.style == wxSLANT)
-      si.style = wxITALIC; // the same for html
+   if(si->style == wxSLANT)
+      si->style = wxITALIC; // the same for html
    
-   if((si.style == wxITALIC) && ( (!styleInfo) || (styleInfo->style != wxITALIC)))
+   if((si->style == wxITALIC) && ( (!styleInfo) || (styleInfo->style != wxITALIC)))
       html += "<i>";
    else
-      if(si.style != wxITALIC && ( styleInfo && (styleInfo->style == wxITALIC)))
+      if(si->style != wxITALIC && ( styleInfo && (styleInfo->style == wxITALIC)))
          html += "</i>";
 
-   if(si.underline && ( (!styleInfo) || ! styleInfo->underline))
+   if(si->underline && ( (!styleInfo) || ! styleInfo->underline))
       html += "<u>";
-   else if(si.underline == false && ( styleInfo && styleInfo->underline))
+   else if(si->underline == false && ( styleInfo && styleInfo->underline))
       html += "</u>";
 
    
-   *styleInfo = si; // update last style info
+   *styleInfo = *si; // update last style info
    
    return html;
 }
 
 
 
+wxLayoutExportStatus::wxLayoutExportStatus(wxLayoutList *list)
+{
+   m_si = *list->GetDefaults();
+   m_line = list->GetFirstLine();
+   m_iterator = m_line->GetFirstObject();
+}
+   
+
+
 #define   WXLO_IS_TEXT(type) \
 ( type == WXLO_TYPE_TEXT \
   || (type == WXLO_TYPE_CMD \
-      && (mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_HTML))
+      && mode == WXLO_EXPORT_AS_HTML))
 
 
-  
 wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
-                                     int mode)
+                                     int mode, int flags)
 {
    wxASSERT(status);
    wxLayoutExportObject * export;
    
    if(status->m_iterator == NULLIT) // end of line
    {
-      if(!status->m_line || status->m_line->GetNextLine() == NULL) // reached end of list
+      if(!status->m_line || status->m_line->GetNextLine() == NULL)
+         // reached end of list
          return NULL;
-      else
+   }
+   export = new wxLayoutExportObject();
+   wxLayoutObjectType type;
+   if(status->m_iterator != NULLIT)
+   {
+      type = (** status->m_iterator).GetType();
+      if( mode == WXLO_EXPORT_AS_OBJECTS || ! WXLO_IS_TEXT(type)) // simple case
       {
-         status->m_line = status->m_line->GetNextLine();
-         status->m_iterator = status->m_line->GetFirstObject();
-         export = new wxLayoutExportObject();;
-      if( (mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_OBJECTS) // simple case
-         {
-            export->type = WXLO_EXPORT_OBJECT;
-            export->content.object = *status->m_iterator;
-            status->m_iterator++;
-            return export;
-         }
-         //else: text object:
-         export->type = ((mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_HTML)
-            ?  WXLO_EXPORT_HTML : WXLO_EXPORT_TEXT;
-         if((mode & WXLO_EXPORT_WITH_CRLF) == WXLO_EXPORT_WITH_CRLF)
-            export->content.text = new wxString("\r\n");
-         else
-            export->content.text = new wxString("\n");
+         export->type = WXLO_EXPORT_OBJECT;
+         export->content.object = *status->m_iterator;
+         status->m_iterator++;
          return export;
       }
    }
-   
-   export = new wxLayoutExportObject();
-   wxLayoutObjectType   type = (** status->m_iterator).GetType();
-   if( (mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_OBJECTS || ! WXLO_IS_TEXT(type)) // simple case
-   {
-      export->type = WXLO_EXPORT_OBJECT;
-      export->content.object = *status->m_iterator;
-      status->m_iterator++;
-      return export;
+   else
+   {  // iterator == NULLIT
+      if(mode == WXLO_EXPORT_AS_OBJECTS)
+      {
+         export->type = WXLO_EXPORT_EMPTYLINE;
+         export->content.object = NULL; //empty line
+         status->m_line = status->m_line->GetNextLine();
+         if(status->m_line)
+            status->m_iterator = status->m_line->GetFirstObject();
+         return export;
+      }
+      else
+         type = WXLO_TYPE_TEXT;
    }
 
-   // else: must be text
    wxString *str = new wxString();
    // text must be concatenated
-   do
+   for(;;)
    {
+      while(status->m_iterator == NULLIT)
+      {
+         if(flags & WXLO_EXPORT_AS_HTML)
+            *str += "<br>";
+         if(flags & WXLO_EXPORT_WITH_CRLF)
+            *str += "\r\n";
+         else
+            *str += '\n';
+
+         status->m_line = status->m_line->GetNextLine();
+         if(status->m_line)
+            status->m_iterator = status->m_line->GetFirstObject();
+         else
+            break; // end of list
+      }
+      if(! status->m_line)  // reached end of list, fall through
+         break; 
+      type = (** status->m_iterator).GetType();
+      if(type == WXLO_TYPE_ICON)
+         break;
       switch(type)
       {
       case WXLO_TYPE_TEXT:
          *str += ((wxLayoutObjectText *)*status->m_iterator)->GetText();
          break;
       case WXLO_TYPE_CMD:
-         wxASSERT_MSG( (mode&WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_HTML,
+         wxASSERT_MSG( mode == WXLO_EXPORT_AS_HTML,
                        "reached cmd object in text mode" );
          
          *str += wxLayoutExportCmdAsHTML(*(wxLayoutObjectCmd const
@@ -217,28 +247,9 @@ wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
          ;
       }
       status->m_iterator++;
-      if(status->m_iterator == NULLIT) // end of line!
-      {
-         if((mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_HTML)
-            *str += "<br>";
-         if((mode & WXLO_EXPORT_WITH_CRLF) == WXLO_EXPORT_WITH_CRLF)
-            *str += "\r\n";
-         else
-            *str += '\n';
-         status->m_line = status->m_line->GetNextLine();
-         if(status->m_line)
-            status->m_iterator = status->m_line->GetFirstObject();
-         else
-            status->m_iterator = NULLIT;
-      }
-      if(status->m_iterator != NULLIT)
-         type = (** status->m_iterator).GetType();
-      else
-         break;
    }
-   while(WXLO_IS_TEXT(type));
 
-   export->type = ((mode & WXLO_EXPORT_AS_MASK) == WXLO_EXPORT_AS_HTML)
+   export->type = (mode == WXLO_EXPORT_AS_HTML)
       ?  WXLO_EXPORT_HTML : WXLO_EXPORT_TEXT;
    export->content.text = str;
    return export;