Applied patch [ 651713 ] changes to convertrc

David J. Cooke (davidjcooke)

amendments to convertrc: add support for
CONTROL... syntax for static, edit, combobox,
buttons, but NOT scrollbar; add support for
embedded quotes in stringtable; other minor changes


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18260 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-12-16 11:03:05 +00:00
parent 7d1dcec23a
commit 5c8756b04c
2 changed files with 195 additions and 80 deletions

View File

@@ -101,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;
}
@@ -116,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();
@@ -177,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")
@@ -212,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);
@@ -227,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
@@ -242,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);
@@ -259,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";
@@ -281,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);
@@ -314,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);
@@ -395,9 +441,8 @@ wxString rc2xml::GetQuoteField()
while (ch!=34)
ReadChar(ch);
ReadChar(ch);
while (ch!=34)
{
phrase+=(char)ch;
@@ -406,6 +451,49 @@ wxString rc2xml::GetQuoteField()
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;
@@ -423,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\"");
@@ -463,6 +552,8 @@ void rc2xml::ParseMenu(wxString varname)
while ((token!="END")&(token!="}"))
{
token=GetToken();
token.MakeUpper();
if (token=="POPUP")
{
ParsePopupMenu();
@@ -497,6 +588,8 @@ void rc2xml::ParsePopupMenu()
while ((token!="END")&(token!="}"))
{
token=GetToken();
token.MakeUpper();
if (token=="POPUP")
ParsePopupMenu();
@@ -589,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;
@@ -713,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);
@@ -811,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);
@@ -855,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!="}"))
@@ -905,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;
@@ -913,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();
}
@@ -969,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>"
@@ -978,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");
@@ -990,6 +1083,7 @@ void rc2xml::ParseMenuItem()
wxLogError("Unknown Menu Item token:"+token);
ptoken=PeekToken();
ptoken.MakeUpper();
}
m_xmlfile.Write("\t\t\t</object>\n");
@@ -1000,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();
@@ -1046,8 +1144,7 @@ void rc2xml::ParseStaticBitmap(wxString bitmapname, wxString varname)
{
wxString token;
//Grab SS_BITMAP
token=GetToken();
ReadOrs(token);
int x,y,width,height;
@@ -1085,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);
}

View File

@@ -52,19 +52,20 @@ protected:
void ParseRichEdit(wxString label, wxString varname);
void ParseDialog(wxString dlgname);
void ParseControls();
void ParseListBox();
void ParseStaticText();
void ParseTextCtrl();
void ParseRadioButton();
void ParseCheckBox();
void ParsePushButton();
void ParseListBox(wxString varname);
void ParseStaticText(wxString phrase,wxString varname);
void ParseTextCtrl(wxString varname);
void ParseRadioButton(wxString phrase,wxString varname);
void ParseCheckBox(wxString phrase,wxString varname);
void ParsePushButton(wxString phrase, wxString varname);
bool Seperator(int ch);
void ParseGroupBox();
void ParseGroupBox(wxString phrase, wxString varname);
bool ReadRect(int & x, int & y, int & width, int & height);
wxString GetToken(bool *listseperator = 0);
wxString GetQuoteField();
wxString GetStringQuote();
void ReadChar(int &ch);
void ParseComboBox();
void ParseComboBox(wxString varname);
void ParseMenu(wxString varname);
void ParsePopupMenu();
wxString PeekToken();