]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/utils/convertrc/rc2xml.cpp
Do -> Redo
[wxWidgets.git] / contrib / utils / convertrc / rc2xml.cpp
index 15f7ac44eeecb842bea8011267755317fa8f84e3..3c8e797ae142d8d7e2a6f57ba48d08af226ebecf 100644 (file)
@@ -21,7 +21,7 @@ cross platform (wxGTK,etc)
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
-#include <wx/wxprec.h>
+#include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #pragma hdrstop
@@ -68,11 +68,16 @@ bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
     m_rc.Open(rcfile.c_str());
     m_filesize=m_rc.Length();
     
+
     m_workingpath=wxPathOnly(rcfile);
+
     m_targetpath=wxPathOnly(xmlfile)+"\\";
 
+
+
     wxSetWorkingDirectory(m_workingpath);
 
+
     bool result;
     result=m_xmlfile.Open(xmlfile.c_str(),"w+t");
     wxASSERT_MSG(result,"Couldn't create XML file");   
@@ -96,6 +101,8 @@ bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
     m_xmlfile.Write("</resource>\n");
     m_xmlfile.Close();
     m_rc.Close();
+    wxMessageBox(_("Conversion complete."), _("Done"), 
+                            wxOK | wxICON_INFORMATION);
 
 return TRUE;
 }
@@ -111,7 +118,8 @@ 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();
@@ -172,32 +180,60 @@ END
 void rc2xml::ParseControls()
 {
     wxString token;
+    wxString label,varname;
 
     token=GetToken();
     while ((token!="END")&(token!="}"))
         {
         if (token=="AUTOCHECKBOX")
-            ParseCheckBox();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseCheckBox(label,varname);
+            }
         else
         if (token=="AUTORADIOBUTTON")
-            ParseRadioButton();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseRadioButton(label,varname);
+           }
         else
         if (token=="LTEXT")
-            ParseStaticText();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseStaticText(label,varname);
+            }
         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")
-            ParseGroupBox();
+           {
+            label=GetQuoteField();
+            varname=GetToken();
+            ParseGroupBox(label,varname);
+            }
         else if (token=="COMBOBOX")
-            ParseComboBox();
+            {
+            varname=GetToken();
+            ParseComboBox(varname);
+             }
         else if (token=="CONTROL")
             ParseControlMS();
         else if (token=="LISTBOX")
-            ParseListBox();
+           {
+            varname=GetToken();
+            ParseListBox(varname);
+            }
         else if (token=="ICON")
             ParseIconStatic();
         else if (token=="SCROLLBAR")
@@ -207,12 +243,15 @@ void rc2xml::ParseControls()
 
 }
 //LTEXT           "Radius",IDC_STATIC,9,67,23,8
-void rc2xml::ParseStaticText()
+void rc2xml::ParseStaticText(wxString phrase, wxString varname)
 {
     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);
 
@@ -222,11 +261,16 @@ void rc2xml::ParseStaticText()
 
 }
 //EDITTEXT        IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
-void rc2xml::ParseTextCtrl()
+void rc2xml::ParseTextCtrl(wxString varname)
 {
     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
@@ -237,13 +281,15 @@ void rc2xml::ParseTextCtrl()
 
 }
 //AUTOCHECKBOX "&log.", ID_XLOG, 25, 24, 21, 12
-void rc2xml::ParseCheckBox()
+void rc2xml::ParseCheckBox(wxString phrase, wxString varname)
 {
     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);
 
@@ -254,15 +300,14 @@ void rc2xml::ParseCheckBox()
 
 }
 //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 phrase,varname;
-    phrase=GetQuoteField();
-    varname=GetToken();
-
     int x,y,width,height;
+    bool GotOrs;
+    GotOrs = ReadOrs(token);
     if (ReadRect(x,y,width,height))
+        if (GotOrs==FALSE)
       ReadOrs(token);
     if (token.Find("WS_GROUP") != -1)
         style += "wxRB_GROUP";
@@ -276,13 +321,16 @@ void rc2xml::ParseRadioButton()
 }
 
 //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 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);
 
@@ -309,13 +357,16 @@ bool rc2xml::Seperator(int ch)
     return FALSE;
 }
 
-void rc2xml::ParseGroupBox()
+void rc2xml::ParseGroupBox(wxString phrase, wxString varname)
 {
 //    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);
 
@@ -390,14 +441,56 @@ wxString rc2xml::GetQuoteField()
 
     while (ch!=34)
         ReadChar(ch);
+    ReadChar(ch);
   
+    while (ch!=34)
+    {
+    phrase+=(char)ch;
+    ReadChar(ch);
+    }
+    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;
 }
 
@@ -418,15 +511,16 @@ void rc2xml::ReadChar(int &ch)
         m_done=TRUE;
 }
 
