]>
git.saurik.com Git - wxWidgets.git/blob - contrib/utils/convertrc/rc2xml.cpp
1 // rc2xml.cpp: implementation of the rc2xml class.
2 //Author: Brian Gavin 9/24/00
3 //License: wxWindows License
9 trans->Convert("Myfile.rc","Myfile.xml");
12 1. Figure how to fix memory leaks in all wxLists in this class
13 2. Find a way to rename MS Windows fonts so that they work
14 cross platform (wxGTK,etc)
15 3. Be able to abort incorrectly formated files without crashing
19 #pragma implementation "rc2xml.cpp"
20 #pragma interface "rc2xml.cpp"
23 // For compilers that support precompilation, includes "wx/wx.h".
24 #include "wx/wxprec.h"
30 // for all others, include the necessary headers (this file is usually all you
31 // need because it includes almost all "standard" wxWindows headers
39 #include "wx/deprecated/setup.h"
40 #include "wx/deprecated/resource.h"
41 #include <wx/textfile.h>
42 #include <wx/tokenzr.h>
46 //////////////////////////////////////////////////////////////////////
47 // Construction/Destruction
48 //////////////////////////////////////////////////////////////////////
53 m_bitmaplist
=new wxList(wxKEY_STRING
);
54 m_stringtable
=new wxList(wxKEY_STRING
);
55 m_iconlist
= new wxList(wxKEY_STRING
);
56 m_resourcelist
=new wxList(wxKEY_INTEGER
);
64 delete m_resourcelist
;
67 bool rc2xml::Convert(wxString rcfile
, wxString xmlfile
)
69 m_rc
.Open(rcfile
.c_str());
70 m_filesize
=m_rc
.Length();
73 m_workingpath
=wxPathOnly(rcfile
);
75 m_targetpath
=wxPathOnly(xmlfile
)+"\\";
79 wxSetWorkingDirectory(m_workingpath
);
83 result
=m_xmlfile
.Open(xmlfile
.c_str(),"w+t");
84 wxASSERT_MSG(result
,"Couldn't create XML file");
89 /* Write Basic header for XML file */
90 m_xmlfile
.Write("<?xml version=\"1.0\" ?>\n");
91 m_xmlfile
.Write("<resource>\n");
94 ParseResourceHeader();
95 //Gather all the resource we need for toolbars,menus, and etc
99 //Read in dialogs, toolbars,menus
102 m_xmlfile
.Write("</resource>\n");
105 wxMessageBox(_("Conversion complete."), _("Done"),
106 wxOK
| wxICON_INFORMATION
);
112 void rc2xml::ParseDialog(wxString dlgname
)
115 static int dlgid
=999;
117 /* Make sure that this really is a dialog
118 microsoft reuses the keyword DIALOG for other things
121 //Microsoft notation?
122 while ((token
=="DISCARDABLE")
123 ||(token
=="LOADONCALL")||(token
=="MOVEABLE"))
128 //Error isn't a Dialog resource eject eject
129 if (!token
.IsNumber())
132 //Record x,y,width,height
133 int x
,y
,width
,height
;
134 ReadRect(x
,y
,width
,height
);
138 wxString ptsize
,face
;
140 m_xmlfile
.Write("\t<object class=\"wxDialog\"");
141 //Avoid duplicate names this way
142 dlgname
.Replace("IDD_","DLG_");
143 WriteBasicInfo(x
,y
,width
,height
,dlgname
);
147 while ((token
!="BEGIN")&(token
!="{"))
149 if (token
=="CAPTION")
151 title
=GetQuoteField();
154 //TODO fix face name so that it is cross platform name
155 // FONT 8, "MS Sans Serif"
159 face
=GetQuoteField();
160 m_xmlfile
.Write("\t\t<font>\n");
161 m_xmlfile
.Write("\t\t\t<size>"+ptsize
+"</size>\n");
162 m_xmlfile
.Write("\t\t\t<face>"+face
+"</face>\n");
163 m_xmlfile
.Write("\t\t</font>\n");
170 m_xmlfile
.Write("\t</object>\n");
175 EDITTEXT IDC_BANDS,36,83,22,14,ES_AUTOHSCROLL | ES_NUMBER | NOT
177 LTEXT "Bands",IDC_STATIC,11,86,21,8
178 EDITTEXT IDC_NAME,10,3,75,14,ES_AUTOHSCROLL
181 void rc2xml::ParseControls()
184 wxString label
,varname
;
187 while ((token
!="END")&(token
!="}"))
189 if (token
=="AUTOCHECKBOX")
191 label
=GetQuoteField();
193 ParseCheckBox(label
,varname
);
196 if (token
=="AUTORADIOBUTTON")
198 label
=GetQuoteField();
200 ParseRadioButton(label
,varname
);
205 label
=GetQuoteField();
207 ParseStaticText(label
,varname
);
209 else if (token
=="EDITTEXT")
212 ParseTextCtrl(varname
);
214 else if ((token
=="PUSHBUTTON")||(token
=="DEFPUSHBUTTON"))
216 label
=GetQuoteField();
218 ParsePushButton(label
,varname
);
220 else if (token
=="GROUPBOX")
222 label
=GetQuoteField();
224 ParseGroupBox(label
,varname
);
226 else if (token
=="COMBOBOX")
229 ParseComboBox(varname
);
231 else if (token
=="CONTROL")
233 else if (token
=="LISTBOX")
236 ParseListBox(varname
);
238 else if (token
=="ICON")
240 else if (token
=="SCROLLBAR")
246 //LTEXT "Radius",IDC_STATIC,9,67,23,8
247 void rc2xml::ParseStaticText(wxString phrase
, wxString varname
)
251 while (!token
.IsNumber())
256 int x
,y
,width
,height
;
257 ReadRect(x
,y
,width
,height
);
259 m_xmlfile
.Write("\t\t<object class=\"wxStaticText\"");
260 WriteBasicInfo(x
,y
,width
,height
,varname
);WriteLabel(phrase
);
261 m_xmlfile
.Write("\t\t</object>\n");
264 //EDITTEXT IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
265 void rc2xml::ParseTextCtrl(wxString varname
)
270 while (!token
.IsNumber())
275 int x
,y
,width
,height
;
276 ReadRect(x
,y
,width
,height
);
279 m_xmlfile
.Write("\t\t<object class=\"wxTextCtrl\"");
280 WriteBasicInfo(x
,y
,width
,height
,varname
);
281 m_xmlfile
.Write("\t\t</object>\n");
284 //AUTOCHECKBOX "&log.", ID_XLOG, 25, 24, 21, 12
285 void rc2xml::ParseCheckBox(wxString phrase
, wxString varname
)
289 while (!token
.IsNumber())
294 int x
,y
,width
,height
;
295 ReadRect(x
,y
,width
,height
);
297 m_xmlfile
.Write("\t\t<object class=\"wxCheckBox\"");
298 WriteBasicInfo(x
,y
,width
,height
,varname
);
300 m_xmlfile
.Write("\t\t</object>\n");
303 //AUTORADIOBUTTON "&text", ID_SW10, 13, 12, 68, 10, BS_AUTORADIOBUTTON | WS_GROUP
304 void rc2xml::ParseRadioButton(wxString phrase
, wxString varname
)
306 wxString token
,style
;
307 int x
,y
,width
,height
;
309 GotOrs
= ReadOrs(token
);
310 if (ReadRect(x
,y
,width
,height
))
313 if (token
.Find("WS_GROUP") != -1)
314 style
+= "wxRB_GROUP";
316 m_xmlfile
.Write("\t\t<object class=\"wxRadioButton\"");
317 WriteBasicInfo(x
,y
,width
,height
,varname
);
320 m_xmlfile
.Write("\t\t</object>\n");
324 //PUSHBUTTON "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
325 void rc2xml::ParsePushButton(wxString phrase
, wxString varname
)
330 while (!token
.IsNumber())
335 int x
,y
,width
,height
;
336 ReadRect(x
,y
,width
,height
);
338 m_xmlfile
.Write("\t\t<object class=\"wxButton\"");
339 WriteBasicInfo(x
,y
,width
,height
,varname
);
341 m_xmlfile
.Write("\t\t</object>\n");
346 bool rc2xml::Seperator(int ch
)
348 //if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='|')|(ch=='\t'))
349 if ((ch
==' ')|(ch
==',')|(ch
==13)|(ch
==10)|(ch
=='\t'))
361 void rc2xml::ParseGroupBox(wxString phrase
, wxString varname
)
363 // GROUPBOX "Rotate",IDC_STATIC,1,1,71,79
366 while (!token
.IsNumber())
371 int x
,y
,width
,height
;
372 ReadRect(x
,y
,width
,height
);
374 m_xmlfile
.Write("\t\t<object class=\"wxStaticBox\"");
375 WriteBasicInfo(x
,y
,width
,height
,varname
);
377 m_xmlfile
.Write("\t\t</object>\n");
380 bool rc2xml::ReadRect(int & x
, int & y
, int & width
, int & height
)
384 width
=atoi(GetToken());
386 wxString tmp
= GetToken(&ret
);
388 return ret
; // check for more parameters
391 wxString
rc2xml::GetToken(bool *listseperator
)
409 while (Seperator(ch
))
422 while (!Seperator(ch
))
432 *listseperator
= (ch
== ',');
436 wxString
rc2xml::GetQuoteField()
455 // string in stringtable may contain embedded quotes
456 // escape characters retained to allow strings to be rewritten
457 wxString
rc2xml::GetStringQuote()
470 if ((ch
==34)&&(lastch
!='\\'))
474 // RC supports "", for embedded quote, as well as \"
486 ReadChar(ch
); // skip
487 if ((ch
=='\n')&&(lastch
=='\\')) // lastch <should> be this
488 phrase
+='n'; // escape
498 void rc2xml::ReadChar(int &ch
)
503 if((result
>=m_filesize
))
506 result
=m_rc
.Read(&ch
,1);
515 void rc2xml::ParseComboBox(wxString varname
)
517 /* COMBOBOX IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT |
518 WS_VSCROLL | WS_TABSTOP */
519 wxString token
,style
;
520 int x
,y
,width
,height
;
522 GotOrs
= ReadOrs(token
);
523 if (ReadRect(x
,y
,width
,height
))
527 m_xmlfile
.Write("\t\t<object class=\"wxComboBox\"");
528 WriteBasicInfo(x
,y
,width
,height
,varname
);
529 if (token
.Find("CBS_SIMPLE") != -1)
530 WriteStyle("wxCB_SIMPLE");
531 if (token
.Find("CBS_SORT") != -1)
532 WriteStyle("wxCB_SORT");
533 if (token
.Find("CBS_DISABLENOSCROLL") != -1)
534 WriteStyle("wxLB_ALWAYS_SB");
535 m_xmlfile
.Write("\n\t\t</object>\n");
539 void rc2xml::ParseMenu(wxString varname
)
543 //Write menubar to xml file
544 m_xmlfile
.Write("\t<object class=\"wxMenuBar\"");
545 //Avoid duplicate names this way
546 varname
.Replace("IDR_","MB_");
548 m_xmlfile
.Write(">\n");
550 while ((token
!="BEGIN")&(token
!="{"))
553 while ((token
!="END")&(token
!="}"))
563 m_xmlfile
.Write("\t</object>\n");
566 void rc2xml::ParsePopupMenu()
568 static int menucount
=0;
570 wxString token
,name
,msg
,longhelp
,tip
;
571 token
=GetQuoteField();
573 //Remove \t because it causes problems
575 //spot=token.First("\\t");
576 //token=token.Left(spot);
579 //Generate a fake name since RC menus don't have one
580 name
<<"Menu_"<<menucount
;
581 m_xmlfile
.Write("\t\t<object class=\"wxMenu\"");
583 m_xmlfile
.Write(">\n");
586 while ((token
!="BEGIN")&(token
!="{"))
589 while ((token
!="END")&(token
!="}"))
597 if (token
=="MENUITEM")
600 m_xmlfile
.Write("\t\t\t</object>\n");
603 wxString
rc2xml::PeekToken()
613 //MS Windows pain in the butt CONTROL
614 void rc2xml::ParseControlMS()
616 wxString label
,varname
,kindctrl
,token
;
619 if (token
.Contains("\""))
620 ParseNormalMSControl();
622 ParseWeirdMSControl();
626 /* CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |
627 TBS_NOTICKS | WS_TABSTOP,52,73,100,15
630 void rc2xml::ParseSlider(wxString label
, wxString varname
)
632 wxString token
,style
;
634 if (token
.Find("TBS_VERT")!=-1)
635 style
+="wxSL_VERTICAL";
636 //MFC RC Default is horizontal
638 style
+="wxSL_HORIZONTAL";
640 int x
,y
,width
,height
;
641 ReadRect(x
,y
,width
,height
);
642 m_xmlfile
.Write("\t\t<object class=\"wxSlider\"");
643 WriteBasicInfo(x
,y
,width
,height
,varname
);
645 m_xmlfile
.Write("\n\t\t</object>\n");
649 CONTROL "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
650 WS_BORDER,15,52,154,13
652 void rc2xml::ParseProgressBar(wxString label
, wxString varname
)
654 wxString token
,style
;
657 int x
,y
,width
,height
;
658 ReadRect(x
,y
,width
,height
);
660 //Always horizontal in MFC
661 m_xmlfile
.Write("\t\t<object class=\"wxGauge\"");
662 WriteBasicInfo(x
,y
,width
,height
,varname
);
664 m_xmlfile
.Write("\t\t</object>\n");
667 bool rc2xml::ReadOrs(wxString
& orstring
)
672 if (token
.IsNumber())
676 while(PeekToken()==_T("|"))
679 orstring
+=GetToken();
681 orstring
+=GetToken();
686 //Is it a checkbutton or a radiobutton or a pushbutton or a groupbox
687 void rc2xml::ParseCtrlButton(wxString label
, wxString varname
)
695 if (token
.Find("BS_AUTOCHECKBOX")!=-1)
696 ParseCheckBox(label
, varname
);
697 else if ((token
.Find("BS_AUTORADIOBUTTON")!=-1)||
698 (token
.Find("BS_RADIOBUTTON")!=-1))
699 ParseRadioButton(label
, varname
);
700 else if (token
.Find("BS_GROUPBOX")!=-1)
701 ParseGroupBox(label
, varname
);
702 else // if ((token.Find("BS_PUSHBUTTON")!=-1)||
703 // (token.Find("BS_DEFPUSHBUTTON")!=-1))
704 ParsePushButton(label
, varname
); // make default case
707 void rc2xml::WriteSize(int width
, int height
)
710 msg
<<" <size>"<<width
<<","<<height
<<"d</size>";
711 m_xmlfile
.Write(msg
);
714 void rc2xml::WritePosition(int x
, int y
)
717 msg
<<" <pos>"<<x
<<","<<y
<<"d</pos>";
718 m_xmlfile
.Write(msg
);
721 void rc2xml::WriteTitle(wxString title
)
724 msg
=_T("\t\t<title>"+title
+"</title>\n");
725 m_xmlfile
.Write(msg
);
728 void rc2xml::WriteName(wxString name
)
731 //Try to convert any number ids into names
733 //Replace common MS ids with wxWindows ids
734 //I didn't do everyone of them
737 else if (name
=="IDCANCEL")
739 else if (name
=="IDAPPLY")
741 else if (name
=="ID_FILE_OPEN")
743 else if (name
=="ID_FILE_CLOSE")
745 else if (name
=="ID_FILE_SAVE")
747 else if (name
=="ID_FILE_SAVE_AS")
749 else if (name
=="ID_APP_EXIT")
751 else if (name
=="ID_FILE_PRINT")
753 else if (name
=="ID_FILE_PRINT_PREVIEW")
755 else if (name
=="ID_FILE_PRINT_SETUP")
756 name
="wxID_PRINT_SETUP";
757 else if (name
=="ID_APP_ABOUT")
759 else if (name
=="ID_EDIT_UNDO")
761 else if (name
=="ID_EDIT_CUT")
763 else if (name
=="ID_EDIT_COPY")
765 else if (name
=="ID_EDIT_PASTE")
767 else if (name
=="IDYES")
769 else if (name
=="IDNO")
771 else if (name
=="IDHELP")
774 m_xmlfile
.Write(" name= \""+name
+"\"");
777 void rc2xml::WriteLabel(wxString label
)
779 label
.Replace("&","$");
780 m_xmlfile
.Write("\t\t\t<label>"+label
+"</label>\n");
783 void rc2xml::WriteBasicInfo(int x
, int y
, int width
, int height
, wxString name
)
786 m_xmlfile
.Write(">\n");
787 m_xmlfile
.Write("\t\t\t");
789 WriteSize(width
,height
);
790 m_xmlfile
.Write("\n");
793 void rc2xml::WriteStyle(wxString style
)
795 if (style
.Length()==0)
797 m_xmlfile
.Write("\t\t\t<style>"+style
+"</style>\n");
800 LISTBOX IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL |
801 LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
803 void rc2xml::ParseListBox(wxString varname
)
807 while (!token
.IsNumber())
812 int x
,y
,width
,height
;
813 ReadRect(x
,y
,width
,height
);
815 m_xmlfile
.Write("\t\t<object class=\"wxListBox\"");
816 WriteBasicInfo(x
,y
,width
,height
,varname
);
817 m_xmlfile
.Write("\n\t\t</object>\n");
821 CONTROL "",IDC_RICHEDIT1,"RICHEDIT",ES_AUTOHSCROLL | WS_BORDER |
822 WS_TABSTOP,103,110,40,14
824 void rc2xml::ParseRichEdit(wxString label
, wxString varname
)
827 //while (ReadOrs(token));
829 int x
,y
,width
,height
;
830 ReadRect(x
,y
,width
,height
);
832 //Make it a rich text control
833 style
+="wxTE_MULTILINE ";
834 m_xmlfile
.Write("\t\t<object class=\"wxTextCtrl\"");
835 WriteBasicInfo(x
,y
,width
,height
,varname
);
837 m_xmlfile
.Write("\t\t</object>\n");
841 CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,209,72,
844 void rc2xml::ParseSpinCtrl(wxString label
, wxString varname
)
846 wxString token
,style
;
849 if (token
.Find("UDS_HORZ")!=-1)
850 style
="wxSP_HORIZONTAL";
853 style
="wxSP_VERTICAL";
855 int x
,y
,width
,height
;
856 ReadRect(x
,y
,width
,height
);
857 m_xmlfile
.Write("\t\t<object class=\"wxSpinButton\"");
858 WriteBasicInfo(x
,y
,width
,height
,varname
);
860 m_xmlfile
.Write("\n\t\t</object>\n");
864 void rc2xml::FirstPass()
866 wxString token
,prevtok
;
871 ParseBitmap(prevtok
);
872 else if (token
=="STRINGTABLE")
873 ParseStringTable(prevtok
);
874 else if (token
=="ICON")
881 void rc2xml::ParseBitmap(wxString varname
)
883 wxString token
,*bitmapfile
;
886 //Microsoft notation?
887 if (token
=="DISCARDABLE")
892 bitmapfile
=new wxString
;
893 *bitmapfile
=GetQuoteField();
894 m_bitmaplist
->Append(varname
,bitmapfile
);
899 void rc2xml::SecondPass()
901 wxString token
,prevtok
;
905 if ((token
=="DIALOG")||(token
=="DIALOGEX"))
906 ParseDialog(prevtok
);
907 else if (token
=="MENU")
909 else if (token
=="TOOLBAR")
910 ParseToolBar(prevtok
);
917 void rc2xml::ParseToolBar(wxString varname
)
921 wxASSERT_MSG(token
=="DISCARDABLE","Error in toolbar parsing");
922 //Look up bitmap for toolbar and load
923 wxNode
*node
=m_bitmaplist
->Find(LookUpId(varname
));
924 wxString
*bitmappath
;
925 bitmappath
=(wxString
*)node
->Data();
927 if (!bitmap
.LoadFile(*bitmappath
,wxBITMAP_TYPE_BMP
))
928 wxLogError("Unable to load bitmap:"+*bitmappath
);
930 //Write toolbar to xml file
931 m_xmlfile
.Write(" <object class=\"wxToolBar\"");
932 //Avoid duplicate names this way
933 varname
.Replace("IDR_","TB_");
935 m_xmlfile
.Write(">\n");
941 //Grab width and height
943 width
=atoi(GetToken());
944 height
=atoi(GetToken());
947 wxString buttonname
,msg
,tip
,longhelp
;
949 while ((token
!="BEGIN")&(token
!="{"))
952 while ((token
!="END")&(token
!="}"))
956 buttonname
=GetToken();
957 m_xmlfile
.Write("\t\t\t<object class=\"tool\"");
958 WriteName(buttonname
);
959 m_xmlfile
.Write(">\n");
960 //Write tool tip if any
961 if (LookUpString(buttonname
,msg
))
963 SplitHelp(msg
,tip
,longhelp
);
964 m_xmlfile
.Write("\t\t\t\t<tooltip>"+tip
+"</tooltip>\n");
965 m_xmlfile
.Write(" <longhelp>"+longhelp
+"</longhelp>\n");
967 //Make a bitmap file name
968 buttonname
=CleanName(buttonname
);
970 m_xmlfile
.Write("\t\t\t\t<bitmap>"+buttonname
+"</bitmap>\n");
971 WriteToolButton(buttonname
,c
,width
,height
,bitmap
);
972 m_xmlfile
.Write("\t\t\t</object>\n");
975 else if (token
=="SEPARATOR")
977 m_xmlfile
.Write("\t\t\t<object class=\"separator\"/>\n");
981 m_xmlfile
.Write("\t</object>\n");
984 //Extract bitmaps from larger toolbar bitmap
985 void rc2xml::WriteToolButton(wxString name
,int index
, int width
, int height
, wxBitmap bitmap
)
989 wxRect
r(x
,0,width
,height
);
991 little
=bitmap
.GetSubBitmap(r
);
992 little
.SaveFile(m_targetpath
+name
,wxBITMAP_TYPE_BMP
);
995 void rc2xml::ParseStringTable(wxString varname
)
999 while ((token
!="BEGIN")&(token
!="{"))
1004 while ((token
!="END")&(token
!="}"))
1007 *msg
=GetStringQuote();
1008 m_stringtable
->Append(token
,msg
);
1014 bool rc2xml::LookUpString(wxString strid
,wxString
& st
)
1016 wxNode
*node
=m_stringtable
->Find(strid
);
1021 s
=(wxString
*)node
->Data();
1027 bool rc2xml::SplitHelp(wxString msg
, wxString
&shorthelp
, wxString
&longhelp
)
1030 spot
=msg
.Find("\\n");
1037 longhelp
=msg
.Left(spot
);
1038 spot
=msg
.Length()-spot
-2;
1039 shorthelp
=msg
.Right(spot
);
1043 void rc2xml::ParseMenuItem()
1045 wxString token
,name
,msg
,tip
,longhelp
;
1047 if (PeekToken()=="SEPARATOR")
1049 m_xmlfile
.Write("\t\t\t<object class=\"separator\"/>\n");
1053 token
=GetQuoteField();
1055 //Remove \t because it causes problems
1056 //spot=token.First("\\t");
1057 //token=token.Left(spot);
1058 m_xmlfile
.Write("\t\t\t<object class=\"wxMenuItem\"");
1060 m_xmlfile
.Write(">\n");
1062 //Look up help if any listed in stringtable
1063 //can't assume numbers correlate, restrict to string identifiers
1064 if ((!name
.IsNumber())&&(LookUpString(name
,msg
)))
1066 SplitHelp(msg
,tip
,longhelp
);
1067 m_xmlfile
.Write("\t\t\t<help>"
1068 +longhelp
+"</help>\n");
1070 //look for extra attributes like checked and break
1074 while ((ptoken
!="MENUITEM")&(ptoken
!="POPUP")&(ptoken
!="END"))
1078 if (token
=="CHECKED")
1079 m_xmlfile
.Write("\t\t\t<checkable>1</checkable>\n");
1080 else if (token
=="MENUBREAK");
1081 //m_xmlfile.Write("\t\t\t</break>\n");
1082 else if (token
=="GRAYED");
1084 wxLogError("Unknown Menu Item token:"+token
);
1089 m_xmlfile
.Write("\t\t\t</object>\n");
1093 //ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
1094 void rc2xml::ParseIconStatic()
1097 wxString varname
,iconname
;
1098 token
= PeekToken();
1099 if (token
.Contains("\""))
1100 iconname
= GetQuoteField();
1102 iconname
=GetToken();
1106 int x
,y
,width
,height
;
1107 ReadRect(x
,y
,width
,height
);
1109 m_xmlfile
.Write("\t\t<object class=\"wxStaticBitmap\"");
1110 WriteBasicInfo(x
,y
,width
,height
,varname
);
1111 //Save icon as a bitmap
1112 WriteIcon(iconname
);
1113 m_xmlfile
.Write("\t\t</object>\n");
1116 //IDR_MAINFRAME ICON DISCARDABLE "res\\mfcexample.ico"
1117 void rc2xml::ParseIcon(wxString varname
)
1119 wxString token
,*iconfile
;
1120 iconfile
=new wxString
;
1123 *iconfile
=GetQuoteField();
1124 m_iconlist
->Append(varname
,iconfile
);
1129 wxString
rc2xml::CleanName(wxString name
)
1132 name
.Replace("id_","");
1133 name
.Replace("idr_","");
1134 name
.Replace("idb_","");
1135 name
.Replace("idc_","");
1137 name
.Replace(".ico","");
1139 name
.Replace(".bmp","");
1142 // And the award for most messed up control goes to...
1143 // CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
1144 void rc2xml::ParseStaticBitmap(wxString bitmapname
, wxString varname
)
1151 int x
,y
,width
,height
;
1152 ReadRect(x
,y
,width
,height
);
1154 m_xmlfile
.Write("\t\t<object class=\"wxStaticBitmap\"");
1155 WriteBasicInfo(x
,y
,width
,height
,varname
);
1156 WriteBitmap(bitmapname
);
1157 m_xmlfile
.Write("\t\t</object>\n");
1161 void rc2xml::ParseNormalMSControl()
1163 wxString label
,varname
,kindctrl
;
1165 label
=GetQuoteField();
1167 kindctrl
=GetQuoteField();
1168 kindctrl
.MakeUpper();
1170 if (kindctrl
=="MSCTLS_UPDOWN32")
1171 ParseSpinCtrl(label
,varname
);
1172 if (kindctrl
=="MSCTLS_TRACKBAR32")
1173 ParseSlider(label
,varname
);
1174 if (kindctrl
=="MSCTLS_PROGRESS32")
1175 ParseProgressBar(label
,varname
);
1176 if (kindctrl
=="SYSTREEVIEW32")
1177 ParseTreeCtrl(label
,varname
);
1178 if (kindctrl
=="SYSMONTHCAL32")
1179 ParseCalendar(label
,varname
);
1180 if (kindctrl
=="SYSLISTVIEW32")
1181 ParseListCtrl(label
,varname
);
1182 if (kindctrl
=="BUTTON")
1183 ParseCtrlButton(label
,varname
);
1184 if (kindctrl
=="RICHEDIT")
1185 ParseRichEdit(label
,varname
);
1186 if (kindctrl
=="STATIC")
1192 if (token
.Find("SS_BITMAP")!=-1)
1193 ParseStaticBitmap(label
,varname
);
1195 ParseStaticText(label
,varname
);
1197 if (kindctrl
=="EDIT")
1198 ParseTextCtrl(varname
);
1199 if (kindctrl
=="LISTBOX")
1200 ParseListBox(varname
);
1201 if (kindctrl
=="COMBOBOX")
1202 ParseComboBox(varname
);
1206 void rc2xml::ParseWeirdMSControl()
1213 kindctrl
=GetQuoteField();
1214 kindctrl
.MakeUpper();
1215 // CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
1216 if (kindctrl
=="STATIC")
1218 if (PeekToken()=="SS_BITMAP")
1219 ParseStaticBitmap(id
,varname
);
1221 wxLogError("Unknown MS Control Static token");
1225 //SCROLLBAR IDC_SCROLLBAR1,219,56,10,40,SBS_VERT
1227 void rc2xml::ParseScrollBar()
1233 int x
,y
,width
,height
;
1234 ReadRect(x
,y
,width
,height
);
1239 if (token
.Find("SBS_VERT")!=-1)
1240 style
=_T("wxSB_VERTICAL");
1241 //Default MFC style is horizontal
1243 style
=_T("wxSB_HORIZONTAL");
1245 m_xmlfile
.Write("\t\t<object class=\"wxScrollBar\"");
1246 WriteBasicInfo(x
,y
,width
,height
,varname
);
1248 m_xmlfile
.Write("\n\t\t</object>\n");
1251 // CONTROL "Tree1",IDC_TREE1,"SysTreeView32",WS_BORDER | WS_TABSTOP,
1254 void rc2xml::ParseTreeCtrl(wxString label
, wxString varname
)
1257 //while (ReadOrs(token));
1259 int x
,y
,width
,height
;
1260 ReadRect(x
,y
,width
,height
);
1261 m_xmlfile
.Write("\t\t<object class=\"wxTreeCtrl\"");
1262 WriteBasicInfo(x
,y
,width
,height
,varname
);
1263 m_xmlfile
.Write("\t\t</object>\n");
1266 // CONTROL "MonthCalendar1",IDC_MONTHCALENDAR1,"SysMonthCal32",
1267 //MCS_NOTODAY | WS_TABSTOP,105,71,129,89
1269 void rc2xml::ParseCalendar(wxString label
, wxString varname
)
1272 //while (ReadOrs(token));
1274 int x
,y
,width
,height
;
1275 ReadRect(x
,y
,width
,height
);
1276 m_xmlfile
.Write("\t\t<object class=\"wxCalendarCtrl\"");
1277 WriteBasicInfo(x
,y
,width
,height
,varname
);
1278 m_xmlfile
.Write("\t\t</object>\n");
1280 // CONTROL "List1",IDC_LIST1,"SysListView32",WS_BORDER | WS_TABSTOP,
1283 void rc2xml::ParseListCtrl(wxString label
, wxString varname
)
1286 //while (ReadOrs(token));
1288 int x
,y
,width
,height
;
1289 ReadRect(x
,y
,width
,height
);
1290 m_xmlfile
.Write("\t\t<object class=\"wxListCtrl\"");
1291 WriteBasicInfo(x
,y
,width
,height
,varname
);
1292 m_xmlfile
.Write("\t\t</object>\n");
1296 void rc2xml::WriteBitmap(wxString bitmapname
)
1299 wxNode
*node
=m_bitmaplist
->Find(LookUpId(bitmapname
));
1302 m_xmlfile
.Write("\t\t\t<bitmap>missingfile</bitmap>\n");
1303 wxLogError("Unable to find bitmap:"+bitmapname
);
1307 wxString
*bitmappath
;
1308 bitmappath
=(wxString
*)node
->Data();
1310 bitmapname
=wxFileNameFromPath(*bitmappath
);
1312 if (!bitmap
.LoadFile(*bitmappath
,wxBITMAP_TYPE_BMP
))
1313 wxLogError("Unable to load bitmap:"+*bitmappath
);
1315 //Make a bitmap file name
1316 bitmapname
=CleanName(bitmapname
);
1318 m_xmlfile
.Write("\t\t\t<bitmap>"+bitmapname
+"</bitmap>\n");
1319 bitmap
.SaveFile(m_targetpath
+bitmapname
,wxBITMAP_TYPE_BMP
);
1322 void rc2xml::WriteIcon(wxString iconname
)
1324 wxNode
*node
=m_iconlist
->Find(iconname
);
1327 m_xmlfile
.Write("\t\t\t<bitmap>missing_file</bitmap>\n");
1328 wxLogError("Unable to find icon:"+iconname
);
1331 iconpath
=(wxString
*)node
->Data();
1334 if (!icon
.LoadFile(*iconpath
,wxBITMAP_TYPE_ICO
))
1335 wxLogError("Unable to load icon:"+*iconpath
);
1337 bitmap
.CopyFromIcon(icon
);
1341 iconname
=wxFileNameFromPath(*iconpath
);
1342 //Make a bitmap file name
1343 iconname
=CleanName(iconname
);
1345 m_xmlfile
.Write("\t\t\t<bitmap>"+iconname
+"</bitmap>\n");
1346 bitmap
.SaveFile(m_targetpath
+iconname
,wxBITMAP_TYPE_BMP
);
1350 /*Unfortunately sometimes the great MSVC Resource editor decides
1351 to use numbers instead of the word id. I have no idea why they
1352 do this, but that is the way it is.
1354 /* this is a quick and dirty way to parse the resource.h file
1355 it will not recognize #ifdef so it can be easily fooled
1357 void rc2xml::ParseResourceHeader()
1360 //Attempt to load resource.h in current path
1361 if (!r
.Open("resource.h"))
1363 wxLogError("Warining Unable to load resource.h file");
1369 wxStringTokenizer tok
;
1375 //Read through entire file
1376 for ( str
= r
.GetFirstLine(); !r
.Eof(); str
= r
.GetNextLine() )
1378 if (str
.Find("#define")!=-1)
1381 //Just ignore #define token
1383 v
=tok
.GetNextToken();
1384 id
=tok
.GetNextToken();
1387 varname
=new wxString
;
1390 m_resourcelist
->Append(n
,varname
);
1400 wxString
rc2xml::LookUpId(wxString id
)
1408 wxNode
*node
=m_resourcelist
->Find(n
);
1413 s
=(wxString
*)node
->Data();