]> git.saurik.com Git - wxWidgets.git/commitdiff
added rc2xml and wxr2xml convertor (no makefiles yet)
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 17 Sep 2000 19:17:13 +0000 (19:17 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 17 Sep 2000 19:17:13 +0000 (19:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8387 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

contrib/utils/convertrc/rc2wxr.cpp [new file with mode: 0644]
contrib/utils/convertrc/rc2wxr.h [new file with mode: 0644]
contrib/utils/convertrc/rc2xml.cpp [new file with mode: 0644]
contrib/utils/convertrc/rc2xml.h [new file with mode: 0644]
contrib/utils/convertrc/wxr2xml.cpp [new file with mode: 0644]
contrib/utils/convertrc/wxr2xml.h [new file with mode: 0644]

diff --git a/contrib/utils/convertrc/rc2wxr.cpp b/contrib/utils/convertrc/rc2wxr.cpp
new file mode 100644 (file)
index 0000000..3c91b14
--- /dev/null
@@ -0,0 +1,641 @@
+// RC2WXR.cpp: implementation of the wxRC2WXR class.
+//
+//////////////////////////////////////////////////////////////////////
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#include "rc2wxr.h"
+#include "wx/image.h"
+#include "wx/resource.h"
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+wxRC2WXR::wxRC2WXR()
+{
+m_done=FALSE;
+m_controlid=6000;
+}
+
+wxRC2WXR::~wxRC2WXR()
+{
+
+}
+
+void wxRC2WXR::Open(wxString wxrfile, wxString rcfile)
+{
+    wxFileProgressDlg fileprog;
+
+
+       m_rc.Open(rcfile);
+       m_filesize=m_rc.Length();
+if( (m_wxr  = fopen( wxrfile, "wt" )) == NULL )
+{
+         return;
+}
+
+fileprog.Show(TRUE);
+
+wxString tok,prevtok;
+
+
+while (!m_done)
+{
+
+tok=GetToken();
+
+if (tok=="DIALOG")
+{
+       ParseDialog(prevtok);
+       fileprog.UpdateProgress(&m_rc);
+}
+       
+
+if (tok=="MENU")
+{
+       ParseMenu(prevtok);
+       fileprog.UpdateProgress(&m_rc);
+}      
+
+prevtok=tok;
+}
+fileprog.UpdateProgress(&m_rc);
+fclose(m_wxr);
+//fclose(m_rc);  
+m_rc.Close();
+
+fileprog.Show(FALSE);
+}
+
+
+/*
+Example .rc 
+Microsoft style as of v5.0
+IDD_ABOUTBOX DIALOG DISCARDABLE  0, 0, 217, 55
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About Funimator"
+FONT 8, "MS Sans Serif"
+
+  Borland 4.5 style rc
+IDD_DIBATTR DIALOG 7, 16, 172, 119
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "DIB Attributes"
+FONT 8, "MS Sans Serif"
+{
+ DEFPUSHBUTTON "Ok", IDOK, 114, 8, 50, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 114, 28, 50, 14
+
+
+
+*/
+void wxRC2WXR::ParseDialog(wxString dlgname)
+{
+       wxString tok;
+       static int dlgid=999;
+       dlgid++;
+       /* Make sure that this really is a dialog 
+       microsoft reuses the keyword DIALOG for other things
+       */
+       tok=PeekToken();
+       //Microsoft notation?
+       if (tok=="DISCARDABLE")
+       {
+               tok=GetToken();
+               tok=PeekToken();
+       }
+       //This isn't a Dialog resource eject eject
+       if (!tok.IsNumber())
+               return;
+//Generate Dialog text
+fprintf(m_wxr,"static char *dialog%i = \"dialog(name = '%s',\\\n",dlgid,dlgname);
+//be lazy about style for now. add it later
+fprintf(m_wxr,"style = 'wxRAISED_BORDER | wxCAPTION | wxTHICK_FRAME | wxSYSTEM_MENU',\\\n");
+
+fprintf(m_wxr,"id = %i,\\\n",dlgid);
+
+//Record x,y,width,height
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"x = %i, y = %i, width = %i, height = %i,\\\n",x,y,width,height);
+
+
+//CAPTION "About Funimator"
+//Get Title
+tok=GetToken();
+wxString title;
+
+while ((tok!="BEGIN")&(tok!="{"))
+{
+if (tok=="CAPTION")
+       {
+       title=GetQuoteField();
+       fprintf(m_wxr,"title = '%s',\\\n",title);
+       }
+tok=GetToken();
+}
+fprintf(m_wxr,"use_dialog_units = 1,\\\n");
+fprintf(m_wxr,"use_system_defaults = 0,\\\n");
+
+fprintf(m_wxr,"font = [8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif'],\\\n");
+ParseControls();
+fprintf(m_wxr,").\";\n\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 wxRC2WXR::ParseControls()
+{
+wxString tok;
+
+tok=GetToken();
+while ((tok!="END")&(tok!="}"))
+{
+if (tok=="LTEXT")
+    ParseStaticText();
+if (tok=="EDITTEXT")
+    ParseTextCtrl();
+if (tok=="PUSHBUTTON")
+    ParsePushButton();
+if (tok=="DEFPUSHBUTTON")
+    ParsePushButton();
+if (tok=="GROUPBOX")
+    ParseGroupBox();
+if (tok=="COMBOBOX")
+    ParseComboBox();
+if (tok=="CONTROL")
+    ParseControlMS();
+
+tok=GetToken();
+}
+
+}
+//LTEXT           "Radius",IDC_STATIC,9,67,23,8
+void wxRC2WXR::ParseStaticText()
+{
+wxString tok;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+m_controlid++;
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"  control = [%i,wxStaticText,'%s','0','%s',",m_controlid,phrase,varname);
+fprintf(m_wxr,"%i,%i,%i,%i,'',\\\n",x,y,width,height);
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+}
+//EDITTEXT        IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
+void wxRC2WXR::ParseTextCtrl()
+{
+wxString tok;
+wxString varname;
+varname=GetToken();
+m_controlid++;
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"  control = [%i,wxTextCtrl,'','0','%s',",m_controlid,varname);
+fprintf(m_wxr,"%i,%i,%i,%i,'',\\\n",x,y,width,height);
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+
+}
+//PUSHBUTTON      "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
+void wxRC2WXR::ParsePushButton()
+{
+wxString tok;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+int c;
+m_controlid++;
+c=m_controlid;
+if (varname=="IDOK")
+c=wxID_OK;
+
+if (varname=="IDCANCEL")
+c=wxID_CANCEL;
+
+if (varname=="IDAPPLY")
+c=wxID_APPLY;
+
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"  control = [%i,wxButton,'%s','0','%s',",c,phrase,varname);
+fprintf(m_wxr,"%i,%i,%i,%i,'',\\\n",x,y,width,height);
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+
+}
+
+
+bool wxRC2WXR::Seperator(int ch)
+{
+if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='|'))
+   return TRUE;
+
+if (ch==EOF)
+{
+       m_done=TRUE;
+       return TRUE;
+}
+return FALSE;
+}
+
+void wxRC2WXR::ParseGroupBox()
+{
+//    GROUPBOX        "Rotate",IDC_STATIC,1,1,71,79
+wxString tok;
+wxString phrase,varname;
+phrase=GetQuoteField();
+varname=GetToken();
+m_controlid++;
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"  control = [%i,wxStaticBox,'%s','0','%s',",m_controlid,phrase,varname);
+fprintf(m_wxr,"%i,%i,%i,%i,'',\\\n",x,y,width,height);
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+
+
+}
+
+void wxRC2WXR::ReadRect(int & x, int & y, int & width, int & height)
+{
+x=atoi(GetToken());
+y=atoi(GetToken());
+width=atoi(GetToken());
+height=atoi(GetToken());
+
+}
+
+wxString wxRC2WXR::GetToken()
+{
+wxString tok="";
+
+if (m_rc.Eof())
+{
+m_done=TRUE;
+return tok;
+}
+
+int ch=0;
+ReadChar(ch);
+if (ch==EOF)
+{
+m_done=TRUE;
+return tok;
+}
+
+while (Seperator(ch))
+{
+  ReadChar(ch);
+  if (m_done)
+         return tok;
+}
+
+if (ch==EOF)
+{
+       m_done=TRUE;
+
+}
+  
+
+while (!Seperator(ch))
+{
+       tok+=(char)ch;
+       ReadChar(ch);
+
+}
+
+if (ch==EOF)
+   m_done=TRUE;
+
+
+return tok;
+}
+
+wxString wxRC2WXR::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 wxRC2WXR::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 wxRC2WXR::ParseComboBox()
+{
+/* COMBOBOX        IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP */
+wxString tok;
+wxString varname;
+varname=GetToken();
+m_controlid++;
+int x,y,width,height;
+ReadRect(x,y,width,height);
+
+fprintf(m_wxr,"  control = [%i,wxChoice,'','0','%s',",m_controlid,varname);
+fprintf(m_wxr,"%i,%i,%i,%i,[],\\\n",x,y,width,height);
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+
+
+}
+
+void wxRC2WXR::ParseMenu(wxString name)
+{
+wxString tok="";
+static int menuid=0;
+menuid++;
+fprintf(m_wxr,"static char *MenuBar%i = \"menu(name = '%s',\\\n",menuid,name);  
+fprintf(m_wxr,"menu = \\\n");
+fprintf(m_wxr,"[\\\n");
+
+while ((tok!="BEGIN")&(tok!="{"))
+   tok=GetToken();
+
+while ((tok!="END")&(tok!="}"))
+{
+   tok=GetToken();
+if (tok=="POPUP")
+       {
+    ParsePopupMenu();
+       fprintf(m_wxr,"  ],\\\n");
+       }
+}
+
+fprintf(m_wxr,"]).\";\n\n");
+}
+
+void wxRC2WXR::ParsePopupMenu()
+{
+static int menuitem=99;
+menuitem++;
+
+wxString tok;
+tok=GetQuoteField();
+int spot;
+//Remove /t because it causes problems
+spot=tok.First("\\t");
+tok=tok.Left(spot);
+fprintf(m_wxr,"  ['%s',%i,'',\\\n",tok,menuitem);
+while ((tok!="BEGIN")&(tok!="{"))
+   tok=GetToken();
+
+while ((tok!="END")&(tok!="}"))
+{
+   tok=GetToken();
+if (tok=="MENUITEM")
+       {
+       if (PeekToken()=="SEPARATOR")
+               fprintf(m_wxr,"      [],\\\n");
+       else
+       {
+       tok=GetQuoteField();
+       //Remove /t because it causes problems
+       spot=tok.First("\\t");
+       tok=tok.Left(spot);
+       menuitem++;
+    fprintf(m_wxr,"      ['%s',%i,''],\\\n",tok,menuitem);
+       }
+       }
+
+}
+
+    
+}
+
+wxString wxRC2WXR::PeekToken()
+{
+wxString tok;
+int p;
+p=m_rc.Tell();
+tok=GetToken();
+
+m_rc.Seek(p);
+return tok;
+}
+//Windows pain in the butt CONTROL
+void wxRC2WXR::ParseControlMS()
+{
+wxString label,varname,kindctrl,tok;
+label=GetQuoteField();
+varname=GetToken();
+kindctrl=GetQuoteField();
+kindctrl.MakeUpper();
+
+
+if (kindctrl=="MSCTLS_TRACKBAR32")
+   ParseSlider(label,varname);
+if (kindctrl=="MSCTLS_PROGRESS32")
+   ParseProgressBar(label,varname);
+if (kindctrl=="BUTTON")
+   ParseCtrlButton(label,varname);
+}
+/*    CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,52,73,100,15
+*/
+
+void wxRC2WXR::ParseSlider(wxString label, wxString varname)
+{
+       wxString tok;
+       while (ReadOrs(tok));
+fprintf(m_wxr,"  control = [%i,wxSlider,'','wxSL_HORIZONTAL','%s',",m_controlid,varname);  
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"%i,%i,%i,%i,",x,y,width,height);
+fprintf(m_wxr," 1, 1, 10,\\\n");
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+}
+/*    
+CONTROL         "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
+                    WS_BORDER,15,52,154,13
+*/
+void wxRC2WXR::ParseProgressBar(wxString label, wxString varname)
+{
+wxString tok;
+while (ReadOrs(tok));
+fprintf(m_wxr,"  control = [%i,wxGauge,'','wxGA_HORIZONTAL','%s',",m_controlid,varname);  
+int x,y,width,height;
+ReadRect(x,y,width,height);
+fprintf(m_wxr,"%i,%i,%i,%i,",x,y,width,height);
+fprintf(m_wxr," 0, 10,\\\n");
+fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+}
+
+bool wxRC2WXR::ReadOrs(wxString & w)
+{
+wxString tok;
+tok=PeekToken();
+if (tok.IsNumber())
+   return false;
+w=GetToken();
+return TRUE;
+}
+
+//Is it a check button or a radio button
+void wxRC2WXR::ParseCtrlButton(wxString label, wxString varname)
+{
+wxString tok;
+       tok=GetToken();
+
+m_controlid++;
+       int x,y,width,height;
+
+if (tok=="BS_AUTOCHECKBOX")
+{
+    fprintf(m_wxr,"  control = [%i,wxCheckBox,'%s','0','%s',",m_controlid,label,varname);    
+    while (ReadOrs(tok));      
+       ReadRect(x,y,width,height);
+    fprintf(m_wxr,"%i,%i,%i,%i,0,\\\n",x,y,width,height);
+    fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+}
+
+if (tok=="BS_AUTORADIOBUTTON")
+{
+    fprintf(m_wxr,"  control = [%i,wxRadioButton,'%s','0','%s',",m_controlid,label,varname);    
+    while(ReadOrs(tok));       
+       ReadRect(x,y,width,height);
+    fprintf(m_wxr,"%i,%i,%i,%i,0,\\\n",x,y,width,height);
+    fprintf(m_wxr,"[8, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0, 'MS Sans Serif']],\\\n");
+}
+
+
+
+}
+
+BEGIN_EVENT_TABLE(wxFileProgressDlg,wxDialog)
+END_EVENT_TABLE()
+
+wxFileProgressDlg::wxFileProgressDlg()
+{
+wxPoint pos;
+wxSize size;
+pos = ConvertDialogToPixels(wxPoint(10,10));
+size = ConvertDialogToPixels(wxSize(170,31));
+Create(GetParent(),100,"Parsing RC File",pos,size,603985920);
+SetClientSize(size);
+Move(pos);
+//wxGauge Control
+pos = ConvertDialogToPixels(wxPoint(16,16));
+size = ConvertDialogToPixels(wxSize(136,6));
+m_pProgress = new wxGauge(this,101,100,pos,size);
+//wxStaticText Control
+pos = ConvertDialogToPixels(wxPoint(72,4));
+size = ConvertDialogToPixels(wxSize(18,6));
+m_pCompleteLabel= new wxStaticText(this,102,"0",pos,size,0);
+}
+wxFileProgressDlg::~wxFileProgressDlg()
+{
+
+}
+
+void wxFileProgressDlg::UpdateProgress(wxFile * f)
+{
+int p;
+p=(int)((float)f->Tell()/(float)f->Length()*100.0);
+m_pProgress->SetValue(p);
+wxString t;
+t.sprintf("%i%%",p);
+m_pCompleteLabel->SetLabel(t);
+Refresh();
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+// GenerateBitmapSrc Class
+//////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+GenerateBitmapSrc::GenerateBitmapSrc()
+{
+
+}
+
+GenerateBitmapSrc::~GenerateBitmapSrc()
+{
+
+}
+
+bool GenerateBitmapSrc::Create(wxString imfile, wxString srcfile,wxString varname)
+{
+
+wxImage img;
+FILE *src;
+
+int h,w;
+
+img.LoadFile(imfile,wxBITMAP_TYPE_ANY);
+h=img.GetHeight();
+w=img.GetWidth();
+
+if( (src  = fopen( srcfile, "at" )) == NULL )
+      return FALSE;
+fprintf(src,"#if !defined(IMG_%s)\n",varname);
+fprintf(src,"#define IMG_%s\n",varname);
+
+fprintf(src,"//Data from bitmap file %s \n",imfile);
+fprintf(src,"//Image Height=%i,Width=%i RGB format\n",h,w);
+fprintf(src,"static unsigned char %s[][3]={\n",varname);
+
+
+for (int y=0;y<h;y++)
+{
+       for (int x=0;x<w;x++)
+       {
+       //fprintf(src,"{%i,%i,%i},",img.GetRed(x,y),img.GetGreen(x,y),img.GetBlue(x,y));
+
+       }
+fprintf(src,"\n");
+}      
+
+fprintf(src,"};\n\n");
+
+fprintf(src,"wxBitmap Load%s()\n{\n",varname);
+fprintf(src,"wxImage myimg(%i,%i);\n",w,h);
+int size=w*h*3;
+fprintf(src,"memcpy(myimg.GetData(),&%s[0][0],%i);\n",varname,size);
+fprintf(src,"return myimg.ConvertToBitmap();\n");
+fprintf(src,"}\n");
+fprintf(src,"#endif\n");
+fclose(src);
+
+return TRUE;
+}
+
diff --git a/contrib/utils/convertrc/rc2wxr.h b/contrib/utils/convertrc/rc2wxr.h
new file mode 100644 (file)
index 0000000..35aeb28
--- /dev/null
@@ -0,0 +1,71 @@
+// wxHandleWXR.h: interface for the wxHandleWXR class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#if !defined(RC2WXR_H)
+#define RC2WXR_H
+
+#include "wx/file.h"
+#include "stdio.h"
+
+class wxRC2WXR : public wxObject  
+{
+public:
+wxRC2WXR();
+~wxRC2WXR();
+void Open(wxString wxrfile, wxString rcfile);
+
+private:
+wxFile m_rc;
+FILE *m_wxr;
+int m_filesize;
+bool m_done;
+int m_controlid;
+void ParseDialog(wxString dlgname);
+void ParseControls();
+void ParseStaticText();
+void ParseTextCtrl();
+void ParsePushButton();
+bool Seperator(int ch);
+void ParseGroupBox();
+void ReadRect(int & x, int & y, int & width, int & height);
+wxString GetToken();
+wxString GetQuoteField();
+void ReadChar(int &ch);
+void ParseComboBox();
+void ParseMenu(wxString name);
+void ParsePopupMenu();
+wxString PeekToken();
+void ParseControlMS();
+void ParseSlider(wxString label, wxString varname);
+void ParseProgressBar(wxString label, wxString varname);
+bool ReadOrs(wxString & w);
+void ParseCtrlButton(wxString label, wxString varname);
+
+};
+
+class wxFileProgressDlg : public wxDialog
+{
+public:
+       void UpdateProgress(wxFile *f);
+
+wxFileProgressDlg();
+virtual ~wxFileProgressDlg();
+
+protected:
+wxGauge *m_pProgress;
+wxStaticText *m_pCompleteLabel;
+
+  DECLARE_EVENT_TABLE()
+
+};
+class GenerateBitmapSrc : public wxObject  
+{
+public:
+       bool Create(wxString imfile, wxString srcfile,wxString varname);
+       GenerateBitmapSrc();
+       virtual ~GenerateBitmapSrc();
+
+};
+
+#endif
\ No newline at end of file
diff --git a/contrib/utils/convertrc/rc2xml.cpp b/contrib/utils/convertrc/rc2xml.cpp
new file mode 100644 (file)
index 0000000..2518c9d
--- /dev/null
@@ -0,0 +1,1072 @@
+// 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");
+
+}
diff --git a/contrib/utils/convertrc/rc2xml.h b/contrib/utils/convertrc/rc2xml.h
new file mode 100644 (file)
index 0000000..697efea
--- /dev/null
@@ -0,0 +1,85 @@
+// rc2xml.h
+//
+//////////////////////////////////////////////////////////////////////
+
+#if !defined(RC2XML_H)
+#define RC2XML_H
+
+#include "wx/file.h"
+#include <wx/ffile.h>
+#include <wx/list.h>
+
+
+class wxRC2XML : public wxObject  
+{
+public:
+       void ParseNormalMSControl();
+bool Convert(wxString rcfile, wxString xmlfile);
+wxRC2XML();
+~wxRC2XML();
+
+protected:
+       void ParseListCtrl(wxString label,wxString varname);
+       void ParseCalendar(wxString label,wxString varname);
+       void ParseTreeCtrl(wxString label,wxString varname);
+       void ParseScrollBar();
+       void ParseWeirdMSControl();
+       void ParseStaticBitmap(wxString label,wxString varname);
+       wxString CleanName(wxString name);
+       void ParseIcon(wxString varname);
+       wxList * m_iconlist;
+       void ParseIconStatic();
+       void ParseMenuItem();
+       
+//Functions
+bool SplitHelp(wxString msg, wxString &shorthelp, wxString &longhelp);
+bool LookUpString(wxString strid,wxString & st);
+void ParseStringTable(wxString varname);
+void WriteToolButton(wxString name,int index,int width,int height,wxBitmap bitmap);
+wxString LookupString(wxString varname,wxStringList id,wxStringList msg);
+void ParseToolBar(wxString varname);
+void SecondPass();
+void FirstPass();
+void ParseBitmap(wxString varname);
+void ParseSpinCtrl(wxString label,wxString varname);
+void ParseRichEdit(wxString label, wxString varname);
+void ParseDialog(wxString dlgname);
+void ParseControls();
+void ParseListBox();
+void ParseStaticText();
+void ParseTextCtrl();
+void ParsePushButton();
+bool Seperator(int ch);
+void ParseGroupBox();
+void ReadRect(int & x, int & y, int & width, int & height);
+wxString GetToken();
+wxString GetQuoteField();
+void ReadChar(int &ch);
+void ParseComboBox();
+void ParseMenu(wxString varname);
+void ParsePopupMenu();
+wxString PeekToken();
+void ParseControlMS();
+void ParseSlider(wxString label, wxString varname);
+void ParseProgressBar(wxString label, wxString varname);
+bool ReadOrs(wxString & w);
+void ParseCtrlButton(wxString label, wxString varname);
+void WriteStyle(wxString style);
+void WriteBasicInfo(int x,int y,int width,int height,wxString name);
+void WriteName(wxString name);
+void WriteTitle(wxString title);
+void WritePosition(int x,int y);
+void WriteSize(int width,int height);
+void WriteLabel(wxString label);
+//variables
+wxList * m_stringtable;
+wxList *m_bitmaplist;
+wxFile m_rc;
+wxFFile m_xmlfile;
+int m_filesize;
+bool m_done;
+
+};
+
+
+#endif
\ No newline at end of file
diff --git a/contrib/utils/convertrc/wxr2xml.cpp b/contrib/utils/convertrc/wxr2xml.cpp
new file mode 100644 (file)
index 0000000..a6e9d0d
--- /dev/null
@@ -0,0 +1,694 @@
+// wxr2xml.cpp: implementation of the wxWxr2Xml class.
+//  8/30/00  Brian Gavin
+// only tested on wxMSW so far
+//////////////////////////////////////////////////////////////////////
+/* TODO
+  port to wxGTK should be very easy
+  support fonts
+  add unsupported controls when XML format adds them
+*/
+#ifdef __GNUG__
+#pragma implementation "wxr2xml.h"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "wxr2xml.h"
+
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+wxWxr2Xml::wxWxr2Xml()
+{
+
+}
+
+wxWxr2Xml::~wxWxr2Xml()
+{
+
+}
+
+bool wxWxr2Xml::Convert(wxString wxrfile, wxString xmlfile)
+{
+bool result;
+result=m_xmlfile.Open(xmlfile.c_str(),"w+t");
+wxASSERT_MSG(result,"Couldn't create XML file");       
+if (!result)
+       return FALSE;
+
+result=m_table.ParseResourceFile(wxrfile);
+wxASSERT_MSG(result,"Couldn't Load WXR file");
+if (!result)
+       return FALSE;
+//Write basic xml header
+m_xmlfile.Write("<?xml version=\"1.0\" ?>\n");
+m_xmlfile.Write("<resource>\n");
+result=ParseResources();
+m_xmlfile.Write("</resource>\n");
+
+m_xmlfile.Close();
+
+return result;
+}
+
+bool wxWxr2Xml::ParseResources()
+{
+m_table.BeginFind();
+wxNode *node;
+       
+while ((node = m_table.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+               if (resType=="wxDialog")
+                       ParseDialog(res);
+        else if (resType=="wxPanel")
+                       ParsePanel(res);
+       else if (resType=="wxPanel")
+                       ParsePanel(res);
+          else if (resType=="wxMenu")
+                       ParseMenuBar(res);
+          else if (resType=="wxBitmap")
+                       ParseBitmap(res);
+        else 
+                  wxLogError("Found unsupported resource "+resType);
+    }
+
+return TRUE;
+}
+
+void wxWxr2Xml::ParsePanel(wxItemResource *res)
+{
+
+m_xmlfile.Write("      <panel");
+PanelStuff(res);
+WriteControlInfo(res);
+m_xmlfile.Write("\n"); 
+m_xmlfile.Write("      <children>\n");
+ParseControls(res);
+m_xmlfile.Write("      </children>\n");
+
+m_xmlfile.Write("      </panel>\n");
+}
+
+
+void wxWxr2Xml::ParseDialog(wxItemResource *res)
+{
+PanelStuff(res);
+m_xmlfile.Write("      <dialog");
+WriteControlInfo(res);
+m_xmlfile.Write(GetTitle(res));
+
+    
+m_xmlfile.Write("\n"); 
+m_xmlfile.Write("      <children>\n");
+ParseControls(res);
+m_xmlfile.Write("      </children>\n");
+m_xmlfile.Write("      </dialog>\n");
+}
+
+void wxWxr2Xml::ParseControls(wxItemResource *res)
+{
+wxNode *node = res->GetChildren().First();
+while (node)
+        {
+           wxItemResource *res = (wxItemResource *)node->Data();
+           wxString resType(res->GetType());
+               if (resType=="wxButton")
+                       ParseButton(res);
+               else if ((resType=="wxTextCtrl")|(resType=="wxText")
+                       |(resType=="wxMultiText"))
+                       ParseTextCtrl(res);
+               else if (resType=="wxCheckBox")
+                       ParseCheckBox(res);
+               else if (resType=="wxRadioBox")
+                       ParseRadioBox(res);
+               else if (resType=="wxListBox")
+                       ParseListBox(res);
+               else if ((resType=="wxStaticText")|(resType=="wxMessage"))
+                       ParseStaticText(res);
+               else if (resType=="wxChoice")
+                       ParseChoice(res);
+               else if (resType=="wxGauge")
+                       ParseGauge(res);
+               else if (resType=="wxSlider")
+                       ParseSlider(res);
+               else if (resType=="wxComboBox")
+                       ParseComboBox(res);
+               else if (resType=="wxRadioButton")
+                       ParseRadioButton(res);
+               else if (resType=="wxStaticBitmap")
+                       ParseStaticBitmap(res);
+               else if (resType=="wxScrollBar")
+                       wxLogError("wxScrollBar unsupported");
+               else if ((resType=="wxStaticBox")|(resType=="wxGroupBox"))
+                       wxLogError("wxStaticBox unsupported");
+               else if (resType=="wxBitmapButton")
+                       wxLogError("wxBitmapButton unsupported");
+               else
+                       wxLogError("Found unsupported resource "+resType);
+            node = node->Next();
+        }
+}
+
+//Write out basic stuff every control has
+// name,position,size,bg,fg
+void wxWxr2Xml::WriteControlInfo(wxItemResource *res)
+{
+m_xmlfile.Write(GenerateName(res));
+m_xmlfile.Write(">\n");
+m_xmlfile.Write(GetPosition(res));
+m_xmlfile.Write(GetSize(res));
+m_xmlfile.Write(GetStyles(res));
+}
+
+wxString wxWxr2Xml::GetSize(wxItemResource *res)
+{
+wxString msg;
+if (m_dlgunits)
+       msg<<" <size>"<<res->GetWidth()<<","<<res->GetHeight()<<"d</size>";
+else
+       msg<<" <size>"<<res->GetWidth()<<","<<res->GetHeight()<<"</size>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetPosition(wxItemResource *res)
+{
+wxString msg;
+if (m_dlgunits)
+       msg<<" <pos>"<<res->GetX()<<","<<res->GetY()<<"d</pos>";
+else
+       msg<<" <pos>"<<res->GetX()<<","<<res->GetY()<<"</pos>";
+return msg;
+}
+
+void wxWxr2Xml::ParseButton(wxItemResource *res)
+{
+m_xmlfile.Write("              <button");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</button>\n");
+}
+
+void wxWxr2Xml::ParseTextCtrl(wxItemResource *res)
+{
+m_xmlfile.Write("              <textctrl");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue4(res));
+m_xmlfile.Write("</textctrl>\n");
+
+}
+
+wxString wxWxr2Xml::GetTitle(wxItemResource *res)
+{
+wxString msg;
+msg=_T(" <title>"+res->GetTitle()+"</title>");
+return msg;
+}
+
+wxString wxWxr2Xml::GetValue4(wxItemResource *res)
+{
+wxString msg;
+msg=_T(" <value>"+res->GetValue4()+"</value>");
+return msg;
+}
+
+void wxWxr2Xml::ParseCheckBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <checkbox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write(GetCheckStatus(res));
+m_xmlfile.Write("</checkbox>\n");
+}
+
+wxString wxWxr2Xml::GetLabel(wxItemResource *res)
+{
+return _T(" <label>"+res->GetTitle()+"</label>");
+}
+
+void wxWxr2Xml::ParseRadioBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <radiobox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+//Add radio box items
+WriteStringList(res);
+//Value1
+m_xmlfile.Write(GetDimension(res));
+m_xmlfile.Write("\n                    </radiobox>\n");
+}
+
+void wxWxr2Xml::ParseListBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <listbox");
+WriteControlInfo(res);
+WriteStringList(res);
+m_xmlfile.Write("</listbox>\n");
+}
+
+void wxWxr2Xml::ParseStaticText(wxItemResource *res)
+{
+m_xmlfile.Write("              <statictext");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</statictext>\n");
+}
+
+void wxWxr2Xml::ParseStaticBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <staticbox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</staticbox>\n");
+}
+
+void wxWxr2Xml::WriteStringList(wxItemResource *res)
+{
+m_xmlfile.Write("\n                    <content>");
+for ( wxStringListNode *node = res->GetStringValues().GetFirst(); node; 
+       node = node->GetNext() )
+    {
+        const wxString s1 = node->GetData();
+        m_xmlfile.Write("\n                    <item>"+s1+"</item>");
+    }
+       m_xmlfile.Write("\n                     </content>");
+}
+
+void wxWxr2Xml::ParseChoice(wxItemResource *res)
+{
+m_xmlfile.Write("              <choice");
+WriteControlInfo(res);
+//Add choice items
+WriteStringList(res);
+m_xmlfile.Write("\n            </choice>\n");
+}
+
+void wxWxr2Xml::ParseGauge(wxItemResource *res)
+{
+m_xmlfile.Write("              <gauge");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetRange(res));
+m_xmlfile.Write("\n                    </gauge>\n");
+}
+
+
+wxString wxWxr2Xml::GetValue1(wxItemResource *res)
+{
+wxString msg;
+msg<<" <value>"<<res->GetValue1()<<"</value>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetRange(wxItemResource *res)
+{
+wxString msg;
+msg<<" <range>"<<res->GetValue2()<<"</range>";
+return msg;
+}
+
+void wxWxr2Xml::ParseSlider(wxItemResource *res)
+{
+m_xmlfile.Write("              <slider");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetMax(res));
+m_xmlfile.Write(GetMin(res));
+m_xmlfile.Write("\n                    </slider>\n");
+}
+
+wxString wxWxr2Xml::GetMax(wxItemResource *res)
+{
+wxString msg;
+msg<<" <max>"<<res->GetValue3()<<"</max>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetMin(wxItemResource *res)
+{
+wxString msg;
+msg<<" <min>"<<res->GetValue2()<<"</min>";
+return msg;
+}
+
+void wxWxr2Xml::ParseComboBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <combobox");
+WriteControlInfo(res);
+//Add combo items
+WriteStringList(res);
+m_xmlfile.Write("\n            </combobox>\n");
+}
+
+void wxWxr2Xml::ParseRadioButton(wxItemResource *res)
+{
+m_xmlfile.Write("              <radiobutton");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+
+wxString msg;
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetCheckStatus(res));
+m_xmlfile.Write("\n                    </radiobutton>\n");
+}
+
+void wxWxr2Xml::ParseScrollBar(wxItemResource *res)
+{
+m_xmlfile.Write("              <scrollbar");
+WriteControlInfo(res);
+//TODO learn more about XML scrollbar format
+m_xmlfile.Write("\n                    </scrollbar>\n");
+} 
+
+wxString wxWxr2Xml::GetCheckStatus(wxItemResource *res)
+{
+wxString msg;
+msg<<" <checked>"<<res->GetValue1()<<"</checked>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetStyles(wxItemResource *res)
+{
+//Very crude way to get styles
+long style;
+wxString s,restype;
+restype=res->GetType();
+style=res->GetStyle();
+
+s="<style>";
+
+//Common styles for all controls
+if (style&wxSIMPLE_BORDER)
+               s+="wxSIMPLE_BORDER|";
+if (style&wxSUNKEN_BORDER)
+               s+="wxSUNKEN_BORDER|";
+if (style&wxSIMPLE_BORDER)
+               s+="wxSIMPLE_BORDER|";
+if (style&wxDOUBLE_BORDER)
+               s+="wxDOUBLE_BORDER|";
+if (style&wxRAISED_BORDER)
+               s+="wxRAISED_BORDER|";
+if (style&wxTRANSPARENT_WINDOW)
+               s+="wxTRANSPARENT_WINDOW|";
+if (style&wxWANTS_CHARS)
+               s+="wxWANTS_CHARS|";
+if (style&wxNO_FULL_REPAINT_ON_RESIZE)
+               s+="wxNO_FULL_REPAINT_ON_RESIZE|";
+           
+if (restype=="wxDialog")
+{
+       if (style&wxDIALOG_MODAL)
+               s+="wxDIALOG_MODAL|";
+       if (style&wxDEFAULT_DIALOG_STYLE)
+               s+="wxDEFAULT_DIALOG_STYLE|";
+       if (style&wxDIALOG_MODELESS)
+               s+="wxDIALOG_MODELESS|";
+       if (style&wxNO_3D)
+               s+="wxNO_3D|";
+       if (style&wxTAB_TRAVERSAL)
+               s+="wxTAB_TRAVERSAL|";
+       if (style&wxWS_EX_VALIDATE_RECURSIVELY)
+               s+="wxWS_EX_VALIDATE_RECURSIVELY|";
+       if (style&wxSTAY_ON_TOP)
+               s+="wxSTAY_ON_TOP|";
+       if (style&wxCAPTION)
+               s+="wxCAPTION|";
+       if (style&wxTHICK_FRAME)
+               s+="wxTHICK_FRAME|";
+       if (style&wxRESIZE_BOX)
+               s+="wxRESIZE_BOX|";
+       if (style&wxRESIZE_BORDER)
+               s+="wxRESIZE_BORDER|";
+       if (style&wxSYSTEM_MENU)
+               s+="wxSYSTEM_MENU|";
+       if (style&wxCLIP_CHILDREN)
+               s+="wxCLIP_CHILDREN|";
+       
+       
+}
+    
+
+    
+if (restype=="wxPanel")
+{
+       if (style&wxCLIP_CHILDREN)
+               s+="wxCLIP_CHILDREN|";
+       if (style&wxNO_3D)
+               s+="wxNO_3D|";
+       if (style&wxTAB_TRAVERSAL)
+               s+="wxTAB_TRAVERSAL|";
+       if (style&wxWS_EX_VALIDATE_RECURSIVELY)
+               s+="wxWS_EX_VALIDATE_RECURSIVELY|";
+}
+
+if (restype=="wxComboBox")
+{
+       if (style&wxCB_SORT)
+               s+="wxCB_SORT|";
+       if (style&wxCB_SIMPLE)
+               s+="wxCB_SIMPLE|";
+       if (style&wxCB_READONLY)
+               s+="wxCB_READONLY|";
+       if (style&wxCB_DROPDOWN)
+               s+="wxCB_DROPDOWN|";
+}
+
+if (restype=="wxGauge")
+{
+       if (style&wxGA_HORIZONTAL)
+               s+="wxGA_HORIZONTAL|";
+       if (style&wxGA_VERTICAL)
+               s+="wxGA_VERTICAL|";
+       if (style&wxGA_PROGRESSBAR)
+               s+="wxGA_PROGRESSBAR|";
+       // windows only
+       if (style&wxGA_SMOOTH)
+               s+="wxGA_SMOOTH|";
+}
+
+if (restype=="wxRadioButton")
+{
+       if (style&wxRB_GROUP)
+               s+="wxRB_GROUP|";
+}
+
+if (restype=="wxStaticText")
+{
+       if (style&wxST_NO_AUTORESIZE)
+               s+="wxST_NO_AUTORESIZEL|";
+}
+
+if (restype=="wxRadioBox")
+       {
+       if (style&wxRA_HORIZONTAL)
+               s+="wxRA_HORIZONTAL|";
+       if (style&wxRA_SPECIFY_COLS)
+               s+="wxRA_SPECIFY_COLS|";
+       if (style&wxRA_SPECIFY_ROWS)
+               s+="wxRA_SPECIFY_ROWS|";
+       if (style&wxRA_VERTICAL)
+               s+="wxRA_VERTICAL|";
+       }
+
+if (restype=="wxListBox")
+{
+       if (style&wxLB_SINGLE)
+               s+="wxLB_SINGLE|";
+       if (style&wxLB_MULTIPLE)
+               s+="wxLB_MULTIPLE|";
+       if (style&wxLB_EXTENDED)
+               s+="wxLB_EXTENDED|";
+       if (style&wxLB_HSCROLL)
+               s+="wxLB_HSCROLL|";
+       if (style&wxLB_ALWAYS_SB)
+               s+="wxLB_ALWAYS_SB|";
+       if (style&wxLB_NEEDED_SB)
+               s+="wxLB_NEEDED_SB|";
+       if (style&wxLB_SORT)
+               s+="wxLB_SORT|";
+}
+       
+if (restype=="wxTextCtrl")
+{
+       if (style&wxTE_PROCESS_ENTER)
+               s+="wxTE_PROCESS_ENTER|";
+       if (style&wxTE_PROCESS_TAB)
+               s+="wxTE_PROCESS_TAB|";
+       if (style&wxTE_MULTILINE)
+               s+="wxTE_MULTILINE|";
+       if (style&wxTE_PASSWORD)
+               s+="wxTE_PASSWORD|";
+       if (style&wxTE_READONLY)
+               s+="wxTE_READONLY|";
+       if (style&wxHSCROLL)
+               s+="wxHSCROLL|";
+}
+
+int l;
+l=s.Length();
+//No styles defined
+if (l==7)
+       return _T("");
+//Trim off last |
+s=s.Truncate(l-1);
+
+s+="</style>";
+return s;      
+}
+
+wxString wxWxr2Xml::GetDimension(wxItemResource *res)
+{
+wxString msg;
+msg<<" <dimension>"<<res->GetValue1()<<"</dimension>";
+return msg;
+}
+
+wxString wxWxr2Xml::GenerateName(wxItemResource *res)
+{
+wxString name;
+name=_T(" name=\"");
+switch (res->GetId())
+       {
+       case wxID_OK:
+               name+=_T("wxID_OK");
+               break;
+       case wxID_CANCEL:
+               name+=_T("wxID_CANCEL");
+               break;
+       default:
+               name+=res->GetName();
+       }
+
+name+="\"";    
+return name;
+}
+
+void wxWxr2Xml::ParseMenuBar(wxItemResource *res)
+{
+       wxItemResource *child;
+       wxNode *node = res->GetChildren().First();
+       //Get Menu Bar Name
+       m_xmlfile.Write("<menubar ");
+       m_xmlfile.Write(GenerateName(res));
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("       <children>\n");
+    while (node)
+    {
+               child= (wxItemResource *)node->Data();
+               ParseMenu(child);
+        node = node->Next();
+       }
+
+       m_xmlfile.Write("       </children>\n");
+       m_xmlfile.Write("</menubar> \n");
+}
+
+
+void wxWxr2Xml::ParseMenu(wxItemResource *res)
+{
+       wxItemResource *child;
+       wxNode *node = res->GetChildren().First();
+       //Get Menu 
+       m_xmlfile.Write("       <menu ");
+       wxString menuname;
+       menuname<<"name = \"menu_"<<res->GetValue1()<<"\"";
+       m_xmlfile.Write(menuname);
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("               <label>"
+               +FixMenuString(res->GetTitle())+"</label>\n");
+       if (res->GetValue4()!="")
+               m_xmlfile.Write("               <help>"+res->GetValue4()+"</help>\n");
+       m_xmlfile.Write("               <children>\n");
+       //Read in menu items and additional menus
+       while (node)
+    {
+               child= (wxItemResource *)node->Data();
+               if (!child->GetChildren().First())
+                       ParseMenuItem(child);
+               else
+                       ParseMenu(child);
+
+        node = node->Next();
+       }
+m_xmlfile.Write("              </children>\n");
+m_xmlfile.Write("      </menu> \n");
+}
+
+void wxWxr2Xml::ParseMenuItem(wxItemResource *res)
+{
+       //Get Menu Item or Separator
+if (res->GetTitle()=="")
+       {
+       m_xmlfile.Write("               <separator/>\n");
+       }
+else
+       {
+       m_xmlfile.Write("               <menuitem ");
+       wxString menuname;
+       menuname<<"name = \"menuitem_"<<res->GetValue1()<<"\"";
+       m_xmlfile.Write(menuname);
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("                       <label>"
+               +FixMenuString(res->GetTitle())+"</label>\n");
+       if (res->GetValue4()!="")
+               m_xmlfile.Write("                       <help>"+res->GetValue4()+"</help>\n");
+       if (res->GetValue2())
+               m_xmlfile.Write("                       <checkable>1</checkable>\n");
+       m_xmlfile.Write("               </menuitem> \n");
+       }
+}
+
+wxString wxWxr2Xml::FixMenuString(wxString phrase)
+{
+phrase.Replace("&","$");
+return phrase;
+}
+
+void wxWxr2Xml::ParseStaticBitmap(wxItemResource *res)
+{
+m_xmlfile.Write("              <staticbitmap");
+WriteControlInfo(res);
+//value4 holds bitmap name
+wxString bitmapname;
+bitmapname=res->GetValue4();
+wxBitmap bitmap;
+bitmap= wxResourceCreateBitmap(bitmapname,&m_table);
+bitmapname+=_T(".bmp");
+bitmap.SaveFile(bitmapname,wxBITMAP_TYPE_BMP);
+m_xmlfile.Write("\n            <bitmap>"+bitmapname+"</bitmap>");
+m_xmlfile.Write("</staticbitmap>\n");
+//bitmap5
+}
+
+void wxWxr2Xml::ParseBitmap(wxItemResource *res)
+{
+
+}
+
+void wxWxr2Xml::PanelStuff(wxItemResource *res)
+{
+if ((res->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
+       m_dlgunits=TRUE;
+else 
+       m_dlgunits=FALSE;
+
+//If this is true ignore fonts, background color and use system
+//defaults instead
+if ((res->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0)
+       m_systemdefaults=TRUE;
+else 
+       m_systemdefaults=FALSE;
+
+}
diff --git a/contrib/utils/convertrc/wxr2xml.h b/contrib/utils/convertrc/wxr2xml.h
new file mode 100644 (file)
index 0000000..3cebb80
--- /dev/null
@@ -0,0 +1,67 @@
+// wxr2xml.h: 
+// 8/30/00 Brian Gavin
+//////////////////////////////////////////////////////////////////////
+
+#if !defined(WXR2XML_H)
+#define WXR2XML_H
+
+#include <wx/ffile.h>
+#include "wx/resource.h"
+
+
+class wxWxr2Xml : public wxObject  
+{
+public:
+       bool Convert(wxString wxrfile,wxString xmlfile);
+       wxWxr2Xml();
+       virtual ~wxWxr2Xml();
+
+protected:
+       void PanelStuff(wxItemResource *res);
+       bool m_systemdefaults;
+       bool m_dlgunits;
+       void ParseBitmap(wxItemResource *res);
+       void ParseStaticBitmap(wxItemResource *res);
+       wxString FixMenuString(wxString phrase);
+       void ParseMenuItem(wxItemResource *res);
+       void ParseMenu(wxItemResource *res);
+       void ParseMenuBar(wxItemResource *res);
+       wxString GenerateName(wxItemResource *res);
+       wxString GetStyles(wxItemResource *res);
+       wxString GetDimension(wxItemResource *res);
+       void ParsePanel(wxItemResource *res);
+       void ParseRadioButton(wxItemResource *res);
+       wxString GetMin(wxItemResource *res);
+       wxString GetCheckStatus(wxItemResource *res);
+       void ParseScrollBar(wxItemResource *res);
+       void ParseComboBox(wxItemResource * res);
+       wxString GetMax(wxItemResource *res);
+       void ParseSlider(wxItemResource *res);
+       wxString GetValue1(wxItemResource *res);
+       wxString GetRange(wxItemResource *res);
+       void ParseGauge(wxItemResource *res);
+       void ParseChoice(wxItemResource *res);
+       void WriteStringList(wxItemResource *res);
+       void ParseStaticBox(wxItemResource *res);
+       void ParseRadioBox(wxItemResource *res);
+       wxString GetLabel(wxItemResource *res);
+       void ParseCheckBox(wxItemResource *res);
+       wxString GetValue4(wxItemResource *res);
+       wxString GetTitle(wxItemResource *res);
+       void ParseTextCtrl(wxItemResource *res);
+       void ParseButton(wxItemResource *res);
+       wxString GetPosition(wxItemResource *res);
+       void WriteControlInfo(wxItemResource *res);
+       void ParseStaticText(wxItemResource *res);
+       void ParseListBox(wxItemResource *res);
+       wxString GetSize(wxItemResource *res);
+       void ParseControls(wxItemResource *res);
+       void ParseDialog(wxItemResource *res);
+       bool ParseResources();
+
+       //Variables
+       wxResourceTable m_table;
+       wxFFile m_xmlfile;
+};
+
+#endif