]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/dialoged/src/reswrite.cpp
A fix for attribrute sorting, but it's still broken if there are
[wxWidgets.git] / utils / dialoged / src / reswrite.cpp
index 2b560e4a5dcbbfd3ed51f8081a6b1cf1fc355553..8e5588fe92f8b57e7af68d5c3532590f722c8e34 100644 (file)
 #include <math.h>
 #include <string.h>
 
-#if defined(__WINDOWS__) && !defined(__GNUWIN32__)
-#include <strstrea.h>
-#else
-#include <strstream.h>
-#endif
-
-#include <fstream.h>
-
 #include "wx/scrolbar.h"
 #include "wx/string.h"
+#include "wx/wfstream.h"
+#include "wx/txtstrm.h"
 
 #include "reseditr.h"
 
 char *SafeString(char *s);
-char *SafeWord(char *s);
+char *SafeWord(const wxString& s);
 
 // Save an association between the child resource and the panel item, to allow
 // us not to require unique window names.
-wxControl *wxResourceTableWithSaving::CreateItem(wxPanel *panel, wxItemResource *childResource)
+wxControl *wxResourceTableWithSaving::CreateItem(wxPanel *panel, const wxItemResource *childResource, const wxItemResource* parentResource)
 {
-  wxControl *item = wxResourceTable::CreateItem(panel, childResource);
-  if (item)
-    wxResourceManager::GetCurrentResourceManager()->GetResourceAssociations().Put((long)childResource, item);
-  return item;
+    wxControl *item = wxResourceTable::CreateItem(panel, childResource, parentResource);
+    if (item)
+        wxResourceManager::GetCurrentResourceManager()->GetResourceAssociations().Put((long)childResource, item);
+    return item;
 }
 
-void wxResourceTableWithSaving::OutputFont(ostream& stream, wxFont *font)
+void wxResourceTableWithSaving::OutputFont(wxTextOutputStream& stream, const wxFont& font)
 {
-  stream << "[" << font->GetPointSize() << ", '";
-  stream << font->GetFamilyString() << "', '";
-  stream << font->GetStyleString() << "', '";
-  stream << font->GetWeightString() << "', ";
-  stream << (int)font->GetUnderlined();
-  if (font->GetFaceName() != "")
-    stream << ", '" << font->GetFaceName() << "'";
-  stream << "]";
+    stream << "[" << font.GetPointSize() << ", '";
+    stream << font.GetFamilyString() << "', '";
+    stream << font.GetStyleString() << "', '";
+    stream << font.GetWeightString() << "', ";
+    stream << (int)font.GetUnderlined();
+    if (font.GetFaceName() != "")
+        stream << ", '" << font.GetFaceName() << "'";
+    stream << "]";
 }
 
 /*
- * Resource table with saving (basic one only has loading)
- */
+* Resource table with saving (basic one only has loading)
+*/
+
 bool wxResourceTableWithSaving::Save(const wxString& filename)
 {
-  ofstream stream(((wxString &) filename).GetData());
-  if (stream.bad())
-    return FALSE;
+    wxFileOutputStream file_output( filename );
+    if (file_output.LastError())
+        return FALSE;
     
-  BeginFind();
-  wxNode *node = NULL;
-  while (node = Next())
-  {
-    wxItemResource *item = (wxItemResource *)node->Data();
-    wxString resType(item->GetType());
+    wxTextOutputStream stream( file_output );
     
-    if (resType == "wxDialogBox" || resType == "wxDialog" || resType == "wxPanel" || resType == "wxBitmap")
+    BeginFind();
+    wxNode *node = NULL;
+    while ((node = Next()))
     {
-      if (!SaveResource(stream, item))
-        return FALSE;
+        wxItemResource *item = (wxItemResource *)node->Data();
+        wxString resType(item->GetType());
+        
+        if (resType == "wxDialogBox" || resType == "wxDialog" || resType == "wxPanel" || resType == "wxBitmap")
+        {
+            if (!SaveResource(stream, item, (wxItemResource*) NULL))
+                return FALSE;
+        }
     }
-  }
-  return TRUE;
+    return TRUE;
 }
 
