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