]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/utils/convertrc/rc2xml.cpp
Patch [ 726877 ]: Remove /GX- from makevc.env
[wxWidgets.git] / contrib / utils / convertrc / rc2xml.cpp
index ee909b0256b7b1a46a4efd82a9fc572c06b3a94d..fc65fe51b32af1cea62240b4143238eec74f35a7 100644 (file)
@@ -36,7 +36,8 @@ cross platform (wxGTK,etc)
 
 #include "rc2xml.h"
 #include "wx/image.h"
 
 #include "rc2xml.h"
 #include "wx/image.h"
-#include "wx/resource.h"
+#include "wx/deprecated/setup.h"
+#include "wx/deprecated/resource.h"
 #include <wx/textfile.h>
 #include <wx/tokenzr.h>
 
 #include <wx/textfile.h>
 #include <wx/tokenzr.h>
 
@@ -67,7 +68,7 @@ bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
 {
     m_rc.Open(rcfile.c_str());
     m_filesize=m_rc.Length();
 {
     m_rc.Open(rcfile.c_str());
     m_filesize=m_rc.Length();
-    
+
 
     m_workingpath=wxPathOnly(rcfile);
 
 
     m_workingpath=wxPathOnly(rcfile);
 
@@ -80,15 +81,15 @@ bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
 
     bool result;
     result=m_xmlfile.Open(xmlfile.c_str(),"w+t");
 
     bool result;
     result=m_xmlfile.Open(xmlfile.c_str(),"w+t");
-    wxASSERT_MSG(result,"Couldn't create XML file");   
+    wxASSERT_MSG(result,"Couldn't create XML file");
     if (!result)
         return FALSE;
 
     if (!result)
         return FALSE;
 
-       
+
 /* Write Basic header for XML file */
     m_xmlfile.Write("<?xml version=\"1.0\" ?>\n");
     m_xmlfile.Write("<resource>\n");
 /* Write Basic header for XML file */
     m_xmlfile.Write("<?xml version=\"1.0\" ?>\n");
     m_xmlfile.Write("<resource>\n");
-    
+
 //Read resource.h
     ParseResourceHeader();
 //Gather all the resource we need for toolbars,menus, and etc
 //Read resource.h
     ParseResourceHeader();
 //Gather all the resource we need for toolbars,menus, and etc
@@ -101,6 +102,8 @@ bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
     m_xmlfile.Write("</resource>\n");
     m_xmlfile.Close();
     m_rc.Close();
     m_xmlfile.Write("</resource>\n");
     m_xmlfile.Close();
     m_rc.Close();
+    wxMessageBox(_("Conversion complete."), _("Done"),
+                            wxOK | wxICON_INFORMATION);
 
 return TRUE;
 }
 
 return TRUE;
 }
@@ -111,12 +114,13 @@ void rc2xml::ParseDialog(wxString dlgname)
     wxString token;
     static int dlgid=999;
     dlgid++;
     wxString token;
     static int dlgid=999;
     dlgid++;
-/* Make sure that this really is a dialog 
+/* Make sure that this really is a dialog
 microsoft reuses the keyword DIALOG for other things
 */
     token=PeekToken();
 //Microsoft notation?
 microsoft reuses the keyword DIALOG for other things
 */
     token=PeekToken();
 //Microsoft notation?
