+// rc2xml.cpp: implementation of the wxRC2XML class.
+//
+//////////////////////////////////////////////////////////////////////
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#include "rc2xml.h"
+#include "wx/image.h"
+#include "wx/resource.h"
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+wxRC2XML::wxRC2XML()
+{
+m_done=FALSE;
+m_bitmaplist=new wxList(wxKEY_STRING);
+m_stringtable=new wxList(wxKEY_STRING);
+m_iconlist = new wxList(wxKEY_STRING);
+}
+
+wxRC2XML::~wxRC2XML()
+{
+delete m_bitmaplist;
+delete m_stringtable;
+delete m_iconlist;
+}
+
+bool wxRC2XML::Convert(wxString rcfile, wxString xmlfile)
+{
+m_rc.Open(rcfile.c_str());
+m_filesize=m_rc.Length();
+
+bool result;
+result=m_xmlfile.Open(xmlfile.c_str(),"w+t");
+wxASSERT_MSG(result,"Couldn't create XML file");
+if (!result)
+ return FALSE;
+
+
+/* Write Basic header for XML file */
+m_xmlfile.Write("<?xml version=\"1.0\" ?>\n");
+m_xmlfile.Write("<resource>\n");
+
+//Gather all the resource we need for toolbars,menus, and etc
+FirstPass();
+m_done=FALSE;
+m_rc.Seek(0);
+//Read in dialogs, toolbars,menus
+SecondPass();
+
+m_xmlfile.Write("</resource>\n");
+m_xmlfile.Close();
+m_rc.Close();
+
+return TRUE;
+}
+
+
+void wxRC2XML::ParseDialog(wxString dlgname)
+{
+ wxString token;
+ static int dlgid=999;
+ dlgid++;
+ /* Make sure that this really is a dialog
+ microsoft reuses the keyword DIALOG for other things
+ */
+ token=PeekToken();
+ //Microsoft notation?
+ if (token=="DISCARDABLE")
+ {
+ token=GetToken();
+ token=PeekToken();
+ }
+ //Error isn't a Dialog resource eject eject
+ if (!token.IsNumber())
+ return;
+
+//Record x,y,width,height
+int x,y,width,height;
+ReadRect(x,y,width,height);
+//Get Title
+token=GetToken();
+wxString title;
+
+while ((token!="BEGIN")&(token!="{"))
+{
+if (token=="CAPTION")
+ {
+ title=GetQuoteField();
+ }
+token=GetToken();
+}
+m_xmlfile.Write(" <dialog");
+//Avoid duplicate names this way
+dlgname.Replace("IDD_","DLG_");
+
+WriteBasicInfo(x,y,width,height,dlgname);
+WriteTitle(title);
+m_xmlfile.Write(" <children>\n");
+ParseControls();
+m_xmlfile.Write(" </children>\n");
+m_xmlfile.Write(" </dialog>\n");
+}
+
+/*
+BEGIN
+ 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
+END
+*/
+void wxRC2XML::ParseControls()
+{
+wxString token;
+
+token=GetToken();
+while ((token!="END")&(token!="}"))
+ {
+ if (token=="LTEXT")
+ ParseStaticText();
+ else if (token=="EDITTEXT")
+ ParseTextCtrl();
+ else if (token=="PUSHBUTTON")
+ ParsePushButton();
+ else if (token=="DEFPUSHBUTTON")
+ ParsePushButton();
+ else if (token=="GROUPBOX")
+ ParseGroupBox();
+ else if (token=="COMBOBOX")
+ ParseComboBox();
+ else if (token=="CONTROL")
+ ParseControlMS();
+ else if (token=="LISTBOX")
+ ParseListBox();
+ else if (token=="ICON")
+ ParseIconStatic();
+ else if (token=="SCROLLBAR")
+ ParseScrollBar();
+ token=GetToken();
+ }
+
+}
+//LTEXT "Radius",IDC_STATIC,9,67,23,8
+void wxRC2XML::ParseStaticText()
+{
+wxString token;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <statictext");
+WriteBasicInfo(x,y,width,height,varname);WriteLabel(phrase);
+m_xmlfile.Write(" </statictext>\n");
+
+}
+//EDITTEXT IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
+void wxRC2XML::ParseTextCtrl()
+{
+wxString token;
+wxString varname,style;
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+//TODO
+//style=GetToken();
+
+m_xmlfile.Write(" <textctrl");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write("\n </textctrl>\n");
+
+}
+//PUSHBUTTON "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
+void wxRC2XML::ParsePushButton()
+{
+wxString token;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+
+
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <button");
+WriteBasicInfo(x,y,width,height,varname);
+WriteLabel(phrase);
+m_xmlfile.Write(" </button>\n");
+
+}
+
+
+bool wxRC2XML::Seperator(int ch)
+{
+//if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='|')|(ch=='\t'))
+if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='\t'))
+ return TRUE;
+
+if (ch==EOF)
+{
+ m_done=TRUE;
+ return TRUE;
+}
+return FALSE;
+}
+
+void wxRC2XML::ParseGroupBox()
+{
+// GROUPBOX "Rotate",IDC_STATIC,1,1,71,79
+wxString token;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <staticbox");
+WriteBasicInfo(x,y,width,height,varname);
+WriteLabel(phrase);
+m_xmlfile.Write(" </staticbox>\n");
+
+
+}
+
+void wxRC2XML::ReadRect(int & x, int & y, int & width, int & height)
+{
+x=atoi(GetToken());
+y=atoi(GetToken());
+width=atoi(GetToken());
+height=atoi(GetToken());
+
+}
+
+wxString wxRC2XML::GetToken()
+{
+wxString token="";
+
+if (m_rc.Eof())
+{
+m_done=TRUE;
+return token;
+}
+
+int ch=0;
+ReadChar(ch);
+if (ch==EOF)
+{
+m_done=TRUE;
+return token;
+}
+
+while (Seperator(ch))
+{
+ ReadChar(ch);
+ if (m_done)
+ return token;
+}
+
+if (ch==EOF)
+{
+ m_done=TRUE;
+
+}
+
+
+while (!Seperator(ch))
+{
+ token+=(char)ch;
+ ReadChar(ch);
+
+}
+
+if (ch==EOF)
+ m_done=TRUE;
+
+
+return token;
+}
+
+wxString wxRC2XML::GetQuoteField()
+{
+wxString phrase;
+//ASCII code 34 "
+int ch=0;
+ReadChar(ch);
+
+while (ch!=34)
+ ReadChar(ch);
+
+ ReadChar(ch);
+
+while (ch!=34)
+{
+ phrase+=(char)ch;
+ ReadChar(ch);
+}
+return phrase;
+}
+
+void wxRC2XML::ReadChar(int &ch)
+{
+ int result;
+result=m_rc.Tell();
+
+if((result>=m_filesize))
+ m_done=TRUE;
+
+result=m_rc.Read(&ch,1);
+
+if((result==-1))
+ m_done=TRUE;
+
+if(ch==EOF)
+ m_done=TRUE;
+}
+
+void wxRC2XML::ParseComboBox()
+{
+/* COMBOBOX IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP */
+wxString token;
+wxString varname;
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <combobox");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write("\n </combobox>\n");
+
+
+
+}
+
+void wxRC2XML::ParseMenu(wxString varname)
+{
+wxString token="";
+
+//Write menubar to xml file
+m_xmlfile.Write(" <menubar");
+//Avoid duplicate names this way
+varname.Replace("IDR_","MB_");
+WriteName(varname);
+m_xmlfile.Write(">\n");
+m_xmlfile.Write(" <children>\n");
+
+while ((token!="BEGIN")&(token!="{"))
+ token=GetToken();
+
+while ((token!="END")&(token!="}"))
+{
+ token=GetToken();
+if (token=="POPUP")
+ {
+ ParsePopupMenu();
+ }
+}
+m_xmlfile.Write(" </children>\n");
+m_xmlfile.Write(" </menubar>\n");
+}
+
+void wxRC2XML::ParsePopupMenu()
+{
+static menucount=0;
+menucount++;
+wxString token,name,msg,longhelp,tip;
+token=GetQuoteField();
+int spot;
+//Remove /t because it causes problems
+
+spot=token.First("\\t");
+token=token.Left(spot);
+
+//Write Menu item
+//Generate a fake name since RC menus don't have one
+name<<"Menu_"<<menucount;
+m_xmlfile.Write(" <menu");
+WriteName(name);
+m_xmlfile.Write(">\n");
+WriteLabel(token);
+m_xmlfile.Write(" <children>\n");
+
+while ((token!="BEGIN")&(token!="{"))
+ token=GetToken();
+
+while ((token!="END")&(token!="}"))
+ {
+ token=GetToken();
+
+ if (token=="POPUP")
+ ParsePopupMenu();
+
+ if (token=="MENUITEM")
+ ParseMenuItem();
+
+ }
+m_xmlfile.Write(" </children>\n");
+m_xmlfile.Write(" </menu>\n");
+}
+
+wxString wxRC2XML::PeekToken()
+{
+wxString token;
+int p;
+p=m_rc.Tell();
+token=GetToken();
+
+m_rc.Seek(p);
+return token;
+}
+//MS Windows pain in the butt CONTROL
+void wxRC2XML::ParseControlMS()
+{
+wxString label,varname,kindctrl,token;
+token=PeekToken();
+
+if (token.Contains("\""))
+ ParseNormalMSControl();
+else
+ ParseWeirdMSControl();
+
+}
+
+/* CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |
+ TBS_NOTICKS | WS_TABSTOP,52,73,100,15
+*/
+
+void wxRC2XML::ParseSlider(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+//TODO Handle styles
+//fprintf(m_wxrfile," control = [%i,wxSlider,'','wxSL_HORIZONTAL','%s',",m_controlid,varname);
+int x,y,width,height;
+ReadRect(x,y,width,height);
+m_xmlfile.Write(" <slider");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write("\n </slider>\n");
+
+}
+/*
+CONTROL "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
+ WS_BORDER,15,52,154,13
+*/
+void wxRC2XML::ParseProgressBar(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+wxString style;
+//Always horizontal in MFC
+style+="wxGA_HORIZONTAL";
+m_xmlfile.Write(" <gauge");
+WriteBasicInfo(x,y,width,height,varname);
+WriteStyle(style);
+m_xmlfile.Write(" </gauge>\n");
+}
+
+/* FIXME: this function needs to be rewritten */
+bool wxRC2XML::ReadOrs(wxString & w)
+{
+wxString token;
+token=PeekToken();
+
+if (token.IsNumber())
+ return FALSE;
+
+w=GetToken();
+return TRUE;
+}
+
+//Is it a check button or a radio button
+void wxRC2XML::ParseCtrlButton(wxString label, wxString varname)
+{
+wxString token;
+ token=GetToken();
+ int x,y,width,height;
+
+if (token=="BS_AUTOCHECKBOX")
+ {
+ while (ReadOrs(token));
+ ReadRect(x,y,width,height);
+ m_xmlfile.Write(" <checkbox");
+ WriteBasicInfo(x,y,width,height,varname);
+ WriteLabel(label);
+ m_xmlfile.Write(" </checkbox>\n");
+ }
+
+if (token=="BS_AUTORADIOBUTTON")
+ {
+ while(ReadOrs(token));
+ ReadRect(x,y,width,height);
+ m_xmlfile.Write(" <radiobutton");
+ WriteBasicInfo(x,y,width,height,varname);
+ WriteLabel(label);
+ m_xmlfile.Write(" </radiobutton>\n");
+ }
+
+
+
+}
+
+
+void wxRC2XML::WriteSize(int width, int height)
+{
+wxString msg;
+msg<<" <size>"<<width<<","<<height<<"d</size>";
+m_xmlfile.Write(msg);
+}
+
+void wxRC2XML::WritePosition(int x, int y)
+{
+wxString msg;
+msg<<" <pos>"<<x<<","<<y<<"d</pos>";
+m_xmlfile.Write(msg);
+}
+
+void wxRC2XML::WriteTitle(wxString title)
+{
+wxString msg;
+msg=_T(" <title>"+title+"</title>\n");
+m_xmlfile.Write(msg);
+}
+
+void wxRC2XML::WriteName(wxString name)
+{
+
+//Replace common MS ids with wxWindows ids
+//I didn't do everyone of them
+if (name=="IDOK")
+ name="wxID_OK";
+else if (name=="IDCANCEL")
+ name="wxID_CANCEL";
+else if (name=="IDAPPLY")
+ name="wxID_APPLY";
+else if (name=="ID_FILE_OPEN")
+ name="wxID_OPEN";
+else if (name=="ID_FILE_CLOSE")
+ name="wxID_CLOSE";
+else if (name=="ID_FILE_SAVE")
+ name="wxID_SAVE";
+else if (name=="ID_FILE_SAVE_AS")
+ name="wxID_SAVEAS";
+else if (name=="ID_APP_EXIT")
+ name="wxID_EXIT";
+else if (name=="ID_FILE_PRINT")
+ name="wxID_PRINT";
+else if (name=="ID_FILE_PRINT_PREVIEW")
+ name="wxID_PREVIEW";
+else if (name=="ID_FILE_PRINT_SETUP")
+ name="wxID_PRINT_SETUP";
+else if (name=="ID_APP_ABOUT")
+ name="wxID_ABOUT";
+else if (name=="ID_EDIT_UNDO")
+ name="wxID_UNDO";
+else if (name=="ID_EDIT_CUT")
+ name="wxID_CUT";
+else if (name=="ID_EDIT_COPY")
+ name="wxID_COPY";
+else if (name=="ID_EDIT_PASTE")
+ name="wxID_PASTE";
+
+m_xmlfile.Write(" name= \""+name+"\"");
+}
+
+void wxRC2XML::WriteLabel(wxString label)
+{
+label.Replace("&","$");
+m_xmlfile.Write(" <label>"+label+"</label>\n");
+}
+
+void wxRC2XML::WriteBasicInfo(int x, int y, int width, int height, wxString name)
+{
+WriteName(name);
+m_xmlfile.Write(">\n");
+m_xmlfile.Write(" ");
+WritePosition(x,y);
+WriteSize(width,height);
+m_xmlfile.Write("\n");
+
+}
+
+void wxRC2XML::WriteStyle(wxString style)
+{
+if (style.Length()==0)
+ return;
+m_xmlfile.Write("\n <style>"+style+"</style>\n");
+}
+/*
+ LISTBOX IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL |
+ LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+*/
+void wxRC2XML::ParseListBox()
+{
+wxString token;
+wxString varname;
+
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <listbox");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write("\n </listbox>\n");
+
+}
+/*
+ CONTROL "",IDC_RICHEDIT1,"RICHEDIT",ES_AUTOHSCROLL | WS_BORDER |
+ WS_TABSTOP,103,110,40,14
+*/
+void wxRC2XML::ParseRichEdit(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+wxString style;
+//Make it a rich text control
+style+="wxTE_MULTILINE ";
+m_xmlfile.Write(" <textctrl");
+WriteBasicInfo(x,y,width,height,varname);
+WriteStyle(style);
+m_xmlfile.Write(" </textctrl>\n");
+
+}
+/*
+CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,209,72,
+ 19,26
+*/
+void wxRC2XML::ParseSpinCtrl(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+wxString style;
+m_xmlfile.Write(" <spinbutton");
+WriteBasicInfo(x,y,width,height,varname);
+WriteStyle(style);
+m_xmlfile.Write("\n </spinbutton>\n");
+
+
+}
+
+void wxRC2XML::FirstPass()
+{
+wxString token,prevtok;
+while (!m_done)
+ {
+ token=GetToken();
+ if (token=="BITMAP")
+ ParseBitmap(prevtok);
+ else if (token=="STRINGTABLE")
+ ParseStringTable(prevtok);
+ else if (token=="ICON")
+ ParseIcon(prevtok);
+ prevtok=token;
+ }
+}
+
+void wxRC2XML::ParseBitmap(wxString varname)
+{
+wxString token,*bitmapfile;
+bitmapfile=new wxString;
+token=PeekToken();
+//Microsoft notation?
+if (token=="DISCARDABLE")
+ {
+ token=GetToken();
+ token=PeekToken();
+ }
+
+*bitmapfile=GetQuoteField();
+m_bitmaplist->Append(varname,bitmapfile);
+
+}
+
+
+void wxRC2XML::SecondPass()
+{
+wxString token,prevtok;
+while (!m_done)
+ {
+ token=GetToken();
+ if (token=="DIALOG")
+ ParseDialog(prevtok);
+ else if (token=="MENU")
+ ParseMenu(prevtok);
+ else if (token=="TOOLBAR")
+ ParseToolBar(prevtok);
+ prevtok=token;
+ }
+
+}
+
+void wxRC2XML::ParseToolBar(wxString varname)
+{
+wxString token;
+token=GetToken();
+wxASSERT_MSG(token=="DISCARDABLE","Error in toolbar parsing");
+
+//Look up bitmap for toolbar and load
+wxNode *node=m_bitmaplist->Find(varname);
+wxString *bitmappath;
+bitmappath=(wxString *)node->Data();
+wxBitmap bitmap;
+if (!bitmap.LoadFile(*bitmappath,wxBITMAP_TYPE_BMP ))
+ wxLogError("Unable to load bitmap:"+*bitmappath);
+
+//Write toolbar to xml file
+m_xmlfile.Write(" <toolbar");
+//Avoid duplicate names this way
+varname.Replace("IDR_","TB_");
+WriteName(varname);
+m_xmlfile.Write(">\n");
+wxString style;
+style+="wxTB_FLAT";
+WriteStyle(style);
+
+m_xmlfile.Write(" <children>\n");
+
+//Grab width and height
+int width,height;
+width=atoi(GetToken());
+height=atoi(GetToken());
+
+int c=0;
+wxString buttonname,msg,tip,longhelp;
+token=GetToken();
+while ((token!="BEGIN"))
+ token=GetToken();
+
+while ((token!="END")&(token!="}"))
+ {
+ if (token=="BUTTON")
+ {
+ buttonname=GetToken();
+ m_xmlfile.Write(" <tool");
+ WriteName(buttonname);
+ m_xmlfile.Write(">\n");
+ //Write tool tip if any
+ if (LookUpString(buttonname,msg))
+ {
+ SplitHelp(msg,tip,longhelp);
+ m_xmlfile.Write(" <tooltip>"+tip+"</tooltip>\n");
+ m_xmlfile.Write(" <longhelp>"+longhelp+"</longhelp>\n");
+ }
+ //Make a bitmap file name
+ buttonname=CleanName(buttonname);
+ buttonname+=".bmp";
+ m_xmlfile.Write(" <bitmap>"+buttonname+"</bitmap>\n");
+ WriteToolButton(buttonname,c,width,height,bitmap);
+ m_xmlfile.Write(" </tool>\n");
+ c++;
+ }
+ else if (token=="SEPARATOR")
+ {
+ m_xmlfile.Write(" <separator/>\n");
+ }
+ token=GetToken();
+ }
+m_xmlfile.Write(" </children>\n");
+m_xmlfile.Write(" </toolbar>\n");
+}
+
+//Extract bitmaps from larger toolbar bitmap
+void wxRC2XML::WriteToolButton(wxString name,int index, int width, int height, wxBitmap bitmap)
+{
+int x;
+x=index*width;
+wxRect r(x,0,width,height);
+wxBitmap little;
+
+little=bitmap.GetSubBitmap(r);
+little.SaveFile(name,wxBITMAP_TYPE_BMP);
+}
+
+void wxRC2XML::ParseStringTable(wxString varname)
+{
+wxString token;
+token=GetToken();
+while ((token!="BEGIN"))
+ token=GetToken();
+token=GetToken();
+wxString *msg;
+
+while ((token!="END")&(token!="}"))
+ {
+ msg=new wxString;
+ *msg=GetQuoteField();
+ m_stringtable->Append(token,msg);
+ token=GetToken();
+ }
+
+}
+
+bool wxRC2XML::LookUpString(wxString strid,wxString & st)
+{
+wxNode *node=m_stringtable->Find(strid);
+wxString *s;
+if (node==NULL)
+ return FALSE;
+
+s=(wxString *)node->Data();
+st=*s;
+
+return TRUE;
+}
+
+bool wxRC2XML::SplitHelp(wxString msg, wxString &shorthelp, wxString &longhelp)
+{
+int spot;
+spot=msg.Find("\\n");
+if (spot==-1)
+ {
+ shorthelp=msg;
+ longhelp=msg;
+ }
+
+longhelp=msg.Left(spot);
+spot=msg.Length()-spot-2;
+shorthelp=msg.Right(spot);
+return TRUE;
+}
+
+void wxRC2XML::ParseMenuItem()
+{
+wxString token,name,msg,tip,longhelp;
+int spot;
+if (PeekToken()=="SEPARATOR")
+ {
+ m_xmlfile.Write(" <separator/>\n");
+ return;
+ }
+
+token=GetQuoteField();
+name=GetToken();
+//Remove /t because it causes problems
+spot=token.First("\\t");
+token=token.Left(spot);
+m_xmlfile.Write(" <menuitem");
+WriteName(name);
+m_xmlfile.Write(">\n");
+WriteLabel(token);
+//Look up help if any listed in stringtable
+if (LookUpString(name,msg))
+ {
+ SplitHelp(msg,tip,longhelp);
+ m_xmlfile.Write(" <help>"
+ +longhelp+"</help>\n");
+ }
+//look for extra attributes like checked and break
+wxString ptoken;
+ptoken=PeekToken();
+while ((ptoken!="MENUITEM")&(ptoken!="POPUP")&(ptoken!="END"))
+ {
+ token=GetToken();
+ if (token=="CHECKED")
+ m_xmlfile.Write(" <checkable>1</checkable>\n");
+ else if (token=="MENUBREAK");
+ //m_xmlfile.Write(" </break>\n");
+ else if (token=="GRAYED");
+ else
+ wxLogError("Unknown Menu Item token:"+token);
+ ptoken=PeekToken();
+ }
+m_xmlfile.Write(" </menuitem>\n");
+
+}
+
+//ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
+void wxRC2XML::ParseIconStatic()
+{
+wxString token;
+wxString varname,iconname;
+iconname=GetToken();
+//Look up icon
+wxNode *node=m_iconlist->Find(iconname);
+wxString *iconpath;
+iconpath=(wxString *)node->Data();
+wxIcon icon;
+wxBitmap bitmap;
+if (!icon.LoadFile(*iconpath,wxBITMAP_TYPE_ICO ))
+ wxLogError("Unable to load icon:"+*iconpath);
+bitmap.CopyFromIcon(icon);
+varname=GetToken();
+
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <staticbitmap");
+WriteBasicInfo(x,y,width,height,varname);
+//Save icon as a bitmap
+//Make a bitmap file name
+iconname=CleanName(iconname);
+iconname+=".bmp";
+m_xmlfile.Write(" <bitmap>"+iconname+"</bitmap>\n");
+bitmap.SaveFile(iconname,wxBITMAP_TYPE_BMP);
+m_xmlfile.Write(" </staticbitmap>\n");
+
+}
+//IDR_MAINFRAME ICON DISCARDABLE "res\\mfcexample.ico"
+void wxRC2XML::ParseIcon(wxString varname)
+{
+wxString token,*iconfile;
+iconfile=new wxString;
+token=PeekToken();
+
+*iconfile=GetQuoteField();
+m_iconlist->Append(varname,iconfile);
+
+}
+
+wxString wxRC2XML::CleanName(wxString name)
+{
+name.MakeLower();
+name.Replace("id_","");
+name.Replace("idr_","");
+name.Replace("idb_","");
+name.Replace("idc_","");
+return name;
+}
+// And the award for most messed up control goes to...
+// CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
+void wxRC2XML::ParseStaticBitmap(wxString bitmapname, wxString varname)
+{
+wxString token;
+//Grab SS_BITMAP
+token=GetToken();
+
+//Look up bitmap
+wxNode *node=m_bitmaplist->Find(bitmapname);
+wxString *bitmappath;
+bitmappath=(wxString *)node->Data();
+wxBitmap bitmap;
+if (!bitmap.LoadFile(*bitmappath,wxBITMAP_TYPE_BMP ))
+ wxLogError("Unable to load bitmap:"+*bitmappath);
+
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+m_xmlfile.Write(" <staticbitmap");
+WriteBasicInfo(x,y,width,height,varname);
+//Make a bitmap file name
+bitmapname=CleanName(bitmapname);
+bitmapname+=".bmp";
+m_xmlfile.Write(" <bitmap>"+bitmapname+"</bitmap>\n");
+bitmap.SaveFile(bitmapname,wxBITMAP_TYPE_BMP);
+m_xmlfile.Write(" </staticbitmap>\n");
+
+
+}
+
+void wxRC2XML::ParseNormalMSControl()
+{
+wxString label,varname,kindctrl;
+
+label=GetQuoteField();
+varname=GetToken();
+kindctrl=GetQuoteField();
+kindctrl.MakeUpper();
+
+if (kindctrl=="MSCTLS_UPDOWN32")
+ ParseSpinCtrl(label,varname);
+if (kindctrl=="MSCTLS_TRACKBAR32")
+ ParseSlider(label,varname);
+if (kindctrl=="MSCTLS_PROGRESS32")
+ ParseProgressBar(label,varname);
+if (kindctrl=="SYSTREEVIEW32")
+ ParseTreeCtrl(label,varname);
+if (kindctrl=="SYSMONTHCAL32")
+ ParseCalendar(label,varname);
+if (kindctrl=="SYSLISTVIEW32")
+ ParseListCtrl(label,varname);
+if (kindctrl=="BUTTON")
+ ParseCtrlButton(label,varname);
+if (kindctrl=="RICHEDIT")
+ ParseRichEdit(label,varname);
+
+}
+
+void wxRC2XML::ParseWeirdMSControl()
+{
+wxString kindctrl;
+wxString varname;
+wxString id;
+id=GetToken();
+varname=GetToken();
+kindctrl=GetQuoteField();
+kindctrl.MakeUpper();
+// CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
+if (kindctrl=="STATIC")
+ {
+ if (PeekToken()=="SS_BITMAP")
+ ParseStaticBitmap(id,varname);
+ else
+ wxLogError("Unknown MS Control Static token");
+ }
+
+}
+//SCROLLBAR IDC_SCROLLBAR1,219,56,10,40,SBS_VERT
+
+void wxRC2XML::ParseScrollBar()
+{
+wxString token;
+wxString varname;
+
+varname=GetToken();
+int x,y,width,height;
+ReadRect(x,y,width,height);
+wxString style;
+//Default MFC style is horizontal
+style=_T("wxSB_HORIZONTAL");
+/*
+while (ReadOrs(token))
+{
+if (token=="SBS_VERT")
+ style=_T("wxSB_VERTICAL");
+}
+*/
+m_xmlfile.Write(" <scrollbar");
+WriteBasicInfo(x,y,width,height,varname);
+WriteStyle(style);
+m_xmlfile.Write("\n </scrollbar>\n");
+
+
+}
+// CONTROL "Tree1",IDC_TREE1,"SysTreeView32",WS_BORDER | WS_TABSTOP,
+// 7,7,66,61
+
+void wxRC2XML::ParseTreeCtrl(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+m_xmlfile.Write(" <treectrl");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write(" </treectrl>\n");
+
+}
+// CONTROL "MonthCalendar1",IDC_MONTHCALENDAR1,"SysMonthCal32",
+ //MCS_NOTODAY | WS_TABSTOP,105,71,129,89
+
+void wxRC2XML::ParseCalendar(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+m_xmlfile.Write(" <calendarctrl");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write(" </calendarctrl>\n");
+}
+// CONTROL "List1",IDC_LIST1,"SysListView32",WS_BORDER | WS_TABSTOP,
+ // 7,89,68,71
+
+void wxRC2XML::ParseListCtrl(wxString label, wxString varname)
+{
+wxString token;
+while (ReadOrs(token));
+int x,y,width,height;
+ReadRect(x,y,width,height);
+m_xmlfile.Write(" <listctrl");
+WriteBasicInfo(x,y,width,height,varname);
+m_xmlfile.Write(" </listctrl>\n");
+
+}