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