-bool wxResourceTableWithSaving::SaveResource(ostream& stream, wxItemResource *item)
+bool wxResourceTableWithSaving::SaveResource(wxTextOutputStream& stream, wxItemResource* item, wxItemResource* parentItem)
 {
-  char styleBuf[400];
-  wxString itemType(item->GetType());
-  
-  if (itemType == "wxDialogBox" || itemType == "wxDialog" || itemType == "wxPanel")
+    char styleBuf[400];
+    wxString itemType(item->GetType());
+    
+    if (itemType == "wxDialogBox" || itemType == "wxDialog" || itemType == "wxPanel")
     {
-      if (itemType == "wxDialogBox" || itemType == "wxDialog")
-      {
-        stream << "static char *" << item->GetName() << " = \"dialog(name = '" << item->GetName() << "',\\\n";
-        GenerateDialogStyleString(item->GetStyle(), styleBuf);
-      }
-      else
-      {
-        stream << "static char *" << item->GetName() << " = \"panel(name = '" << item->GetName() << "',\\\n";
-        GeneratePanelStyleString(item->GetStyle(), styleBuf);
-      }
-      stream << "  style = '" << styleBuf << "',\\\n";
-      stream << "  title = '" << item->GetTitle() << "',\\\n";
-      stream << "  x = " << item->GetX() << ", y = " << item->GetY();
-      stream << ", width = " << item->GetWidth() << ", height = " << item->GetHeight();
-//      stream << "  modal = " << item->GetValue1();
-      
-      if (1) // item->GetStyle() & wxNO_3D)
-      {
-        if (item->GetBackgroundColour())
+        if (itemType == "wxDialogBox" || itemType == "wxDialog")
         {
-          char buf[7];
-          wxDecToHex(item->GetBackgroundColour()->Red(), buf);
-          wxDecToHex(item->GetBackgroundColour()->Green(), buf+2);
-          wxDecToHex(item->GetBackgroundColour()->Blue(), buf+4);
-          buf[6] = 0;
-
-          stream << ",\\\n  " << "background_colour = '" << buf << "'";
+            stream << "static char *" << item->GetName() << " = \"dialog(name = '" << item->GetName() << "',\\\n";
+            GenerateDialogStyleString(item->GetStyle(), styleBuf);
         }
-#if 0
-        if (item->GetLabelColour())
+        else
         {
-          char buf[7];
-          wxDecToHex(item->GetLabelColour()->Red(), buf);
-          wxDecToHex(item->GetLabelColour()->Green(), buf+2);
-          wxDecToHex(item->GetLabelColour()->Blue(), buf+4);
-          buf[6] = 0;
-
-          stream << ",\\\n  " << "label_colour = '" << buf << "'";
+            stream << "static char *" << item->GetName() << " = \"panel(name = '" << item->GetName() << "',\\\n";
+            GenerateDialogStyleString(item->GetStyle(), styleBuf);
         }
-        if (item->GetButtonColour())
+        
+        stream << "  style = '" << styleBuf << "',\\\n";
+        stream << "  title = " << SafeWord(item->GetTitle()) << ",\\\n";
+        stream << "  id = " << item->GetId() << ",\\\n";
+        stream << "  x = " << item->GetX() << ", y = " << item->GetY();
+        stream << ", width = " << item->GetWidth() << ", height = " << item->GetHeight();
+        
+        if (1) // item->GetStyle() & wxNO_3D)
         {
-          char buf[7];
-          wxDecToHex(item->GetButtonColour()->Red(), buf);
-          wxDecToHex(item->GetButtonColour()->Green(), buf+2);
-          wxDecToHex(item->GetButtonColour()->Blue(), buf+4);
-          buf[6] = 0;
-
-          stream << ",\\\n  " << "button_colour = '" << buf << "'";
+            if (item->GetBackgroundColour().Ok())
+            {
+                char buf[7];
+                wxDecToHex(item->GetBackgroundColour().Red(), buf);
+                wxDecToHex(item->GetBackgroundColour().Green(), buf+2);
+                wxDecToHex(item->GetBackgroundColour().Blue(), buf+4);
+                buf[6] = 0;
+                
+                stream << ",\\\n  " << "background_colour = '" << buf << "'";
+            }
         }
-#endif
-
-      }
-      
-      if (item->GetFont() && item->GetFont()->Ok())
-      {
-        stream << ",\\\n  font = ";
-        OutputFont(stream, item->GetFont());
-      }
-
-      if (item->GetChildren().Number() > 0)
-        stream << ",\\\n";
-      else
-        stream << "\\\n";
-      wxNode *node = item->GetChildren().First();
-      while (node)
-      {
-        wxItemResource *child = (wxItemResource *)node->Data();
         
-        stream << "  control = [";
+        int dialogUnits = 0;
+        int useDefaults = 0;
+        if ((item->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
+            dialogUnits = 1;
+        if ((item->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0)
+            useDefaults = 1;
         
-        SaveResource(stream, child);
-
-        stream << "]";
-
-        if (node->Next())
-          stream << ",\\\n";
-        node = node->Next();
-      }
-      stream << ").\";\n\n";
+        stream << ",\\\n  " << "use_dialog_units = " << dialogUnits;
+        stream << ",\\\n  " << "use_system_defaults = " << useDefaults;
+        
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n  font = ";
+            OutputFont(stream, item->GetFont());
+        }
+        
+        if (item->GetChildren().Number() > 0)
+            stream << ",\\\n";
+        else
+            stream << "\\\n";
+        wxNode *node = item->GetChildren().First();
+        while (node)
+        {
+            wxItemResource *child = (wxItemResource *)node->Data();
+            
+            stream << "  control = [";
+            
+            SaveResource(stream, child, item);
+            
+            stream << "]";
+            
+            if (node->Next())
+                stream << ",\\\n";
+            node = node->Next();
+        }
+        stream << ").\";\n\n";
     }
-  else if (itemType == "wxButton" || itemType == "wxBitmapButton")
+    else if (itemType == "wxButton" || itemType == "wxBitmapButton")
     {
-      GenerateButtonStyleString(item->GetStyle(), styleBuf);
-      stream << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      if (item->GetValue4())
-        stream << ", '" << item->GetValue4() << "'";
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        if (item->GetValue4())
+            stream << ", '" << item->GetValue4() << "'";
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxStaticText" || itemType == "wxStaticBitmap")
+    else if (itemType == "wxStaticText" || itemType == "wxStaticBitmap")
     {
-      GenerateMessageStyleString(item->GetStyle(), styleBuf);
-      stream << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      if (item->GetValue4())
-        stream << ", '" << item->GetValue4() << "'";
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        if (item->GetValue4())
+            stream << ", '" << item->GetValue4() << "'";
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxCheckBox")
+    else if (itemType == "wxCheckBox")
     {
-      GenerateCheckBoxStyleString(item->GetStyle(), styleBuf);
-      stream << "wxCheckBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      stream << ", " << item->GetValue1();
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxCheckBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << item->GetValue1();
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxStaticBox")
+    else if (itemType == "wxRadioButton")
     {
-      GenerateGroupBoxStyleString(item->GetStyle(), styleBuf);
-      stream << "wxGroupBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxRadioButton, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << item->GetValue1();
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxText" || itemType == "wxMultiText" || itemType == "wxTextCtrl")
+    else if (itemType == "wxStaticBox")
     {
-      GenerateTextStyleString(item->GetStyle(), styleBuf);
-      stream << "wxTextCtrl, ";
-      stream << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      stream << ", " << SafeWord(item->GetValue4());
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxStaticBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxGauge")
+    else if (itemType == "wxText" || itemType == "wxMultiText" || itemType == "wxTextCtrl")
     {
-      GenerateGaugeStyleString(item->GetStyle(), styleBuf);
-      stream << "wxGauge, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      stream << ", " << item->GetValue1() << ", " << item->GetValue2();
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxTextCtrl, ";
+        stream << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << SafeWord(item->GetValue4());
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxSlider")
+    else if (itemType == "wxGauge")
     {
-      GenerateSliderStyleString(item->GetStyle(), styleBuf);
-      stream << "wxSlider, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3();
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxGauge, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << item->GetValue1() << ", " << item->GetValue2();
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
+    }
+    else if (itemType == "wxSlider")
+    {
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxSlider, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3();
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
+        }
     }
-  else if (itemType == "wxScrollBar")
+    else if (itemType == "wxScrollBar")
     {
-      GenerateScrollBarStyleString(item->GetStyle(), styleBuf);
-      stream << "wxScrollBar, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-      stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3() << ", ";
-      stream << item->GetValue5();
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxScrollBar, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3() << ", ";
+        stream << item->GetValue5();
     }
-  else if (itemType == "wxListBox")
+    else if (itemType == "wxListBox")
     {
-      GenerateListBoxStyleString(item->GetStyle(), styleBuf);
-      stream << "wxListBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-
-      // Default list of values
-
-      stream << ", [";
-      if (item->GetStringValues())
-      {
-        wxNode *node = item->GetStringValues()->First();
-        while (node)
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxListBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        
+        // Default list of values
+        
+        stream << ", [";
+        if (item->GetStringValues().Number() > 0)
         {
-          char *s = (char *)node->Data();
-          stream << SafeWord(s);
-          if (node->Next())
-            stream << ", ";
-          node = node->Next();
+            wxNode *node = item->GetStringValues().First();
+            while (node)
+            {
+                char *s = (char *)node->Data();
+                stream << SafeWord(s);
+                if (node->Next())
+                    stream << ", ";
+                node = node->Next();
+            }
         }
-      }
-      stream << "], ";
-      switch (item->GetValue1())
-      {
+        stream << "]";
+        /* Styles are now in the window style, not in a separate arg
+        stream << ", ";
+        switch (item->GetValue1())
+        {
         case wxLB_MULTIPLE:
         {
-          stream << "'wxLB_MULTIPLE'";
-          break;
+        stream << "'wxLB_MULTIPLE'";
+        break;
         }
         case wxLB_EXTENDED:
         {
-          stream << "'wxLB_EXTENDED'";
-          break;
+        stream << "'wxLB_EXTENDED'";
+        break;
         }
         case wxLB_SINGLE:
         default:
         {
-          stream << "'wxLB_SINGLE'";
-          break;
+        stream << "'wxLB_SINGLE'";
+        break;
         }
-      }
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
-    }
-  else if (itemType == "wxChoice")
-    {
-      GenerateChoiceStyleString(item->GetStyle(), styleBuf);
-      stream << "wxChoice, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-
-      // Default list of values
-
-      stream << ", [";
-      if (item->GetStringValues())
-      {
-        wxNode *node = item->GetStringValues()->First();
-        while (node)
+        }
+        */
+        
+        if (item->GetFont().Ok())
         {
-          char *s = (char *)node->Data();
-          stream << SafeWord(s);
-          if (node->Next())
-            stream << ", ";
-          node = node->Next();
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
         }
-      }
-      stream << "]";
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
     }
-  else if (itemType == "wxRadioBox")
+    else if (itemType == "wxChoice" || itemType == "wxComboBox")
     {
-      // Must write out the orientation and number of rows/cols!!
-      GenerateRadioBoxStyleString(item->GetStyle(), styleBuf);
-      stream << "wxRadioBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
-      stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
-      stream << item->GetWidth() << ", " << item->GetHeight();
-
-      // Default list of values
-
-      stream << ", [";
-      if (item->GetStringValues())
-      {
-        wxNode *node = item->GetStringValues()->First();
-        while (node)
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        
+        stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
+        
+        if (itemType == "wxComboBox")
+            stream << ", " << SafeWord(item->GetValue4());
+        
+        // Default list of values
+        
+        stream << ", [";
+        if (item->GetStringValues().Number() > 0)
         {
-          char *s = (char *)node->Data();
-          stream << SafeWord(s);
-          if (node->Next())
-            stream << ", ";
-          node = node->Next();
+            wxNode *node = item->GetStringValues().First();
+            while (node)
+            {
+                char *s = (char *)node->Data();
+                stream << SafeWord(s);
+                if (node->Next())
+                    stream << ", ";
+                node = node->Next();
+            }
+        }
+        stream << "]";
+        if (item->GetFont().Ok())
+        {
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
         }
-      }
-      stream << "], " << item->GetValue1();
-      if (item->GetFont())
-      {
-        stream << ",\\\n      ";
-        OutputFont(stream, item->GetFont());
-      }
     }
-  else if (itemType == "wxBitmap")
+    else if (itemType == "wxRadioBox")
     {
-      stream << "static char *" << item->GetName() << " = \"bitmap(name = '" << item->GetName() << "',\\\n";
-      
-      wxNode *node = item->GetChildren().First();
-      while (node)
-      {
-        wxItemResource *child = (wxItemResource *)node->Data();
-        stream << "  bitmap = [";
+        // Must write out the orientation and number of rows/cols!!
+        GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
+        stream << item->GetId() << ", " << "wxRadioBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
+        stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
+        stream << item->GetWidth() << ", " << item->GetHeight();
         
-        char buf[400];
-        strcpy(buf, child->GetName());
-#ifdef __WINDOWS__
-        wxDos2UnixFilename(buf);
-#endif
-
-        stream << "'" << buf << "', ";
+        // Default list of values
         
-        int bitmapType = (int)child->GetValue1();
-        switch (bitmapType)
+        stream << ", [";
+        if (item->GetStringValues().Number() > 0)
         {
-          case wxBITMAP_TYPE_XBM_DATA:
-          {
-            stream << "wxBITMAP_TYPE_XBM_DATA";
-            break;
-          }
-          case wxBITMAP_TYPE_XPM_DATA:
-          {
-            stream << "wxBITMAP_TYPE_XPM_DATA";
-            break;
-          }
-          case wxBITMAP_TYPE_XBM:
-          {
-            stream << "wxBITMAP_TYPE_XBM";
-            break;
-          }
-          case wxBITMAP_TYPE_XPM:
-          {
-            stream << "wxBITMAP_TYPE_XPM";
-            break;
-          }
-          case wxBITMAP_TYPE_BMP:
-          {
-            stream << "wxBITMAP_TYPE_BMP";
-            break;
-          }
-          case wxBITMAP_TYPE_BMP_RESOURCE:
-          {
-            stream << "wxBITMAP_TYPE_BMP_RESOURCE";
-            break;
-          }
-          case wxBITMAP_TYPE_GIF:
-          {
-            stream << "wxBITMAP_TYPE_GIF";
-            break;
-          }
-          case wxBITMAP_TYPE_TIF:
-          {
-            stream << "wxBITMAP_TYPE_TIF";
-            break;
-          }
-          case wxBITMAP_TYPE_ICO:
-          {
-            stream << "wxBITMAP_TYPE_ICO";
-            break;
-          }
-          case wxBITMAP_TYPE_ICO_RESOURCE:
-          {
-            stream << "wxBITMAP_TYPE_ICO_RESOURCE";
-            break;
-          }
-          case wxBITMAP_TYPE_CUR:
-          {
-            stream << "wxBITMAP_TYPE_CUR";
-            break;
-          }
-          case wxBITMAP_TYPE_CUR_RESOURCE:
-          {
-            stream << "wxBITMAP_TYPE_CUR_RESOURCE";
-            break;
-          }
-          default:
-          case wxBITMAP_TYPE_ANY:
-          {
-            stream << "wxBITMAP_TYPE_ANY";
-            break;
-          }
+            wxNode *node = item->GetStringValues().First();
+            while (node)
+            {
+                char *s = (char *)node->Data();
+                stream << SafeWord(s);
+                if (node->Next())
+                    stream << ", ";
+                node = node->Next();
+            }
         }
-        stream << ", ";
-        int platform = child->GetValue2();
-        switch (platform)
+        stream << "], " << item->GetValue1();
+        if (item->GetFont().Ok())
         {
-          case RESOURCE_PLATFORM_WINDOWS:
-          {
-            stream << "'WINDOWS'";
-            break;
-          }
-          case RESOURCE_PLATFORM_X:
-          {
-            stream << "'X'";
-            break;
-          }
-          case RESOURCE_PLATFORM_MAC:
-          {
-            stream << "'MAC'";
-            break;
-          }
-          case RESOURCE_PLATFORM_ANY:
-          {
-            stream << "'ANY'";
-            break;
-          }
+            stream << ",\\\n      ";
+            OutputFont(stream, item->GetFont());
         }
-        int noColours = (int)child->GetValue3();
-        if (noColours > 0)
-          stream << ", " << noColours;
-
-        stream << "]";
-
-        if (node->Next())
-         stream << ",\\\n";
+    }
+    else if (itemType == "wxBitmap")
+    {
+        stream << "static char *" << item->GetName() << " = \"bitmap(name = '" << item->GetName() << "',\\\n";
         
-        node = node->Next();
+        wxNode *node = item->GetChildren().First();
+        while (node)
+        {
+            wxItemResource *child = (wxItemResource *)node->Data();
+            stream << "  bitmap = [";
+            
+            char buf[400];
+            strcpy(buf, child->GetName());
+#ifdef __WXMSW__
+            wxDos2UnixFilename(buf);
+#endif
+            
+            stream << "'" << buf << "', ";
+            
+            int bitmapType = (int)child->GetValue1();
+            switch (bitmapType)
+            {
+            case wxBITMAP_TYPE_XBM_DATA:
+                {
+                    stream << "wxBITMAP_TYPE_XBM_DATA";
+                    break;
+                }
+            case wxBITMAP_TYPE_XPM_DATA:
+                {
+                    stream << "wxBITMAP_TYPE_XPM_DATA";
+                    break;
+                }
+            case wxBITMAP_TYPE_XBM:
+                {
+                    stream << "wxBITMAP_TYPE_XBM";
+                    break;
+                }
+            case wxBITMAP_TYPE_XPM:
+                {
+                    stream << "wxBITMAP_TYPE_XPM";
+                    break;
+                }
+            case wxBITMAP_TYPE_BMP:
+                {
+                    stream << "wxBITMAP_TYPE_BMP";
+                    break;
+                }
+            case wxBITMAP_TYPE_BMP_RESOURCE:
+                {
+                    stream << "wxBITMAP_TYPE_BMP_RESOURCE";
+                    break;
+                }
+            case wxBITMAP_TYPE_GIF:
+                {
+                    stream << "wxBITMAP_TYPE_GIF";
+                    break;
+                }
+            case wxBITMAP_TYPE_TIF:
+                {
+                    stream << "wxBITMAP_TYPE_TIF";
+                    break;
+                }
+            case wxBITMAP_TYPE_ICO:
+                {
+                    stream << "wxBITMAP_TYPE_ICO";
+                    break;
+                }
+            case wxBITMAP_TYPE_ICO_RESOURCE:
+                {
+                    stream << "wxBITMAP_TYPE_ICO_RESOURCE";
+                    break;
+                }
+            case wxBITMAP_TYPE_CUR:
+                {
+                    stream << "wxBITMAP_TYPE_CUR";
+                    break;
+                }
+            case wxBITMAP_TYPE_CUR_RESOURCE:
+                {
+                    stream << "wxBITMAP_TYPE_CUR_RESOURCE";
+                    break;
+                }
+            default:
+            case wxBITMAP_TYPE_ANY:
+                {
+                    stream << "wxBITMAP_TYPE_ANY";
+                    break;
+                }
+            }
+            stream << ", ";
+            int platform = child->GetValue2();
+            switch (platform)
+            {
+            case RESOURCE_PLATFORM_WINDOWS:
+                {
+                    stream << "'WINDOWS'";
+                    break;
+                }
+            case RESOURCE_PLATFORM_X:
+                {
+                    stream << "'X'";
+                    break;
+                }
+            case RESOURCE_PLATFORM_MAC:
+                {
+                    stream << "'MAC'";
+                    break;
+                }
+            case RESOURCE_PLATFORM_ANY:
+                {
+                    stream << "'ANY'";
+                    break;
+                }
+            }
+            int noColours = (int)child->GetValue3();
+            if (noColours > 0)
+                stream << ", " << noColours;
+            
+            stream << "]";
+            
+            if (node->Next())
+                stream << ",\\\n";
+            
+            node = node->Next();
       }
       stream << ").\";\n\n";
     }
-  return TRUE;
-}
-
-void wxResourceTableWithSaving::GenerateWindowStyleString(long windowStyle, char *buf)
-{
-  GenerateStyle(buf, windowStyle, wxNO_3D, "wxNO_3D");
-  GenerateStyle(buf, windowStyle, wxVSCROLL, "wxVSCROLL");
-  GenerateStyle(buf, windowStyle, wxHSCROLL, "wxHSCROLL");
-  GenerateStyle(buf, windowStyle, wxBORDER, "wxBORDER");
+    else
+    {
+        wxString str("Unimplemented resource type: ");
+        str += itemType;
+        wxMessageBox(str);
+    }
+    return TRUE;
 }
 
 void wxResourceTableWithSaving::GenerateDialogStyleString(long windowStyle, char *buf)
 {
-  buf[0] = 0;
-  GenerateWindowStyleString(windowStyle, buf);
-
-/*
-  GenerateStyle(buf, windowStyle, wxRETAINED, "wxRETAINED");
-*/
-  if (!GenerateStyle(buf, windowStyle, wxDEFAULT_DIALOG_STYLE, "wxDEFAULT_DIALOG_STYLE"))
-  {
-    GenerateStyle(buf, windowStyle, wxCAPTION, "wxCAPTION");
-    GenerateStyle(buf, windowStyle, wxTHICK_FRAME, "wxTHICK_FRAME");
-    GenerateStyle(buf, windowStyle, wxRESIZE_BORDER, "wxRESIZE_BORDER");
-    GenerateStyle(buf, windowStyle, wxSYSTEM_MENU, "wxSYSTEM_MENU");
-    GenerateStyle(buf, windowStyle, wxMINIMIZE_BOX, "wxMINIMIZE_BOX");
-    GenerateStyle(buf, windowStyle, wxMAXIMIZE_BOX, "wxMAXIMIZE_BOX");
-  }
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
+    buf[0] = 0;
+    m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
+    m_styleTable.GenerateStyleStrings("wxPanel", windowStyle, buf);
+    m_styleTable.GenerateStyleStrings("wxDialog", windowStyle, buf);
+    
+    if (strlen(buf) == 0)
+        strcat(buf, "0");
 }
 
 void wxResourceTableWithSaving::GeneratePanelStyleString(long windowStyle, char *buf)
 {
-  buf[0] = 0;
-  GenerateWindowStyleString(windowStyle, buf);
-
-/*
-  GenerateStyle(buf, windowStyle, wxRETAINED, "wxRETAINED");
-*/
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-
-void wxResourceTableWithSaving::GenerateItemStyleString(long windowStyle, char *buf)
-{
-  GenerateWindowStyleString(windowStyle, buf);
-  
-  GenerateStyle(buf, windowStyle, wxHORIZONTAL, "wxHORIZONTAL");
-  GenerateStyle(buf, windowStyle, wxVERTICAL, "wxVERTICAL");
-}
-
-void wxResourceTableWithSaving::GenerateRadioBoxStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateMessageStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateTextStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  GenerateStyle(buf, windowStyle, wxTE_PROCESS_ENTER, "wxTE_PROCESS_ENTER");
-  GenerateStyle(buf, windowStyle, wxTE_READONLY, "wxTE_READONLY");
-  GenerateStyle(buf, windowStyle, wxTE_PASSWORD, "wxTE_PASSWORD");
-  GenerateStyle(buf, windowStyle, wxTE_MULTILINE, "wxTE_MULTILINE");
-
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateButtonStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateCheckBoxStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateListBoxStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  GenerateStyle(buf, windowStyle, wxLB_ALWAYS_SB, "wxLB_ALWAYS_SB");
-  GenerateStyle(buf, windowStyle, wxLB_SORT,      "wxLB_SORT");
-//  GenerateStyle(buf, windowStyle, wxLB_SINGLE,    "wxLB_SINGLE"); // Done already
-  GenerateStyle(buf, windowStyle, wxLB_MULTIPLE,  "wxLB_MULTIPLE");
-  GenerateStyle(buf, windowStyle, wxLB_EXTENDED,  "wxLB_EXTENDED");
-
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateSliderStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateGroupBoxStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-void wxResourceTableWithSaving::GenerateGaugeStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  GenerateStyle(buf, windowStyle, wxGA_PROGRESSBAR, "wxGA_PROGRESSBAR");
-
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
+    buf[0] = 0;
+    m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
+    m_styleTable.GenerateStyleStrings("wxPanel", windowStyle, buf);
+    
+    if (strlen(buf) == 0)
+        strcat(buf, "0");
 }
 
-void wxResourceTableWithSaving::GenerateChoiceStyleString(long windowStyle, char *buf)
-{
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
 
-void wxResourceTableWithSaving::GenerateScrollBarStyleString(long windowStyle, char *buf)
+void wxResourceTableWithSaving::GenerateControlStyleString(const wxString& windowClass, long windowStyle, char *buf)
 {
-  buf[0] = 0;
-  GenerateItemStyleString(windowStyle, buf);
-  
-  if (strlen(buf) == 0)
-    strcat(buf, "0");
-}
-
-bool wxResourceTableWithSaving::GenerateStyle(char *buf, long windowStyle, long flag, char *strStyle)
-{
-  if ((windowStyle & flag) == flag)
-  {
-    if (strlen(buf) > 0)
-      strcat(buf, " | ");
-    strcat(buf, strStyle);
-    return TRUE;
-  }
-  else
-    return FALSE;
+    buf[0] = 0;
+    m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
+    m_styleTable.GenerateStyleStrings("wxControl", windowStyle, buf);
+    m_styleTable.GenerateStyleStrings(windowClass, windowStyle, buf);
+    
+    if (strlen(buf) == 0)
+        strcat(buf, "0");
 }
 
 // Returns quoted string or "NULL"
-char *SafeString(char *s)
+char *SafeString(const wxString& s)
 {
-  if (!s)
-    return "NULL";
-  else
-  {
-    strcpy(wxBuffer, "\"");
-    strcat(wxBuffer, s);
-    strcat(wxBuffer, "\"");
-    return wxBuffer;
-  }
+    if (s == "")
+        return "NULL";
+    else
+    {
+        strcpy(wxBuffer, "\"");
+        strcat(wxBuffer, s);
+        strcat(wxBuffer, "\"");
+        return wxBuffer;
+    }
 }
 
-// Returns quoted string or ''
-char *SafeWord(char *s)
+// Returns quoted string or '' : convert " to \"
+char *SafeWord(const wxString& s)
 {
-  if (!s)
-    return "''";
-  else
-  {
-    strcpy(wxBuffer, "'");
-    strcat(wxBuffer, s);
-    strcat(wxBuffer, "'");
-    return wxBuffer;
-  }
+    const char *cp;
+    char *dp;
+    
+    if (s == "")
+        return "''";
+    else
+    {
+        dp = wxBuffer;
+        cp = s.c_str();
+        *dp++ = '\'';
+        while(*cp != 0) {
+            if(*cp == '"') {
+                *dp++ = '\\';
+                *dp++ = '"';
+            } else if(*cp == '\'') {
+                *dp++ = '\\';
+                *dp++ = '\'';
+            } else
+                *dp++ = *cp;
+            
+            cp++;
+        }
+        *dp++ = '\'';
+        *dp++ = 0;
+        
+        return wxBuffer;
+    }
 }