X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11ad1132cac5f3356fa2ffb595806137c309a7ea..fc9a9b2ab212efcf595dee50e58942c71344eca4:/contrib/utils/convertrc/rc2xml.cpp?ds=inline diff --git a/contrib/utils/convertrc/rc2xml.cpp b/contrib/utils/convertrc/rc2xml.cpp index 15f7ac44ee..3c8e797ae1 100644 --- a/contrib/utils/convertrc/rc2xml.cpp +++ b/contrib/utils/convertrc/rc2xml.cpp @@ -21,7 +21,7 @@ cross platform (wxGTK,etc) #endif // For compilers that support precompilation, includes "wx/wx.h". -#include +#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("\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 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\n"); - } - - if (token.Find("BS_AUTORADIOBUTTON")!=-1) - { - ReadRect(x,y,width,height); - m_xmlfile.Write("\t\t\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" @@ -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\t1\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\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 ))