]> git.saurik.com Git - wxWidgets.git/blame - contrib/utils/convertrc/rc2xml.cpp
wxEmptyString decorations.
[wxWidgets.git] / contrib / utils / convertrc / rc2xml.cpp
CommitLineData
2193517f
VS
1// rc2xml.cpp: implementation of the rc2xml class.
2//Author: Brian Gavin 9/24/00
3//License: wxWindows License
4/*
5How to use:
6#include "rc2xml.h"
7...
8rc2xml trans;
9trans->Convert("Myfile.rc","Myfile.xml");
10*/
11/* TODO
121. Figure how to fix memory leaks in all wxLists in this class
132. Find a way to rename MS Windows fonts so that they work
14cross platform (wxGTK,etc)
153. Be able to abort incorrectly formated files without crashing
16*/
17
18#ifdef __GNUG__
19#pragma implementation "rc2xml.cpp"
20#pragma interface "rc2xml.cpp"
21#endif
22
88d42654 23// For compilers that support precompilation, includes "wx/wx.h".
92a19c2e 24#include "wx/wxprec.h"
2193517f
VS
25
26#ifdef __BORLANDC__
27#pragma hdrstop
28#endif
29
30// for all others, include the necessary headers (this file is usually all you
be5a51fb 31// need because it includes almost all "standard" wxWidgets headers
2193517f
VS
32#ifndef WX_PRECOMP
33#include <wx/wx.h>
34#endif
35
88d42654
VS
36
37#include "rc2xml.h"
38#include "wx/image.h"
7c9955d1
JS
39#include "wx/deprecated/setup.h"
40#include "wx/deprecated/resource.h"
2193517f
VS
41#include <wx/textfile.h>
42#include <wx/tokenzr.h>
43
44
45
88d42654
VS
46//////////////////////////////////////////////////////////////////////
47// Construction/Destruction
48//////////////////////////////////////////////////////////////////////
49
2193517f 50rc2xml::rc2xml()
88d42654 51{
f80ea77b 52 m_done=false;
2193517f
VS
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);
88d42654
VS
57}
58
2193517f 59rc2xml::~rc2xml()
88d42654 60{
2193517f
VS
61 delete m_bitmaplist;
62 delete m_stringtable;
63 delete m_iconlist;
64 delete m_resourcelist;
88d42654
VS
65}
66
2193517f 67bool rc2xml::Convert(wxString rcfile, wxString xmlfile)
88d42654 68{
2193517f
VS
69 m_rc.Open(rcfile.c_str());
70 m_filesize=m_rc.Length();
7c9955d1 71
92a19c2e 72
2c99715a 73 m_workingpath=wxPathOnly(rcfile);
92a19c2e 74
19d0f58d 75 m_targetpath=wxPathOnly(xmlfile) + _T("\\");
2c99715a 76
92a19c2e
GT
77
78
2c99715a
VS
79 wxSetWorkingDirectory(m_workingpath);
80
92a19c2e 81
2193517f 82 bool result;
19d0f58d
JS
83 result=m_xmlfile.Open(xmlfile.c_str(),_T("w+t"));
84 wxASSERT_MSG(result,_T("Couldn't create XML file"));
2193517f 85 if (!result)
f80ea77b 86 return false;
88d42654 87
7c9955d1 88
88d42654 89/* Write Basic header for XML file */
19d0f58d
JS
90 m_xmlfile.Write(_T("<?xml version=\"1.0\" ?>\n"));
91 m_xmlfile.Write(_T("<resource>\n"));
7c9955d1 92
2193517f
VS
93//Read resource.h
94 ParseResourceHeader();
88d42654 95//Gather all the resource we need for toolbars,menus, and etc
2193517f 96 FirstPass();
f80ea77b 97 m_done=false;
2193517f 98 m_rc.Seek(0);
88d42654 99//Read in dialogs, toolbars,menus
2193517f 100 SecondPass();
88d42654 101
19d0f58d 102 m_xmlfile.Write(_T("</resource>\n"));
2193517f
VS
103 m_xmlfile.Close();
104 m_rc.Close();
7c9955d1 105 wxMessageBox(_("Conversion complete."), _("Done"),
5c8756b0 106 wxOK | wxICON_INFORMATION);
88d42654 107
f80ea77b 108return true;
88d42654
VS
109}
110
111
2193517f 112void rc2xml::ParseDialog(wxString dlgname)
88d42654 113{
2193517f
VS
114 wxString token;
115 static int dlgid=999;
116 dlgid++;
7c9955d1 117/* Make sure that this really is a dialog
2193517f
VS
118microsoft reuses the keyword DIALOG for other things
119*/
120 token=PeekToken();
121//Microsoft notation?
19d0f58d
JS
122 while ((token==_T("DISCARDABLE"))
123 ||(token==_T("LOADONCALL"))||(token==_T("MOVEABLE")))
2193517f
VS
124 {
125 token=GetToken();
126 token=PeekToken();
127 }
128//Error isn't a Dialog resource eject eject
129 if (!token.IsNumber())
130 return;
88d42654
VS
131
132//Record x,y,width,height
2193517f
VS
133 int x,y,width,height;
134 ReadRect(x,y,width,height);
88d42654 135//Get Title
2193517f
VS
136 token=GetToken();
137 wxString title;
138 wxString ptsize,face;
7c9955d1 139
19d0f58d 140 m_xmlfile.Write(_T("\t<object class=\"wxDialog\""));
2193517f 141 //Avoid duplicate names this way
19d0f58d 142 dlgname.Replace(_T("IDD_"),_T("DLG_"));
2193517f
VS
143 WriteBasicInfo(x,y,width,height,dlgname);
144 WriteTitle(title);
7c9955d1 145
2193517f 146
19d0f58d 147 while ((token!=_T("BEGIN"))&(token!=_T("{")))
2193517f 148 {
19d0f58d 149 if (token==_T("CAPTION"))
2193517f
VS
150 {
151 title=GetQuoteField();
152 }
153
154//TODO fix face name so that it is cross platform name
155// FONT 8, "MS Sans Serif"
19d0f58d 156 if (token==_T("FONT"))
2193517f
VS
157 {
158 ptsize=GetToken();
159 face=GetQuoteField();
19d0f58d
JS
160 m_xmlfile.Write(_T("\t\t<font>\n"));
161 m_xmlfile.Write(_T("\t\t\t<size>")+ptsize+_T("</size>\n"));
162 m_xmlfile.Write(_T("\t\t\t<face>")+face+_T("</face>\n"));
163 m_xmlfile.Write(_T("\t\t</font>\n"));
2193517f
VS
164 }
165
166 token=GetToken();
167 }
88d42654 168
2193517f 169 ParseControls();
19d0f58d 170 m_xmlfile.Write(_T("\t</object>\n"));
88d42654
VS
171}
172
173/*
174BEGIN
7c9955d1 175 EDITTEXT IDC_BANDS,36,83,22,14,ES_AUTOHSCROLL | ES_NUMBER | NOT
88d42654
VS
176 WS_TABSTOP
177 LTEXT "Bands",IDC_STATIC,11,86,21,8
178 EDITTEXT IDC_NAME,10,3,75,14,ES_AUTOHSCROLL
179END
180*/
2193517f 181void rc2xml::ParseControls()
88d42654 182{
2193517f 183 wxString token;
5c8756b0 184 wxString label,varname;
2193517f
VS
185
186 token=GetToken();
19d0f58d 187 while ((token!=_T("END"))&(token!=_T("}")))
2193517f 188 {
19d0f58d 189 if (token==_T("AUTOCHECKBOX"))
5c8756b0
JS
190 {
191 label=GetQuoteField();
192 varname=GetToken();
193 ParseCheckBox(label,varname);
194 }
11ad1132 195 else
19d0f58d 196 if (token==_T("AUTORADIOBUTTON"))
5c8756b0
JS
197 {
198 label=GetQuoteField();
199 varname=GetToken();
200 ParseRadioButton(label,varname);
201 }
11ad1132 202 else
19d0f58d 203 if (token==_T("LTEXT"))
5c8756b0
JS
204 {
205 label=GetQuoteField();
206 varname=GetToken();
207 ParseStaticText(label,varname);
208 }
19d0f58d 209 else if (token==_T("EDITTEXT"))
5c8756b0
JS
210 {
211 varname=GetToken();
212 ParseTextCtrl(varname);
213 }
19d0f58d 214 else if ((token==_T("PUSHBUTTON"))||(token==_T("DEFPUSHBUTTON")))
5c8756b0
JS
215 {
216 label=GetQuoteField();
217 varname=GetToken();
218 ParsePushButton(label,varname);
219 }
19d0f58d 220 else if (token==_T("GROUPBOX"))
5c8756b0
JS
221 {
222 label=GetQuoteField();
223 varname=GetToken();
224 ParseGroupBox(label,varname);
225 }
19d0f58d 226 else if (token==_T("COMBOBOX"))
5c8756b0
JS
227 {
228 varname=GetToken();
229 ParseComboBox(varname);
230 }
19d0f58d 231 else if (token==_T("CONTROL"))
2193517f 232 ParseControlMS();
19d0f58d 233 else if (token==_T("LISTBOX"))
5c8756b0
JS
234 {
235 varname=GetToken();
236 ParseListBox(varname);
237 }
19d0f58d 238 else if (token==_T("ICON"))
2193517f 239 ParseIconStatic();
19d0f58d 240 else if (token==_T("SCROLLBAR"))
2193517f
VS
241 ParseScrollBar();
242 token=GetToken();
243 }
88d42654
VS
244
245}
246//LTEXT "Radius",IDC_STATIC,9,67,23,8
5c8756b0 247void rc2xml::ParseStaticText(wxString phrase, wxString varname)
88d42654 248{
2193517f 249 wxString token;
5c8756b0
JS
250 token=PeekToken();
251 while (!token.IsNumber())
252 {
253 token=GetToken();
254 token=PeekToken();
255 }
2193517f
VS
256 int x,y,width,height;
257 ReadRect(x,y,width,height);
88d42654 258
19d0f58d 259 m_xmlfile.Write(_T("\t\t<object class=\"wxStaticText\""));
2193517f 260 WriteBasicInfo(x,y,width,height,varname);WriteLabel(phrase);
19d0f58d 261 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
262
263}
264//EDITTEXT IDC_RADIUS,36,65,40,14,ES_AUTOHSCROLL
5c8756b0 265void rc2xml::ParseTextCtrl(wxString varname)
88d42654 266{
2193517f 267 wxString token;
5c8756b0
JS
268 wxString style;
269 token=PeekToken();
270 while (!token.IsNumber())
271 {
272 token=GetToken();
273 token=PeekToken();
274 }
2193517f
VS
275 int x,y,width,height;
276 ReadRect(x,y,width,height);
88d42654
VS
277//TODO
278//style=GetToken();
19d0f58d 279 m_xmlfile.Write(_T("\t\t<object class=\"wxTextCtrl\""));
2193517f 280 WriteBasicInfo(x,y,width,height,varname);
19d0f58d 281 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
282
283}
11ad1132 284//AUTOCHECKBOX "&log.", ID_XLOG, 25, 24, 21, 12
5c8756b0 285void rc2xml::ParseCheckBox(wxString phrase, wxString varname)
11ad1132
VS
286{
287 wxString token;
5c8756b0
JS
288 token=PeekToken();
289 while (!token.IsNumber())
290 {
291 token=GetToken();
292 token=PeekToken();
293 }
11ad1132
VS
294 int x,y,width,height;
295 ReadRect(x,y,width,height);
296
19d0f58d 297 m_xmlfile.Write(_T("\t\t<object class=\"wxCheckBox\""));
11ad1132
VS
298 WriteBasicInfo(x,y,width,height,varname);
299 WriteLabel(phrase);
19d0f58d 300 m_xmlfile.Write(_T("\t\t</object>\n"));
11ad1132
VS
301
302}
303//AUTORADIOBUTTON "&text", ID_SW10, 13, 12, 68, 10, BS_AUTORADIOBUTTON | WS_GROUP
5c8756b0 304void rc2xml::ParseRadioButton(wxString phrase, wxString varname)
11ad1132
VS
305{
306 wxString token,style;
11ad1132 307 int x,y,width,height;
5c8756b0
JS
308 bool GotOrs;
309 GotOrs = ReadOrs(token);
11ad1132 310 if (ReadRect(x,y,width,height))
f80ea77b 311 if (GotOrs==false)
11ad1132 312 ReadOrs(token);
f80ea77b 313 if (token.Find(_T("WS_GROUP")) != wxNOT_FOUND)
19d0f58d 314 style += _T("wxRB_GROUP");
11ad1132 315
19d0f58d 316 m_xmlfile.Write(_T("\t\t<object class=\"wxRadioButton\""));
11ad1132
VS
317 WriteBasicInfo(x,y,width,height,varname);
318 WriteLabel(phrase);
319 WriteStyle(style);
19d0f58d 320 m_xmlfile.Write(_T("\t\t</object>\n"));
11ad1132
VS
321
322}
323
88d42654 324//PUSHBUTTON "Create/Update",IDC_CREATE,15,25,53,13,NOT WS_TABSTOP
5c8756b0 325void rc2xml::ParsePushButton(wxString phrase, wxString varname)
88d42654 326{
2193517f 327 wxString token;
88d42654 328
5c8756b0
JS
329 token=PeekToken();
330 while (!token.IsNumber())
331 {
332 token=GetToken();
333 token=PeekToken();
334 }
2193517f
VS
335 int x,y,width,height;
336 ReadRect(x,y,width,height);
88d42654 337
19d0f58d 338 m_xmlfile.Write(_T("\t\t<object class=\"wxButton\""));
2193517f
VS
339 WriteBasicInfo(x,y,width,height,varname);
340 WriteLabel(phrase);
19d0f58d 341 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
342
343}
344
345
2193517f 346bool rc2xml::Seperator(int ch)
88d42654
VS
347{
348//if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='|')|(ch=='\t'))
2193517f 349 if ((ch==' ')|(ch==',')|(ch==13)|(ch==10)|(ch=='\t'))
f80ea77b 350 return true;
2193517f
VS
351
352 if (ch==EOF)
353 {
f80ea77b
WS
354 m_done=true;
355 return true;
2193517f 356 }
7c9955d1 357
f80ea77b 358 return false;
88d42654
VS
359}
360
5c8756b0 361void rc2xml::ParseGroupBox(wxString phrase, wxString varname)
88d42654
VS
362{
363// GROUPBOX "Rotate",IDC_STATIC,1,1,71,79
2193517f 364 wxString token;
5c8756b0
JS
365 token=PeekToken();
366 while (!token.IsNumber())
367 {
368 token=GetToken();
369 token=PeekToken();
370 }
2193517f
VS
371 int x,y,width,height;
372 ReadRect(x,y,width,height);
373
19d0f58d 374 m_xmlfile.Write(_T("\t\t<object class=\"wxStaticBox\""));
2193517f
VS
375 WriteBasicInfo(x,y,width,height,varname);
376 WriteLabel(phrase);
19d0f58d 377 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
378}
379
11ad1132 380bool rc2xml::ReadRect(int & x, int & y, int & width, int & height)
88d42654 381{
19d0f58d
JS
382 x=wxAtoi(GetToken());
383 y=wxAtoi(GetToken());
384 width=wxAtoi(GetToken());
11ad1132
VS
385 bool ret;
386 wxString tmp = GetToken(&ret);
19d0f58d 387 height=wxAtoi(tmp);
11ad1132 388 return ret; // check for more parameters
88d42654
VS
389}
390
11ad1132 391wxString rc2xml::GetToken(bool *listseperator)
88d42654 392{
19d0f58d 393 wxString token=wxEmptyString;
88d42654 394
2193517f
VS
395 if (m_rc.Eof())
396 {
f80ea77b 397 m_done=true;
2193517f 398 return token;
88d42654
VS
399}
400
2193517f
VS
401 int ch=0;
402 ReadChar(ch);
403 if (ch==EOF)
404 {
f80ea77b 405 m_done=true;
2193517f
VS
406 return token;
407 }
88d42654 408
2193517f
VS
409 while (Seperator(ch))
410 {
411 ReadChar(ch);
412 if (m_done)
413 return token;
414 }
88d42654 415
2193517f
VS
416 if (ch==EOF)
417 {
f80ea77b 418 m_done=true;
2193517f 419 }
7c9955d1 420
88d42654 421
2193517f
VS
422 while (!Seperator(ch))
423 {
11ad1132 424 token += (char)ch;
2193517f
VS
425 ReadChar(ch);
426 }
88d42654 427
11ad1132 428 if (ch == EOF)
f80ea77b 429 m_done = true;
88d42654 430
11ad1132
VS
431 if (listseperator)
432 *listseperator = (ch == ',');
2193517f 433 return token;
88d42654
VS
434}
435
2193517f 436wxString rc2xml::GetQuoteField()
88d42654 437{
2193517f
VS
438 wxString phrase;
439 //ASCII code 34 "
440 int ch=0;
c988c5b2
JS
441 int ch1=0;
442
2193517f 443 ReadChar(ch);
88d42654 444
c988c5b2
JS
445 // !! Changed by MS, 15th/11/04. Can now read strings such as
446 // """Catapult"" - blah blah", ...
447
2193517f
VS
448 while (ch!=34)
449 ReadChar(ch);
7c9955d1 450
c988c5b2
JS
451 // found first '"'
452 while (true)
5c8756b0 453 {
c988c5b2
JS
454 ReadChar(ch);
455 if (ch == 34)
456 {
457 // another quote?
458 ReadChar(ch1);
459 if (ch1 != 34)
460 {
461 // real end of string..
462 break;
463 }
464
465 // add a single quote - fall through
466 }
467 phrase+=(char)ch;
5c8756b0 468 }
c988c5b2 469
5c8756b0
JS
470 return phrase;
471}
472
473// string in stringtable may contain embedded quotes
474// escape characters retained to allow strings to be rewritten
475wxString rc2xml::GetStringQuote()
476{
477 wxString phrase;
478 //ASCII code 34 "
f80ea77b 479 bool done=false;
5c8756b0 480 int p,ch=0,lastch=0;
2193517f 481 ReadChar(ch);
88d42654 482
2193517f 483 while (ch!=34)
5c8756b0
JS
484 ReadChar(ch);
485 ReadChar(ch);
f80ea77b 486 while (done==false)
5c8756b0
JS
487 {
488 if ((ch==34)&&(lastch!='\\'))
489 {
490 p=m_rc.Tell();
491 ReadChar(ch);
492// RC supports "", for embedded quote, as well as \"
7c9955d1
JS
493 if (ch==34)
494 phrase+='\\';
5c8756b0 495 else
2193517f 496 {
5c8756b0 497 m_rc.Seek(p);
f80ea77b 498 done = true;
5c8756b0
JS
499 }
500 }
f80ea77b 501 if (done==true)
5c8756b0
JS
502 break;
503 if (ch=='\r')
504 ReadChar(ch); // skip
505 if ((ch=='\n')&&(lastch=='\\')) // lastch <should> be this
506 phrase+='n'; // escape
507 else
2193517f 508 phrase+=(char)ch;
5c8756b0 509 lastch=ch;
2193517f
VS
510 ReadChar(ch);
511 }
5c8756b0 512
2193517f 513 return phrase;
88d42654
VS
514}
515
2193517f 516void rc2xml::ReadChar(int &ch)
88d42654 517{
2193517f
VS
518 int result;
519 result=m_rc.Tell();
88d42654 520
2193517f 521 if((result>=m_filesize))
f80ea77b 522 m_done=true;
88d42654 523
2193517f 524 result=m_rc.Read(&ch,1);
88d42654 525
2193517f 526 if((result==-1))
f80ea77b 527 m_done=true;
88d42654 528
2193517f 529 if(ch==EOF)
f80ea77b 530 m_done=true;
88d42654
VS
531}
532
5c8756b0 533void rc2xml::ParseComboBox(wxString varname)
88d42654 534{
7c9955d1 535/* COMBOBOX IDC_SCALECOMBO,10,110,48,52,CBS_DROPDOWNLIST | CBS_SORT |
88d42654 536 WS_VSCROLL | WS_TABSTOP */
11ad1132 537 wxString token,style;
2193517f 538 int x,y,width,height;
5c8756b0
JS
539 bool GotOrs;
540 GotOrs = ReadOrs(token);
11ad1132 541 if (ReadRect(x,y,width,height))
f80ea77b 542 if (GotOrs==false)
11ad1132 543 ReadOrs(token);
88d42654 544
19d0f58d 545 m_xmlfile.Write(_T("\t\t<object class=\"wxComboBox\""));
2193517f 546 WriteBasicInfo(x,y,width,height,varname);
f80ea77b 547 if (token.Find(_T("CBS_SIMPLE")) != wxNOT_FOUND)
19d0f58d 548 WriteStyle(_T("wxCB_SIMPLE"));
f80ea77b 549 if (token.Find(_T("CBS_SORT")) != wxNOT_FOUND)
19d0f58d 550 WriteStyle(_T("wxCB_SORT"));
f80ea77b 551 if (token.Find(_T("CBS_DISABLENOSCROLL")) != wxNOT_FOUND)
19d0f58d
JS
552 WriteStyle(_T("wxLB_ALWAYS_SB"));
553 m_xmlfile.Write(_T("\n\t\t</object>\n"));
88d42654
VS
554
555}
556
2193517f 557void rc2xml::ParseMenu(wxString varname)
88d42654 558{
19d0f58d 559 wxString token=wxEmptyString;
2193517f
VS
560
561 //Write menubar to xml file
19d0f58d 562 m_xmlfile.Write(_T("\t<object class=\"wxMenuBar\""));
2193517f 563 //Avoid duplicate names this way
19d0f58d 564 varname.Replace(_T("IDR_"),_T("MB_"));
2193517f 565 WriteName(varname);
19d0f58d 566 m_xmlfile.Write(_T(">\n"));
2193517f 567
19d0f58d 568 while ((token!=_T("BEGIN"))&(token!=_T("{")))
2193517f
VS
569 token=GetToken();
570
19d0f58d 571 while ((token!=_T("END"))&(token!=_T("}")))
2193517f
VS
572 {
573 token=GetToken();
5c8756b0
JS
574 token.MakeUpper();
575
19d0f58d 576 if (token==_T("POPUP"))
2193517f
VS
577 {
578 ParsePopupMenu();
579 }
580 }
19d0f58d 581 m_xmlfile.Write(_T("\t</object>\n"));
88d42654
VS
582}
583
2193517f 584void rc2xml::ParsePopupMenu()
88d42654 585{
2193517f
VS
586 static int menucount=0;
587 menucount++;
588 wxString token,name,msg,longhelp,tip;
589 token=GetQuoteField();
590
591//Remove \t because it causes problems
88d42654 592
2193517f
VS
593//spot=token.First("\\t");
594//token=token.Left(spot);
88d42654
VS
595
596//Write Menu item
597//Generate a fake name since RC menus don't have one
19d0f58d
JS
598 name << _T("Menu_") << menucount;
599 m_xmlfile.Write(_T("\t\t<object class=\"wxMenu\""));
2193517f 600 WriteName(name);
19d0f58d 601 m_xmlfile.Write(_T(">\n"));
2193517f 602 WriteLabel(token);
2193517f 603
19d0f58d 604 while ((token!=_T("BEGIN"))&(token!=_T("{")))
2193517f
VS
605 token=GetToken();
606
19d0f58d 607 while ((token!=_T("END"))&(token!=_T("}")))
2193517f
VS
608 {
609 token=GetToken();
5c8756b0
JS
610 token.MakeUpper();
611
19d0f58d 612 if (token==_T("POPUP"))
2193517f 613 ParsePopupMenu();
7c9955d1 614
19d0f58d 615 if (token==_T("MENUITEM"))
2193517f
VS
616 ParseMenuItem();
617 }
19d0f58d 618 m_xmlfile.Write(_T("\t\t\t</object>\n"));
88d42654
VS
619}
620
2193517f 621wxString rc2xml::PeekToken()
88d42654 622{
2193517f
VS
623 wxString token;
624 int p;
625 p=m_rc.Tell();
626 token=GetToken();
88d42654 627
2193517f
VS
628 m_rc.Seek(p);
629 return token;
88d42654
VS
630}
631//MS Windows pain in the butt CONTROL
2193517f 632void rc2xml::ParseControlMS()
88d42654 633{
2193517f
VS
634 wxString label,varname,kindctrl,token;
635 token=PeekToken();
88d42654 636
19d0f58d 637 if (token.Contains(_T("\"")))
2193517f
VS
638 ParseNormalMSControl();
639 else
640 ParseWeirdMSControl();
88d42654
VS
641
642}
643
7c9955d1 644/* CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH |
88d42654
VS
645 TBS_NOTICKS | WS_TABSTOP,52,73,100,15
646*/
647
19d0f58d 648void rc2xml::ParseSlider(wxString WXUNUSED(label), wxString varname)
88d42654 649{
2193517f
VS
650 wxString token,style;
651 ReadOrs(token);
f80ea77b 652 if (token.Find(_T("TBS_VERT"))!=wxNOT_FOUND)
19d0f58d 653 style+=_T("wxSL_VERTICAL");
2193517f
VS
654 //MFC RC Default is horizontal
655 else
19d0f58d 656 style+=_T("wxSL_HORIZONTAL");
2193517f
VS
657
658 int x,y,width,height;
659 ReadRect(x,y,width,height);
19d0f58d 660 m_xmlfile.Write(_T("\t\t<object class=\"wxSlider\""));
2193517f
VS
661 WriteBasicInfo(x,y,width,height,varname);
662 WriteStyle(style);
19d0f58d 663 m_xmlfile.Write(_T("\n\t\t</object>\n"));
88d42654
VS
664
665}
7c9955d1 666/*
88d42654
VS
667CONTROL "Progress1",CG_IDC_PROGDLG_PROGRESS,"msctls_progress32",
668 WS_BORDER,15,52,154,13
669*/
19d0f58d 670void rc2xml::ParseProgressBar(wxString WXUNUSED(label), wxString varname)
88d42654 671{
2193517f
VS
672 wxString token,style;
673 ReadOrs(token);
7c9955d1 674
2193517f
VS
675 int x,y,width,height;
676 ReadRect(x,y,width,height);
677
88d42654 678//Always horizontal in MFC
19d0f58d 679 m_xmlfile.Write(_T("\t\t<object class=\"wxGauge\""));
2193517f
VS
680 WriteBasicInfo(x,y,width,height,varname);
681 WriteStyle(style);
19d0f58d 682 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
683}
684
2193517f 685bool rc2xml::ReadOrs(wxString & orstring)
88d42654 686{
2193517f
VS
687 wxString token;
688
689 token=PeekToken();
690 if (token.IsNumber())
f80ea77b 691 return false;
2193517f
VS
692 orstring=GetToken();
693
694 while(PeekToken()==_T("|"))
695 {
7c9955d1 696 //Grab |
2193517f
VS
697 orstring+=GetToken();
698 //Grab next token
699 orstring+=GetToken();
700 }
f80ea77b 701 return true;
88d42654
VS
702}
703
5c8756b0 704//Is it a checkbutton or a radiobutton or a pushbutton or a groupbox
2193517f 705void rc2xml::ParseCtrlButton(wxString label, wxString varname)
88d42654 706{
2193517f 707 wxString token;
5c8756b0
JS
708 int p;
709 p=m_rc.Tell();
2193517f 710 ReadOrs(token);
5c8756b0 711 m_rc.Seek(p);
2193517f 712
f80ea77b 713 if (token.Find(_T("BS_AUTOCHECKBOX"))!=wxNOT_FOUND)
5c8756b0 714 ParseCheckBox(label, varname);
f80ea77b
WS
715 else if ((token.Find(_T("BS_AUTORADIOBUTTON"))!=wxNOT_FOUND)||
716 (token.Find(_T("BS_RADIOBUTTON"))!=wxNOT_FOUND))
5c8756b0 717 ParseRadioButton(label, varname);
f80ea77b 718 else if (token.Find(_T("BS_GROUPBOX"))!=wxNOT_FOUND)
7c9955d1 719 ParseGroupBox(label, varname);
f80ea77b
WS
720 else // if ((token.Find("BS_PUSHBUTTON")!=wxNOT_FOUND)||
721// (token.Find("BS_DEFPUSHBUTTON")!=wxNOT_FOUND))
5c8756b0 722 ParsePushButton(label, varname); // make default case
88d42654
VS
723}
724
2193517f 725void rc2xml::WriteSize(int width, int height)
88d42654 726{
2193517f 727 wxString msg;
19d0f58d 728 msg << _T(" <size>") << width << _T(",") << height << _T("d</size>");
2193517f 729 m_xmlfile.Write(msg);
88d42654
VS
730}
731
2193517f 732void rc2xml::WritePosition(int x, int y)
88d42654 733{
2193517f 734 wxString msg;
19d0f58d 735 msg << _T(" <pos>") << x << _T(",") << y << _T("d</pos>");
2193517f 736 m_xmlfile.Write(msg);
88d42654
VS
737}
738
2193517f 739void rc2xml::WriteTitle(wxString title)
88d42654 740{
2193517f 741 wxString msg;
19d0f58d 742 msg=_T("\t\t<title>")+title+_T("</title>\n");
2193517f 743 m_xmlfile.Write(msg);
88d42654
VS
744}
745
2193517f 746void rc2xml::WriteName(wxString name)
88d42654 747{
7c9955d1 748
2193517f
VS
749//Try to convert any number ids into names
750name=LookUpId(name);
be5a51fb 751//Replace common MS ids with wxWidgets ids
88d42654 752//I didn't do everyone of them
19d0f58d
JS
753 if (name==_T("IDOK"))
754 name=_T("wxID_OK");
755 else if (name==_T("IDCANCEL"))
756 name=_T("wxID_CANCEL");
757 else if (name==_T("IDAPPLY"))
758 name=_T("wxID_APPLY");
759 else if (name==_T("ID_FILE_OPEN"))
760 name=_T("wxID_OPEN");
761 else if (name==_T("ID_FILE_CLOSE"))
762 name=_T("wxID_CLOSE");
763 else if (name==_T("ID_FILE_SAVE"))
764 name=_T("wxID_SAVE");
765 else if (name==_T("ID_FILE_SAVE_AS"))
766 name=_T("wxID_SAVEAS");
767 else if (name==_T("ID_APP_EXIT"))
768 name=_T("wxID_EXIT");
769 else if (name==_T("ID_FILE_PRINT"))
770 name=_T("wxID_PRINT");
771 else if (name==_T("ID_FILE_PRINT_PREVIEW"))
772 name=_T("wxID_PREVIEW");
773 else if (name==_T("ID_FILE_PRINT_SETUP"))
774 name=_T("wxID_PRINT_SETUP");
775 else if (name==_T("ID_APP_ABOUT"))
776 name=_T("wxID_ABOUT");
777 else if (name==_T("ID_EDIT_UNDO"))
778 name=_T("wxID_UNDO");
779 else if (name==_T("ID_EDIT_CUT"))
780 name=_T("wxID_CUT");
781 else if (name==_T("ID_EDIT_COPY"))
782 name=_T("wxID_COPY");
783 else if (name==_T("ID_EDIT_PASTE"))
784 name=_T("wxID_PASTE");
785 else if (name==_T("IDYES"))
786 name=_T("wxID_YES");
787 else if (name==_T("IDNO"))
788 name=_T("wxID_NO");
789 else if (name==_T("IDHELP"))
790 name=_T("wxID_HELP");
791
792 m_xmlfile.Write(_T(" name= \"")+name+_T("\""));
88d42654
VS
793}
794
2193517f 795void rc2xml::WriteLabel(wxString label)
88d42654 796{
19d0f58d 797 label.Replace(_T("&"),_T("$"));
c988c5b2 798 // changes by MS, handle '<' '>' characters within a label.
b0e43baf
WS
799 label.Replace(_T("<"),_T("&lt;"));
800 label.Replace(_T(">"),_T("&gt;"));
19d0f58d 801 m_xmlfile.Write(_T("\t\t\t<label>")+label+_T("</label>\n"));
88d42654
VS
802}
803
2193517f 804void rc2xml::WriteBasicInfo(int x, int y, int width, int height, wxString name)
88d42654 805{
2193517f 806 WriteName(name);
19d0f58d
JS
807 m_xmlfile.Write(_T(">\n"));
808 m_xmlfile.Write(_T("\t\t\t"));
2193517f
VS
809 WritePosition(x,y);
810 WriteSize(width,height);
19d0f58d 811 m_xmlfile.Write(_T("\n"));
88d42654
VS
812}
813
2193517f 814void rc2xml::WriteStyle(wxString style)
88d42654 815{
2193517f
VS
816 if (style.Length()==0)
817 return;
19d0f58d 818 m_xmlfile.Write(_T("\t\t\t<style>")+style+_T("</style>\n"));
88d42654
VS
819}
820/*
7c9955d1 821 LISTBOX IDC_LIST1,16,89,48,40,LBS_SORT | LBS_MULTIPLESEL |
88d42654
VS
822 LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
823*/
5c8756b0 824void rc2xml::ParseListBox(wxString varname)
88d42654 825{
2193517f 826 wxString token;
5c8756b0
JS
827 token=PeekToken();
828 while (!token.IsNumber())
829 {
830 token=GetToken();
831 token=PeekToken();
832 }
2193517f
VS
833 int x,y,width,height;
834 ReadRect(x,y,width,height);
88d42654 835
19d0f58d 836 m_xmlfile.Write(_T("\t\t<object class=\"wxListBox\""));
2193517f 837 WriteBasicInfo(x,y,width,height,varname);
19d0f58d 838 m_xmlfile.Write(_T("\n\t\t</object>\n"));
88d42654
VS
839
840}
841/*
7c9955d1 842 CONTROL "",IDC_RICHEDIT1,"RICHEDIT",ES_AUTOHSCROLL | WS_BORDER |
88d42654
VS
843 WS_TABSTOP,103,110,40,14
844*/
2193517f 845void rc2xml::ParseRichEdit(wxString label, wxString varname)
88d42654 846{
2193517f
VS
847 wxString token;
848 //while (ReadOrs(token));
849 ReadOrs(token);
850 int x,y,width,height;
851 ReadRect(x,y,width,height);
852 wxString style;
88d42654 853//Make it a rich text control
19d0f58d
JS
854 style+=_T("wxTE_MULTILINE ");
855 m_xmlfile.Write(_T("\t\t<object class=\"wxTextCtrl\""));
2193517f
VS
856 WriteBasicInfo(x,y,width,height,varname);
857 WriteStyle(style);
19d0f58d 858 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
859
860}
861/*
862CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,209,72,
863 19,26
864*/
19d0f58d 865void rc2xml::ParseSpinCtrl(wxString WXUNUSED(label), wxString varname)
88d42654 866{
2193517f 867 wxString token,style;
7c9955d1 868
2193517f 869 ReadOrs(token);
f80ea77b 870 if (token.Find(_T("UDS_HORZ"))!=wxNOT_FOUND)
19d0f58d 871 style=_T("wxSP_HORIZONTAL");
2193517f
VS
872 //MFC default
873 else
19d0f58d 874 style=_T("wxSP_VERTICAL");
2193517f
VS
875
876 int x,y,width,height;
877 ReadRect(x,y,width,height);
19d0f58d 878 m_xmlfile.Write(_T("\t\t<object class=\"wxSpinButton\""));
2193517f
VS
879 WriteBasicInfo(x,y,width,height,varname);
880 WriteStyle(style);
19d0f58d 881 m_xmlfile.Write(_T("\n\t\t</object>\n"));
88d42654
VS
882
883}
884
2193517f 885void rc2xml::FirstPass()
88d42654 886{
2193517f
VS
887 wxString token,prevtok;
888 while (!m_done)
889 {
890 token=GetToken();
19d0f58d 891 if (token==_T("BITMAP"))
2193517f 892 ParseBitmap(prevtok);
19d0f58d 893 else if (token==_T("STRINGTABLE"))
2193517f 894 ParseStringTable(prevtok);
19d0f58d 895 else if (token==_T("ICON"))
2193517f 896 ParseIcon(prevtok);
7c9955d1 897
2193517f
VS
898 prevtok=token;
899 }
88d42654
VS
900}
901
2193517f 902void rc2xml::ParseBitmap(wxString varname)
88d42654 903{
2193517f 904 wxString token,*bitmapfile;
7c9955d1 905
2193517f
VS
906 token=PeekToken();
907 //Microsoft notation?
19d0f58d 908 if (token==_T("DISCARDABLE"))
2193517f
VS
909 {
910 token=GetToken();
911 token=PeekToken();
912 }
913 bitmapfile=new wxString;
914 *bitmapfile=GetQuoteField();
915 m_bitmaplist->Append(varname,bitmapfile);
88d42654
VS
916
917}
918
919
2193517f 920void rc2xml::SecondPass()
88d42654 921{
2193517f
VS
922 wxString token,prevtok;
923 while (!m_done)
924 {
925 token=GetToken();
19d0f58d 926 if ((token==_T("DIALOG"))||(token==_T("DIALOGEX")))
2193517f 927 ParseDialog(prevtok);
19d0f58d 928 else if (token==_T("MENU"))
2193517f 929 ParseMenu(prevtok);
19d0f58d 930 else if (token==_T("TOOLBAR"))
2193517f 931 ParseToolBar(prevtok);
7c9955d1 932
2193517f
VS
933 prevtok=token;
934 }
88d42654
VS
935
936}
937
2193517f 938void rc2xml::ParseToolBar(wxString varname)
88d42654 939{
7c9955d1 940 wxString token;
2193517f 941 token=GetToken();
19d0f58d 942 wxASSERT_MSG(token==_T("DISCARDABLE"),_T("Error in toolbar parsing"));
88d42654 943//Look up bitmap for toolbar and load
2193517f
VS
944 wxNode *node=m_bitmaplist->Find(LookUpId(varname));
945 wxString *bitmappath;
19d0f58d 946 bitmappath=(wxString *)node->GetData();
2193517f
VS
947 wxBitmap bitmap;
948 if (!bitmap.LoadFile(*bitmappath,wxBITMAP_TYPE_BMP ))
19d0f58d 949 wxLogError(_T("Unable to load bitmap:")+*bitmappath);
88d42654
VS
950
951//Write toolbar to xml file
f80ea77b 952 m_xmlfile.Write(_T("\t<object class=\"wxToolBar\""));
88d42654 953//Avoid duplicate names this way
19d0f58d 954 varname.Replace(_T("IDR_"),_T("TB_"));
2193517f 955 WriteName(varname);
19d0f58d 956 m_xmlfile.Write(_T(">\n"));
2193517f 957 wxString style;
19d0f58d 958 style+=_T("wxTB_FLAT");
2193517f 959 WriteStyle(style);
88d42654 960
88d42654
VS
961
962//Grab width and height
2193517f 963 int width,height;
19d0f58d
JS
964 width=wxAtoi(GetToken());
965 height=wxAtoi(GetToken());
2193517f 966
7c9955d1 967 int c=0;
2193517f
VS
968 wxString buttonname,msg,tip,longhelp;
969 token=GetToken();
19d0f58d 970 while ((token!=_T("BEGIN"))&(token!=_T("{")))
2193517f
VS
971 token=GetToken();
972
19d0f58d 973 while ((token!=_T("END"))&(token!=_T("}")))
2193517f 974 {
19d0f58d 975 if (token==_T("BUTTON"))
2193517f
VS
976 {
977 buttonname=GetToken();
19d0f58d 978 m_xmlfile.Write(_T("\t\t\t<object class=\"tool\""));
2193517f 979 WriteName(buttonname);
19d0f58d 980 m_xmlfile.Write(_T(">\n"));
2193517f
VS
981 //Write tool tip if any
982 if (LookUpString(buttonname,msg))
983 {
984 SplitHelp(msg,tip,longhelp);
19d0f58d 985 m_xmlfile.Write(_T("\t\t\t\t<tooltip>")+tip+_T("</tooltip>\n"));
f80ea77b 986 m_xmlfile.Write(_T("\t\t<longhelp>")+longhelp+_T("</longhelp>\n"));
2193517f
VS
987 }
988 //Make a bitmap file name
989 buttonname=CleanName(buttonname);
19d0f58d
JS
990 buttonname+=_T(".bmp");
991 m_xmlfile.Write(_T("\t\t\t\t<bitmap>")+buttonname+_T("</bitmap>\n"));
2193517f 992 WriteToolButton(buttonname,c,width,height,bitmap);
19d0f58d 993 m_xmlfile.Write(_T("\t\t\t</object>\n"));
2193517f
VS
994 c++;
995 }
19d0f58d 996 else if (token==_T("SEPARATOR"))
2193517f 997 {
19d0f58d 998 m_xmlfile.Write(_T("\t\t\t<object class=\"separator\"/>\n"));
2193517f
VS
999 }
1000 token=GetToken();
1001 }
19d0f58d 1002 m_xmlfile.Write(_T("\t</object>\n"));
88d42654
VS
1003}
1004
1005//Extract bitmaps from larger toolbar bitmap
2193517f 1006void rc2xml::WriteToolButton(wxString name,int index, int width, int height, wxBitmap bitmap)
88d42654 1007{
2193517f
VS
1008 int x;
1009 x=index*width;
1010 wxRect r(x,0,width,height);
1011 wxBitmap little;
1012 little=bitmap.GetSubBitmap(r);
2c99715a 1013 little.SaveFile(m_targetpath+name,wxBITMAP_TYPE_BMP);
88d42654
VS
1014}
1015
2193517f 1016void rc2xml::ParseStringTable(wxString varname)
88d42654 1017{
2193517f
VS
1018 wxString token;
1019 token=GetToken();
19d0f58d 1020 while ((token!=_T("BEGIN"))&(token!=_T("{")))
2193517f
VS
1021 token=GetToken();
1022 token=GetToken();
1023 wxString *msg;
1024
19d0f58d 1025 while ((token!=_T("END"))&(token!=_T("}")))
2193517f
VS
1026 {
1027 msg=new wxString;
5c8756b0 1028 *msg=GetStringQuote();
2193517f
VS
1029 m_stringtable->Append(token,msg);
1030 token=GetToken();
1031 }
88d42654
VS
1032
1033}
1034
2193517f 1035bool rc2xml::LookUpString(wxString strid,wxString & st)
88d42654 1036{
2193517f
VS
1037 wxNode *node=m_stringtable->Find(strid);
1038 wxString *s;
1039 if (node==NULL)
f80ea77b 1040 return false;
88d42654 1041
19d0f58d 1042 s=(wxString *)node->GetData();
2193517f 1043 st=*s;
88d42654 1044
f80ea77b 1045 return true;
88d42654
VS
1046}
1047
2193517f 1048bool rc2xml::SplitHelp(wxString msg, wxString &shorthelp, wxString &longhelp)
88d42654 1049{
2193517f 1050 int spot;
19d0f58d 1051 spot=msg.Find(_T("\\n"));
f80ea77b 1052 if (spot==wxNOT_FOUND)
2193517f
VS
1053 {
1054 shorthelp=msg;
1055 longhelp=msg;
1056 }
1057
1058 longhelp=msg.Left(spot);
1059 spot=msg.Length()-spot-2;
1060 shorthelp=msg.Right(spot);
f80ea77b 1061 return true;
88d42654
VS
1062}
1063
2193517f 1064void rc2xml::ParseMenuItem()
88d42654 1065{
2193517f
VS
1066 wxString token,name,msg,tip,longhelp;
1067//int spot;
19d0f58d 1068 if (PeekToken()==_T("SEPARATOR"))
2193517f 1069 {
19d0f58d 1070 m_xmlfile.Write(_T("\t\t\t<object class=\"separator\"/>\n"));
2193517f
VS
1071 return;
1072 }
1073
1074 token=GetQuoteField();
1075 name=GetToken();
1076//Remove \t because it causes problems
1077//spot=token.First("\\t");
1078//token=token.Left(spot);
19d0f58d 1079 m_xmlfile.Write(_T("\t\t\t<object class=\"wxMenuItem\""));
2193517f 1080 WriteName(name);
19d0f58d 1081 m_xmlfile.Write(_T(">\n"));
2193517f 1082 WriteLabel(token);
88d42654 1083//Look up help if any listed in stringtable
5c8756b0 1084//can't assume numbers correlate, restrict to string identifiers
7c9955d1 1085 if ((!name.IsNumber())&&(LookUpString(name,msg)))
2193517f
VS
1086 {
1087 SplitHelp(msg,tip,longhelp);
19d0f58d
JS
1088 m_xmlfile.Write(_T("\t\t\t<help>")
1089 +longhelp+_T("</help>\n"));
2193517f 1090 }
88d42654 1091//look for extra attributes like checked and break
2193517f
VS
1092 wxString ptoken;
1093 ptoken=PeekToken();
5c8756b0 1094 ptoken.MakeUpper();
19d0f58d 1095 while ((ptoken!=_T("MENUITEM"))&(ptoken!=_T("POPUP"))&(ptoken!=_T("END")))
2193517f
VS
1096 {
1097 token=GetToken();
5c8756b0 1098 ptoken.MakeUpper();
19d0f58d
JS
1099 if (token==_T("CHECKED"))
1100 m_xmlfile.Write(_T("\t\t\t<checkable>1</checkable>\n"));
b2247ee9
CE
1101 else if (token==_T("MENUBREAK"))
1102 ;
2193517f 1103//m_xmlfile.Write("\t\t\t</break>\n");
b2247ee9
CE
1104 else if (token==_T("GRAYED"))
1105 ;
2193517f 1106 else
19d0f58d 1107 wxLogError(_T("Unknown Menu Item token:")+token);
7c9955d1 1108
2193517f 1109 ptoken=PeekToken();
5c8756b0 1110 ptoken.MakeUpper();
2193517f 1111 }
19d0f58d 1112 m_xmlfile.Write(_T("\t\t\t</object>\n"));
88d42654
VS
1113
1114}
1115
1116//ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
2193517f 1117void rc2xml::ParseIconStatic()
88d42654 1118{
2193517f
VS
1119 wxString token;
1120 wxString varname,iconname;
5c8756b0 1121 token = PeekToken();
19d0f58d 1122 if (token.Contains(_T("\"")))
5c8756b0
JS
1123 iconname = GetQuoteField();
1124 else
2193517f 1125 iconname=GetToken();
88d42654 1126//Look up icon
2193517f 1127 varname=GetToken();
88d42654 1128
2193517f
VS
1129 int x,y,width,height;
1130 ReadRect(x,y,width,height);
88d42654 1131
19d0f58d 1132 m_xmlfile.Write(_T("\t\t<object class=\"wxStaticBitmap\""));
2193517f 1133 WriteBasicInfo(x,y,width,height,varname);
88d42654 1134//Save icon as a bitmap
2193517f 1135 WriteIcon(iconname);
19d0f58d 1136 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
1137
1138}
1139//IDR_MAINFRAME ICON DISCARDABLE "res\\mfcexample.ico"
2193517f 1140void rc2xml::ParseIcon(wxString varname)
88d42654 1141{
2193517f
VS
1142 wxString token,*iconfile;
1143 iconfile=new wxString;
1144 token=PeekToken();
88d42654 1145
2193517f
VS
1146 *iconfile=GetQuoteField();
1147 m_iconlist->Append(varname,iconfile);
7c9955d1 1148
88d42654
VS
1149
1150}
1151
2193517f 1152wxString rc2xml::CleanName(wxString name)
88d42654 1153{
2193517f 1154 name.MakeLower();
19d0f58d
JS
1155 name.Replace(_T("id_"),wxEmptyString);
1156 name.Replace(_T("idr_"),wxEmptyString);
1157 name.Replace(_T("idb_"),wxEmptyString);
1158 name.Replace(_T("idc_"),wxEmptyString);
92a19c2e 1159
19d0f58d 1160 name.Replace(_T(".ico"),wxEmptyString);
92a19c2e 1161
19d0f58d 1162 name.Replace(_T(".bmp"),wxEmptyString);
2193517f 1163 return name;
88d42654
VS
1164}
1165// And the award for most messed up control goes to...
1166// CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
2193517f 1167void rc2xml::ParseStaticBitmap(wxString bitmapname, wxString varname)
88d42654 1168{
2193517f
VS
1169 wxString token;
1170 //Grab SS_BITMAP
5c8756b0 1171 ReadOrs(token);
88d42654 1172
88d42654 1173
2193517f
VS
1174 int x,y,width,height;
1175 ReadRect(x,y,width,height);
1176
19d0f58d 1177 m_xmlfile.Write(_T("\t\t<object class=\"wxStaticBitmap\""));
2193517f
VS
1178 WriteBasicInfo(x,y,width,height,varname);
1179 WriteBitmap(bitmapname);
19d0f58d 1180 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
1181
1182}
1183
2193517f 1184void rc2xml::ParseNormalMSControl()
88d42654
VS
1185{
1186wxString label,varname,kindctrl;
1187
1188label=GetQuoteField();
1189varname=GetToken();
1190kindctrl=GetQuoteField();
1191kindctrl.MakeUpper();
1192
19d0f58d 1193 if (kindctrl==_T("MSCTLS_UPDOWN32"))
2193517f 1194 ParseSpinCtrl(label,varname);
19d0f58d 1195 if (kindctrl==_T("MSCTLS_TRACKBAR32"))
2193517f 1196 ParseSlider(label,varname);
19d0f58d 1197 if (kindctrl==_T("MSCTLS_PROGRESS32"))
2193517f 1198 ParseProgressBar(label,varname);
19d0f58d 1199 if (kindctrl==_T("SYSTREEVIEW32"))
2193517f 1200 ParseTreeCtrl(label,varname);
19d0f58d 1201 if (kindctrl==_T("SYSMONTHCAL32"))
2193517f 1202 ParseCalendar(label,varname);
19d0f58d 1203 if (kindctrl==_T("SYSLISTVIEW32"))
2193517f 1204 ParseListCtrl(label,varname);
19d0f58d 1205 if (kindctrl==_T("BUTTON"))
2193517f 1206 ParseCtrlButton(label,varname);
19d0f58d 1207 if (kindctrl==_T("RICHEDIT"))
2193517f 1208 ParseRichEdit(label,varname);
19d0f58d 1209 if (kindctrl==_T("STATIC"))
5c8756b0
JS
1210 {
1211 wxString token;
1212 int p=m_rc.Tell();
1213 ReadOrs(token);
1214 m_rc.Seek(p);
f80ea77b 1215 if (token.Find(_T("SS_BITMAP"))!=wxNOT_FOUND)
5c8756b0
JS
1216 ParseStaticBitmap(label,varname);
1217 else
1218 ParseStaticText(label,varname);
1219 }
19d0f58d 1220 if (kindctrl==_T("EDIT"))
5c8756b0 1221 ParseTextCtrl(varname);
19d0f58d 1222 if (kindctrl==_T("LISTBOX"))
5c8756b0 1223 ParseListBox(varname);
19d0f58d 1224 if (kindctrl==_T("COMBOBOX"))
5c8756b0 1225 ParseComboBox(varname);
88d42654
VS
1226
1227}
1228
2193517f 1229void rc2xml::ParseWeirdMSControl()
88d42654 1230{
2193517f
VS
1231 wxString kindctrl;
1232 wxString varname;
1233 wxString id;
1234 id=GetToken();
1235 varname=GetToken();
1236 kindctrl=GetQuoteField();
1237 kindctrl.MakeUpper();
88d42654 1238// CONTROL IDB_FACE,IDC_STATIC,"Static",SS_BITMAP,26,62,32,30
19d0f58d 1239 if (kindctrl==_T("STATIC"))
2193517f 1240 {
19d0f58d 1241 if (PeekToken()==_T("SS_BITMAP"))
2193517f
VS
1242 ParseStaticBitmap(id,varname);
1243 else
19d0f58d 1244 wxLogError(_T("Unknown MS Control Static token"));
2193517f 1245 }
88d42654
VS
1246
1247}
1248//SCROLLBAR IDC_SCROLLBAR1,219,56,10,40,SBS_VERT
1249
2193517f 1250void rc2xml::ParseScrollBar()
88d42654 1251{
2193517f
VS
1252 wxString token;
1253 wxString varname;
1254
1255 varname=GetToken();
1256 int x,y,width,height;
1257 ReadRect(x,y,width,height);
1258 wxString style;
1259
1260 ReadOrs(token);
7c9955d1 1261
f80ea77b 1262if (token.Find(_T("SBS_VERT"))!=wxNOT_FOUND)
2193517f 1263 style=_T("wxSB_VERTICAL");
88d42654 1264//Default MFC style is horizontal
2193517f
VS
1265 else
1266 style=_T("wxSB_HORIZONTAL");
88d42654 1267
19d0f58d 1268 m_xmlfile.Write(_T("\t\t<object class=\"wxScrollBar\""));
2193517f
VS
1269 WriteBasicInfo(x,y,width,height,varname);
1270 WriteStyle(style);
19d0f58d 1271 m_xmlfile.Write(_T("\n\t\t</object>\n"));
88d42654
VS
1272
1273}
1274// CONTROL "Tree1",IDC_TREE1,"SysTreeView32",WS_BORDER | WS_TABSTOP,
1275// 7,7,66,61
1276
19d0f58d 1277void rc2xml::ParseTreeCtrl(wxString WXUNUSED(label), wxString varname)
88d42654 1278{
2193517f
VS
1279 wxString token;
1280//while (ReadOrs(token));
1281 ReadOrs(token);
1282 int x,y,width,height;
1283 ReadRect(x,y,width,height);
19d0f58d 1284 m_xmlfile.Write(_T("\t\t<object class=\"wxTreeCtrl\""));
2193517f 1285 WriteBasicInfo(x,y,width,height,varname);
19d0f58d 1286 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
1287
1288}
1289// CONTROL "MonthCalendar1",IDC_MONTHCALENDAR1,"SysMonthCal32",
1290 //MCS_NOTODAY | WS_TABSTOP,105,71,129,89
1291
19d0f58d 1292void rc2xml::ParseCalendar(wxString WXUNUSED(label), wxString varname)
88d42654 1293{
2193517f
VS
1294 wxString token;
1295//while (ReadOrs(token));
1296 ReadOrs(token);
1297 int x,y,width,height;
1298 ReadRect(x,y,width,height);
19d0f58d 1299 m_xmlfile.Write(_T("\t\t<object class=\"wxCalendarCtrl\""));
2193517f 1300 WriteBasicInfo(x,y,width,height,varname);
19d0f58d 1301 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
1302}
1303// CONTROL "List1",IDC_LIST1,"SysListView32",WS_BORDER | WS_TABSTOP,
1304 // 7,89,68,71
1305
19d0f58d 1306void rc2xml::ParseListCtrl(wxString WXUNUSED(label), wxString varname)
88d42654 1307{
2193517f
VS
1308 wxString token;
1309 //while (ReadOrs(token));
1310 ReadOrs(token);
1311 int x,y,width,height;
1312 ReadRect(x,y,width,height);
19d0f58d 1313 m_xmlfile.Write(_T("\t\t<object class=\"wxListCtrl\""));
2193517f 1314 WriteBasicInfo(x,y,width,height,varname);
19d0f58d 1315 m_xmlfile.Write(_T("\t\t</object>\n"));
88d42654
VS
1316
1317}
2193517f
VS
1318
1319void rc2xml::WriteBitmap(wxString bitmapname)
1320{
1321//Look up bitmap
1322 wxNode *node=m_bitmaplist->Find(LookUpId(bitmapname));
1323 if (node==NULL)
1324 {
19d0f58d
JS
1325 m_xmlfile.Write(_T("\t\t\t<bitmap>missingfile</bitmap>\n"));
1326 wxLogError(_T("Unable to find bitmap:")+bitmapname);
2193517f
VS
1327 return;
1328 }
7c9955d1 1329
2193517f 1330 wxString *bitmappath;
19d0f58d 1331 bitmappath=(wxString *)node->GetData();
92a19c2e 1332
2c99715a 1333 bitmapname=wxFileNameFromPath(*bitmappath);
2193517f
VS
1334 wxBitmap bitmap;
1335 if (!bitmap.LoadFile(*bitmappath,wxBITMAP_TYPE_BMP ))
19d0f58d 1336 wxLogError(_T("Unable to load bitmap:")+*bitmappath);
2193517f
VS
1337
1338 //Make a bitmap file name
1339 bitmapname=CleanName(bitmapname);
19d0f58d
JS
1340 bitmapname+=_T(".bmp");
1341 m_xmlfile.Write(_T("\t\t\t<bitmap>")+bitmapname+_T("</bitmap>\n"));
2c99715a 1342 bitmap.SaveFile(m_targetpath+bitmapname,wxBITMAP_TYPE_BMP);
2193517f
VS
1343}
1344
1345void rc2xml::WriteIcon(wxString iconname)
1346{
1347wxNode *node=m_iconlist->Find(iconname);
1348 if (node==NULL)
1349 {
19d0f58d
JS
1350 m_xmlfile.Write(_T("\t\t\t<bitmap>missing_file</bitmap>\n"));
1351 wxLogError(_T("Unable to find icon:")+iconname);
2193517f
VS
1352 }
1353 wxString *iconpath;
19d0f58d 1354 iconpath=(wxString *)node->GetData();
2193517f
VS
1355 wxIcon icon;
1356 wxBitmap bitmap;
1357 if (!icon.LoadFile(*iconpath,wxBITMAP_TYPE_ICO ))
19d0f58d 1358 wxLogError(_T("Unable to load icon:")+*iconpath);
2193517f
VS
1359#ifdef __WXMSW__
1360 bitmap.CopyFromIcon(icon);
1361#else
1362 bitmap = icon;
1363#endif
2c99715a 1364 iconname=wxFileNameFromPath(*iconpath);
2193517f
VS
1365 //Make a bitmap file name
1366 iconname=CleanName(iconname);
19d0f58d
JS
1367 iconname+=_T(".bmp");
1368 m_xmlfile.Write(_T("\t\t\t<bitmap>")+iconname+_T("</bitmap>\n"));
2c99715a 1369 bitmap.SaveFile(m_targetpath+iconname,wxBITMAP_TYPE_BMP);
2193517f 1370
7c9955d1 1371
2193517f
VS
1372}
1373/*Unfortunately sometimes the great MSVC Resource editor decides
1374to use numbers instead of the word id. I have no idea why they
1375do this, but that is the way it is.
1376*/
1377/* this is a quick and dirty way to parse the resource.h file
1378it will not recognize #ifdef so it can be easily fooled
1379*/
1380void rc2xml::ParseResourceHeader()
1381{
1382wxTextFile r;
1383//Attempt to load resource.h in current path
19d0f58d 1384 if (!r.Open(_T("resource.h")))
2193517f 1385 {
19d0f58d 1386 wxLogError(_T("Warining Unable to load resource.h file"));
2193517f
VS
1387 return;
1388 }
7c9955d1 1389
2193517f
VS
1390 wxString str;
1391 wxString id,v;
1392 wxStringTokenizer tok;
1393 wxString *varname;
7c9955d1
JS
1394
1395
2193517f
VS
1396 long n;
1397
1398//Read through entire file
1399 for ( str = r.GetFirstLine(); !r.Eof(); str = r.GetNextLine() )
1400 {
f80ea77b 1401 if (str.Find(_T("#define"))!=wxNOT_FOUND)
2193517f
VS
1402 {
1403 tok.SetString(str);
1404 //Just ignore #define token
1405 tok.GetNextToken();
1406 v=tok.GetNextToken();
1407 id=tok.GetNextToken();
1408 if (id.IsNumber())
1409 {
1410 varname=new wxString;
1411 id.ToLong(&n);
1412 *varname=v;
1413 m_resourcelist->Append(n,varname);
1414 }
1415 }
1416 }
1417
7c9955d1
JS
1418
1419
2193517f
VS
1420}
1421
1422
1423wxString rc2xml::LookUpId(wxString id)
1424{
1425wxString st;
1426
1427if (!id.IsNumber())
1428 return id;
1429long n;
1430id.ToLong(&n);
1431wxNode *node=m_resourcelist->Find(n);
1432 wxString *s;
1433 if (node==NULL)
1434 return id;
1435
19d0f58d 1436 s=(wxString *)node->GetData();
2193517f
VS
1437 st=*s;
1438return st;
1439}