-void rc2xml::ParseComboBox()
+void rc2xml::ParseComboBox(wxString varname)
 {
 /* COMBOBOX        IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT | 
                     WS_VSCROLL | WS_TABSTOP */
     wxString token,style;
-    wxString varname;
-    varname=GetToken();
     int x,y,width,height;
+    bool GotOrs;
+    GotOrs = ReadOrs(token);
     if (ReadRect(x,y,width,height))
+        if (GotOrs==FALSE)
       ReadOrs(token);
 
     m_xmlfile.Write("\t\t<object class=\"wxComboBox\"");
@@ -458,6 +552,8 @@ void rc2xml::ParseMenu(wxString varname)
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
+    token.MakeUpper();
+
     if (token=="POPUP")
         {
         ParsePopupMenu();
@@ -492,6 +588,8 @@ void rc2xml::ParsePopupMenu()
     while ((token!="END")&(token!="}"))
     {
     token=GetToken();
+    token.MakeUpper();
+
     if (token=="POPUP")
         ParsePopupMenu();
        
@@ -584,34 +682,27 @@ bool rc2xml::ReadOrs(wxString & orstring)
     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;
+    int p;
+    p=m_rc.Tell();
     ReadOrs(token);
-    int x,y,width,height;
+    m_rc.Seek(p);
 
     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;
@@ -708,11 +799,15 @@ void rc2xml::WriteStyle(wxString style)
     LISTBOX         IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL | 
                     LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
 */
-void rc2xml::ParseListBox()
+void rc2xml::ParseListBox(wxString varname)
 {
     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);
 
@@ -806,7 +901,7 @@ void rc2xml::SecondPass()
     while (!m_done)
         {
         token=GetToken();
-        if (token=="DIALOG")
+        if ((token=="DIALOG")||(token=="DIALOGEX"))
             ParseDialog(prevtok);
         else if (token=="MENU")
             ParseMenu(prevtok);
@@ -850,7 +945,7 @@ void rc2xml::ParseToolBar(wxString varname)
     int c=0;   
     wxString buttonname,msg,tip,longhelp;
     token=GetToken();
-    while ((token!="BEGIN"))
+    while ((token!="BEGIN")&(token!="{"))
         token=GetToken();
 
     while ((token!="END")&(token!="}"))
@@ -900,7 +995,7 @@ void rc2xml::ParseStringTable(wxString varname)
 {
     wxString token;
     token=GetToken();
-    while ((token!="BEGIN"))
+    while ((token!="BEGIN")&(token!="{"))
         token=GetToken();
     token=GetToken();
     wxString *msg;
@@ -908,7 +1003,7 @@ void rc2xml::ParseStringTable(wxString varname)
     while ((token!="END")&(token!="}"))
         {
         msg=new wxString;
-        *msg=GetQuoteField();
+        *msg=GetStringQuote();
         m_stringtable->Append(token,msg);
         token=GetToken();
         }
@@ -964,7 +1059,8 @@ void rc2xml::ParseMenuItem()
     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>"
@@ -973,9 +1069,11 @@ void rc2xml::ParseMenuItem()
 //look for extra attributes like checked and break
     wxString ptoken;
     ptoken=PeekToken();
+    ptoken.MakeUpper();
     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");
@@ -985,6 +1083,7 @@ void rc2xml::ParseMenuItem()
             wxLogError("Unknown Menu Item token:"+token);
         
         ptoken=PeekToken();
+        ptoken.MakeUpper();
         }
     m_xmlfile.Write("\t\t\t</object>\n"); 
 
@@ -995,6 +1094,10 @@ void rc2xml::ParseIconStatic()
 {
     wxString token;
     wxString varname,iconname;
+    token = PeekToken();
+    if (token.Contains("\""))
+        iconname = GetQuoteField();
+    else
     iconname=GetToken();
 //Look up icon
     varname=GetToken();
@@ -1029,7 +1132,9 @@ wxString rc2xml::CleanName(wxString name)
     name.Replace("idr_","");
     name.Replace("idb_","");
     name.Replace("idc_","");
+
     name.Replace(".ico","");
+
     name.Replace(".bmp","");
     return name;
 }
@@ -1039,8 +1144,7 @@ void rc2xml::ParseStaticBitmap(wxString bitmapname, wxString varname)
 {
     wxString token;
     //Grab SS_BITMAP
-    token=GetToken();
-
+    ReadOrs(token);
 
 
     int x,y,width,height;
@@ -1078,6 +1182,23 @@ kindctrl.MakeUpper();
         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);
 
 }
 
@@ -1184,6 +1305,7 @@ void rc2xml::WriteBitmap(wxString bitmapname)
     
     wxString *bitmappath;
     bitmappath=(wxString *)node->Data();
+
     bitmapname=wxFileNameFromPath(*bitmappath);
     wxBitmap bitmap;
     if (!bitmap.LoadFile(*bitmappath,wxBITMAP_TYPE_BMP ))