-    if (token=="DISCARDABLE")
+    while ((token=="DISCARDABLE")
+            ||(token=="LOADONCALL")||(token=="MOVEABLE"))
     {
     token=GetToken();
     token=PeekToken();
     {
     token=GetToken();
     token=PeekToken();
@@ -132,13 +136,13 @@ microsoft reuses the keyword DIALOG for other things
     token=GetToken();
     wxString title;
     wxString ptsize,face;
     token=GetToken();
     wxString title;
     wxString ptsize,face;
-    
+
     m_xmlfile.Write("\t<object class=\"wxDialog\"");
     //Avoid duplicate names this way
     dlgname.Replace("IDD_","DLG_");
     WriteBasicInfo(x,y,width,height,dlgname);
     WriteTitle(title);
     m_xmlfile.Write("\t<object class=\"wxDialog\"");
     //Avoid duplicate names this way
     dlgname.Replace("IDD_","DLG_");
     WriteBasicInfo(x,y,width,height,dlgname);
     WriteTitle(title);
-    
+
 
     while ((token!="BEGIN")&(token!="{"))
     {
 
     while ((token!="BEGIN")&(token!="{"))
     {
@@ -168,7 +172,7 @@ microsoft reuses the keyword DIALOG for other things
 
 /*
 BEGIN
 
 /*
 BEGIN
-    EDITTEXT        IDC_BANDS,36,83,22,14,ES_AUTOHSCROLL | ES_NUMBER | NOT 
+    EDITTEXT        IDC_BANDS,36,83,22,14,ES_AUTOHSCROLL | ES_NUMBER | NOT
                     WS_TABSTOP
     LTEXT           "Bands",IDC_STATIC,11,86,21,8
     EDITTEXT        IDC_NAME,10,3,75,14,ES_AUTOHSCROLL
                     WS_TABSTOP
     LTEXT           "Bands",IDC_STATIC,11,86,21,8
     EDITTEXT        IDC_NAME,10,3,75,14,ES_AUTOHSCROLL
@@ -177,32 +181,60 @@ END
 void rc2xml::ParseControls()
 {
     wxString token;
 void rc2xml::ParseControls()
 {
     wxString token;
+    wxString label,varname;
 
     token=GetToken();
     while ((token!="END")&(token!="}"))
         {
         if (token=="AUTOCHECKBOX")
 
     token=GetToken();
     while ((token!="END")&(token!="}"))
         {
         if (token=="AUTOCHECKBOX")
-            ParseCheckBox();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseCheckBox(label,varname);
+            }
         else
         if (token=="AUTORADIOBUTTON")
         else
         if (token=="AUTORADIOBUTTON")
-            ParseRadioButton();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseRadioButton(label,varname);
+           }
         else
         if (token=="LTEXT")
         else
         if (token=="LTEXT")
-            ParseStaticText();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseStaticText(label,varname);
+            }
         else if (token=="EDITTEXT")
         else if (token=="EDITTEXT")
-            ParseTextCtrl();
-        else if (token=="PUSHBUTTON")
-            ParsePushButton();
-        else if (token=="DEFPUSHBUTTON")
-            ParsePushButton();
+           {
+            varname=GetToken();
+            ParseTextCtrl(varname);
+            }
+        else if ((token=="PUSHBUTTON")||(token=="DEFPUSHBUTTON"))
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParsePushButton(label,varname);
+            }
         else if (token=="GROUPBOX")
         else if (token=="GROUPBOX")
-            ParseGroupBox();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseGroupBox(label,varname);
+            }
         else if (token=="COMBOBOX")
         else if (token=="COMBOBOX")
-            ParseComboBox();
+            {
+            varname=GetToken();
+            ParseComboBox(varname);
+             }
         else if (token=="CONTROL")
             ParseControlMS();
         else if (token=="LISTBOX")
         else if (token=="CONTROL")
             ParseControlMS();
         else if (token=="LISTBOX")
-            ParseListBox();
+           {
+            varname=GetToken();
+            ParseListBox(varname);
+            }
         else if (token=="ICON")
             ParseIconStatic();
         else if (token=="SCROLLBAR")
         else if (token=="ICON")
             ParseIconStatic();
         else if (token=="SCROLLBAR")
@@ -212,12 +244,15 @@ void rc2xml::ParseControls()
 
 }
 //LTEXT           "Radius",IDC_STATIC,9,67,23,8
 
 }
 //LTEXT           "Radius",IDC_STATIC,9,67,23,8
-void rc2xml::ParseStaticText()
+void rc2xml::ParseStaticText(wxString phrase, wxString varname)
 {
     wxString token;
 {
     wxString token;
-    wxString phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -227,11 +262,16 @@ void rc2xml::ParseStaticText()
 
 }
 //EDITTEXT        IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
 
 }
 //EDITTEXT        IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
-void rc2xml::ParseTextCtrl()
+void rc2xml::ParseTextCtrl(wxString varname)
 {
     wxString token;
 {
     wxString token;
-    wxString varname,style;
-    varname=GetToken();
+    wxString style;
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 //TODO
     int x,y,width,height;
     ReadRect(x,y,width,height);
 //TODO
@@ -242,13 +282,15 @@ void rc2xml::ParseTextCtrl()
 
 }
 //AUTOCHECKBOX "&log.", ID_XLOG, 25, 24, 21, 12
 
 }
 //AUTOCHECKBOX "&log.", ID_XLOG, 25, 24, 21, 12
-void rc2xml::ParseCheckBox()
+void rc2xml::ParseCheckBox(wxString phrase, wxString varname)
 {
     wxString token;
 {
     wxString token;
-    wxString phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
-
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -259,15 +301,14 @@ void rc2xml::ParseCheckBox()
 
 }
 //AUTORADIOBUTTON "&text", ID_SW10, 13, 12, 68, 10, BS_AUTORADIOBUTTON | WS_GROUP
 
 }
 //AUTORADIOBUTTON "&text", ID_SW10, 13, 12, 68, 10, BS_AUTORADIOBUTTON | WS_GROUP
-void rc2xml::ParseRadioButton()
+void rc2xml::ParseRadioButton(wxString phrase, wxString varname)
 {
     wxString token,style;
 {
     wxString token,style;
-    wxString phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
-
     int x,y,width,height;
     int x,y,width,height;
+    bool GotOrs;
+    GotOrs = ReadOrs(token);
     if (ReadRect(x,y,width,height))
     if (ReadRect(x,y,width,height))
+        if (GotOrs==FALSE)
       ReadOrs(token);
     if (token.Find("WS_GROUP") != -1)
         style += "wxRB_GROUP";
       ReadOrs(token);
     if (token.Find("WS_GROUP") != -1)
         style += "wxRB_GROUP";
@@ -281,13 +322,16 @@ void rc2xml::ParseRadioButton()
 }
 
 //PUSHBUTTON      "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
 }
 
 //PUSHBUTTON      "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
-void rc2xml::ParsePushButton()
+void rc2xml::ParsePushButton(wxString phrase, wxString varname)
 {
     wxString token;
 {
     wxString token;
-    wxString phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
 
 
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -310,17 +354,20 @@ bool rc2xml::Seperator(int ch)
         m_done=TRUE;
         return TRUE;
         }
         m_done=TRUE;
         return TRUE;
         }
-    
+
     return FALSE;
 }
 
     return FALSE;
 }
 
-void rc2xml::ParseGroupBox()
+void rc2xml::ParseGroupBox(wxString phrase, wxString varname)
 {
 //    GROUPBOX        "Rotate",IDC_STATIC,1,1,71,79
     wxString token;
 {
 //    GROUPBOX        "Rotate",IDC_STATIC,1,1,71,79
     wxString token;
-    wxString phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -370,7 +417,7 @@ wxString rc2xml::GetToken(bool *listseperator)
     {
     m_done=TRUE;
     }
     {
     m_done=TRUE;
     }
-  
+
 
     while (!Seperator(ch))
     {
 
     while (!Seperator(ch))
     {
@@ -395,7 +442,6 @@ wxString rc2xml::GetQuoteField()
 
     while (ch!=34)
         ReadChar(ch);
 
     while (ch!=34)
         ReadChar(ch);
-  
     ReadChar(ch);
 
     while (ch!=34)
     ReadChar(ch);
 
     while (ch!=34)
@@ -406,6 +452,49 @@ wxString rc2xml::GetQuoteField()
     return phrase;
 }
 
     return phrase;
 }
 
+// string in stringtable may contain embedded quotes
+// escape characters retained to allow strings to be rewritten
+wxString rc2xml::GetStringQuote()
+{
+    wxString phrase;
+    //ASCII code 34 "
+    bool done=FALSE;
+    int p,ch=0,lastch=0;
+    ReadChar(ch);
+
+    while (ch!=34)
+        ReadChar(ch);
+    ReadChar(ch);
+    while (done==FALSE)
+        {
+        if ((ch==34)&&(lastch!='\\'))
+            {
+            p=m_rc.Tell();
+            ReadChar(ch);
+// RC supports "", for embedded quote, as well as  \"
+            if (ch==34)
+                phrase+='\\';
+            else
+    {
+                m_rc.Seek(p);
+                done = TRUE;
+                }
+            }
+         if (done==TRUE)
+             break;
+         if (ch=='\r')
+             ReadChar(ch);                    // skip
+         if ((ch=='\n')&&(lastch=='\\'))      // lastch <should> be this
+             phrase+='n';                     // escape
+         else
+    phrase+=(char)ch;
+         lastch=ch;
+    ReadChar(ch);
+    }
+
+    return phrase;
+}
+
 void rc2xml::ReadChar(int &ch)
 {
     int result;
 void rc2xml::ReadChar(int &ch)
 {
     int result;
@@ -423,15 +512,16 @@ void rc2xml::ReadChar(int &ch)
         m_done=TRUE;
 }
 
         m_done=TRUE;
 }
 
-void rc2xml::ParseComboBox()
+void rc2xml::ParseComboBox(wxString varname)
 {
 {
-/* COMBOBOX        IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT | 
+/* COMBOBOX        IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT |
                     WS_VSCROLL | WS_TABSTOP */
     wxString token,style;
                     WS_VSCROLL | WS_TABSTOP */
     wxString token,style;
-    wxString varname;
-    varname=GetToken();
     int x,y,width,height;
     int x,y,width,height;
+    bool GotOrs;
+    GotOrs = ReadOrs(token);
     if (ReadRect(x,y,width,height))
     if (ReadRect(x,y,width,height))
+        if (GotOrs==FALSE)
       ReadOrs(token);
 
     m_xmlfile.Write("\t\t<object class=\"wxComboBox\"");
       ReadOrs(token);
 
     m_xmlfile.Write("\t\t<object class=\"wxComboBox\"");
@@ -463,6 +553,8 @@ void rc2xml::ParseMenu(wxString varname)
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
+    token.MakeUpper();
+
     if (token=="POPUP")
         {
         ParsePopupMenu();
     if (token=="POPUP")
         {
         ParsePopupMenu();
@@ -497,9 +589,11 @@ void rc2xml::ParsePopupMenu()
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
+    token.MakeUpper();
+
     if (token=="POPUP")
         ParsePopupMenu();
     if (token=="POPUP")
         ParsePopupMenu();
-       
+
     if (token=="MENUITEM")
         ParseMenuItem();
     }
     if (token=="MENUITEM")
         ParseMenuItem();
     }
@@ -529,7 +623,7 @@ void rc2xml::ParseControlMS()
 
 }
 
 
 }
 
-/*    CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | 
+/*    CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |
                     TBS_NOTICKS | WS_TABSTOP,52,73,100,15
 */
 
                     TBS_NOTICKS | WS_TABSTOP,52,73,100,15
 */
 
@@ -551,7 +645,7 @@ void rc2xml::ParseSlider(wxString label, wxString varname)
     m_xmlfile.Write("\n\t\t</object>\n");
 
 }
     m_xmlfile.Write("\n\t\t</object>\n");
 
 }
