]> git.saurik.com Git - wxWidgets.git/blob - src/common/resource.cpp
Compile fix for GTK 1.0
[wxWidgets.git] / src / common / resource.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: resource.cpp
3 // Purpose: Resource system
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "resource.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #if wxUSE_WX_RESOURCES
24
25 #ifdef __VISUALC__
26 #pragma warning(disable:4706) // assignment within conditional expression
27 #endif // VC++
28
29 #ifndef WX_PRECOMP
30 #include "wx/defs.h"
31 #include "wx/setup.h"
32 #include "wx/list.h"
33 #include "wx/hash.h"
34 #include "wx/gdicmn.h"
35 #include "wx/utils.h"
36 #include "wx/types.h"
37 #include "wx/menu.h"
38 #include "wx/stattext.h"
39 #include "wx/button.h"
40 #include "wx/bmpbuttn.h"
41 #include "wx/radiobox.h"
42 #include "wx/radiobut.h"
43 #include "wx/listbox.h"
44 #include "wx/choice.h"
45 #include "wx/checkbox.h"
46 #include "wx/settings.h"
47 #include "wx/slider.h"
48 #include "wx/statbox.h"
49 #include "wx/statbmp.h"
50 #if wxUSE_GAUGE
51 #include "wx/gauge.h"
52 #endif
53 #include "wx/textctrl.h"
54 #include "wx/msgdlg.h"
55 #include "wx/intl.h"
56 #endif
57
58 #if wxUSE_RADIOBUTTON
59 #include "wx/radiobut.h"
60 #endif
61
62 #if wxUSE_SCROLLBAR
63 #include "wx/scrolbar.h"
64 #endif
65
66 #if wxUSE_COMBOBOX
67 #include "wx/combobox.h"
68 #endif
69
70 #include "wx/validate.h"
71
72 #include "wx/log.h"
73
74 #include <ctype.h>
75 #include <math.h>
76 #include <stdlib.h>
77 #include <string.h>
78
79 #include "wx/resource.h"
80 #include "wx/string.h"
81 #include "wx/wxexpr.h"
82
83 #include "wx/settings.h"
84
85 // Forward (private) declarations
86 bool wxResourceInterpretResources(wxResourceTable& table, wxExprDatabase& db);
87 wxItemResource *wxResourceInterpretDialog(wxResourceTable& table, wxExpr *expr, bool isPanel = FALSE);
88 wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr);
89 wxItemResource *wxResourceInterpretMenu(wxResourceTable& table, wxExpr *expr);
90 wxItemResource *wxResourceInterpretMenuBar(wxResourceTable& table, wxExpr *expr);
91 wxItemResource *wxResourceInterpretString(wxResourceTable& table, wxExpr *expr);
92 wxItemResource *wxResourceInterpretBitmap(wxResourceTable& table, wxExpr *expr);
93 wxItemResource *wxResourceInterpretIcon(wxResourceTable& table, wxExpr *expr);
94 // Interpret list expression
95 wxFont wxResourceInterpretFontSpec(wxExpr *expr);
96
97 bool wxResourceReadOneResource(FILE *fd, wxExprDatabase& db, bool *eof, wxResourceTable *table = (wxResourceTable *) NULL);
98 bool wxResourceParseIncludeFile(const wxString& f, wxResourceTable *table = (wxResourceTable *) NULL);
99
100 wxResourceTable *wxDefaultResourceTable = (wxResourceTable *) NULL;
101
102 char *wxResourceBuffer = (char *) NULL;
103 long wxResourceBufferSize = 0;
104 long wxResourceBufferCount = 0;
105 int wxResourceStringPtr = 0;
106
107 void wxInitializeResourceSystem()
108 {
109 wxDefaultResourceTable = new wxResourceTable;
110 }
111
112 void wxCleanUpResourceSystem()
113 {
114 delete wxDefaultResourceTable;
115 if (wxResourceBuffer)
116 delete[] wxResourceBuffer;
117 }
118
119 void wxLogWarning(char *msg)
120 {
121 wxMessageBox(msg, _("Warning"), wxOK);
122 }
123
124 #if !USE_SHARED_LIBRARY
125 IMPLEMENT_DYNAMIC_CLASS(wxItemResource, wxObject)
126 IMPLEMENT_DYNAMIC_CLASS(wxResourceTable, wxHashTable)
127 #endif
128
129 wxItemResource::wxItemResource()
130 {
131 m_itemType = "";
132 m_title = "";
133 m_name = "";
134 m_windowStyle = 0;
135 m_x = m_y = m_width = m_height = 0;
136 m_value1 = m_value2 = m_value3 = m_value5 = 0;
137 m_value4 = "";
138 m_windowId = 0;
139 m_exStyle = 0;
140 }
141
142 wxItemResource::~wxItemResource()
143 {
144 wxNode *node = m_children.First();
145 while (node)
146 {
147 wxItemResource *item = (wxItemResource *)node->Data();
148 delete item;
149 delete node;
150 node = m_children.First();
151 }
152 }
153
154 /*
155 * Resource table
156 */
157
158 wxResourceTable::wxResourceTable():wxHashTable(wxKEY_STRING), identifiers(wxKEY_STRING)
159 {
160 }
161
162 wxResourceTable::~wxResourceTable()
163 {
164 ClearTable();
165 }
166
167 wxItemResource *wxResourceTable::FindResource(const wxString& name) const
168 {
169 wxItemResource *item = (wxItemResource *)Get(WXSTRINGCAST name);
170 return item;
171 }
172
173 void wxResourceTable::AddResource(wxItemResource *item)
174 {
175 wxString name = item->GetName();
176 if (name == _T(""))
177 name = item->GetTitle();
178 if (name == _T(""))
179 name = _T("no name");
180
181 // Delete existing resource, if any.
182 Delete(name);
183
184 Put(name, item);
185 }
186
187 bool wxResourceTable::DeleteResource(const wxString& name)
188 {
189 wxItemResource *item = (wxItemResource *)Delete(WXSTRINGCAST name);
190 if (item)
191 {
192 // See if any resource has this as its child; if so, delete from
193 // parent's child list.
194 BeginFind();
195 wxNode *node = (wxNode *) NULL;
196 while ((node = Next()))
197 {
198 wxItemResource *parent = (wxItemResource *)node->Data();
199 if (parent->GetChildren().Member(item))
200 {
201 parent->GetChildren().DeleteObject(item);
202 break;
203 }
204 }
205
206 delete item;
207 return TRUE;
208 }
209 else
210 return FALSE;
211 }
212
213 bool wxResourceTable::ParseResourceFile(const wxString& filename)
214 {
215 wxExprDatabase db;
216
217 FILE *fd = fopen(filename.fn_str(), "r");
218 if (!fd)
219 return FALSE;
220 bool eof = FALSE;
221 while (wxResourceReadOneResource(fd, db, &eof, this) && !eof)
222 {
223 // Loop
224 }
225 fclose(fd);
226 return wxResourceInterpretResources(*this, db);
227 }
228
229 bool wxResourceTable::ParseResourceData(const wxString& data)
230 {
231 wxExprDatabase db;
232 if (!db.ReadFromString(data))
233 {
234 wxLogWarning(_("Ill-formed resource file syntax."));
235 return FALSE;
236 }
237
238 return wxResourceInterpretResources(*this, db);
239 }
240
241 bool wxResourceTable::RegisterResourceBitmapData(const wxString& name, char bits[], int width, int height)
242 {
243 // Register pre-loaded bitmap data
244 wxItemResource *item = new wxItemResource;
245 // item->SetType(wxRESOURCE_TYPE_XBM_DATA);
246 item->SetType(_T("wxXBMData"));
247 item->SetName(name);
248 item->SetValue1((long)bits);
249 item->SetValue2((long)width);
250 item->SetValue3((long)height);
251 AddResource(item);
252 return TRUE;
253 }
254
255 bool wxResourceTable::RegisterResourceBitmapData(const wxString& name, char **data)
256 {
257 // Register pre-loaded bitmap data
258 wxItemResource *item = new wxItemResource;
259 // item->SetType(wxRESOURCE_TYPE_XPM_DATA);
260 item->SetType(_T("wxXPMData"));
261 item->SetName(name);
262 item->SetValue1((long)data);
263 AddResource(item);
264 return TRUE;
265 }
266
267 bool wxResourceTable::SaveResource(const wxString& WXUNUSED(filename))
268 {
269 return FALSE;
270 }
271
272 void wxResourceTable::ClearTable()
273 {
274 BeginFind();
275 wxNode *node = Next();
276 while (node)
277 {
278 wxNode *next = Next();
279 wxItemResource *item = (wxItemResource *)node->Data();
280 delete item;
281 delete node;
282 node = next;
283 }
284 }
285
286 wxControl *wxResourceTable::CreateItem(wxWindow *parent, const wxItemResource* childResource, const wxItemResource* parentResource) const
287 {
288 int id = childResource->GetId();
289 if ( id == 0 )
290 id = -1;
291
292 bool dlgUnits = ((parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0);
293
294 wxControl *control = (wxControl *) NULL;
295 wxString itemType(childResource->GetType());
296
297 wxPoint pos;
298 wxSize size;
299 if (dlgUnits)
300 {
301 pos = parent->ConvertDialogToPixels(wxPoint(childResource->GetX(), childResource->GetY()));
302 size = parent->ConvertDialogToPixels(wxSize(childResource->GetWidth(), childResource->GetHeight()));
303 }
304 else
305 {
306 pos = wxPoint(childResource->GetX(), childResource->GetY());
307 size = wxSize(childResource->GetWidth(), childResource->GetHeight());
308 }
309
310 if (itemType == wxString(_T("wxButton")) || itemType == wxString(_T("wxBitmapButton")))
311 {
312 if (childResource->GetValue4() != _T(""))
313 {
314 // Bitmap button
315 wxBitmap bitmap = childResource->GetBitmap();
316 if (!bitmap.Ok())
317 {
318 bitmap = wxResourceCreateBitmap(childResource->GetValue4(), (wxResourceTable *)this);
319 ((wxItemResource*) childResource)->SetBitmap(bitmap);
320 }
321 if (bitmap.Ok())
322 control = new wxBitmapButton(parent, id, bitmap, pos, size,
323 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
324 }
325 else
326 // Normal, text button
327 control = new wxButton(parent, id, childResource->GetTitle(), pos, size,
328 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
329 }
330 else if (itemType == wxString(_T("wxMessage")) || itemType == wxString(_T("wxStaticText")) ||
331 itemType == wxString(_T("wxStaticBitmap")))
332 {
333 if (childResource->GetValue4() != _T(""))
334 {
335 // Bitmap message
336 wxBitmap bitmap = childResource->GetBitmap();
337 if (!bitmap.Ok())
338 {
339 bitmap = wxResourceCreateBitmap(childResource->GetValue4(), (wxResourceTable *)this);
340 ((wxItemResource*) childResource)->SetBitmap(bitmap);
341 }
342 #if wxUSE_BITMAP_MESSAGE
343 if (bitmap.Ok())
344 control = new wxStaticBitmap(parent, id, bitmap, pos, size,
345 childResource->GetStyle(), childResource->GetName());
346 #endif
347 }
348 else
349 {
350 control = new wxStaticText(parent, id, childResource->GetTitle(), pos, size,
351 childResource->GetStyle(), childResource->GetName());
352 }
353 }
354 else if (itemType == wxString(_T("wxText")) || itemType == wxString(_T("wxTextCtrl")) || itemType == wxString(_T("wxMultiText")))
355 {
356 control = new wxTextCtrl(parent, id, childResource->GetValue4(), pos, size,
357 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
358 }
359 else if (itemType == wxString(_T("wxCheckBox")))
360 {
361 control = new wxCheckBox(parent, id, childResource->GetTitle(), pos, size,
362 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
363
364 ((wxCheckBox *)control)->SetValue((childResource->GetValue1() != 0));
365 }
366 #if wxUSE_GAUGE
367 else if (itemType == wxString(_T("wxGauge")))
368 {
369 control = new wxGauge(parent, id, (int)childResource->GetValue2(), pos, size,
370 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
371
372 ((wxGauge *)control)->SetValue((int)childResource->GetValue1());
373 }
374 #endif
375 #if wxUSE_RADIOBUTTON
376 else if (itemType == wxString(_T("wxRadioButton")))
377 {
378 control = new wxRadioButton(parent, id, childResource->GetTitle(), // (int)childResource->GetValue1(),
379 pos, size,
380 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
381 }
382 #endif
383 #if wxUSE_SCROLLBAR
384 else if (itemType == wxString(_T("wxScrollBar")))
385 {
386 control = new wxScrollBar(parent, id, pos, size,
387 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
388 /*
389 ((wxScrollBar *)control)->SetValue((int)childResource->GetValue1());
390 ((wxScrollBar *)control)->SetPageSize((int)childResource->GetValue2());
391 ((wxScrollBar *)control)->SetObjectLength((int)childResource->GetValue3());
392 ((wxScrollBar *)control)->SetViewLength((int)(long)childResource->GetValue5());
393 */
394 ((wxScrollBar *)control)->SetScrollbar((int)childResource->GetValue1(),(int)childResource->GetValue2(),
395 (int)childResource->GetValue3(),(int)(long)childResource->GetValue5(),FALSE);
396
397 }
398 #endif
399 else if (itemType == wxString(_T("wxSlider")))
400 {
401 control = new wxSlider(parent, id, (int)childResource->GetValue1(),
402 (int)childResource->GetValue2(), (int)childResource->GetValue3(), pos, size,
403 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
404 }
405 else if (itemType == wxString(_T("wxGroupBox")) || itemType == wxString(_T("wxStaticBox")))
406 {
407 control = new wxStaticBox(parent, id, childResource->GetTitle(), pos, size,
408 childResource->GetStyle(), childResource->GetName());
409 }
410 else if (itemType == wxString(_T("wxListBox")))
411 {
412 wxStringList& stringList = childResource->GetStringValues();
413 wxString *strings = (wxString *) NULL;
414 int noStrings = 0;
415 if (stringList.Number() > 0)
416 {
417 noStrings = stringList.Number();
418 strings = new wxString[noStrings];
419 wxNode *node = stringList.First();
420 int i = 0;
421 while (node)
422 {
423 strings[i] = (wxChar *)node->Data();
424 i ++;
425 node = node->Next();
426 }
427 }
428 control = new wxListBox(parent, id, pos, size,
429 noStrings, strings, childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
430
431 if (strings)
432 delete[] strings;
433 }
434 else if (itemType == wxString(_T("wxChoice")))
435 {
436 wxStringList& stringList = childResource->GetStringValues();
437 wxString *strings = (wxString *) NULL;
438 int noStrings = 0;
439 if (stringList.Number() > 0)
440 {
441 noStrings = stringList.Number();
442 strings = new wxString[noStrings];
443 wxNode *node = stringList.First();
444 int i = 0;
445 while (node)
446 {
447 strings[i] = (wxChar *)node->Data();
448 i ++;
449 node = node->Next();
450 }
451 }
452 control = new wxChoice(parent, id, pos, size,
453 noStrings, strings, childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
454
455 if (strings)
456 delete[] strings;
457 }
458 #if wxUSE_COMBOBOX
459 else if (itemType == wxString(_T("wxComboBox")))
460 {
461 wxStringList& stringList = childResource->GetStringValues();
462 wxString *strings = (wxString *) NULL;
463 int noStrings = 0;
464 if (stringList.Number() > 0)
465 {
466 noStrings = stringList.Number();
467 strings = new wxString[noStrings];
468 wxNode *node = stringList.First();
469 int i = 0;
470 while (node)
471 {
472 strings[i] = (wxChar *)node->Data();
473 i ++;
474 node = node->Next();
475 }
476 }
477 control = new wxComboBox(parent, id, childResource->GetValue4(), pos, size,
478 noStrings, strings, childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
479
480 if (strings)
481 delete[] strings;
482 }
483 #endif
484 else if (itemType == wxString(_T("wxRadioBox")))
485 {
486 wxStringList& stringList = childResource->GetStringValues();
487 wxString *strings = (wxString *) NULL;
488 int noStrings = 0;
489 if (stringList.Number() > 0)
490 {
491 noStrings = stringList.Number();
492 strings = new wxString[noStrings];
493 wxNode *node = stringList.First();
494 int i = 0;
495 while (node)
496 {
497 strings[i] = (wxChar *)node->Data();
498 i ++;
499 node = node->Next();
500 }
501 }
502 control = new wxRadioBox(parent, (wxWindowID) id, wxString(childResource->GetTitle()), pos, size,
503 noStrings, strings, (int)childResource->GetValue1(), childResource->GetStyle(), wxDefaultValidator,
504 childResource->GetName());
505
506 if (strings)
507 delete[] strings;
508 }
509
510 if ((parentResource->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0)
511 {
512 // Don't set font; will be inherited from parent.
513 }
514 else
515 {
516 if (control && childResource->GetFont().Ok())
517 control->SetFont(childResource->GetFont());
518 }
519 return control;
520 }
521
522 /*
523 * Interpret database as a series of resources
524 */
525
526 bool wxResourceInterpretResources(wxResourceTable& table, wxExprDatabase& db)
527 {
528 wxNode *node = db.First();
529 while (node)
530 {
531 wxExpr *clause = (wxExpr *)node->Data();
532 wxString functor(clause->Functor());
533
534 wxItemResource *item = (wxItemResource *) NULL;
535 if (functor == _T("dialog"))
536 item = wxResourceInterpretDialog(table, clause);
537 else if (functor == _T("panel"))
538 item = wxResourceInterpretDialog(table, clause, TRUE);
539 else if (functor == _T("menubar"))
540 item = wxResourceInterpretMenuBar(table, clause);
541 else if (functor == _T("menu"))
542 item = wxResourceInterpretMenu(table, clause);
543 else if (functor == _T("string"))
544 item = wxResourceInterpretString(table, clause);
545 else if (functor == _T("bitmap"))
546 item = wxResourceInterpretBitmap(table, clause);
547 else if (functor == _T("icon"))
548 item = wxResourceInterpretIcon(table, clause);
549
550 if (item)
551 {
552 // Remove any existing resource of same name
553 if (item->GetName() != _T(""))
554 table.DeleteResource(item->GetName());
555 table.AddResource(item);
556 }
557 node = node->Next();
558 }
559 return TRUE;
560 }
561
562 static const wxChar *g_ValidControlClasses[] =
563 {
564 _T("wxButton"),
565 _T("wxBitmapButton"),
566 _T("wxMessage"),
567 _T("wxStaticText"),
568 _T("wxStaticBitmap"),
569 _T("wxText"),
570 _T("wxTextCtrl"),
571 _T("wxMultiText"),
572 _T("wxListBox"),
573 _T("wxRadioBox"),
574 _T("wxRadioButton"),
575 _T("wxCheckBox"),
576 _T("wxBitmapCheckBox"),
577 _T("wxGroupBox"),
578 _T("wxStaticBox"),
579 _T("wxSlider"),
580 _T("wxGauge"),
581 _T("wxScrollBar"),
582 _T("wxChoice"),
583 _T("wxComboBox")
584 };
585
586 static bool wxIsValidControlClass(const wxString& c)
587 {
588 for ( size_t i = 0; i < WXSIZEOF(g_ValidControlClasses); i++ )
589 {
590 if ( c == g_ValidControlClasses[i] )
591 return TRUE;
592 }
593 return FALSE;
594 }
595
596 wxItemResource *wxResourceInterpretDialog(wxResourceTable& table, wxExpr *expr, bool isPanel)
597 {
598 wxItemResource *dialogItem = new wxItemResource;
599 if (isPanel)
600 dialogItem->SetType(_T("wxPanel"));
601 else
602 dialogItem->SetType(_T("wxDialog"));
603 wxString style = _T("");
604 wxString title = _T("");
605 wxString name = _T("");
606 wxString backColourHex = _T("");
607 wxString labelColourHex = _T("");
608 wxString buttonColourHex = _T("");
609
610 long windowStyle = wxDEFAULT_DIALOG_STYLE;
611 if (isPanel)
612 windowStyle = 0;
613
614 int x = 0; int y = 0; int width = -1; int height = -1;
615 int isModal = 0;
616 wxExpr *labelFontExpr = (wxExpr *) NULL;
617 wxExpr *buttonFontExpr = (wxExpr *) NULL;
618 wxExpr *fontExpr = (wxExpr *) NULL;
619 expr->GetAttributeValue(_T("style"), style);
620 expr->GetAttributeValue(_T("name"), name);
621 expr->GetAttributeValue(_T("title"), title);
622 expr->GetAttributeValue(_T("x"), x);
623 expr->GetAttributeValue(_T("y"), y);
624 expr->GetAttributeValue(_T("width"), width);
625 expr->GetAttributeValue(_T("height"), height);
626 expr->GetAttributeValue(_T("modal"), isModal);
627 expr->GetAttributeValue(_T("label_font"), &labelFontExpr);
628 expr->GetAttributeValue(_T("button_font"), &buttonFontExpr);
629 expr->GetAttributeValue(_T("font"), &fontExpr);
630 expr->GetAttributeValue(_T("background_colour"), backColourHex);
631 expr->GetAttributeValue(_T("label_colour"), labelColourHex);
632 expr->GetAttributeValue(_T("button_colour"), buttonColourHex);
633
634 int useDialogUnits = 0;
635 expr->GetAttributeValue(_T("use_dialog_units"), useDialogUnits);
636 if (useDialogUnits != 0)
637 dialogItem->SetResourceStyle(dialogItem->GetResourceStyle() | wxRESOURCE_DIALOG_UNITS);
638
639 int useDefaults = 0;
640 expr->GetAttributeValue(_T("use_system_defaults"), useDefaults);
641 if (useDefaults != 0)
642 dialogItem->SetResourceStyle(dialogItem->GetResourceStyle() | wxRESOURCE_USE_DEFAULTS);
643
644 long id = 0;
645 expr->GetAttributeValue(_T("id"), id);
646 dialogItem->SetId(id);
647
648 if (style != _T(""))
649 {
650 windowStyle = wxParseWindowStyle(style);
651 }
652 dialogItem->SetStyle(windowStyle);
653 dialogItem->SetValue1(isModal);
654 dialogItem->SetName(name);
655 dialogItem->SetTitle(title);
656 dialogItem->SetSize(x, y, width, height);
657
658 if (backColourHex != _T(""))
659 {
660 int r = 0;
661 int g = 0;
662 int b = 0;
663 r = wxHexToDec(backColourHex.Mid(0, 2));
664 g = wxHexToDec(backColourHex.Mid(2, 2));
665 b = wxHexToDec(backColourHex.Mid(4, 2));
666 dialogItem->SetBackgroundColour(wxColour((unsigned char)r,(unsigned char)g,(unsigned char)b));
667 }
668 if (labelColourHex != _T(""))
669 {
670 int r = 0;
671 int g = 0;
672 int b = 0;
673 r = wxHexToDec(labelColourHex.Mid(0, 2));
674 g = wxHexToDec(labelColourHex.Mid(2, 2));
675 b = wxHexToDec(labelColourHex.Mid(4, 2));
676 dialogItem->SetLabelColour(wxColour((unsigned char)r,(unsigned char)g,(unsigned char)b));
677 }
678 if (buttonColourHex != _T(""))
679 {
680 int r = 0;
681 int g = 0;
682 int b = 0;
683 r = wxHexToDec(buttonColourHex.Mid(0, 2));
684 g = wxHexToDec(buttonColourHex.Mid(2, 2));
685 b = wxHexToDec(buttonColourHex.Mid(4, 2));
686 dialogItem->SetButtonColour(wxColour((unsigned char)r,(unsigned char)g,(unsigned char)b));
687 }
688
689 if (fontExpr)
690 dialogItem->SetFont(wxResourceInterpretFontSpec(fontExpr));
691 else if (buttonFontExpr)
692 dialogItem->SetFont(wxResourceInterpretFontSpec(buttonFontExpr));
693 else if (labelFontExpr)
694 dialogItem->SetFont(wxResourceInterpretFontSpec(labelFontExpr));
695
696 // Now parse all controls
697 wxExpr *controlExpr = expr->GetFirst();
698 while (controlExpr)
699 {
700 if (controlExpr->Number() == 3)
701 {
702 wxString controlKeyword(controlExpr->Nth(1)->StringValue());
703 if (controlKeyword != _T("") && controlKeyword == _T("control"))
704 {
705 // The value part: always a list.
706 wxExpr *listExpr = controlExpr->Nth(2);
707 if (listExpr->Type() == PrologList)
708 {
709 wxItemResource *controlItem = wxResourceInterpretControl(table, listExpr);
710 if (controlItem)
711 {
712 dialogItem->GetChildren().Append(controlItem);
713 }
714 }
715 }
716 }
717 controlExpr = controlExpr->GetNext();
718 }
719 return dialogItem;
720 }
721
722 wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr)
723 {
724 wxItemResource *controlItem = new wxItemResource;
725
726 // First, find the standard features of a control definition:
727 // [optional integer/string id], control name, title, style, name, x, y, width, height
728
729 wxString controlType;
730 wxString style;
731 wxString title;
732 wxString name;
733 int id = 0;
734 long windowStyle = 0;
735 int x = 0; int y = 0; int width = -1; int height = -1;
736 int count = 0;
737
738 wxExpr *expr1 = expr->Nth(0);
739
740 if ( expr1->Type() == PrologString || expr1->Type() == PrologWord )
741 {
742 if ( wxIsValidControlClass(expr1->StringValue()) )
743 {
744 count = 1;
745 controlType = expr1->StringValue();
746 }
747 else
748 {
749 wxString str(expr1->StringValue());
750 id = wxResourceGetIdentifier(str, &table);
751 if (id == 0)
752 {
753 wxLogWarning(_("Could not resolve control class or id '%s'. "
754 "Use (non-zero) integer instead\n or provide #define "
755 "(see manual for caveats)"),
756 (const wxChar*) expr1->StringValue());
757 delete controlItem;
758 return (wxItemResource *) NULL;
759 }
760 else
761 {
762 // Success - we have an id, so the 2nd element must be the control class.
763 controlType = expr->Nth(1)->StringValue();
764 count = 2;
765 }
766 }
767 }
768 else if (expr1->Type() == PrologInteger)
769 {
770 id = (int)expr1->IntegerValue();
771 // Success - we have an id, so the 2nd element must be the control class.
772 controlType = expr->Nth(1)->StringValue();
773 count = 2;
774 }
775
776 expr1 = expr->Nth(count);
777 count ++;
778 if ( expr1 )
779 title = expr1->StringValue();
780
781 expr1 = expr->Nth(count);
782 count ++;
783 if (expr1)
784 {
785 style = expr1->StringValue();
786 windowStyle = wxParseWindowStyle(style);
787 }
788
789 expr1 = expr->Nth(count);
790 count ++;
791 if (expr1)
792 name = expr1->StringValue();
793
794 expr1 = expr->Nth(count);
795 count ++;
796 if (expr1)
797 x = (int)expr1->IntegerValue();
798
799 expr1 = expr->Nth(count);
800 count ++;
801 if (expr1)
802 y = (int)expr1->IntegerValue();
803
804 expr1 = expr->Nth(count);
805 count ++;
806 if (expr1)
807 width = (int)expr1->IntegerValue();
808
809 expr1 = expr->Nth(count);
810 count ++;
811 if (expr1)
812 height = (int)expr1->IntegerValue();
813
814 controlItem->SetStyle(windowStyle);
815 controlItem->SetName(name);
816 controlItem->SetTitle(title);
817 controlItem->SetSize(x, y, width, height);
818 controlItem->SetType(controlType);
819 controlItem->SetId(id);
820
821 if (controlType == _T("wxButton"))
822 {
823 // Check for bitmap resource name (in case loading old-style resource file)
824 if (expr->Nth(count) && ((expr->Nth(count)->Type() == PrologString) || (expr->Nth(count)->Type() == PrologWord)))
825 {
826 wxString str(expr->Nth(count)->StringValue());
827 count ++;
828
829 if (str != _T(""))
830 {
831 controlItem->SetValue4(str);
832 controlItem->SetType(_T("wxBitmapButton"));
833 }
834 }
835 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
836 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
837 }
838 else if (controlType == _T("wxBitmapButton"))
839 {
840 // Check for bitmap resource name
841 if (expr->Nth(count) && ((expr->Nth(count)->Type() == PrologString) || (expr->Nth(count)->Type() == PrologWord)))
842 {
843 wxString str(expr->Nth(count)->StringValue());
844 controlItem->SetValue4(str);
845 count ++;
846 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
847 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
848 }
849 }
850 else if (controlType == _T("wxCheckBox"))
851 {
852 // Check for default value
853 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
854 {
855 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
856 count ++;
857 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
858 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
859 }
860 }
861 #if wxUSE_RADIOBUTTON
862 else if (controlType == _T("wxRadioButton"))
863 {
864 // Check for default value
865 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
866 {
867 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
868 count ++;
869 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
870 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
871 }
872 }
873 #endif
874 else if (controlType == _T("wxText") || controlType == _T("wxTextCtrl") || controlType == _T("wxMultiText"))
875 {
876 // Check for default value
877 if (expr->Nth(count) && ((expr->Nth(count)->Type() == PrologString) || (expr->Nth(count)->Type() == PrologWord)))
878 {
879 wxString str(expr->Nth(count)->StringValue());
880 controlItem->SetValue4(str);
881 count ++;
882
883 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
884 {
885 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
886 // Do nothing - no label font any more
887 count ++;
888 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
889 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
890 }
891 }
892 }
893 else if (controlType == _T("wxMessage") || controlType == _T("wxStaticText"))
894 {
895 // Check for bitmap resource name (in case it's an old-style .wxr file)
896 if (expr->Nth(count) && ((expr->Nth(count)->Type() == PrologString) || (expr->Nth(count)->Type() == PrologWord)))
897 {
898 wxString str(expr->Nth(count)->StringValue());
899 controlItem->SetValue4(str);
900 count ++;
901 controlItem->SetType(_T("wxStaticText"));
902 }
903 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
904 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
905 }
906 else if (controlType == _T("wxStaticBitmap"))
907 {
908 // Check for bitmap resource name
909 if (expr->Nth(count) && ((expr->Nth(count)->Type() == PrologString) || (expr->Nth(count)->Type() == PrologWord)))
910 {
911 wxString str(expr->Nth(count)->StringValue());
912 controlItem->SetValue4(str);
913 count ++;
914 }
915 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
916 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
917 }
918 else if (controlType == _T("wxGroupBox") || controlType == _T("wxStaticBox"))
919 {
920 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
921 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
922 }
923 else if (controlType == _T("wxGauge"))
924 {
925 // Check for default value
926 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
927 {
928 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
929 count ++;
930
931 // Check for range
932 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
933 {
934 controlItem->SetValue2(expr->Nth(count)->IntegerValue());
935 count ++;
936
937 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
938 {
939 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
940 // Do nothing
941 count ++;
942
943 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
944 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
945 }
946 }
947 }
948 }
949 else if (controlType == _T("wxSlider"))
950 {
951 // Check for default value
952 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
953 {
954 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
955 count ++;
956
957 // Check for min
958 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
959 {
960 controlItem->SetValue2(expr->Nth(count)->IntegerValue());
961 count ++;
962
963 // Check for max
964 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
965 {
966 controlItem->SetValue3(expr->Nth(count)->IntegerValue());
967 count ++;
968
969 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
970 {
971 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
972 // do nothing
973 count ++;
974
975 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
976 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
977 }
978 }
979 }
980 }
981 }
982 else if (controlType == _T("wxScrollBar"))
983 {
984 // DEFAULT VALUE
985 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
986 {
987 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
988 count ++;
989
990 // PAGE LENGTH
991 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
992 {
993 controlItem->SetValue2(expr->Nth(count)->IntegerValue());
994 count ++;
995
996 // OBJECT LENGTH
997 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
998 {
999 controlItem->SetValue3(expr->Nth(count)->IntegerValue());
1000 count ++;
1001
1002 // VIEW LENGTH
1003 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
1004 controlItem->SetValue5(expr->Nth(count)->IntegerValue());
1005 }
1006 }
1007 }
1008 }
1009 else if (controlType == _T("wxListBox"))
1010 {
1011 wxExpr *valueList = (wxExpr *) NULL;
1012
1013 if ((valueList = expr->Nth(count)) && (valueList->Type() == PrologList))
1014 {
1015 wxStringList stringList;
1016 wxExpr *stringExpr = valueList->GetFirst();
1017 while (stringExpr)
1018 {
1019 stringList.Add(stringExpr->StringValue());
1020 stringExpr = stringExpr->GetNext();
1021 }
1022 controlItem->SetStringValues(stringList);
1023 count ++;
1024 // This is now obsolete: it's in the window style.
1025 // Check for wxSINGLE/wxMULTIPLE
1026 wxExpr *mult = (wxExpr *) NULL;
1027 /*
1028 controlItem->SetValue1(wxLB_SINGLE);
1029 */
1030 if ((mult = expr->Nth(count)) && ((mult->Type() == PrologString)||(mult->Type() == PrologWord)))
1031 {
1032 /*
1033 wxString m(mult->StringValue());
1034 if (m == "wxLB_MULTIPLE")
1035 controlItem->SetValue1(wxLB_MULTIPLE);
1036 else if (m == "wxLB_EXTENDED")
1037 controlItem->SetValue1(wxLB_EXTENDED);
1038 */
1039 // Ignore the value
1040 count ++;
1041 }
1042 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1043 {
1044 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1045 count ++;
1046 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1047 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1048 }
1049 }
1050 }
1051 else if (controlType == _T("wxChoice"))
1052 {
1053 wxExpr *valueList = (wxExpr *) NULL;
1054 // Check for default value list
1055 if ((valueList = expr->Nth(count)) && (valueList->Type() == PrologList))
1056 {
1057 wxStringList stringList;
1058 wxExpr *stringExpr = valueList->GetFirst();
1059 while (stringExpr)
1060 {
1061 stringList.Add(stringExpr->StringValue());
1062 stringExpr = stringExpr->GetNext();
1063 }
1064 controlItem->SetStringValues(stringList);
1065
1066 count ++;
1067
1068 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1069 {
1070 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1071 count ++;
1072
1073 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1074 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1075 }
1076 }
1077 }
1078 #if wxUSE_COMBOBOX
1079 else if (controlType == _T("wxComboBox"))
1080 {
1081 wxExpr *textValue = expr->Nth(count);
1082 if (textValue && (textValue->Type() == PrologString || textValue->Type() == PrologWord))
1083 {
1084 wxString str(textValue->StringValue());
1085 controlItem->SetValue4(str);
1086
1087 count ++;
1088
1089 wxExpr *valueList = (wxExpr *) NULL;
1090 // Check for default value list
1091 if ((valueList = expr->Nth(count)) && (valueList->Type() == PrologList))
1092 {
1093 wxStringList stringList;
1094 wxExpr *stringExpr = valueList->GetFirst();
1095 while (stringExpr)
1096 {
1097 stringList.Add(stringExpr->StringValue());
1098 stringExpr = stringExpr->GetNext();
1099 }
1100 controlItem->SetStringValues(stringList);
1101
1102 count ++;
1103
1104 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1105 {
1106 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1107 count ++;
1108
1109 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1110 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1111 }
1112 }
1113 }
1114 }
1115 #endif
1116 #if 1
1117 else if (controlType == _T("wxRadioBox"))
1118 {
1119 wxExpr *valueList = (wxExpr *) NULL;
1120 // Check for default value list
1121 if ((valueList = expr->Nth(count)) && (valueList->Type() == PrologList))
1122 {
1123 wxStringList stringList;
1124 wxExpr *stringExpr = valueList->GetFirst();
1125 while (stringExpr)
1126 {
1127 stringList.Add(stringExpr->StringValue());
1128 stringExpr = stringExpr->GetNext();
1129 }
1130 controlItem->SetStringValues(stringList);
1131 count ++;
1132
1133 // majorDim (number of rows or cols)
1134 if (expr->Nth(count) && (expr->Nth(count)->Type() == PrologInteger))
1135 {
1136 controlItem->SetValue1(expr->Nth(count)->IntegerValue());
1137 count ++;
1138 }
1139 else
1140 controlItem->SetValue1(0);
1141
1142 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1143 {
1144 // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1145 count ++;
1146
1147 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
1148 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
1149 }
1150 }
1151 }
1152 #endif
1153 else
1154 {
1155 delete controlItem;
1156 return (wxItemResource *) NULL;
1157 }
1158 return controlItem;
1159 }
1160
1161 // Forward declaration
1162 wxItemResource *wxResourceInterpretMenu1(wxResourceTable& table, wxExpr *expr);
1163
1164 /*
1165 * Interpet a menu item
1166 */
1167
1168 wxItemResource *wxResourceInterpretMenuItem(wxResourceTable& table, wxExpr *expr)
1169 {
1170 wxItemResource *item = new wxItemResource;
1171
1172 wxExpr *labelExpr = expr->Nth(0);
1173 wxExpr *idExpr = expr->Nth(1);
1174 wxExpr *helpExpr = expr->Nth(2);
1175 wxExpr *checkableExpr = expr->Nth(3);
1176
1177 // Further keywords/attributes to follow sometime...
1178 if (expr->Number() == 0)
1179 {
1180 // item->SetType(wxRESOURCE_TYPE_SEPARATOR);
1181 item->SetType(_T("wxMenuSeparator"));
1182 return item;
1183 }
1184 else
1185 {
1186 // item->SetType(wxTYPE_MENU); // Well, menu item, but doesn't matter.
1187 item->SetType(_T("wxMenu")); // Well, menu item, but doesn't matter.
1188 if (labelExpr)
1189 {
1190 wxString str(labelExpr->StringValue());
1191 item->SetTitle(str);
1192 }
1193 if (idExpr)
1194 {
1195 int id = 0;
1196 // If a string or word, must look up in identifier table.
1197 if ((idExpr->Type() == PrologString) || (idExpr->Type() == PrologWord))
1198 {
1199 wxString str(idExpr->StringValue());
1200 id = wxResourceGetIdentifier(str, &table);
1201 if (id == 0)
1202 {
1203 wxLogWarning(_("Could not resolve menu id '%s'. "
1204 "Use (non-zero) integer instead\n"
1205 "or provide #define (see manual for caveats)"),
1206 (const wxChar*) idExpr->StringValue());
1207 }
1208 }
1209 else if (idExpr->Type() == PrologInteger)
1210 id = (int)idExpr->IntegerValue();
1211 item->SetValue1(id);
1212 }
1213 if (helpExpr)
1214 {
1215 wxString str(helpExpr->StringValue());
1216 item->SetValue4(str);
1217 }
1218 if (checkableExpr)
1219 item->SetValue2(checkableExpr->IntegerValue());
1220
1221 // Find the first expression that's a list, for submenu
1222 wxExpr *subMenuExpr = expr->GetFirst();
1223 while (subMenuExpr && (subMenuExpr->Type() != PrologList))
1224 subMenuExpr = subMenuExpr->GetNext();
1225
1226 while (subMenuExpr)
1227 {
1228 wxItemResource *child = wxResourceInterpretMenuItem(table, subMenuExpr);
1229 item->GetChildren().Append(child);
1230 subMenuExpr = subMenuExpr->GetNext();
1231 }
1232 }
1233 return item;
1234 }
1235
1236 /*
1237 * Interpret a nested list as a menu
1238 */
1239 /*
1240 wxItemResource *wxResourceInterpretMenu1(wxResourceTable& table, wxExpr *expr)
1241 {
1242 wxItemResource *menu = new wxItemResource;
1243 // menu->SetType(wxTYPE_MENU);
1244 menu->SetType("wxMenu");
1245 wxExpr *element = expr->GetFirst();
1246 while (element)
1247 {
1248 wxItemResource *item = wxResourceInterpretMenuItem(table, element);
1249 if (item)
1250 menu->GetChildren().Append(item);
1251 element = element->GetNext();
1252 }
1253 return menu;
1254 }
1255 */
1256
1257 wxItemResource *wxResourceInterpretMenu(wxResourceTable& table, wxExpr *expr)
1258 {
1259 wxExpr *listExpr = (wxExpr *) NULL;
1260 expr->GetAttributeValue(_T("menu"), &listExpr);
1261 if (!listExpr)
1262 return (wxItemResource *) NULL;
1263
1264 wxItemResource *menuResource = wxResourceInterpretMenuItem(table, listExpr);
1265
1266 if (!menuResource)
1267 return (wxItemResource *) NULL;
1268
1269 wxString name;
1270 if (expr->GetAttributeValue(_T("name"), name))
1271 {
1272 menuResource->SetName(name);
1273 }
1274
1275 return menuResource;
1276 }
1277
1278 wxItemResource *wxResourceInterpretMenuBar(wxResourceTable& table, wxExpr *expr)
1279 {
1280 wxExpr *listExpr = (wxExpr *) NULL;
1281 expr->GetAttributeValue(_T("menu"), &listExpr);
1282 if (!listExpr)
1283 return (wxItemResource *) NULL;
1284
1285 wxItemResource *resource = new wxItemResource;
1286 resource->SetType(_T("wxMenu"));
1287 // resource->SetType(wxTYPE_MENU);
1288
1289 wxExpr *element = listExpr->GetFirst();
1290 while (element)
1291 {
1292 wxItemResource *menuResource = wxResourceInterpretMenuItem(table, listExpr);
1293 resource->GetChildren().Append(menuResource);
1294 element = element->GetNext();
1295 }
1296
1297 wxString name;
1298 if (expr->GetAttributeValue(_T("name"), name))
1299 {
1300 resource->SetName(name);
1301 }
1302
1303 return resource;
1304 }
1305
1306 wxItemResource *wxResourceInterpretString(wxResourceTable& WXUNUSED(table), wxExpr *WXUNUSED(expr))
1307 {
1308 return (wxItemResource *) NULL;
1309 }
1310
1311 wxItemResource *wxResourceInterpretBitmap(wxResourceTable& WXUNUSED(table), wxExpr *expr)
1312 {
1313 wxItemResource *bitmapItem = new wxItemResource;
1314 // bitmapItem->SetType(wxTYPE_BITMAP);
1315 bitmapItem->SetType(_T("wxBitmap"));
1316 wxString name;
1317 if (expr->GetAttributeValue(_T("name"), name))
1318 {
1319 bitmapItem->SetName(name);
1320 }
1321 // Now parse all bitmap specifications
1322 wxExpr *bitmapExpr = expr->GetFirst();
1323 while (bitmapExpr)
1324 {
1325 if (bitmapExpr->Number() == 3)
1326 {
1327 wxString bitmapKeyword(bitmapExpr->Nth(1)->StringValue());
1328 if (bitmapKeyword == _T("bitmap") || bitmapKeyword == _T("icon"))
1329 {
1330 // The value part: always a list.
1331 wxExpr *listExpr = bitmapExpr->Nth(2);
1332 if (listExpr->Type() == PrologList)
1333 {
1334 wxItemResource *bitmapSpec = new wxItemResource;
1335 // bitmapSpec->SetType(wxTYPE_BITMAP);
1336 bitmapSpec->SetType(_T("wxBitmap"));
1337
1338 // List is of form: [filename, bitmaptype, platform, colours, xresolution, yresolution]
1339 // where everything after 'filename' is optional.
1340 wxExpr *nameExpr = listExpr->Nth(0);
1341 wxExpr *typeExpr = listExpr->Nth(1);
1342 wxExpr *platformExpr = listExpr->Nth(2);
1343 wxExpr *coloursExpr = listExpr->Nth(3);
1344 wxExpr *xresExpr = listExpr->Nth(4);
1345 wxExpr *yresExpr = listExpr->Nth(5);
1346 if (nameExpr && nameExpr->StringValue() != _T(""))
1347 {
1348 bitmapSpec->SetName(nameExpr->StringValue());
1349 }
1350 if (typeExpr && typeExpr->StringValue() != _T(""))
1351 {
1352 bitmapSpec->SetValue1(wxParseWindowStyle(typeExpr->StringValue()));
1353 }
1354 else
1355 bitmapSpec->SetValue1(0);
1356
1357 if (platformExpr && platformExpr->StringValue() != _T(""))
1358 {
1359 wxString plat(platformExpr->StringValue());
1360 if (plat == _T("windows") || plat == _T("WINDOWS"))
1361 bitmapSpec->SetValue2(RESOURCE_PLATFORM_WINDOWS);
1362 else if (plat == _T("x") || plat == _T("X"))
1363 bitmapSpec->SetValue2(RESOURCE_PLATFORM_X);
1364 else if (plat == _T("mac") || plat == _T("MAC"))
1365 bitmapSpec->SetValue2(RESOURCE_PLATFORM_MAC);
1366 else
1367 bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY);
1368 }
1369 else
1370 bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY);
1371
1372 if (coloursExpr)
1373 bitmapSpec->SetValue3(coloursExpr->IntegerValue());
1374 int xres = 0;
1375 int yres = 0;
1376 if (xresExpr)
1377 xres = (int)xresExpr->IntegerValue();
1378 if (yresExpr)
1379 yres = (int)yresExpr->IntegerValue();
1380 bitmapSpec->SetSize(0, 0, xres, yres);
1381
1382 bitmapItem->GetChildren().Append(bitmapSpec);
1383 }
1384 }
1385 }
1386 bitmapExpr = bitmapExpr->GetNext();
1387 }
1388
1389 return bitmapItem;
1390 }
1391
1392 wxItemResource *wxResourceInterpretIcon(wxResourceTable& table, wxExpr *expr)
1393 {
1394 wxItemResource *item = wxResourceInterpretBitmap(table, expr);
1395 if (item)
1396 {
1397 // item->SetType(wxTYPE_ICON);
1398 item->SetType(_T("wxIcon"));
1399 return item;
1400 }
1401 else
1402 return (wxItemResource *) NULL;
1403 }
1404
1405 // Interpret list expression as a font
1406 wxFont wxResourceInterpretFontSpec(wxExpr *expr)
1407 {
1408 if (expr->Type() != PrologList)
1409 return wxNullFont;
1410
1411 int point = 10;
1412 int family = wxSWISS;
1413 int style = wxNORMAL;
1414 int weight = wxNORMAL;
1415 int underline = 0;
1416 wxString faceName(_T(""));
1417
1418 wxExpr *pointExpr = expr->Nth(0);
1419 wxExpr *familyExpr = expr->Nth(1);
1420 wxExpr *styleExpr = expr->Nth(2);
1421 wxExpr *weightExpr = expr->Nth(3);
1422 wxExpr *underlineExpr = expr->Nth(4);
1423 wxExpr *faceNameExpr = expr->Nth(5);
1424 if (pointExpr)
1425 point = (int)pointExpr->IntegerValue();
1426
1427 wxString str;
1428 if (familyExpr)
1429 {
1430 str = familyExpr->StringValue();
1431 family = (int)wxParseWindowStyle(str);
1432 }
1433 if (styleExpr)
1434 {
1435 str = styleExpr->StringValue();
1436 style = (int)wxParseWindowStyle(str);
1437 }
1438 if (weightExpr)
1439 {
1440 str = weightExpr->StringValue();
1441 weight = (int)wxParseWindowStyle(str);
1442 }
1443 if (underlineExpr)
1444 underline = (int)underlineExpr->IntegerValue();
1445 if (faceNameExpr)
1446 faceName = faceNameExpr->StringValue();
1447
1448 wxFont font(point, family, style, weight, (underline != 0), faceName);
1449 return font;
1450 }
1451
1452 // Separate file for the remainder of this, for BC++/Win16
1453
1454 #if !((defined(__BORLANDC__) || defined(__SC__)) && defined(__WIN16__))
1455 /*
1456 * (Re)allocate buffer for reading in from resource file
1457 */
1458
1459 bool wxReallocateResourceBuffer()
1460 {
1461 if (!wxResourceBuffer)
1462 {
1463 wxResourceBufferSize = 1000;
1464 wxResourceBuffer = new char[wxResourceBufferSize];
1465 return TRUE;
1466 }
1467 if (wxResourceBuffer)
1468 {
1469 long newSize = wxResourceBufferSize + 1000;
1470 char *tmp = new char[(int)newSize];
1471 strncpy(tmp, wxResourceBuffer, (int)wxResourceBufferCount);
1472 delete[] wxResourceBuffer;
1473 wxResourceBuffer = tmp;
1474 wxResourceBufferSize = newSize;
1475 }
1476 return TRUE;
1477 }
1478
1479 static bool wxEatWhiteSpace(FILE *fd)
1480 {
1481 int ch = 0;
1482
1483 while ((ch = getc(fd)) != EOF)
1484 {
1485 switch (ch)
1486 {
1487 case ' ':
1488 case 0x0a:
1489 case 0x0d:
1490 case 0x09:
1491 break;
1492 case '/':
1493 {
1494 int prev_ch = ch;
1495 ch = getc(fd);
1496 if (ch == EOF)
1497 {
1498 ungetc(prev_ch, fd);
1499 return TRUE;
1500 }
1501
1502 if (ch == '*')
1503 {
1504 // Eat C comment
1505 prev_ch = 0;
1506 while ((ch = getc(fd)) != EOF)
1507 {
1508 if (ch == '/' && prev_ch == '*')
1509 break;
1510 prev_ch = ch;
1511 }
1512 }
1513 else if (ch == '/')
1514 {
1515 // Eat C++ comment
1516 static char buffer[255];
1517 fgets(buffer, 255, fd);
1518 }
1519 else
1520 {
1521 ungetc(prev_ch, fd);
1522 ungetc(ch, fd);
1523 return TRUE;
1524 }
1525 }
1526 break;
1527 default:
1528 ungetc(ch, fd);
1529 return TRUE;
1530
1531 }
1532 }
1533 return FALSE;
1534 }
1535
1536 bool wxGetResourceToken(FILE *fd)
1537 {
1538 if (!wxResourceBuffer)
1539 wxReallocateResourceBuffer();
1540 wxResourceBuffer[0] = 0;
1541 wxEatWhiteSpace(fd);
1542
1543 int ch = getc(fd);
1544 if (ch == '"')
1545 {
1546 // Get string
1547 wxResourceBufferCount = 0;
1548 ch = getc(fd);
1549 while (ch != '"')
1550 {
1551 int actualCh = ch;
1552 if (ch == EOF)
1553 {
1554 wxResourceBuffer[wxResourceBufferCount] = 0;
1555 return FALSE;
1556 }
1557 // Escaped characters
1558 else if (ch == '\\')
1559 {
1560 int newCh = getc(fd);
1561 if (newCh == '"')
1562 actualCh = '"';
1563 else if (newCh == 10)
1564 actualCh = 10;
1565 else
1566 {
1567 ungetc(newCh, fd);
1568 }
1569 }
1570
1571 if (wxResourceBufferCount >= wxResourceBufferSize-1)
1572 wxReallocateResourceBuffer();
1573 wxResourceBuffer[wxResourceBufferCount] = (char)actualCh;
1574 wxResourceBufferCount ++;
1575 ch = getc(fd);
1576 }
1577 wxResourceBuffer[wxResourceBufferCount] = 0;
1578 }
1579 else
1580 {
1581 wxResourceBufferCount = 0;
1582 // Any other token
1583 while (ch != ' ' && ch != EOF && ch != ' ' && ch != 13 && ch != 9 && ch != 10)
1584 {
1585 if (wxResourceBufferCount >= wxResourceBufferSize-1)
1586 wxReallocateResourceBuffer();
1587 wxResourceBuffer[wxResourceBufferCount] = (char)ch;
1588 wxResourceBufferCount ++;
1589
1590 ch = getc(fd);
1591 }
1592 wxResourceBuffer[wxResourceBufferCount] = 0;
1593 if (ch == EOF)
1594 return FALSE;
1595 }
1596 return TRUE;
1597 }
1598
1599 /*
1600 * Files are in form:
1601 static char *name = "....";
1602 with possible comments.
1603 */
1604
1605 bool wxResourceReadOneResource(FILE *fd, wxExprDatabase& db, bool *eof, wxResourceTable *table)
1606 {
1607 if (!table)
1608 table = wxDefaultResourceTable;
1609
1610 // static or #define
1611 if (!wxGetResourceToken(fd))
1612 {
1613 *eof = TRUE;
1614 return FALSE;
1615 }
1616
1617 if (strcmp(wxResourceBuffer, "#define") == 0)
1618 {
1619 wxGetResourceToken(fd);
1620 wxChar *name = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
1621 wxGetResourceToken(fd);
1622 wxChar *value = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
1623 if (wxIsalpha(value[0]))
1624 {
1625 int val = (int)wxAtol(value);
1626 wxResourceAddIdentifier(name, val, table);
1627 }
1628 else
1629 {
1630 wxLogWarning(_("#define %s must be an integer."), name);
1631 delete[] name;
1632 delete[] value;
1633 return FALSE;
1634 }
1635 delete[] name;
1636 delete[] value;
1637
1638 return TRUE;
1639 }
1640 else if (strcmp(wxResourceBuffer, "#include") == 0)
1641 {
1642 wxGetResourceToken(fd);
1643 wxChar *name = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
1644 wxChar *actualName = name;
1645 if (name[0] == _T('"'))
1646 actualName = name + 1;
1647 int len = wxStrlen(name);
1648 if ((len > 0) && (name[len-1] == _T('"')))
1649 name[len-1] = 0;
1650 if (!wxResourceParseIncludeFile(actualName, table))
1651 {
1652 wxLogWarning(_("Could not find resource include file %s."), actualName);
1653 }
1654 delete[] name;
1655 return TRUE;
1656 }
1657 else if (strcmp(wxResourceBuffer, "static") != 0)
1658 {
1659 wxChar buf[300];
1660 wxStrcpy(buf, _("Found "));
1661 wxStrncat(buf, wxConv_libc.cMB2WX(wxResourceBuffer), 30);
1662 wxStrcat(buf, _(", expected static, #include or #define\nwhilst parsing resource."));
1663 wxLogWarning(buf);
1664 return FALSE;
1665 }
1666
1667 // char
1668 if (!wxGetResourceToken(fd))
1669 {
1670 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
1671 *eof = TRUE;
1672 return FALSE;
1673 }
1674
1675 if (strcmp(wxResourceBuffer, "char") != 0)
1676 {
1677 wxLogWarning(_("Expected 'char' whilst parsing resource."));
1678 return FALSE;
1679 }
1680
1681 // *name
1682 if (!wxGetResourceToken(fd))
1683 {
1684 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
1685 *eof = TRUE;
1686 return FALSE;
1687 }
1688
1689 if (wxResourceBuffer[0] != '*')
1690 {
1691 wxLogWarning(_("Expected '*' whilst parsing resource."));
1692 return FALSE;
1693 }
1694 wxChar nameBuf[100];
1695 wxMB2WX(nameBuf, wxResourceBuffer+1, 99);
1696 nameBuf[99] = 0;
1697
1698 // =
1699 if (!wxGetResourceToken(fd))
1700 {
1701 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
1702 *eof = TRUE;
1703 return FALSE;
1704 }
1705
1706 if (strcmp(wxResourceBuffer, "=") != 0)
1707 {
1708 wxLogWarning(_("Expected '=' whilst parsing resource."));
1709 return FALSE;
1710 }
1711
1712 // String
1713 if (!wxGetResourceToken(fd))
1714 {
1715 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
1716 *eof = TRUE;
1717 return FALSE;
1718 }
1719 else
1720 {
1721 if (!db.ReadPrologFromString(wxResourceBuffer))
1722 {
1723 wxLogWarning(_("%s: ill-formed resource file syntax."), nameBuf);
1724 return FALSE;
1725 }
1726 }
1727 // Semicolon
1728 if (!wxGetResourceToken(fd))
1729 {
1730 *eof = TRUE;
1731 }
1732 return TRUE;
1733 }
1734
1735 /*
1736 * Parses string window style into integer window style
1737 */
1738
1739 /*
1740 * Style flag parsing, e.g.
1741 * "wxSYSTEM_MENU | wxBORDER" -> integer
1742 */
1743
1744 wxChar* wxResourceParseWord(wxChar*s, int *i)
1745 {
1746 if (!s)
1747 return (wxChar*) NULL;
1748
1749 static wxChar buf[150];
1750 int len = wxStrlen(s);
1751 int j = 0;
1752 int ii = *i;
1753 while ((ii < len) && (wxIsalpha(s[ii]) || (s[ii] == _T('_'))))
1754 {
1755 buf[j] = s[ii];
1756 j ++;
1757 ii ++;
1758 }
1759 buf[j] = 0;
1760
1761 // Eat whitespace and conjunction characters
1762 while ((ii < len) &&
1763 ((s[ii] == _T(' ')) || (s[ii] == _T('|')) || (s[ii] == _T(','))))
1764 {
1765 ii ++;
1766 }
1767 *i = ii;
1768 if (j == 0)
1769 return (wxChar*) NULL;
1770 else
1771 return buf;
1772 }
1773
1774 struct wxResourceBitListStruct
1775 {
1776 wxChar *word;
1777 long bits;
1778 };
1779
1780 static wxResourceBitListStruct wxResourceBitListTable[] =
1781 {
1782 /* wxListBox */
1783 { _T("wxSINGLE"), wxLB_SINGLE },
1784 { _T("wxMULTIPLE"), wxLB_MULTIPLE },
1785 { _T("wxEXTENDED"), wxLB_EXTENDED },
1786 { _T("wxLB_SINGLE"), wxLB_SINGLE },
1787 { _T("wxLB_MULTIPLE"), wxLB_MULTIPLE },
1788 { _T("wxLB_EXTENDED"), wxLB_EXTENDED },
1789 { _T("wxLB_NEEDED_SB"), wxLB_NEEDED_SB },
1790 { _T("wxLB_ALWAYS_SB"), wxLB_ALWAYS_SB },
1791 { _T("wxLB_SORT"), wxLB_SORT },
1792 { _T("wxLB_OWNERDRAW"), wxLB_OWNERDRAW },
1793 { _T("wxLB_HSCROLL"), wxLB_HSCROLL },
1794
1795 /* wxComboxBox */
1796 { _T("wxCB_SIMPLE"), wxCB_SIMPLE },
1797 { _T("wxCB_DROPDOWN"), wxCB_DROPDOWN },
1798 { _T("wxCB_READONLY"), wxCB_READONLY },
1799 { _T("wxCB_SORT"), wxCB_SORT },
1800
1801 /* wxGauge */
1802 { _T("wxGA_PROGRESSBAR"), wxGA_PROGRESSBAR },
1803 { _T("wxGA_HORIZONTAL"), wxGA_HORIZONTAL },
1804 { _T("wxGA_VERTICAL"), wxGA_VERTICAL },
1805
1806 /* wxTextCtrl */
1807 { _T("wxPASSWORD"), wxPASSWORD},
1808 { _T("wxPROCESS_ENTER"), wxPROCESS_ENTER},
1809 { _T("wxTE_PASSWORD"), wxTE_PASSWORD},
1810 { _T("wxTE_READONLY"), wxTE_READONLY},
1811 { _T("wxTE_PROCESS_ENTER"), wxTE_PROCESS_ENTER},
1812 { _T("wxTE_MULTILINE"), wxTE_MULTILINE},
1813
1814 /* wxRadioBox/wxRadioButton */
1815 { _T("wxRB_GROUP"), wxRB_GROUP },
1816 { _T("wxRA_SPECIFY_COLS"), wxRA_SPECIFY_COLS },
1817 { _T("wxRA_SPECIFY_ROWS"), wxRA_SPECIFY_ROWS },
1818 { _T("wxRA_HORIZONTAL"), wxRA_HORIZONTAL },
1819 { _T("wxRA_VERTICAL"), wxRA_VERTICAL },
1820
1821 /* wxSlider */
1822 { _T("wxSL_HORIZONTAL"), wxSL_HORIZONTAL },
1823 { _T("wxSL_VERTICAL"), wxSL_VERTICAL },
1824 { _T("wxSL_AUTOTICKS"), wxSL_AUTOTICKS },
1825 { _T("wxSL_LABELS"), wxSL_LABELS },
1826 { _T("wxSL_LEFT"), wxSL_LEFT },
1827 { _T("wxSL_TOP"), wxSL_TOP },
1828 { _T("wxSL_RIGHT"), wxSL_RIGHT },
1829 { _T("wxSL_BOTTOM"), wxSL_BOTTOM },
1830 { _T("wxSL_BOTH"), wxSL_BOTH },
1831 { _T("wxSL_SELRANGE"), wxSL_SELRANGE },
1832
1833 /* wxScrollBar */
1834 { _T("wxSB_HORIZONTAL"), wxSB_HORIZONTAL },
1835 { _T("wxSB_VERTICAL"), wxSB_VERTICAL },
1836
1837 /* wxButton */
1838 { _T("wxBU_AUTODRAW"), wxBU_AUTODRAW },
1839 { _T("wxBU_NOAUTODRAW"), wxBU_NOAUTODRAW },
1840
1841 /* wxTreeCtrl */
1842 { _T("wxTR_HAS_BUTTONS"), wxTR_HAS_BUTTONS },
1843 { _T("wxTR_EDIT_LABELS"), wxTR_EDIT_LABELS },
1844 { _T("wxTR_LINES_AT_ROOT"), wxTR_LINES_AT_ROOT },
1845
1846 /* wxListCtrl */
1847 { _T("wxLC_ICON"), wxLC_ICON },
1848 { _T("wxLC_SMALL_ICON"), wxLC_SMALL_ICON },
1849 { _T("wxLC_LIST"), wxLC_LIST },
1850 { _T("wxLC_REPORT"), wxLC_REPORT },
1851 { _T("wxLC_ALIGN_TOP"), wxLC_ALIGN_TOP },
1852 { _T("wxLC_ALIGN_LEFT"), wxLC_ALIGN_LEFT },
1853 { _T("wxLC_AUTOARRANGE"), wxLC_AUTOARRANGE },
1854 { _T("wxLC_USER_TEXT"), wxLC_USER_TEXT },
1855 { _T("wxLC_EDIT_LABELS"), wxLC_EDIT_LABELS },
1856 { _T("wxLC_NO_HEADER"), wxLC_NO_HEADER },
1857 { _T("wxLC_NO_SORT_HEADER"), wxLC_NO_SORT_HEADER },
1858 { _T("wxLC_SINGLE_SEL"), wxLC_SINGLE_SEL },
1859 { _T("wxLC_SORT_ASCENDING"), wxLC_SORT_ASCENDING },
1860 { _T("wxLC_SORT_DESCENDING"), wxLC_SORT_DESCENDING },
1861
1862 /* wxSpinButton */
1863 { _T("wxSP_VERTICAL"), wxSP_VERTICAL},
1864 { _T("wxSP_HORIZONTAL"), wxSP_HORIZONTAL},
1865 { _T("wxSP_ARROW_KEYS"), wxSP_ARROW_KEYS},
1866 { _T("wxSP_WRAP"), wxSP_WRAP},
1867
1868 /* wxSplitterWnd */
1869 { _T("wxSP_NOBORDER"), wxSP_NOBORDER},
1870 { _T("wxSP_3D"), wxSP_3D},
1871 { _T("wxSP_BORDER"), wxSP_BORDER},
1872
1873 /* wxTabCtrl */
1874 { _T("wxTC_MULTILINE"), wxTC_MULTILINE},
1875 { _T("wxTC_RIGHTJUSTIFY"), wxTC_RIGHTJUSTIFY},
1876 { _T("wxTC_FIXEDWIDTH"), wxTC_FIXEDWIDTH},
1877 { _T("wxTC_OWNERDRAW"), wxTC_OWNERDRAW},
1878
1879 /* wxStatusBar95 */
1880 { _T("wxST_SIZEGRIP"), wxST_SIZEGRIP},
1881
1882 /* wxControl */
1883 { _T("wxFIXED_LENGTH"), wxFIXED_LENGTH},
1884 { _T("wxALIGN_LEFT"), wxALIGN_LEFT},
1885 { _T("wxALIGN_CENTER"), wxALIGN_CENTER},
1886 { _T("wxALIGN_CENTRE"), wxALIGN_CENTRE},
1887 { _T("wxALIGN_RIGHT"), wxALIGN_RIGHT},
1888 { _T("wxCOLOURED"), wxCOLOURED},
1889
1890 /* wxToolBar */
1891 { _T("wxTB_3DBUTTONS"), wxTB_3DBUTTONS},
1892 { _T("wxTB_HORIZONTAL"), wxTB_HORIZONTAL},
1893 { _T("wxTB_VERTICAL"), wxTB_VERTICAL},
1894 { _T("wxTB_FLAT"), wxTB_FLAT},
1895
1896 /* Generic */
1897 { _T("wxVSCROLL"), wxVSCROLL },
1898 { _T("wxHSCROLL"), wxHSCROLL },
1899 { _T("wxCAPTION"), wxCAPTION },
1900 { _T("wxSTAY_ON_TOP"), wxSTAY_ON_TOP},
1901 { _T("wxICONIZE"), wxICONIZE},
1902 { _T("wxMINIMIZE"), wxICONIZE},
1903 { _T("wxMAXIMIZE"), wxMAXIMIZE},
1904 { _T("wxSDI"), 0},
1905 { _T("wxMDI_PARENT"), 0},
1906 { _T("wxMDI_CHILD"), 0},
1907 { _T("wxTHICK_FRAME"), wxTHICK_FRAME},
1908 { _T("wxRESIZE_BORDER"), wxRESIZE_BORDER},
1909 { _T("wxSYSTEM_MENU"), wxSYSTEM_MENU},
1910 { _T("wxMINIMIZE_BOX"), wxMINIMIZE_BOX},
1911 { _T("wxMAXIMIZE_BOX"), wxMAXIMIZE_BOX},
1912 { _T("wxRESIZE_BOX"), wxRESIZE_BOX},
1913 { _T("wxDEFAULT_FRAME_STYLE"), wxDEFAULT_FRAME_STYLE},
1914 { _T("wxDEFAULT_FRAME"), wxDEFAULT_FRAME_STYLE},
1915 { _T("wxDEFAULT_DIALOG_STYLE"), wxDEFAULT_DIALOG_STYLE},
1916 { _T("wxBORDER"), wxBORDER},
1917 { _T("wxRETAINED"), wxRETAINED},
1918 { _T("wxNATIVE_IMPL"), 0},
1919 { _T("wxEXTENDED_IMPL"), 0},
1920 { _T("wxBACKINGSTORE"), wxBACKINGSTORE},
1921 // { _T("wxFLAT"), wxFLAT},
1922 // { _T("wxMOTIF_RESIZE"), wxMOTIF_RESIZE},
1923 { _T("wxFIXED_LENGTH"), 0},
1924 { _T("wxDOUBLE_BORDER"), wxDOUBLE_BORDER},
1925 { _T("wxSUNKEN_BORDER"), wxSUNKEN_BORDER},
1926 { _T("wxRAISED_BORDER"), wxRAISED_BORDER},
1927 { _T("wxSIMPLE_BORDER"), wxSIMPLE_BORDER},
1928 { _T("wxSTATIC_BORDER"), wxSTATIC_BORDER},
1929 { _T("wxTRANSPARENT_WINDOW"), wxTRANSPARENT_WINDOW},
1930 { _T("wxNO_BORDER"), wxNO_BORDER},
1931 { _T("wxCLIP_CHILDREN"), wxCLIP_CHILDREN},
1932
1933 { _T("wxTINY_CAPTION_HORIZ"), wxTINY_CAPTION_HORIZ},
1934 { _T("wxTINY_CAPTION_VERT"), wxTINY_CAPTION_VERT},
1935
1936 // Text font families
1937 { _T("wxDEFAULT"), wxDEFAULT},
1938 { _T("wxDECORATIVE"), wxDECORATIVE},
1939 { _T("wxROMAN"), wxROMAN},
1940 { _T("wxSCRIPT"), wxSCRIPT},
1941 { _T("wxSWISS"), wxSWISS},
1942 { _T("wxMODERN"), wxMODERN},
1943 { _T("wxTELETYPE"), wxTELETYPE},
1944 { _T("wxVARIABLE"), wxVARIABLE},
1945 { _T("wxFIXED"), wxFIXED},
1946 { _T("wxNORMAL"), wxNORMAL},
1947 { _T("wxLIGHT"), wxLIGHT},
1948 { _T("wxBOLD"), wxBOLD},
1949 { _T("wxITALIC"), wxITALIC},
1950 { _T("wxSLANT"), wxSLANT},
1951 { _T("wxSOLID"), wxSOLID},
1952 { _T("wxDOT"), wxDOT},
1953 { _T("wxLONG_DASH"), wxLONG_DASH},
1954 { _T("wxSHORT_DASH"), wxSHORT_DASH},
1955 { _T("wxDOT_DASH"), wxDOT_DASH},
1956 { _T("wxUSER_DASH"), wxUSER_DASH},
1957 { _T("wxTRANSPARENT"), wxTRANSPARENT},
1958 { _T("wxSTIPPLE"), wxSTIPPLE},
1959 { _T("wxBDIAGONAL_HATCH"), wxBDIAGONAL_HATCH},
1960 { _T("wxCROSSDIAG_HATCH"), wxCROSSDIAG_HATCH},
1961 { _T("wxFDIAGONAL_HATCH"), wxFDIAGONAL_HATCH},
1962 { _T("wxCROSS_HATCH"), wxCROSS_HATCH},
1963 { _T("wxHORIZONTAL_HATCH"), wxHORIZONTAL_HATCH},
1964 { _T("wxVERTICAL_HATCH"), wxVERTICAL_HATCH},
1965 { _T("wxJOIN_BEVEL"), wxJOIN_BEVEL},
1966 { _T("wxJOIN_MITER"), wxJOIN_MITER},
1967 { _T("wxJOIN_ROUND"), wxJOIN_ROUND},
1968 { _T("wxCAP_ROUND"), wxCAP_ROUND},
1969 { _T("wxCAP_PROJECTING"), wxCAP_PROJECTING},
1970 { _T("wxCAP_BUTT"), wxCAP_BUTT},
1971
1972 // Logical ops
1973 { _T("wxCLEAR"), wxCLEAR},
1974 { _T("wxXOR"), wxXOR},
1975 { _T("wxINVERT"), wxINVERT},
1976 { _T("wxOR_REVERSE"), wxOR_REVERSE},
1977 { _T("wxAND_REVERSE"), wxAND_REVERSE},
1978 { _T("wxCOPY"), wxCOPY},
1979 { _T("wxAND"), wxAND},
1980 { _T("wxAND_INVERT"), wxAND_INVERT},
1981 { _T("wxNO_OP"), wxNO_OP},
1982 { _T("wxNOR"), wxNOR},
1983 { _T("wxEQUIV"), wxEQUIV},
1984 { _T("wxSRC_INVERT"), wxSRC_INVERT},
1985 { _T("wxOR_INVERT"), wxOR_INVERT},
1986 { _T("wxNAND"), wxNAND},
1987 { _T("wxOR"), wxOR},
1988 { _T("wxSET"), wxSET},
1989
1990 { _T("wxFLOOD_SURFACE"), wxFLOOD_SURFACE},
1991 { _T("wxFLOOD_BORDER"), wxFLOOD_BORDER},
1992 { _T("wxODDEVEN_RULE"), wxODDEVEN_RULE},
1993 { _T("wxWINDING_RULE"), wxWINDING_RULE},
1994 { _T("wxHORIZONTAL"), wxHORIZONTAL},
1995 { _T("wxVERTICAL"), wxVERTICAL},
1996 { _T("wxBOTH"), wxBOTH},
1997 { _T("wxCENTER_FRAME"), wxCENTER_FRAME},
1998 { _T("wxOK"), wxOK},
1999 { _T("wxYES_NO"), wxYES_NO},
2000 { _T("wxCANCEL"), wxCANCEL},
2001 { _T("wxYES"), wxYES},
2002 { _T("wxNO"), wxNO},
2003 { _T("wxICON_EXCLAMATION"), wxICON_EXCLAMATION},
2004 { _T("wxICON_HAND"), wxICON_HAND},
2005 { _T("wxICON_QUESTION"), wxICON_QUESTION},
2006 { _T("wxICON_INFORMATION"), wxICON_INFORMATION},
2007 { _T("wxICON_STOP"), wxICON_STOP},
2008 { _T("wxICON_ASTERISK"), wxICON_ASTERISK},
2009 { _T("wxICON_MASK"), wxICON_MASK},
2010 { _T("wxCENTRE"), wxCENTRE},
2011 { _T("wxCENTER"), wxCENTRE},
2012 { _T("wxUSER_COLOURS"), wxUSER_COLOURS},
2013 { _T("wxVERTICAL_LABEL"), 0},
2014 { _T("wxHORIZONTAL_LABEL"), 0},
2015
2016 // Bitmap types (not strictly styles)
2017 { _T("wxBITMAP_TYPE_XPM"), wxBITMAP_TYPE_XPM},
2018 { _T("wxBITMAP_TYPE_XBM"), wxBITMAP_TYPE_XBM},
2019 { _T("wxBITMAP_TYPE_BMP"), wxBITMAP_TYPE_BMP},
2020 { _T("wxBITMAP_TYPE_RESOURCE"), wxBITMAP_TYPE_BMP_RESOURCE},
2021 { _T("wxBITMAP_TYPE_BMP_RESOURCE"), wxBITMAP_TYPE_BMP_RESOURCE},
2022 { _T("wxBITMAP_TYPE_GIF"), wxBITMAP_TYPE_GIF},
2023 { _T("wxBITMAP_TYPE_TIF"), wxBITMAP_TYPE_TIF},
2024 { _T("wxBITMAP_TYPE_ICO"), wxBITMAP_TYPE_ICO},
2025 { _T("wxBITMAP_TYPE_ICO_RESOURCE"), wxBITMAP_TYPE_ICO_RESOURCE},
2026 { _T("wxBITMAP_TYPE_CUR"), wxBITMAP_TYPE_CUR},
2027 { _T("wxBITMAP_TYPE_CUR_RESOURCE"), wxBITMAP_TYPE_CUR_RESOURCE},
2028 { _T("wxBITMAP_TYPE_XBM_DATA"), wxBITMAP_TYPE_XBM_DATA},
2029 { _T("wxBITMAP_TYPE_XPM_DATA"), wxBITMAP_TYPE_XPM_DATA},
2030 { _T("wxBITMAP_TYPE_ANY"), wxBITMAP_TYPE_ANY}
2031 };
2032
2033 static int wxResourceBitListCount = (sizeof(wxResourceBitListTable)/sizeof(wxResourceBitListStruct));
2034
2035 long wxParseWindowStyle(const wxString& bitListString)
2036 {
2037 int i = 0;
2038 wxChar *word;
2039 long bitList = 0;
2040 while ((word = wxResourceParseWord(WXSTRINGCAST bitListString, &i)))
2041 {
2042 bool found = FALSE;
2043 int j;
2044 for (j = 0; j < wxResourceBitListCount; j++)
2045 if (wxStrcmp(wxResourceBitListTable[j].word, word) == 0)
2046 {
2047 bitList |= wxResourceBitListTable[j].bits;
2048 found = TRUE;
2049 break;
2050 }
2051 if (!found)
2052 {
2053 wxLogWarning(_("Unrecognized style %s whilst parsing resource."), word);
2054 return 0;
2055 }
2056 }
2057 return bitList;
2058 }
2059
2060 /*
2061 * Load a bitmap from a wxWindows resource, choosing an optimum
2062 * depth and appropriate type.
2063 */
2064
2065 wxBitmap wxResourceCreateBitmap(const wxString& resource, wxResourceTable *table)
2066 {
2067 if (!table)
2068 table = wxDefaultResourceTable;
2069
2070 wxItemResource *item = table->FindResource(resource);
2071 if (item)
2072 {
2073 if ((item->GetType() == _T("")) || (item->GetType() != _T("wxBitmap")))
2074 {
2075 wxLogWarning(_("%s not a bitmap resource specification."), (const wxChar*) resource);
2076 return wxNullBitmap;
2077 }
2078 int thisDepth = wxDisplayDepth();
2079 long thisNoColours = (long)pow(2.0, (double)thisDepth);
2080
2081 wxItemResource *optResource = (wxItemResource *) NULL;
2082
2083 // Try to find optimum bitmap for this platform/colour depth
2084 wxNode *node = item->GetChildren().First();
2085 while (node)
2086 {
2087 wxItemResource *child = (wxItemResource *)node->Data();
2088 int platform = (int)child->GetValue2();
2089 int noColours = (int)child->GetValue3();
2090 /*
2091 char *name = child->GetName();
2092 int bitmapType = (int)child->GetValue1();
2093 int xRes = child->GetWidth();
2094 int yRes = child->GetHeight();
2095 */
2096
2097 switch (platform)
2098 {
2099 case RESOURCE_PLATFORM_ANY:
2100 {
2101 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2102 optResource = child;
2103 else
2104 {
2105 // Maximise the number of colours.
2106 // If noColours is zero (unspecified), then assume this
2107 // is the right one.
2108 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2109 optResource = child;
2110 }
2111 break;
2112 }
2113 #ifdef __WXMSW__
2114 case RESOURCE_PLATFORM_WINDOWS:
2115 {
2116 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2117 optResource = child;
2118 else
2119 {
2120 // Maximise the number of colours
2121 if ((noColours > 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2122 optResource = child;
2123 }
2124 break;
2125 }
2126 #endif
2127 #ifdef __WXGTK__
2128 case RESOURCE_PLATFORM_X:
2129 {
2130 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2131 optResource = child;
2132 else
2133 {
2134 // Maximise the number of colours
2135 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2136 optResource = child;
2137 }
2138 break;
2139 }
2140 #endif
2141 #ifdef wx_max
2142 case RESOURCE_PLATFORM_MAC:
2143 {
2144 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2145 optResource = child;
2146 else
2147 {
2148 // Maximise the number of colours
2149 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2150 optResource = child;
2151 }
2152 break;
2153 }
2154 #endif
2155 default:
2156 break;
2157 }
2158 node = node->Next();
2159 }
2160 // If no matching resource, fail.
2161 if (!optResource)
2162 return wxNullBitmap;
2163
2164 wxString name = optResource->GetName();
2165 int bitmapType = (int)optResource->GetValue1();
2166 switch (bitmapType)
2167 {
2168 case wxBITMAP_TYPE_XBM_DATA:
2169 {
2170 #ifdef __WXGTK__
2171 wxItemResource *item = table->FindResource(name);
2172 if (!item)
2173 {
2174 wxLogWarning(_("Failed to find XBM resource %s.\n"
2175 "Forgot to use wxResourceLoadBitmapData?"), (const wxChar*) name);
2176 return wxNullBitmap;
2177 }
2178 return wxBitmap(item->GetValue1(), (int)item->GetValue2(), (int)item->GetValue3()) ;
2179 #else
2180 wxLogWarning(_("No XBM facility available!"));
2181 #endif
2182 break;
2183 }
2184 case wxBITMAP_TYPE_XPM_DATA:
2185 {
2186 #if (defined(__WXGTK__)) || (defined(__WXMSW__) && wxUSE_XPM_IN_MSW)
2187 wxItemResource *item = table->FindResource(name);
2188 if (!item)
2189 {
2190 wxLogWarning(_("Failed to find XPM resource %s.\n"
2191 "Forgot to use wxResourceLoadBitmapData?"), (const wxChar*) name);
2192 return wxNullBitmap;
2193 }
2194 return wxBitmap((char **)item->GetValue1());
2195 #else
2196 wxLogWarning(_("No XPM facility available!"));
2197 #endif
2198 break;
2199 }
2200 default:
2201 {
2202 return wxBitmap(name, bitmapType);
2203 break;
2204 }
2205 }
2206 return wxNullBitmap;
2207 }
2208 else
2209 {
2210 wxLogWarning(_("Bitmap resource specification %s not found."), (const wxChar*) resource);
2211 return wxNullBitmap;
2212 }
2213 }
2214
2215 /*
2216 * Load an icon from a wxWindows resource, choosing an optimum
2217 * depth and appropriate type.
2218 */
2219
2220 wxIcon wxResourceCreateIcon(const wxString& resource, wxResourceTable *table)
2221 {
2222 if (!table)
2223 table = wxDefaultResourceTable;
2224
2225 wxItemResource *item = table->FindResource(resource);
2226 if (item)
2227 {
2228 if ((item->GetType() == _T("")) || wxStrcmp(item->GetType(), _T("wxIcon")) != 0)
2229 {
2230 wxLogWarning(_("%s not an icon resource specification."), (const wxChar*) resource);
2231 return wxNullIcon;
2232 }
2233 int thisDepth = wxDisplayDepth();
2234 long thisNoColours = (long)pow(2.0, (double)thisDepth);
2235
2236 wxItemResource *optResource = (wxItemResource *) NULL;
2237
2238 // Try to find optimum icon for this platform/colour depth
2239 wxNode *node = item->GetChildren().First();
2240 while (node)
2241 {
2242 wxItemResource *child = (wxItemResource *)node->Data();
2243 int platform = (int)child->GetValue2();
2244 int noColours = (int)child->GetValue3();
2245 /*
2246 char *name = child->GetName();
2247 int bitmapType = (int)child->GetValue1();
2248 int xRes = child->GetWidth();
2249 int yRes = child->GetHeight();
2250 */
2251
2252 switch (platform)
2253 {
2254 case RESOURCE_PLATFORM_ANY:
2255 {
2256 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2257 optResource = child;
2258 else
2259 {
2260 // Maximise the number of colours.
2261 // If noColours is zero (unspecified), then assume this
2262 // is the right one.
2263 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2264 optResource = child;
2265 }
2266 break;
2267 }
2268 #ifdef __WXMSW__
2269 case RESOURCE_PLATFORM_WINDOWS:
2270 {
2271 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2272 optResource = child;
2273 else
2274 {
2275 // Maximise the number of colours
2276 if ((noColours > 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2277 optResource = child;
2278 }
2279 break;
2280 }
2281 #endif
2282 #ifdef __WXGTK__
2283 case RESOURCE_PLATFORM_X:
2284 {
2285 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2286 optResource = child;
2287 else
2288 {
2289 // Maximise the number of colours
2290 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2291 optResource = child;
2292 }
2293 break;
2294 }
2295 #endif
2296 #ifdef wx_max
2297 case RESOURCE_PLATFORM_MAC:
2298 {
2299 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2300 optResource = child;
2301 else
2302 {
2303 // Maximise the number of colours
2304 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2305 optResource = child;
2306 }
2307 break;
2308 }
2309 #endif
2310 default:
2311 break;
2312 }
2313 node = node->Next();
2314 }
2315 // If no matching resource, fail.
2316 if (!optResource)
2317 return wxNullIcon;
2318
2319 wxString name = optResource->GetName();
2320 int bitmapType = (int)optResource->GetValue1();
2321 switch (bitmapType)
2322 {
2323 case wxBITMAP_TYPE_XBM_DATA:
2324 {
2325 #ifdef __WXGTK__
2326 wxItemResource *item = table->FindResource(name);
2327 if (!item)
2328 {
2329 wxLogWarning(_("Failed to find XBM resource %s.\n"
2330 "Forgot to use wxResourceLoadIconData?"), (const wxChar*) name);
2331 return wxNullIcon;
2332 }
2333 return wxIcon((const char **)item->GetValue1(), (int)item->GetValue2(), (int)item->GetValue3());
2334 #else
2335 wxLogWarning(_("No XBM facility available!"));
2336 #endif
2337 break;
2338 }
2339 case wxBITMAP_TYPE_XPM_DATA:
2340 {
2341 // *** XPM ICON NOT YET IMPLEMENTED IN WXWINDOWS ***
2342 /*
2343 #if (defined(__WXGTK__)) || (defined(__WXMSW__) && wxUSE_XPM_IN_MSW)
2344 wxItemResource *item = table->FindResource(name);
2345 if (!item)
2346 {
2347 char buf[400];
2348 sprintf(buf, _("Failed to find XPM resource %s.\nForgot to use wxResourceLoadIconData?"), name);
2349 wxLogWarning(buf);
2350 return NULL;
2351 }
2352 return wxIcon((char **)item->GetValue1());
2353 #else
2354 wxLogWarning(_("No XPM facility available!"));
2355 #endif
2356 */
2357 wxLogWarning(_("No XPM icon facility available!"));
2358 break;
2359 }
2360 default:
2361 {
2362 #ifdef __WXGTK__
2363 wxLogWarning(_("Icon resource specification %s not found."), (const wxChar*) resource);
2364 #else
2365 return wxIcon(name, bitmapType);
2366 #endif
2367 break;
2368 }
2369 }
2370 return wxNullIcon;
2371 }
2372 else
2373 {
2374 wxLogWarning(_("Icon resource specification %s not found."), (const wxChar*) resource);
2375 return wxNullIcon;
2376 }
2377 }
2378
2379 wxMenu *wxResourceCreateMenu(wxItemResource *item)
2380 {
2381 wxMenu *menu = new wxMenu;
2382 wxNode *node = item->GetChildren().First();
2383 while (node)
2384 {
2385 wxItemResource *child = (wxItemResource *)node->Data();
2386 if ((child->GetType() != _T("")) && (child->GetType() == _T("wxMenuSeparator")))
2387 menu->AppendSeparator();
2388 else if (child->GetChildren().Number() > 0)
2389 {
2390 wxMenu *subMenu = wxResourceCreateMenu(child);
2391 if (subMenu)
2392 menu->Append((int)child->GetValue1(), child->GetTitle(), subMenu, child->GetValue4());
2393 }
2394 else
2395 {
2396 menu->Append((int)child->GetValue1(), child->GetTitle(), child->GetValue4(), (child->GetValue2() != 0));
2397 }
2398 node = node->Next();
2399 }
2400 return menu;
2401 }
2402
2403 wxMenuBar *wxResourceCreateMenuBar(const wxString& resource, wxResourceTable *table, wxMenuBar *menuBar)
2404 {
2405 if (!table)
2406 table = wxDefaultResourceTable;
2407
2408 wxItemResource *menuResource = table->FindResource(resource);
2409 if (menuResource && (menuResource->GetType() != _T("")) && (menuResource->GetType() == _T("wxMenu")))
2410 {
2411 if (!menuBar)
2412 menuBar = new wxMenuBar;
2413 wxNode *node = menuResource->GetChildren().First();
2414 while (node)
2415 {
2416 wxItemResource *child = (wxItemResource *)node->Data();
2417 wxMenu *menu = wxResourceCreateMenu(child);
2418 if (menu)
2419 menuBar->Append(menu, child->GetTitle());
2420 node = node->Next();
2421 }
2422 return menuBar;
2423 }
2424 return (wxMenuBar *) NULL;
2425 }
2426
2427 wxMenu *wxResourceCreateMenu(const wxString& resource, wxResourceTable *table)
2428 {
2429 if (!table)
2430 table = wxDefaultResourceTable;
2431
2432 wxItemResource *menuResource = table->FindResource(resource);
2433 if (menuResource && (menuResource->GetType() != _T("")) && (menuResource->GetType() == _T("wxMenu")))
2434 // if (menuResource && (menuResource->GetType() == wxTYPE_MENU))
2435 return wxResourceCreateMenu(menuResource);
2436 return (wxMenu *) NULL;
2437 }
2438
2439 // Global equivalents (so don't have to refer to default table explicitly)
2440 bool wxResourceParseData(const wxString& resource, wxResourceTable *table)
2441 {
2442 if (!table)
2443 table = wxDefaultResourceTable;
2444
2445 return table->ParseResourceData(resource);
2446 }
2447
2448 bool wxResourceParseFile(const wxString& filename, wxResourceTable *table)
2449 {
2450 if (!table)
2451 table = wxDefaultResourceTable;
2452
2453 return table->ParseResourceFile(filename);
2454 }
2455
2456 // Register XBM/XPM data
2457 bool wxResourceRegisterBitmapData(const wxString& name, char bits[], int width, int height, wxResourceTable *table)
2458 {
2459 if (!table)
2460 table = wxDefaultResourceTable;
2461
2462 return table->RegisterResourceBitmapData(name, bits, width, height);
2463 }
2464
2465 bool wxResourceRegisterBitmapData(const wxString& name, char **data, wxResourceTable *table)
2466 {
2467 if (!table)
2468 table = wxDefaultResourceTable;
2469
2470 return table->RegisterResourceBitmapData(name, data);
2471 }
2472
2473 void wxResourceClear(wxResourceTable *table)
2474 {
2475 if (!table)
2476 table = wxDefaultResourceTable;
2477
2478 table->ClearTable();
2479 }
2480
2481 /*
2482 * Identifiers
2483 */
2484
2485 bool wxResourceAddIdentifier(const wxString& name, int value, wxResourceTable *table)
2486 {
2487 if (!table)
2488 table = wxDefaultResourceTable;
2489
2490 table->identifiers.Put(name, (wxObject *)value);
2491 return TRUE;
2492 }
2493
2494 int wxResourceGetIdentifier(const wxString& name, wxResourceTable *table)
2495 {
2496 if (!table)
2497 table = wxDefaultResourceTable;
2498
2499 return (int)table->identifiers.Get(name);
2500 }
2501
2502 /*
2503 * Parse #include file for #defines (only)
2504 */
2505
2506 bool wxResourceParseIncludeFile(const wxString& f, wxResourceTable *table)
2507 {
2508 if (!table)
2509 table = wxDefaultResourceTable;
2510
2511 FILE *fd = fopen(f.fn_str(), "r");
2512 if (!fd)
2513 {
2514 return FALSE;
2515 }
2516 while (wxGetResourceToken(fd))
2517 {
2518 if (strcmp(wxResourceBuffer, "#define") == 0)
2519 {
2520 wxGetResourceToken(fd);
2521 wxChar *name = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
2522 wxGetResourceToken(fd);
2523 wxChar *value = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
2524 if (wxIsdigit(value[0]))
2525 {
2526 int val = (int)wxAtol(value);
2527 wxResourceAddIdentifier(name, val, table);
2528 }
2529 delete[] name;
2530 delete[] value;
2531 }
2532 }
2533 fclose(fd);
2534 return TRUE;
2535 }
2536
2537 /*
2538 * Reading strings as if they were .wxr files
2539 */
2540
2541 static int getc_string(char *s)
2542 {
2543 int ch = s[wxResourceStringPtr];
2544 if (ch == 0)
2545 return EOF;
2546 else
2547 {
2548 wxResourceStringPtr ++;
2549 return ch;
2550 }
2551 }
2552
2553 static int ungetc_string()
2554 {
2555 wxResourceStringPtr --;
2556 return 0;
2557 }
2558
2559 bool wxEatWhiteSpaceString(char *s)
2560 {
2561 int ch = 0;
2562
2563 while ((ch = getc_string(s)) != EOF)
2564 {
2565 switch (ch)
2566 {
2567 case ' ':
2568 case 0x0a:
2569 case 0x0d:
2570 case 0x09:
2571 break;
2572 case '/':
2573 {
2574 int prev_ch = ch;
2575 ch = getc_string(s);
2576 if (ch == EOF)
2577 {
2578 ungetc_string();
2579 return TRUE;
2580 }
2581
2582 if (ch == '*')
2583 {
2584 // Eat C comment
2585 prev_ch = 0;
2586 while ((ch = getc_string(s)) != EOF)
2587 {
2588 if (ch == '/' && prev_ch == '*')
2589 break;
2590 prev_ch = ch;
2591 }
2592 }
2593 else
2594 {
2595 ungetc_string();
2596 ungetc_string();
2597 return TRUE;
2598 }
2599 }
2600 break;
2601 default:
2602 ungetc_string();
2603 return TRUE;
2604
2605 }
2606 }
2607 return FALSE;
2608 }
2609
2610 bool wxGetResourceTokenString(char *s)
2611 {
2612 if (!wxResourceBuffer)
2613 wxReallocateResourceBuffer();
2614 wxResourceBuffer[0] = 0;
2615 wxEatWhiteSpaceString(s);
2616
2617 int ch = getc_string(s);
2618 if (ch == '"')
2619 {
2620 // Get string
2621 wxResourceBufferCount = 0;
2622 ch = getc_string(s);
2623 while (ch != '"')
2624 {
2625 int actualCh = ch;
2626 if (ch == EOF)
2627 {
2628 wxResourceBuffer[wxResourceBufferCount] = 0;
2629 return FALSE;
2630 }
2631 // Escaped characters
2632 else if (ch == '\\')
2633 {
2634 int newCh = getc_string(s);
2635 if (newCh == '"')
2636 actualCh = '"';
2637 else if (newCh == 10)
2638 actualCh = 10;
2639 else
2640 {
2641 ungetc_string();
2642 }
2643 }
2644
2645 if (wxResourceBufferCount >= wxResourceBufferSize-1)
2646 wxReallocateResourceBuffer();
2647 wxResourceBuffer[wxResourceBufferCount] = (char)actualCh;
2648 wxResourceBufferCount ++;
2649 ch = getc_string(s);
2650 }
2651 wxResourceBuffer[wxResourceBufferCount] = 0;
2652 }
2653 else
2654 {
2655 wxResourceBufferCount = 0;
2656 // Any other token
2657 while (ch != ' ' && ch != EOF && ch != ' ' && ch != 13 && ch != 9 && ch != 10)
2658 {
2659 if (wxResourceBufferCount >= wxResourceBufferSize-1)
2660 wxReallocateResourceBuffer();
2661 wxResourceBuffer[wxResourceBufferCount] = (char)ch;
2662 wxResourceBufferCount ++;
2663
2664 ch = getc_string(s);
2665 }
2666 wxResourceBuffer[wxResourceBufferCount] = 0;
2667 if (ch == EOF)
2668 return FALSE;
2669 }
2670 return TRUE;
2671 }
2672
2673 /*
2674 * Files are in form:
2675 static char *name = "....";
2676 with possible comments.
2677 */
2678
2679 bool wxResourceReadOneResourceString(char *s, wxExprDatabase& db, bool *eof, wxResourceTable *table)
2680 {
2681 if (!table)
2682 table = wxDefaultResourceTable;
2683
2684 // static or #define
2685 if (!wxGetResourceTokenString(s))
2686 {
2687 *eof = TRUE;
2688 return FALSE;
2689 }
2690
2691 if (strcmp(wxResourceBuffer, "#define") == 0)
2692 {
2693 wxGetResourceTokenString(s);
2694 wxChar *name = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
2695 wxGetResourceTokenString(s);
2696 wxChar *value = copystring(wxConv_libc.cMB2WX(wxResourceBuffer));
2697 if (wxIsalpha(value[0]))
2698 {
2699 int val = (int)wxAtol(value);
2700 wxResourceAddIdentifier(name, val, table);
2701 }
2702 else
2703 {
2704 wxLogWarning(_("#define %s must be an integer."), name);
2705 delete[] name;
2706 delete[] value;
2707 return FALSE;
2708 }
2709 delete[] name;
2710 delete[] value;
2711
2712 return TRUE;
2713 }
2714 /*
2715 else if (strcmp(wxResourceBuffer, "#include") == 0)
2716 {
2717 wxGetResourceTokenString(s);
2718 char *name = copystring(wxResourceBuffer);
2719 char *actualName = name;
2720 if (name[0] == '"')
2721 actualName = name + 1;
2722 int len = strlen(name);
2723 if ((len > 0) && (name[len-1] == '"'))
2724 name[len-1] = 0;
2725 if (!wxResourceParseIncludeFile(actualName, table))
2726 {
2727 char buf[400];
2728 sprintf(buf, _("Could not find resource include file %s."), actualName);
2729 wxLogWarning(buf);
2730 }
2731 delete[] name;
2732 return TRUE;
2733 }
2734 */
2735 else if (strcmp(wxResourceBuffer, "static") != 0)
2736 {
2737 wxChar buf[300];
2738 wxStrcpy(buf, _("Found "));
2739 wxStrncat(buf, wxConv_libc.cMB2WX(wxResourceBuffer), 30);
2740 wxStrcat(buf, _(", expected static, #include or #define\nwhilst parsing resource."));
2741 wxLogWarning(buf);
2742 return FALSE;
2743 }
2744
2745 // char
2746 if (!wxGetResourceTokenString(s))
2747 {
2748 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
2749 *eof = TRUE;
2750 return FALSE;
2751 }
2752
2753 if (strcmp(wxResourceBuffer, "char") != 0)
2754 {
2755 wxLogWarning(_("Expected 'char' whilst parsing resource."));
2756 return FALSE;
2757 }
2758
2759 // *name
2760 if (!wxGetResourceTokenString(s))
2761 {
2762 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
2763 *eof = TRUE;
2764 return FALSE;
2765 }
2766
2767 if (wxResourceBuffer[0] != '*')
2768 {
2769 wxLogWarning(_("Expected '*' whilst parsing resource."));
2770 return FALSE;
2771 }
2772 wxChar nameBuf[100];
2773 wxMB2WX(nameBuf, wxResourceBuffer+1, 99);
2774 nameBuf[99] = 0;
2775
2776 // =
2777 if (!wxGetResourceTokenString(s))
2778 {
2779 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
2780 *eof = TRUE;
2781 return FALSE;
2782 }
2783
2784 if (strcmp(wxResourceBuffer, "=") != 0)
2785 {
2786 wxLogWarning(_("Expected '=' whilst parsing resource."));
2787 return FALSE;
2788 }
2789
2790 // String
2791 if (!wxGetResourceTokenString(s))
2792 {
2793 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
2794 *eof = TRUE;
2795 return FALSE;
2796 }
2797 else
2798 {
2799 if (!db.ReadPrologFromString(wxResourceBuffer))
2800 {
2801 wxLogWarning(_("%s: ill-formed resource file syntax."), nameBuf);
2802 return FALSE;
2803 }
2804 }
2805 // Semicolon
2806 if (!wxGetResourceTokenString(s))
2807 {
2808 *eof = TRUE;
2809 }
2810 return TRUE;
2811 }
2812
2813 bool wxResourceParseString(char *s, wxResourceTable *table)
2814 {
2815 if (!table)
2816 table = wxDefaultResourceTable;
2817
2818 if (!s)
2819 return FALSE;
2820
2821 // Turn backslashes into spaces
2822 if (s)
2823 {
2824 int len = strlen(s);
2825 int i;
2826 for (i = 0; i < len; i++)
2827 if (s[i] == 92 && s[i+1] == 13)
2828 {
2829 s[i] = ' ';
2830 s[i+1] = ' ';
2831 }
2832 }
2833
2834 wxExprDatabase db;
2835 wxResourceStringPtr = 0;
2836
2837 bool eof = FALSE;
2838 while (wxResourceReadOneResourceString(s, db, &eof, table) && !eof)
2839 {
2840 // Loop
2841 }
2842 return wxResourceInterpretResources(*table, db);
2843 }
2844
2845 /*
2846 * resource loading facility
2847 */
2848
2849 bool wxWindowBase::LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table)
2850 {
2851 if (!table)
2852 table = wxDefaultResourceTable;
2853
2854 wxItemResource *resource = table->FindResource((const wxChar *)resourceName);
2855 // if (!resource || (resource->GetType() != wxTYPE_DIALOG_BOX))
2856 if (!resource || (resource->GetType() == _T("")) ||
2857 ! ((resource->GetType() == _T("wxDialog")) || (resource->GetType() == _T("wxPanel"))))
2858 return FALSE;
2859
2860 wxString title(resource->GetTitle());
2861 long theWindowStyle = resource->GetStyle();
2862 bool isModal = (resource->GetValue1() != 0);
2863 int x = resource->GetX();
2864 int y = resource->GetY();
2865 int width = resource->GetWidth();
2866 int height = resource->GetHeight();
2867 wxString name = resource->GetName();
2868
2869 if (IsKindOf(CLASSINFO(wxDialog)))
2870 {
2871 wxDialog *dialogBox = (wxDialog *)this;
2872 long modalStyle = isModal ? wxDIALOG_MODAL : 0;
2873 if (!dialogBox->Create(parent, -1, title, wxPoint(x, y), wxSize(width, height), theWindowStyle|modalStyle, name))
2874 return FALSE;
2875
2876 // Only reset the client size if we know we're not going to do it again below.
2877 if ((resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) == 0)
2878 dialogBox->SetClientSize(width, height);
2879 }
2880 else if (IsKindOf(CLASSINFO(wxPanel)))
2881 {
2882 wxPanel* panel = (wxPanel *)this;
2883 if (!panel->Create(parent, -1, wxPoint(x, y), wxSize(width, height), theWindowStyle, name))
2884 return FALSE;
2885 }
2886 else
2887 {
2888 if (!((wxWindow *)this)->Create(parent, -1, wxPoint(x, y), wxSize(width, height), theWindowStyle, name))
2889 return FALSE;
2890 }
2891
2892 if ((resource->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0)
2893 {
2894 // No need to do this since it's done in wxPanel or wxDialog constructor.
2895 // SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
2896 }
2897 else
2898 {
2899 if (resource->GetFont().Ok())
2900 SetFont(resource->GetFont());
2901 if (resource->GetBackgroundColour().Ok())
2902 SetBackgroundColour(resource->GetBackgroundColour());
2903 }
2904
2905 // Should have some kind of font at this point
2906 if (!GetFont().Ok())
2907 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
2908 if (!GetBackgroundColour().Ok())
2909 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
2910
2911 // Only when we've created the window and set the font can we set the correct size,
2912 // if based on dialog units.
2913 if ((resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
2914 {
2915 wxSize sz = ConvertDialogToPixels(wxSize(width, height));
2916 SetClientSize(sz.x, sz.y);
2917
2918 wxPoint pt = ConvertDialogToPixels(wxPoint(x, y));
2919 Move(pt.x, pt.y);
2920 }
2921
2922 // Now create children
2923 wxNode *node = resource->GetChildren().First();
2924 while (node)
2925 {
2926 wxItemResource *childResource = (wxItemResource *)node->Data();
2927
2928 (void) CreateItem(childResource, resource, table);
2929
2930 node = node->Next();
2931 }
2932 return TRUE;
2933 }
2934
2935 wxControl *wxWindowBase::CreateItem(const wxItemResource *resource, const wxItemResource* parentResource, const wxResourceTable *table)
2936 {
2937 if (!table)
2938 table = wxDefaultResourceTable;
2939 return table->CreateItem((wxWindow *)this, resource, parentResource);
2940 }
2941
2942 #ifdef __VISUALC__
2943 #pragma warning(default:4706) // assignment within conditional expression
2944 #endif // VC++
2945
2946 #endif
2947 // BC++/Win16
2948
2949 #endif // wxUSE_WX_RESOURCES