-/*    
+/*
 CONTROL         "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
                     WS_BORDER,15,52,154,13
 */
 CONTROL         "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
                     WS_BORDER,15,52,154,13
 */
@@ -559,7 +653,7 @@ void rc2xml::ParseProgressBar(wxString label, wxString varname)
 {
     wxString token,style;
     ReadOrs(token);
 {
     wxString token,style;
     ReadOrs(token);
-   
+
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -581,7 +675,7 @@ bool rc2xml::ReadOrs(wxString & orstring)
 
     while(PeekToken()==_T("|"))
     {
 
     while(PeekToken()==_T("|"))
     {
-    //Grab | 
+    //Grab |
     orstring+=GetToken();
     //Grab next token
     orstring+=GetToken();
     orstring+=GetToken();
     //Grab next token
     orstring+=GetToken();
@@ -589,34 +683,27 @@ bool rc2xml::ReadOrs(wxString & orstring)
     return TRUE;
 }
 
     return TRUE;
 }
 
-//Is it a check button or a radio button
+//Is it a checkbutton or a radiobutton or a pushbutton or a groupbox
 void rc2xml::ParseCtrlButton(wxString label, wxString varname)
 {
     wxString token;
 void rc2xml::ParseCtrlButton(wxString label, wxString varname)
 {
     wxString token;
+    int p;
+    p=m_rc.Tell();
     ReadOrs(token);
     ReadOrs(token);
-    int x,y,width,height;
+    m_rc.Seek(p);
 
     if (token.Find("BS_AUTOCHECKBOX")!=-1)
 
     if (token.Find("BS_AUTOCHECKBOX")!=-1)
-        {
-        ReadRect(x,y,width,height);
-        m_xmlfile.Write("\t\t<object class=\"wxCheckBox\"");
-        WriteBasicInfo(x,y,width,height,varname);
-        WriteLabel(label);
-        m_xmlfile.Write("\t\t</object>\n");
-        }
-
-    if (token.Find("BS_AUTORADIOBUTTON")!=-1)
-        {
-        ReadRect(x,y,width,height);
-        m_xmlfile.Write("\t\t<object class=\"wxRadioButton\"");
-        WriteBasicInfo(x,y,width,height,varname);
-        WriteLabel(label);
-        m_xmlfile.Write("\t\t</object>\n");
-        }
-
+        ParseCheckBox(label, varname);
+    else if ((token.Find("BS_AUTORADIOBUTTON")!=-1)||
+                  (token.Find("BS_RADIOBUTTON")!=-1))
+        ParseRadioButton(label, varname);
+    else if (token.Find("BS_GROUPBOX")!=-1)
+        ParseGroupBox(label, varname);
+    else  // if ((token.Find("BS_PUSHBUTTON")!=-1)||
+//                (token.Find("BS_DEFPUSHBUTTON")!=-1))
+        ParsePushButton(label, varname);           // make default case
 }
 
 }
 
-
 void rc2xml::WriteSize(int width, int height)
 {
     wxString msg;
 void rc2xml::WriteSize(int width, int height)
 {
     wxString msg;
@@ -640,7 +727,7 @@ void rc2xml::WriteTitle(wxString title)
 
 void rc2xml::WriteName(wxString name)
 {
 
 void rc2xml::WriteName(wxString name)
 {
-       
+
 //Try to convert any number ids into names
 name=LookUpId(name);
 //Replace common MS ids with wxWindows ids
 //Try to convert any number ids into names
 name=LookUpId(name);
 //Replace common MS ids with wxWindows ids
@@ -710,14 +797,18 @@ void rc2xml::WriteStyle(wxString style)
     m_xmlfile.Write("\t\t\t<style>"+style+"</style>\n");
 }
 /*
     m_xmlfile.Write("\t\t\t<style>"+style+"</style>\n");
 }
 /*
-    LISTBOX         IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL | 
+    LISTBOX         IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL |
                     LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
 */
                     LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
 */
-void rc2xml::ParseListBox()
+void rc2xml::ParseListBox(wxString varname)
 {
     wxString token;
 {
     wxString token;
-    wxString varname;
-    varname=GetToken();
+    token=PeekToken();
+    while (!token.IsNumber())
+        {
+        token=GetToken();
+        token=PeekToken();
+        }
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
     int x,y,width,height;
     ReadRect(x,y,width,height);
 
@@ -727,7 +818,7 @@ void rc2xml::ParseListBox()
 
 }
 /*
 
 }
 /*
-    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",ES_AUTOHSCROLL | WS_BORDER | 
+    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",ES_AUTOHSCROLL | WS_BORDER |
                     WS_TABSTOP,103,110,40,14
 */
 void rc2xml::ParseRichEdit(wxString label, wxString varname)
                     WS_TABSTOP,103,110,40,14
 */
 void rc2xml::ParseRichEdit(wxString label, wxString varname)
@@ -753,7 +844,7 @@ CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,209,72,
 void rc2xml::ParseSpinCtrl(wxString label, wxString varname)
 {
     wxString token,style;
 void rc2xml::ParseSpinCtrl(wxString label, wxString varname)
 {
     wxString token,style;
-    
+
     ReadOrs(token);
     if (token.Find("UDS_HORZ")!=-1)
         style="wxSP_HORIZONTAL";
     ReadOrs(token);
     if (token.Find("UDS_HORZ")!=-1)
         style="wxSP_HORIZONTAL";
@@ -782,7 +873,7 @@ void rc2xml::FirstPass()
             ParseStringTable(prevtok);
         else if (token=="ICON")
             ParseIcon(prevtok);
             ParseStringTable(prevtok);
         else if (token=="ICON")
             ParseIcon(prevtok);
-        
+
         prevtok=token;
         }
 }
         prevtok=token;
         }
 }
@@ -790,7 +881,7 @@ void rc2xml::FirstPass()
 void rc2xml::ParseBitmap(wxString varname)
 {
     wxString token,*bitmapfile;
 void rc2xml::ParseBitmap(wxString varname)
 {
     wxString token,*bitmapfile;
-    
+
     token=PeekToken();
     //Microsoft notation?
     if (token=="DISCARDABLE")
     token=PeekToken();
     //Microsoft notation?
     if (token=="DISCARDABLE")
@@ -811,13 +902,13 @@ void rc2xml::SecondPass()
     while (!m_done)
         {
         token=GetToken();
     while (!m_done)
         {
         token=GetToken();
-        if (token=="DIALOG")
+        if ((token=="DIALOG")||(token=="DIALOGEX"))
             ParseDialog(prevtok);
         else if (token=="MENU")
             ParseMenu(prevtok);
         else if (token=="TOOLBAR")
             ParseToolBar(prevtok);
             ParseDialog(prevtok);
         else if (token=="MENU")
             ParseMenu(prevtok);
         else if (token=="TOOLBAR")
             ParseToolBar(prevtok);
-        
+
         prevtok=token;
         }
 
         prevtok=token;
         }
 
@@ -825,7 +916,7 @@ void rc2xml::SecondPass()
 
 void rc2xml::ParseToolBar(wxString varname)
 {
 
 void rc2xml::ParseToolBar(wxString varname)
 {
-    wxString token;    
+    wxString token;
     token=GetToken();
     wxASSERT_MSG(token=="DISCARDABLE","Error in toolbar parsing");
 //Look up bitmap for toolbar and load
     token=GetToken();
     wxASSERT_MSG(token=="DISCARDABLE","Error in toolbar parsing");
 //Look up bitmap for toolbar and load
@@ -852,10 +943,10 @@ void rc2xml::ParseToolBar(wxString varname)
     width=atoi(GetToken());
     height=atoi(GetToken());
 
     width=atoi(GetToken());
     height=atoi(GetToken());
 
-    int c=0;   
+    int c=0;
     wxString buttonname,msg,tip,longhelp;
     token=GetToken();
     wxString buttonname,msg,tip,longhelp;
     token=GetToken();
-    while ((token!="BEGIN"))
+    while ((token!="BEGIN")&(token!="{"))
         token=GetToken();
 
     while ((token!="END")&(token!="}"))
         token=GetToken();
 
     while ((token!="END")&(token!="}"))
@@ -905,7 +996,7 @@ void rc2xml::ParseStringTable(wxString varname)
 {
     wxString token;
     token=GetToken();
 {
     wxString token;
     token=GetToken();
-    while ((token!="BEGIN"))
+    while ((token!="BEGIN")&(token!="{"))
         token=GetToken();
     token=GetToken();
     wxString *msg;
         token=GetToken();
     token=GetToken();
     wxString *msg;
@@ -913,7 +1004,7 @@ void rc2xml::ParseStringTable(wxString varname)
     while ((token!="END")&(token!="}"))
         {
         msg=new wxString;
     while ((token!="END")&(token!="}"))
         {
         msg=new wxString;
-        *msg=GetQuoteField();
+        *msg=GetStringQuote();
         m_stringtable->Append(token,msg);
         token=GetToken();
         }
         m_stringtable->Append(token,msg);
         token=GetToken();
         }
@@ -969,7 +1060,8 @@ void rc2xml::ParseMenuItem()
     m_xmlfile.Write(">\n");
     WriteLabel(token);
 //Look up help if any listed in stringtable
     m_xmlfile.Write(">\n");
     WriteLabel(token);
 //Look up help if any listed in stringtable
-    if (LookUpString(name,msg))
+//can't assume numbers correlate, restrict to string identifiers
+    if ((!name.IsNumber())&&(LookUpString(name,msg)))
         {
         SplitHelp(msg,tip,longhelp);
         m_xmlfile.Write("\t\t\t<help>"
         {
         SplitHelp(msg,tip,longhelp);
         m_xmlfile.Write("\t\t\t<help>"
@@ -978,9 +1070,11 @@ void rc2xml::ParseMenuItem()
 //look for extra attributes like checked and break
     wxString ptoken;
     ptoken=PeekToken();
 //look for extra attributes like checked and break
     wxString ptoken;
     ptoken=PeekToken();
+    ptoken.MakeUpper();
     while ((ptoken!="MENUITEM")&(ptoken!="POPUP")&(ptoken!="END"))
         {
         token=GetToken();
     while ((ptoken!="MENUITEM")&(ptoken!="POPUP")&(ptoken!="END"))
         {
         token=GetToken();
+        ptoken.MakeUpper();
         if (token=="CHECKED")
             m_xmlfile.Write("\t\t\t<checkable>1</checkable>\n");
         else if (token=="MENUBREAK");
         if (token=="CHECKED")
             m_xmlfile.Write("\t\t\t<checkable>1</checkable>\n");
         else if (token=="MENUBREAK");
@@ -988,10 +1082,11 @@ void rc2xml::ParseMenuItem()
         else if (token=="GRAYED");
         else
             wxLogError("Unknown Menu Item token:"+token);
         else if (token=="GRAYED");
         else
             wxLogError("Unknown Menu Item token:"+token);
-        
+
         ptoken=PeekToken();
         ptoken=PeekToken();
+        ptoken.MakeUpper();
         }
         }
-    m_xmlfile.Write("\t\t\t</object>\n"); 
+    m_xmlfile.Write("\t\t\t</object>\n");
 
 }
 
 
 }
 
@@ -1000,6 +1095,10 @@ void rc2xml::ParseIconStatic()
 {
     wxString token;
     wxString varname,iconname;
 {
     wxString token;
     wxString varname,iconname;
+    token = PeekToken();
+    if (token.Contains("\""))
+        iconname = GetQuoteField();
+    else
     iconname=GetToken();
 //Look up icon
     varname=GetToken();
     iconname=GetToken();
 //Look up icon
     varname=GetToken();
@@ -1023,7 +1122,7 @@ void rc2xml::ParseIcon(wxString varname)
 
     *iconfile=GetQuoteField();
     m_iconlist->Append(varname,iconfile);
 
     *iconfile=GetQuoteField();
     m_iconlist->Append(varname,iconfile);
-    
+
 
 }
 
 
 }
 
@@ -1046,8 +1145,7 @@ void rc2xml::ParseStaticBitmap(wxString bitmapname, wxString varname)
 {
     wxString token;
     //Grab SS_BITMAP
 {
     wxString token;
     //Grab SS_BITMAP
-    token=GetToken();
-
+    ReadOrs(token);
 
 
     int x,y,width,height;
 
 
     int x,y,width,height;
@@ -1085,6 +1183,23 @@ kindctrl.MakeUpper();
         ParseCtrlButton(label,varname);
     if (kindctrl=="RICHEDIT")
         ParseRichEdit(label,varname);
         ParseCtrlButton(label,varname);
     if (kindctrl=="RICHEDIT")
         ParseRichEdit(label,varname);
+    if (kindctrl=="STATIC")
+        {
+        wxString token;
+        int p=m_rc.Tell();
+        ReadOrs(token);
+        m_rc.Seek(p);
+        if (token.Find("SS_BITMAP")!=-1)
+            ParseStaticBitmap(label,varname);
+        else
+            ParseStaticText(label,varname);
+        }
+    if (kindctrl=="EDIT")
+        ParseTextCtrl(varname);
+    if (kindctrl=="LISTBOX")
+        ParseListBox(varname);
+    if (kindctrl=="COMBOBOX")
+        ParseComboBox(varname);
 
 }
 
 
 }
 
@@ -1120,7 +1235,7 @@ void rc2xml::ParseScrollBar()
     wxString style;
 
     ReadOrs(token);
     wxString style;
 
     ReadOrs(token);
-    
+
 if (token.Find("SBS_VERT")!=-1)
     style=_T("wxSB_VERTICAL");
 //Default MFC style is horizontal
 if (token.Find("SBS_VERT")!=-1)
     style=_T("wxSB_VERTICAL");
 //Default MFC style is horizontal
@@ -1188,7 +1303,7 @@ void rc2xml::WriteBitmap(wxString bitmapname)
         wxLogError("Unable to find bitmap:"+bitmapname);
         return;
         }
         wxLogError("Unable to find bitmap:"+bitmapname);
         return;
         }
-    
+
     wxString *bitmappath;
     bitmappath=(wxString *)node->Data();
 
     wxString *bitmappath;
     bitmappath=(wxString *)node->Data();
 
@@ -1230,7 +1345,7 @@ wxNode *node=m_iconlist->Find(iconname);
     m_xmlfile.Write("\t\t\t<bitmap>"+iconname+"</bitmap>\n");
     bitmap.SaveFile(m_targetpath+iconname,wxBITMAP_TYPE_BMP);
 
     m_xmlfile.Write("\t\t\t<bitmap>"+iconname+"</bitmap>\n");
     bitmap.SaveFile(m_targetpath+iconname,wxBITMAP_TYPE_BMP);
 
-    
+
 }
 /*Unfortunately sometimes the great MSVC Resource editor decides
 to use numbers instead of the word id.  I have no idea why they
 }
 /*Unfortunately sometimes the great MSVC Resource editor decides
 to use numbers instead of the word id.  I have no idea why they
@@ -1248,13 +1363,13 @@ wxTextFile r;
         wxLogError("Warining Unable to load resource.h file");
         return;
         }
         wxLogError("Warining Unable to load resource.h file");
         return;
         }
-    
+
     wxString str;
     wxString id,v;
     wxStringTokenizer tok;
     wxString *varname;
     wxString str;
     wxString id,v;
     wxStringTokenizer tok;
     wxString *varname;
-    
-    
+
+
     long n;
 
 //Read through entire file
     long n;
 
 //Read through entire file
@@ -1277,8 +1392,8 @@ wxTextFile r;
         }
     }
 
         }
     }
 
-  
-    
+
+
 }
 
 
 }