]> git.saurik.com Git - wxWidgets.git/blame - src/common/resource.cpp
Another one bites the dust.
[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{
169 wxItemResource *item = (wxItemResource *)Get((char *)(const char *)name);
170 return item;
171}
172
173void wxResourceTable::AddResource(wxItemResource *item)
174{
fd71308f
JS
175 wxString name = item->GetName();
176 if (name == "")
aad5220b 177 name = item->GetTitle();
fd71308f 178 if (name == "")
aad5220b
JS
179 name = "no name";
180
181 // Delete existing resource, if any.
182 Delete(name);
183
184 Put(name, item);
185}
186
187bool wxResourceTable::DeleteResource(const wxString& name)
188{
189 wxItemResource *item = (wxItemResource *)Delete((char *)(const char *)name);
190 if (item)
191 {
192 // See if any resource has this as its child; if so, delete from
193 // parent's child list.
194 BeginFind();
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
fd71308f 217 FILE *fd = fopen((const char*) filename, "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);
246 item->SetType("wxXBMData");
247 item->SetName(name);
248 item->SetValue1((long)bits);
249 item->SetValue2((long)width);
250 item->SetValue3((long)height);
251 AddResource(item);
252 return TRUE;
253}
254
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);
260 item->SetType("wxXPMData");
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
aad5220b
JS
310 if (itemType == wxString("wxButton") || itemType == wxString("wxBitmapButton"))
311 {
fd71308f 312 if (childResource->GetValue4() != "")
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 }
330 else if (itemType == wxString("wxMessage") || itemType == wxString("wxStaticText") ||
e17e4f28 331 itemType == wxString("wxStaticBitmap"))
aad5220b 332 {
fd71308f 333 if (childResource->GetValue4() != "")
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 }
354 else if (itemType == wxString("wxText") || itemType == wxString("wxTextCtrl") || itemType == wxString("wxMultiText"))
355 {
fd71308f 356 control = new wxTextCtrl(parent, id, childResource->GetValue4(), pos, size,
aad5220b
JS
357 childResource->GetStyle(), wxDefaultValidator, childResource->GetName());
358 }
359 else if (itemType == wxString("wxCheckBox"))
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
aad5220b
JS
367 else if (itemType == wxString("wxGauge"))
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
aad5220b
JS
376 else if (itemType == wxString("wxRadioButton"))
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
aad5220b
JS
384 else if (itemType == wxString("wxScrollBar"))
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
399 else if (itemType == wxString("wxSlider"))
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 }
405 else if (itemType == wxString("wxGroupBox") || itemType == wxString("wxStaticBox"))
406 {
fd71308f 407 control = new wxStaticBox(parent, id, childResource->GetTitle(), pos, size,
aad5220b
JS
408 childResource->GetStyle(), childResource->GetName());
409 }
410 else if (itemType == wxString("wxListBox"))
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 {
423 strings[i] = (char *)node->Data();
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 }
434 else if (itemType == wxString("wxChoice"))
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 {
447 strings[i] = (char *)node->Data();
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
aad5220b
JS
459 else if (itemType == wxString("wxComboBox"))
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 {
472 strings[i] = (char *)node->Data();
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
484 else if (itemType == wxString("wxRadioBox"))
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 {
497 strings[i] = (char *)node->Data();
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;
aad5220b
JS
535 if (functor == "dialog")
536 item = wxResourceInterpretDialog(table, clause);
537 else if (functor == "panel")
538 item = wxResourceInterpretDialog(table, clause, TRUE);
539 else if (functor == "menubar")
540 item = wxResourceInterpretMenuBar(table, clause);
541 else if (functor == "menu")
542 item = wxResourceInterpretMenu(table, clause);
543 else if (functor == "string")
544 item = wxResourceInterpretString(table, clause);
545 else if (functor == "bitmap")
546 item = wxResourceInterpretBitmap(table, clause);
547 else if (functor == "icon")
548 item = wxResourceInterpretIcon(table, clause);
549
550 if (item)
551 {
552 // Remove any existing resource of same name
fd71308f 553 if (item->GetName() != "")
aad5220b
JS
554 table.DeleteResource(item->GetName());
555 table.AddResource(item);
556 }
557 node = node->Next();
558 }
559 return TRUE;
560}
561
09914df7
VZ
562static const char *g_ValidControlClasses[] =
563{
564 "wxButton",
565 "wxBitmapButton",
566 "wxMessage",
567 "wxStaticText",
568 "wxStaticBitmap",
569 "wxText",
570 "wxTextCtrl",
571 "wxMultiText",
572 "wxListBox",
573 "wxRadioBox",
574 "wxRadioButton",
575 "wxCheckBox",
576 "wxBitmapCheckBox",
577 "wxGroupBox",
578 "wxStaticBox",
579 "wxSlider",
580 "wxGauge",
581 "wxScrollBar",
582 "wxChoice",
583 "wxComboBox"
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)
600 dialogItem->SetType("wxPanel");
601 else
602 dialogItem->SetType("wxDialog");
fd71308f
JS
603 wxString style = "";
604 wxString title = "";
605 wxString name = "";
606 wxString backColourHex = "";
607 wxString labelColourHex = "";
608 wxString buttonColourHex = "";
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;
619 expr->GetAttributeValue("style", style);
620 expr->GetAttributeValue("name", name);
621 expr->GetAttributeValue("title", title);
622 expr->GetAttributeValue("x", x);
623 expr->GetAttributeValue("y", y);
624 expr->GetAttributeValue("width", width);
625 expr->GetAttributeValue("height", height);
626 expr->GetAttributeValue("modal", isModal);
627 expr->GetAttributeValue("label_font", &labelFontExpr);
628 expr->GetAttributeValue("button_font", &buttonFontExpr);
629 expr->GetAttributeValue("font", &fontExpr);
630 expr->GetAttributeValue("background_colour", backColourHex);
631 expr->GetAttributeValue("label_colour", labelColourHex);
632 expr->GetAttributeValue("button_colour", buttonColourHex);
633
634 int useDialogUnits = 0;
635 expr->GetAttributeValue("use_dialog_units", useDialogUnits);
636 if (useDialogUnits != 0)
637 dialogItem->SetResourceStyle(dialogItem->GetResourceStyle() | wxRESOURCE_DIALOG_UNITS);
638
639 int useDefaults = 0;
640 expr->GetAttributeValue("use_system_defaults", useDefaults);
641 if (useDefaults != 0)
642 dialogItem->SetResourceStyle(dialogItem->GetResourceStyle() | wxRESOURCE_USE_DEFAULTS);
aad5220b 643
bbcdf8bc
JS
644 long id = 0;
645 expr->GetAttributeValue("id", id);
646 dialogItem->SetId(id);
647
fd71308f 648 if (style != "")
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
fd71308f 658 if (backColourHex != "")
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 }
fd71308f 668 if (labelColourHex != "")
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 }
fd71308f 678 if (buttonColourHex != "")
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());
703 if (controlKeyword != "" && controlKeyword == "control")
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)"),
756 (const char*) expr1->StringValue());
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
821 if (controlType == "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);
832 controlItem->SetType("wxBitmapButton");
833 }
3013b6f4
JS
834 }
835 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
836 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
837 }
838 else if (controlType == "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 }
850 else if (controlType == "wxCheckBox")
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
aad5220b
JS
862 else if (controlType == "wxRadioButton")
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
8d71b555 874 else if (controlType == "wxText" || controlType == "wxTextCtrl" || controlType == "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
JS
892 }
893 else if (controlType == "wxMessage" || controlType == "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 ++;
901 controlItem->SetType("wxStaticText");
902 }
903 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
904 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
905 }
906 else if (controlType == "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
JS
917 }
918 else if (controlType == "wxGroupBox" || controlType == "wxStaticBox")
919 {
920 if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList)
921 controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count)));
922 }
923 else if (controlType == "wxGauge")
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
JS
948 }
949 else if (controlType == "wxSlider")
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
JS
981 }
982 else if (controlType == "wxScrollBar")
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
JS
1008 }
1009 else if (controlType == "wxListBox")
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
JS
1050 }
1051 else if (controlType == "wxChoice")
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
aad5220b
JS
1079 else if (controlType == "wxComboBox")
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
aad5220b
JS
1117 else if (controlType == "wxRadioBox")
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);
1181 item->SetType("wxMenuSeparator");
1182 return item;
1183 }
1184 else
1185 {
1186// item->SetType(wxTYPE_MENU); // Well, menu item, but doesn't matter.
1187 item->SetType("wxMenu"); // Well, menu item, but doesn't matter.
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)"),
1206 (const char*) 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
JS
1259 wxExpr *listExpr = (wxExpr *) NULL;
1260 expr->GetAttributeValue("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;
1270 if (expr->GetAttributeValue("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
JS
1280 wxExpr *listExpr = (wxExpr *) NULL;
1281 expr->GetAttributeValue("menu", &listExpr);
aad5220b 1282 if (!listExpr)
c67daf87 1283 return (wxItemResource *) NULL;
aad5220b
JS
1284
1285 wxItemResource *resource = new wxItemResource;
1286 resource->SetType("wxMenu");
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
JS
1297 wxString name;
1298 if (expr->GetAttributeValue("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);
1315 bitmapItem->SetType("wxBitmap");
fd71308f
JS
1316 wxString name;
1317 if (expr->GetAttributeValue("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());
1328 if (bitmapKeyword == "bitmap" || bitmapKeyword == "icon")
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);
1336 bitmapSpec->SetType("wxBitmap");
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);
2432b92d 1346 if (nameExpr && nameExpr->StringValue() != "")
47fa7969 1347 {
fd71308f 1348 bitmapSpec->SetName(nameExpr->StringValue());
47fa7969 1349 }
2432b92d 1350 if (typeExpr && typeExpr->StringValue() != "")
47fa7969 1351 {
fd71308f 1352 bitmapSpec->SetValue1(wxParseWindowStyle(typeExpr->StringValue()));
47fa7969 1353 }
aad5220b
JS
1354 else
1355 bitmapSpec->SetValue1(0);
8bbe427f 1356
2432b92d 1357 if (platformExpr && platformExpr->StringValue() != "")
aad5220b
JS
1358 {
1359 wxString plat(platformExpr->StringValue());
1360 if (plat == "windows" || plat == "WINDOWS")
1361 bitmapSpec->SetValue2(RESOURCE_PLATFORM_WINDOWS);
1362 else if (plat == "x" || plat == "X")
1363 bitmapSpec->SetValue2(RESOURCE_PLATFORM_X);
1364 else if (plat == "mac" || plat == "MAC")
1365 bitmapSpec->SetValue2(RESOURCE_PLATFORM_MAC);
1366 else
1367 bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY);
1368 }
1369 else
1370 bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY);
1371
1372 if (coloursExpr)
1373 bitmapSpec->SetValue3(coloursExpr->IntegerValue());
1374 int xres = 0;
1375 int yres = 0;
1376 if (xresExpr)
1377 xres = (int)xresExpr->IntegerValue();
1378 if (yresExpr)
1379 yres = (int)yresExpr->IntegerValue();
1380 bitmapSpec->SetSize(0, 0, xres, yres);
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);
1398 item->SetType("wxIcon");
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;
1416 wxString faceName("");
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);
1607 char *name = copystring(wxResourceBuffer);
1608 wxGetResourceToken(fd);
1609 char *value = copystring(wxResourceBuffer);
1610 if (isalpha(value[0]))
1611 {
1612 int val = (int)atol(value);
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);
1630 char *name = copystring(wxResourceBuffer);
1631 char *actualName = name;
1632 if (name[0] == '"')
1633 actualName = name + 1;
1634 int len = strlen(name);
1635 if ((len > 0) && (name[len-1] == '"'))
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 {
1646 char buf[300];
1a5a8367 1647 strcpy(buf, _("Found "));
aad5220b 1648 strncat(buf, wxResourceBuffer, 30);
1a5a8367 1649 strcat(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 }
1681 char nameBuf[100];
1682 strncpy(nameBuf, wxResourceBuffer+1, 99);
8bbe427f 1683
aad5220b
JS
1684 // =
1685 if (!wxGetResourceToken(fd))
1686 {
e17e4f28 1687 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
1688 *eof = TRUE;
1689 return FALSE;
1690 }
1691
1692 if (strcmp(wxResourceBuffer, "=") != 0)
1693 {
e17e4f28 1694 wxLogWarning(_("Expected '=' whilst parsing resource."));
aad5220b
JS
1695 return FALSE;
1696 }
1697
1698 // String
1699 if (!wxGetResourceToken(fd))
1700 {
e17e4f28 1701 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
1702 *eof = TRUE;
1703 return FALSE;
1704 }
1705 else
1706 {
1707 if (!db.ReadPrologFromString(wxResourceBuffer))
1708 {
e17e4f28 1709 wxLogWarning(_("%s: ill-formed resource file syntax."), nameBuf);
aad5220b
JS
1710 return FALSE;
1711 }
1712 }
1713 // Semicolon
1714 if (!wxGetResourceToken(fd))
1715 {
1716 *eof = TRUE;
1717 }
1718 return TRUE;
1719}
1720
1721/*
1722 * Parses string window style into integer window style
1723 */
8bbe427f 1724
aad5220b
JS
1725/*
1726 * Style flag parsing, e.g.
1727 * "wxSYSTEM_MENU | wxBORDER" -> integer
1728 */
1729
fd71308f 1730char* wxResourceParseWord(char*s, int *i)
aad5220b
JS
1731{
1732 if (!s)
fd71308f 1733 return (char*) NULL;
aad5220b
JS
1734
1735 static char buf[150];
1736 int len = strlen(s);
1737 int j = 0;
1738 int ii = *i;
1739 while ((ii < len) && (isalpha(s[ii]) || (s[ii] == '_')))
1740 {
1741 buf[j] = s[ii];
1742 j ++;
1743 ii ++;
1744 }
1745 buf[j] = 0;
1746
1747 // Eat whitespace and conjunction characters
1748 while ((ii < len) &&
1749 ((s[ii] == ' ') || (s[ii] == '|') || (s[ii] == ',')))
1750 {
1751 ii ++;
1752 }
1753 *i = ii;
1754 if (j == 0)
fd71308f 1755 return (char*) NULL;
aad5220b
JS
1756 else
1757 return buf;
1758}
1759
1760struct wxResourceBitListStruct
1761{
1762 char *word;
1763 long bits;
1764};
1765
1766static wxResourceBitListStruct wxResourceBitListTable[] =
1767{
1768 /* wxListBox */
1769 { "wxSINGLE", wxLB_SINGLE },
1770 { "wxMULTIPLE", wxLB_MULTIPLE },
1771 { "wxEXTENDED", wxLB_EXTENDED },
1772 { "wxLB_SINGLE", wxLB_SINGLE },
1773 { "wxLB_MULTIPLE", wxLB_MULTIPLE },
1774 { "wxLB_EXTENDED", wxLB_EXTENDED },
aad5220b
JS
1775 { "wxLB_NEEDED_SB", wxLB_NEEDED_SB },
1776 { "wxLB_ALWAYS_SB", wxLB_ALWAYS_SB },
1777 { "wxLB_SORT", wxLB_SORT },
607d9061
JS
1778 { "wxLB_OWNERDRAW", wxLB_OWNERDRAW },
1779 { "wxLB_HSCROLL", wxLB_HSCROLL },
8bbe427f 1780
aad5220b
JS
1781 /* wxComboxBox */
1782 { "wxCB_SIMPLE", wxCB_SIMPLE },
1783 { "wxCB_DROPDOWN", wxCB_DROPDOWN },
607d9061 1784 { "wxCB_READONLY", wxCB_READONLY },
aad5220b 1785 { "wxCB_SORT", wxCB_SORT },
8bbe427f 1786
aad5220b
JS
1787 /* wxGauge */
1788 { "wxGA_PROGRESSBAR", wxGA_PROGRESSBAR },
607d9061
JS
1789 { "wxGA_HORIZONTAL", wxGA_HORIZONTAL },
1790 { "wxGA_VERTICAL", wxGA_VERTICAL },
aad5220b
JS
1791
1792 /* wxTextCtrl */
1793 { "wxPASSWORD", wxPASSWORD},
1794 { "wxPROCESS_ENTER", wxPROCESS_ENTER},
1795 { "wxTE_PASSWORD", wxTE_PASSWORD},
1796 { "wxTE_READONLY", wxTE_READONLY},
1797 { "wxTE_PROCESS_ENTER", wxTE_PROCESS_ENTER},
607d9061 1798 { "wxTE_MULTILINE", wxTE_MULTILINE},
aad5220b 1799
607d9061 1800 /* wxRadioBox/wxRadioButton */
aad5220b 1801 { "wxRB_GROUP", wxRB_GROUP },
94b49b93
JS
1802 { "wxRA_SPECIFY_COLS", wxRA_SPECIFY_COLS },
1803 { "wxRA_SPECIFY_ROWS", wxRA_SPECIFY_ROWS },
607d9061
JS
1804 { "wxRA_HORIZONTAL", wxRA_HORIZONTAL },
1805 { "wxRA_VERTICAL", wxRA_VERTICAL },
1806
1807 /* wxSlider */
1808 { "wxSL_HORIZONTAL", wxSL_HORIZONTAL },
1809 { "wxSL_VERTICAL", wxSL_VERTICAL },
1810 { "wxSL_AUTOTICKS", wxSL_AUTOTICKS },
1811 { "wxSL_LABELS", wxSL_LABELS },
1812 { "wxSL_LEFT", wxSL_LEFT },
1813 { "wxSL_TOP", wxSL_TOP },
1814 { "wxSL_RIGHT", wxSL_RIGHT },
1815 { "wxSL_BOTTOM", wxSL_BOTTOM },
1816 { "wxSL_BOTH", wxSL_BOTH },
1817 { "wxSL_SELRANGE", wxSL_SELRANGE },
1818
1819 /* wxScrollBar */
1820 { "wxSB_HORIZONTAL", wxSB_HORIZONTAL },
1821 { "wxSB_VERTICAL", wxSB_VERTICAL },
1822
1823 /* wxButton */
1824 { "wxBU_AUTODRAW", wxBU_AUTODRAW },
1825 { "wxBU_NOAUTODRAW", wxBU_NOAUTODRAW },
1826
1827 /* wxTreeCtrl */
1828 { "wxTR_HAS_BUTTONS", wxTR_HAS_BUTTONS },
1829 { "wxTR_EDIT_LABELS", wxTR_EDIT_LABELS },
bbcdf8bc 1830 { "wxTR_LINES_AT_ROOT", wxTR_LINES_AT_ROOT },
607d9061
JS
1831
1832 /* wxListCtrl */
1833 { "wxLC_ICON", wxLC_ICON },
1834 { "wxLC_SMALL_ICON", wxLC_SMALL_ICON },
1835 { "wxLC_LIST", wxLC_LIST },
1836 { "wxLC_REPORT", wxLC_REPORT },
1837 { "wxLC_ALIGN_TOP", wxLC_ALIGN_TOP },
1838 { "wxLC_ALIGN_LEFT", wxLC_ALIGN_LEFT },
1839 { "wxLC_AUTOARRANGE", wxLC_AUTOARRANGE },
1840 { "wxLC_USER_TEXT", wxLC_USER_TEXT },
1841 { "wxLC_EDIT_LABELS", wxLC_EDIT_LABELS },
1842 { "wxLC_NO_HEADER", wxLC_NO_HEADER },
1843 { "wxLC_NO_SORT_HEADER", wxLC_NO_SORT_HEADER },
1844 { "wxLC_SINGLE_SEL", wxLC_SINGLE_SEL },
1845 { "wxLC_SORT_ASCENDING", wxLC_SORT_ASCENDING },
1846 { "wxLC_SORT_DESCENDING", wxLC_SORT_DESCENDING },
1847
1848 /* wxSpinButton */
1849 { "wxSP_VERTICAL", wxSP_VERTICAL},
1850 { "wxSP_HORIZONTAL", wxSP_HORIZONTAL},
1851 { "wxSP_ARROW_KEYS", wxSP_ARROW_KEYS},
1852 { "wxSP_WRAP", wxSP_WRAP},
1853
1854 /* wxSplitterWnd */
1855 { "wxSP_NOBORDER", wxSP_NOBORDER},
1856 { "wxSP_3D", wxSP_3D},
1857 { "wxSP_BORDER", wxSP_BORDER},
1858
1859 /* wxTabCtrl */
1860 { "wxTC_MULTILINE", wxTC_MULTILINE},
1861 { "wxTC_RIGHTJUSTIFY", wxTC_RIGHTJUSTIFY},
1862 { "wxTC_FIXEDWIDTH", wxTC_FIXEDWIDTH},
1863 { "wxTC_OWNERDRAW", wxTC_OWNERDRAW},
1864
1865 /* wxStatusBar95 */
1866 { "wxST_SIZEGRIP", wxST_SIZEGRIP},
1867
1868 /* wxControl */
aad5220b
JS
1869 { "wxFIXED_LENGTH", wxFIXED_LENGTH},
1870 { "wxALIGN_LEFT", wxALIGN_LEFT},
1871 { "wxALIGN_CENTER", wxALIGN_CENTER},
1872 { "wxALIGN_CENTRE", wxALIGN_CENTRE},
1873 { "wxALIGN_RIGHT", wxALIGN_RIGHT},
607d9061 1874 { "wxCOLOURED", wxCOLOURED},
8bbe427f 1875
aad5220b
JS
1876 /* wxToolBar */
1877 { "wxTB_3DBUTTONS", wxTB_3DBUTTONS},
bbcdf8bc
JS
1878 { "wxTB_HORIZONTAL", wxTB_HORIZONTAL},
1879 { "wxTB_VERTICAL", wxTB_VERTICAL},
1880 { "wxTB_FLAT", wxTB_FLAT},
aad5220b
JS
1881
1882 /* Generic */
1883 { "wxVSCROLL", wxVSCROLL },
1884 { "wxHSCROLL", wxHSCROLL },
1885 { "wxCAPTION", wxCAPTION },
1886 { "wxSTAY_ON_TOP", wxSTAY_ON_TOP},
1887 { "wxICONIZE", wxICONIZE},
1888 { "wxMINIMIZE", wxICONIZE},
1889 { "wxMAXIMIZE", wxMAXIMIZE},
1890 { "wxSDI", 0},
1891 { "wxMDI_PARENT", 0},
1892 { "wxMDI_CHILD", 0},
1893 { "wxTHICK_FRAME", wxTHICK_FRAME},
1894 { "wxRESIZE_BORDER", wxRESIZE_BORDER},
1895 { "wxSYSTEM_MENU", wxSYSTEM_MENU},
1896 { "wxMINIMIZE_BOX", wxMINIMIZE_BOX},
1897 { "wxMAXIMIZE_BOX", wxMAXIMIZE_BOX},
1898 { "wxRESIZE_BOX", wxRESIZE_BOX},
f5419957
JS
1899 { "wxDEFAULT_FRAME_STYLE", wxDEFAULT_FRAME_STYLE},
1900 { "wxDEFAULT_FRAME", wxDEFAULT_FRAME_STYLE},
aad5220b
JS
1901 { "wxDEFAULT_DIALOG_STYLE", wxDEFAULT_DIALOG_STYLE},
1902 { "wxBORDER", wxBORDER},
1903 { "wxRETAINED", wxRETAINED},
aad5220b
JS
1904 { "wxNATIVE_IMPL", 0},
1905 { "wxEXTENDED_IMPL", 0},
1906 { "wxBACKINGSTORE", wxBACKINGSTORE},
1907// { "wxFLAT", wxFLAT},
1908// { "wxMOTIF_RESIZE", wxMOTIF_RESIZE},
607d9061
JS
1909 { "wxFIXED_LENGTH", 0},
1910 { "wxDOUBLE_BORDER", wxDOUBLE_BORDER},
1911 { "wxSUNKEN_BORDER", wxSUNKEN_BORDER},
1912 { "wxRAISED_BORDER", wxRAISED_BORDER},
1913 { "wxSIMPLE_BORDER", wxSIMPLE_BORDER},
1914 { "wxSTATIC_BORDER", wxSTATIC_BORDER},
1915 { "wxTRANSPARENT_WINDOW", wxTRANSPARENT_WINDOW},
1916 { "wxNO_BORDER", wxNO_BORDER},
1917 { "wxCLIP_CHILDREN", wxCLIP_CHILDREN},
aad5220b 1918
aad5220b
JS
1919 { "wxTINY_CAPTION_HORIZ", wxTINY_CAPTION_HORIZ},
1920 { "wxTINY_CAPTION_VERT", wxTINY_CAPTION_VERT},
1921
1922 // Text font families
1923 { "wxDEFAULT", wxDEFAULT},
1924 { "wxDECORATIVE", wxDECORATIVE},
1925 { "wxROMAN", wxROMAN},
1926 { "wxSCRIPT", wxSCRIPT},
1927 { "wxSWISS", wxSWISS},
1928 { "wxMODERN", wxMODERN},
1929 { "wxTELETYPE", wxTELETYPE},
1930 { "wxVARIABLE", wxVARIABLE},
1931 { "wxFIXED", wxFIXED},
1932 { "wxNORMAL", wxNORMAL},
1933 { "wxLIGHT", wxLIGHT},
1934 { "wxBOLD", wxBOLD},
1935 { "wxITALIC", wxITALIC},
1936 { "wxSLANT", wxSLANT},
1937 { "wxSOLID", wxSOLID},
1938 { "wxDOT", wxDOT},
1939 { "wxLONG_DASH", wxLONG_DASH},
1940 { "wxSHORT_DASH", wxSHORT_DASH},
1941 { "wxDOT_DASH", wxDOT_DASH},
1942 { "wxUSER_DASH", wxUSER_DASH},
1943 { "wxTRANSPARENT", wxTRANSPARENT},
1944 { "wxSTIPPLE", wxSTIPPLE},
1945 { "wxBDIAGONAL_HATCH", wxBDIAGONAL_HATCH},
1946 { "wxCROSSDIAG_HATCH", wxCROSSDIAG_HATCH},
1947 { "wxFDIAGONAL_HATCH", wxFDIAGONAL_HATCH},
1948 { "wxCROSS_HATCH", wxCROSS_HATCH},
1949 { "wxHORIZONTAL_HATCH", wxHORIZONTAL_HATCH},
1950 { "wxVERTICAL_HATCH", wxVERTICAL_HATCH},
1951 { "wxJOIN_BEVEL", wxJOIN_BEVEL},
1952 { "wxJOIN_MITER", wxJOIN_MITER},
1953 { "wxJOIN_ROUND", wxJOIN_ROUND},
1954 { "wxCAP_ROUND", wxCAP_ROUND},
1955 { "wxCAP_PROJECTING", wxCAP_PROJECTING},
1956 { "wxCAP_BUTT", wxCAP_BUTT},
1957
1958 // Logical ops
1959 { "wxCLEAR", wxCLEAR},
1960 { "wxXOR", wxXOR},
1961 { "wxINVERT", wxINVERT},
1962 { "wxOR_REVERSE", wxOR_REVERSE},
1963 { "wxAND_REVERSE", wxAND_REVERSE},
1964 { "wxCOPY", wxCOPY},
1965 { "wxAND", wxAND},
1966 { "wxAND_INVERT", wxAND_INVERT},
1967 { "wxNO_OP", wxNO_OP},
1968 { "wxNOR", wxNOR},
1969 { "wxEQUIV", wxEQUIV},
1970 { "wxSRC_INVERT", wxSRC_INVERT},
1971 { "wxOR_INVERT", wxOR_INVERT},
1972 { "wxNAND", wxNAND},
1973 { "wxOR", wxOR},
1974 { "wxSET", wxSET},
1975
1976 { "wxFLOOD_SURFACE", wxFLOOD_SURFACE},
1977 { "wxFLOOD_BORDER", wxFLOOD_BORDER},
1978 { "wxODDEVEN_RULE", wxODDEVEN_RULE},
1979 { "wxWINDING_RULE", wxWINDING_RULE},
1980 { "wxHORIZONTAL", wxHORIZONTAL},
1981 { "wxVERTICAL", wxVERTICAL},
1982 { "wxBOTH", wxBOTH},
1983 { "wxCENTER_FRAME", wxCENTER_FRAME},
1984 { "wxOK", wxOK},
1985 { "wxYES_NO", wxYES_NO},
1986 { "wxCANCEL", wxCANCEL},
1987 { "wxYES", wxYES},
1988 { "wxNO", wxNO},
1989 { "wxICON_EXCLAMATION", wxICON_EXCLAMATION},
1990 { "wxICON_HAND", wxICON_HAND},
1991 { "wxICON_QUESTION", wxICON_QUESTION},
1992 { "wxICON_INFORMATION", wxICON_INFORMATION},
1993 { "wxICON_STOP", wxICON_STOP},
1994 { "wxICON_ASTERISK", wxICON_ASTERISK},
1995 { "wxICON_MASK", wxICON_MASK},
1996 { "wxCENTRE", wxCENTRE},
1997 { "wxCENTER", wxCENTRE},
1998 { "wxUSER_COLOURS", wxUSER_COLOURS},
1999 { "wxVERTICAL_LABEL", 0},
2000 { "wxHORIZONTAL_LABEL", 0},
2001
2002 // Bitmap types (not strictly styles)
2003 { "wxBITMAP_TYPE_XPM", wxBITMAP_TYPE_XPM},
2004 { "wxBITMAP_TYPE_XBM", wxBITMAP_TYPE_XBM},
2005 { "wxBITMAP_TYPE_BMP", wxBITMAP_TYPE_BMP},
2006 { "wxBITMAP_TYPE_RESOURCE", wxBITMAP_TYPE_BMP_RESOURCE},
2007 { "wxBITMAP_TYPE_BMP_RESOURCE", wxBITMAP_TYPE_BMP_RESOURCE},
2008 { "wxBITMAP_TYPE_GIF", wxBITMAP_TYPE_GIF},
2009 { "wxBITMAP_TYPE_TIF", wxBITMAP_TYPE_TIF},
2010 { "wxBITMAP_TYPE_ICO", wxBITMAP_TYPE_ICO},
2011 { "wxBITMAP_TYPE_ICO_RESOURCE", wxBITMAP_TYPE_ICO_RESOURCE},
2012 { "wxBITMAP_TYPE_CUR", wxBITMAP_TYPE_CUR},
2013 { "wxBITMAP_TYPE_CUR_RESOURCE", wxBITMAP_TYPE_CUR_RESOURCE},
2014 { "wxBITMAP_TYPE_XBM_DATA", wxBITMAP_TYPE_XBM_DATA},
2015 { "wxBITMAP_TYPE_XPM_DATA", wxBITMAP_TYPE_XPM_DATA},
2016 { "wxBITMAP_TYPE_ANY", wxBITMAP_TYPE_ANY}
2017};
2018
2019static int wxResourceBitListCount = (sizeof(wxResourceBitListTable)/sizeof(wxResourceBitListStruct));
2020
fd71308f 2021long wxParseWindowStyle(const wxString& bitListString)
aad5220b
JS
2022{
2023 int i = 0;
2024 char *word;
2025 long bitList = 0;
fd71308f 2026 while ((word = wxResourceParseWord((char*) (const char*) bitListString, &i)))
aad5220b
JS
2027 {
2028 bool found = FALSE;
2029 int j;
2030 for (j = 0; j < wxResourceBitListCount; j++)
2031 if (strcmp(wxResourceBitListTable[j].word, word) == 0)
2032 {
2033 bitList |= wxResourceBitListTable[j].bits;
2034 found = TRUE;
2035 break;
2036 }
2037 if (!found)
2038 {
e17e4f28 2039 wxLogWarning(_("Unrecognized style %s whilst parsing resource."), word);
aad5220b
JS
2040 return 0;
2041 }
2042 }
2043 return bitList;
2044}
2045
2046/*
2047 * Load a bitmap from a wxWindows resource, choosing an optimum
2048 * depth and appropriate type.
2049 */
8bbe427f 2050
fd71308f 2051wxBitmap wxResourceCreateBitmap(const wxString& resource, wxResourceTable *table)
aad5220b
JS
2052{
2053 if (!table)
2054 table = wxDefaultResourceTable;
8bbe427f 2055
aad5220b
JS
2056 wxItemResource *item = table->FindResource(resource);
2057 if (item)
2058 {
2432b92d 2059 if ((item->GetType() == "") || (item->GetType() != "wxBitmap"))
aad5220b 2060 {
fd71308f
JS
2061 wxLogWarning(_("%s not a bitmap resource specification."), (const char*) resource);
2062 return wxNullBitmap;
aad5220b
JS
2063 }
2064 int thisDepth = wxDisplayDepth();
2065 long thisNoColours = (long)pow(2.0, (double)thisDepth);
2066
c67daf87 2067 wxItemResource *optResource = (wxItemResource *) NULL;
8bbe427f 2068
aad5220b
JS
2069 // Try to find optimum bitmap for this platform/colour depth
2070 wxNode *node = item->GetChildren().First();
2071 while (node)
2072 {
2073 wxItemResource *child = (wxItemResource *)node->Data();
2074 int platform = (int)child->GetValue2();
2075 int noColours = (int)child->GetValue3();
2076/*
2077 char *name = child->GetName();
2078 int bitmapType = (int)child->GetValue1();
2079 int xRes = child->GetWidth();
2080 int yRes = child->GetHeight();
2081*/
2082
2083 switch (platform)
2084 {
2085 case RESOURCE_PLATFORM_ANY:
2086 {
2087 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2088 optResource = child;
2089 else
2090 {
2091 // Maximise the number of colours.
2092 // If noColours is zero (unspecified), then assume this
2093 // is the right one.
2094 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2095 optResource = child;
2096 }
2097 break;
2098 }
2049ba38 2099#ifdef __WXMSW__
aad5220b
JS
2100 case RESOURCE_PLATFORM_WINDOWS:
2101 {
2102 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2103 optResource = child;
2104 else
2105 {
2106 // Maximise the number of colours
2107 if ((noColours > 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2108 optResource = child;
2109 }
2110 break;
2111 }
2112#endif
6de97a3b 2113#ifdef __WXGTK__
aad5220b
JS
2114 case RESOURCE_PLATFORM_X:
2115 {
2116 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2117 optResource = child;
2118 else
2119 {
2120 // Maximise the number of colours
2121 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2122 optResource = child;
2123 }
2124 break;
2125 }
2126#endif
2127#ifdef wx_max
2128 case RESOURCE_PLATFORM_MAC:
2129 {
2130 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2131 optResource = child;
2132 else
2133 {
2134 // Maximise the number of colours
2135 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2136 optResource = child;
2137 }
2138 break;
2139 }
2140#endif
2141 default:
2142 break;
2143 }
2144 node = node->Next();
2145 }
2146 // If no matching resource, fail.
2147 if (!optResource)
fd71308f 2148 return wxNullBitmap;
aad5220b 2149
fd71308f 2150 wxString name = optResource->GetName();
aad5220b 2151 int bitmapType = (int)optResource->GetValue1();
aad5220b
JS
2152 switch (bitmapType)
2153 {
2154 case wxBITMAP_TYPE_XBM_DATA:
2155 {
6de97a3b 2156#ifdef __WXGTK__
aad5220b
JS
2157 wxItemResource *item = table->FindResource(name);
2158 if (!item)
2159 {
e17e4f28 2160 wxLogWarning(_("Failed to find XBM resource %s.\n"
fd71308f 2161 "Forgot to use wxResourceLoadBitmapData?"), (const char*) name);
8bbe427f 2162 return wxNullBitmap;
aad5220b 2163 }
fd71308f 2164 return wxBitmap(item->GetValue1(), (int)item->GetValue2(), (int)item->GetValue3()) ;
aad5220b 2165#else
e17e4f28 2166 wxLogWarning(_("No XBM facility available!"));
aad5220b
JS
2167#endif
2168 break;
2169 }
2170 case wxBITMAP_TYPE_XPM_DATA:
2171 {
47d67540 2172#if (defined(__WXGTK__)) || (defined(__WXMSW__) && wxUSE_XPM_IN_MSW)
aad5220b
JS
2173 wxItemResource *item = table->FindResource(name);
2174 if (!item)
2175 {
e17e4f28 2176 wxLogWarning(_("Failed to find XPM resource %s.\n"
fd71308f 2177 "Forgot to use wxResourceLoadBitmapData?"), (const char*) name);
8bbe427f 2178 return wxNullBitmap;
aad5220b 2179 }
45b776d4 2180 return wxBitmap((char **)item->GetValue1());
aad5220b 2181#else
e17e4f28 2182 wxLogWarning(_("No XPM facility available!"));
aad5220b
JS
2183#endif
2184 break;
2185 }
2186 default:
2187 {
fd71308f 2188 return wxBitmap(name, bitmapType);
aad5220b
JS
2189 break;
2190 }
2191 }
fd71308f 2192 return wxNullBitmap;
aad5220b
JS
2193 }
2194 else
2195 {
fd71308f
JS
2196 wxLogWarning(_("Bitmap resource specification %s not found."), (const char*) resource);
2197 return wxNullBitmap;
aad5220b
JS
2198 }
2199}
2200
2201/*
2202 * Load an icon from a wxWindows resource, choosing an optimum
2203 * depth and appropriate type.
2204 */
8bbe427f 2205
fd71308f 2206wxIcon wxResourceCreateIcon(const wxString& resource, wxResourceTable *table)
aad5220b
JS
2207{
2208 if (!table)
fd71308f 2209 table = wxDefaultResourceTable;
8bbe427f 2210
aad5220b
JS
2211 wxItemResource *item = table->FindResource(resource);
2212 if (item)
2213 {
fd71308f 2214 if ((item->GetType() == "") || strcmp(item->GetType(), "wxIcon") != 0)
aad5220b 2215 {
fd71308f
JS
2216 wxLogWarning(_("%s not an icon resource specification."), (const char*) resource);
2217 return wxNullIcon;
aad5220b
JS
2218 }
2219 int thisDepth = wxDisplayDepth();
2220 long thisNoColours = (long)pow(2.0, (double)thisDepth);
2221
c67daf87 2222 wxItemResource *optResource = (wxItemResource *) NULL;
8bbe427f 2223
aad5220b
JS
2224 // Try to find optimum icon for this platform/colour depth
2225 wxNode *node = item->GetChildren().First();
2226 while (node)
2227 {
2228 wxItemResource *child = (wxItemResource *)node->Data();
2229 int platform = (int)child->GetValue2();
2230 int noColours = (int)child->GetValue3();
2231/*
2232 char *name = child->GetName();
2233 int bitmapType = (int)child->GetValue1();
2234 int xRes = child->GetWidth();
2235 int yRes = child->GetHeight();
2236*/
2237
2238 switch (platform)
2239 {
2240 case RESOURCE_PLATFORM_ANY:
2241 {
2242 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2243 optResource = child;
2244 else
2245 {
2246 // Maximise the number of colours.
2247 // If noColours is zero (unspecified), then assume this
2248 // is the right one.
2249 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2250 optResource = child;
2251 }
2252 break;
2253 }
2049ba38 2254#ifdef __WXMSW__
aad5220b
JS
2255 case RESOURCE_PLATFORM_WINDOWS:
2256 {
2257 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2258 optResource = child;
2259 else
2260 {
2261 // Maximise the number of colours
2262 if ((noColours > 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2263 optResource = child;
2264 }
2265 break;
2266 }
2267#endif
6de97a3b 2268#ifdef __WXGTK__
aad5220b
JS
2269 case RESOURCE_PLATFORM_X:
2270 {
2271 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2272 optResource = child;
2273 else
2274 {
2275 // Maximise the number of colours
2276 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2277 optResource = child;
2278 }
2279 break;
2280 }
2281#endif
2282#ifdef wx_max
2283 case RESOURCE_PLATFORM_MAC:
2284 {
2285 if (!optResource && ((noColours == 0) || (noColours <= thisNoColours)))
2286 optResource = child;
2287 else
2288 {
2289 // Maximise the number of colours
2290 if ((noColours == 0) || ((noColours <= thisNoColours) && (noColours > optResource->GetValue3())))
2291 optResource = child;
2292 }
2293 break;
2294 }
2295#endif
2296 default:
2297 break;
2298 }
2299 node = node->Next();
2300 }
2301 // If no matching resource, fail.
2302 if (!optResource)
fd71308f 2303 return wxNullIcon;
aad5220b 2304
fd71308f 2305 wxString name = optResource->GetName();
aad5220b 2306 int bitmapType = (int)optResource->GetValue1();
aad5220b
JS
2307 switch (bitmapType)
2308 {
2309 case wxBITMAP_TYPE_XBM_DATA:
2310 {
6de97a3b 2311#ifdef __WXGTK__
aad5220b
JS
2312 wxItemResource *item = table->FindResource(name);
2313 if (!item)
2314 {
e17e4f28 2315 wxLogWarning(_("Failed to find XBM resource %s.\n"
fd71308f 2316 "Forgot to use wxResourceLoadIconData?"), (const char*) name);
8bbe427f 2317 return wxNullIcon;
aad5220b 2318 }
e52f60e6 2319 return wxIcon((const char **)item->GetValue1(), (int)item->GetValue2(), (int)item->GetValue3());
aad5220b 2320#else
e17e4f28 2321 wxLogWarning(_("No XBM facility available!"));
aad5220b
JS
2322#endif
2323 break;
2324 }
2325 case wxBITMAP_TYPE_XPM_DATA:
2326 {
2327 // *** XPM ICON NOT YET IMPLEMENTED IN WXWINDOWS ***
2328/*
47d67540 2329#if (defined(__WXGTK__)) || (defined(__WXMSW__) && wxUSE_XPM_IN_MSW)
aad5220b
JS
2330 wxItemResource *item = table->FindResource(name);
2331 if (!item)
2332 {
2333 char buf[400];
1a5a8367 2334 sprintf(buf, _("Failed to find XPM resource %s.\nForgot to use wxResourceLoadIconData?"), name);
e17e4f28 2335 wxLogWarning(buf);
aad5220b
JS
2336 return NULL;
2337 }
fd71308f 2338 return wxIcon((char **)item->GetValue1());
aad5220b 2339#else
e17e4f28 2340 wxLogWarning(_("No XPM facility available!"));
aad5220b
JS
2341#endif
2342*/
e17e4f28 2343 wxLogWarning(_("No XPM icon facility available!"));
aad5220b
JS
2344 break;
2345 }
2346 default:
2347 {
6de97a3b 2348#ifdef __WXGTK__
fd71308f 2349 wxLogWarning(_("Icon resource specification %s not found."), (const char*) resource);
6de97a3b 2350#else
fd71308f 2351 return wxIcon(name, bitmapType);
6de97a3b 2352#endif
aad5220b
JS
2353 break;
2354 }
2355 }
fd71308f 2356 return wxNullIcon;
aad5220b
JS
2357 }
2358 else
2359 {
fd71308f 2360 wxLogWarning(_("Icon resource specification %s not found."), (const char*) resource);
c0ed460c 2361 return wxNullIcon;
aad5220b
JS
2362 }
2363}
2364
2365wxMenu *wxResourceCreateMenu(wxItemResource *item)
2366{
2367 wxMenu *menu = new wxMenu;
2368 wxNode *node = item->GetChildren().First();
2369 while (node)
2370 {
2371 wxItemResource *child = (wxItemResource *)node->Data();
fd71308f 2372 if ((child->GetType() != "") && (child->GetType() == "wxMenuSeparator"))
aad5220b
JS
2373 menu->AppendSeparator();
2374 else if (child->GetChildren().Number() > 0)
2375 {
2376 wxMenu *subMenu = wxResourceCreateMenu(child);
2377 if (subMenu)
2378 menu->Append((int)child->GetValue1(), child->GetTitle(), subMenu, child->GetValue4());
2379 }
2380 else
2381 {
2382 menu->Append((int)child->GetValue1(), child->GetTitle(), child->GetValue4(), (child->GetValue2() != 0));
2383 }
2384 node = node->Next();
2385 }
2386 return menu;
2387}
2388
fd71308f 2389wxMenuBar *wxResourceCreateMenuBar(const wxString& resource, wxResourceTable *table, wxMenuBar *menuBar)
aad5220b
JS
2390{
2391 if (!table)
2392 table = wxDefaultResourceTable;
8bbe427f 2393
aad5220b 2394 wxItemResource *menuResource = table->FindResource(resource);
fd71308f 2395 if (menuResource && (menuResource->GetType() != "") && (menuResource->GetType() == "wxMenu"))
aad5220b
JS
2396 {
2397 if (!menuBar)
2398 menuBar = new wxMenuBar;
2399 wxNode *node = menuResource->GetChildren().First();
2400 while (node)
2401 {
2402 wxItemResource *child = (wxItemResource *)node->Data();
2403 wxMenu *menu = wxResourceCreateMenu(child);
2404 if (menu)
2405 menuBar->Append(menu, child->GetTitle());
2406 node = node->Next();
2407 }
2408 return menuBar;
2409 }
c67daf87 2410 return (wxMenuBar *) NULL;
aad5220b
JS
2411}
2412
fd71308f 2413wxMenu *wxResourceCreateMenu(const wxString& resource, wxResourceTable *table)
aad5220b
JS
2414{
2415 if (!table)
2416 table = wxDefaultResourceTable;
8bbe427f 2417
aad5220b 2418 wxItemResource *menuResource = table->FindResource(resource);
fd71308f 2419 if (menuResource && (menuResource->GetType() != "") && (menuResource->GetType() == "wxMenu"))
aad5220b
JS
2420// if (menuResource && (menuResource->GetType() == wxTYPE_MENU))
2421 return wxResourceCreateMenu(menuResource);
c67daf87 2422 return (wxMenu *) NULL;
aad5220b
JS
2423}
2424
2425// Global equivalents (so don't have to refer to default table explicitly)
fd71308f 2426bool wxResourceParseData(const wxString& resource, wxResourceTable *table)
aad5220b
JS
2427{
2428 if (!table)
2429 table = wxDefaultResourceTable;
8bbe427f 2430
aad5220b
JS
2431 return table->ParseResourceData(resource);
2432}
2433
fd71308f 2434bool wxResourceParseFile(const wxString& filename, wxResourceTable *table)
aad5220b
JS
2435{
2436 if (!table)
2437 table = wxDefaultResourceTable;
8bbe427f 2438
aad5220b
JS
2439 return table->ParseResourceFile(filename);
2440}
2441
2442// Register XBM/XPM data
fd71308f 2443bool wxResourceRegisterBitmapData(const wxString& name, char bits[], int width, int height, wxResourceTable *table)
aad5220b
JS
2444{
2445 if (!table)
2446 table = wxDefaultResourceTable;
8bbe427f 2447
aad5220b
JS
2448 return table->RegisterResourceBitmapData(name, bits, width, height);
2449}
2450
fd71308f 2451bool wxResourceRegisterBitmapData(const wxString& name, char **data, wxResourceTable *table)
aad5220b
JS
2452{
2453 if (!table)
2454 table = wxDefaultResourceTable;
2455
2456 return table->RegisterResourceBitmapData(name, data);
2457}
2458
2459void wxResourceClear(wxResourceTable *table)
2460{
2461 if (!table)
2462 table = wxDefaultResourceTable;
2463
2464 table->ClearTable();
2465}
2466
2467/*
2468 * Identifiers
2469 */
2470
fd71308f 2471bool wxResourceAddIdentifier(const wxString& name, int value, wxResourceTable *table)
aad5220b
JS
2472{
2473 if (!table)
2474 table = wxDefaultResourceTable;
8bbe427f 2475
aad5220b
JS
2476 table->identifiers.Put(name, (wxObject *)value);
2477 return TRUE;
2478}
2479
fd71308f 2480int wxResourceGetIdentifier(const wxString& name, wxResourceTable *table)
aad5220b
JS
2481{
2482 if (!table)
2483 table = wxDefaultResourceTable;
8bbe427f 2484
aad5220b
JS
2485 return (int)table->identifiers.Get(name);
2486}
2487
2488/*
2489 * Parse #include file for #defines (only)
2490 */
2491
fd71308f 2492bool wxResourceParseIncludeFile(const wxString& f, wxResourceTable *table)
aad5220b
JS
2493{
2494 if (!table)
2495 table = wxDefaultResourceTable;
8bbe427f 2496
aad5220b
JS
2497 FILE *fd = fopen(f, "r");
2498 if (!fd)
2499 {
2500 return FALSE;
2501 }
2502 while (wxGetResourceToken(fd))
2503 {
2504 if (strcmp(wxResourceBuffer, "#define") == 0)
2505 {
2506 wxGetResourceToken(fd);
2507 char *name = copystring(wxResourceBuffer);
2508 wxGetResourceToken(fd);
2509 char *value = copystring(wxResourceBuffer);
2510 if (isdigit(value[0]))
2511 {
2512 int val = (int)atol(value);
2513 wxResourceAddIdentifier(name, val, table);
2514 }
2515 delete[] name;
2516 delete[] value;
2517 }
2518 }
2519 fclose(fd);
2520 return TRUE;
2521}
2522
2523/*
2524 * Reading strings as if they were .wxr files
2525 */
2526
2527static int getc_string(char *s)
2528{
2529 int ch = s[wxResourceStringPtr];
2530 if (ch == 0)
2531 return EOF;
2532 else
2533 {
2534 wxResourceStringPtr ++;
2535 return ch;
2536 }
2537}
2538
fd71308f 2539static int ungetc_string()
aad5220b
JS
2540{
2541 wxResourceStringPtr --;
2542 return 0;
2543}
2544
2545bool wxEatWhiteSpaceString(char *s)
2546{
2547 int ch = getc_string(s);
2548 if (ch == EOF)
2549 return TRUE;
8bbe427f 2550
aad5220b
JS
2551 if ((ch != ' ') && (ch != '/') && (ch != ' ') && (ch != 10) && (ch != 13) && (ch != 9))
2552 {
2553 ungetc_string();
2554 return TRUE;
2555 }
2556
2557 // Eat whitespace
2558 while (ch == ' ' || ch == 10 || ch == 13 || ch == 9)
2559 ch = getc_string(s);
2560 // Check for comment
2561 if (ch == '/')
2562 {
2563 ch = getc_string(s);
2564 if (ch == '*')
2565 {
2566 bool finished = FALSE;
2567 while (!finished)
2568 {
2569 ch = getc_string(s);
2570 if (ch == EOF)
2571 return FALSE;
2572 if (ch == '*')
2573 {
2574 int newCh = getc_string(s);
2575 if (newCh == '/')
2576 finished = TRUE;
2577 else
2578 {
2579 ungetc_string();
2580 }
2581 }
2582 }
2583 }
2584 else // False alarm
2585 return FALSE;
2586 }
2587 else if (ch != EOF)
2588 ungetc_string();
2589 return wxEatWhiteSpaceString(s);
2590}
2591
2592bool wxGetResourceTokenString(char *s)
2593{
2594 if (!wxResourceBuffer)
2595 wxReallocateResourceBuffer();
2596 wxResourceBuffer[0] = 0;
2597 wxEatWhiteSpaceString(s);
2598
2599 int ch = getc_string(s);
2600 if (ch == '"')
2601 {
2602 // Get string
2603 wxResourceBufferCount = 0;
2604 ch = getc_string(s);
2605 while (ch != '"')
2606 {
2607 int actualCh = ch;
2608 if (ch == EOF)
2609 {
2610 wxResourceBuffer[wxResourceBufferCount] = 0;
2611 return FALSE;
2612 }
2613 // Escaped characters
2614 else if (ch == '\\')
2615 {
2616 int newCh = getc_string(s);
2617 if (newCh == '"')
2618 actualCh = '"';
2619 else if (newCh == 10)
2620 actualCh = 10;
2621 else
2622 {
2623 ungetc_string();
2624 }
2625 }
2626
2627 if (wxResourceBufferCount >= wxResourceBufferSize-1)
2628 wxReallocateResourceBuffer();
2629 wxResourceBuffer[wxResourceBufferCount] = (char)actualCh;
2630 wxResourceBufferCount ++;
2631 ch = getc_string(s);
2632 }
2633 wxResourceBuffer[wxResourceBufferCount] = 0;
2634 }
2635 else
2636 {
2637 wxResourceBufferCount = 0;
2638 // Any other token
2639 while (ch != ' ' && ch != EOF && ch != ' ' && ch != 13 && ch != 9 && ch != 10)
2640 {
2641 if (wxResourceBufferCount >= wxResourceBufferSize-1)
2642 wxReallocateResourceBuffer();
2643 wxResourceBuffer[wxResourceBufferCount] = (char)ch;
2644 wxResourceBufferCount ++;
8bbe427f 2645
aad5220b
JS
2646 ch = getc_string(s);
2647 }
2648 wxResourceBuffer[wxResourceBufferCount] = 0;
2649 if (ch == EOF)
2650 return FALSE;
2651 }
2652 return TRUE;
2653}
2654
2655/*
2656 * Files are in form:
2657 static char *name = "....";
2658 with possible comments.
2659 */
8bbe427f 2660
fd71308f 2661bool wxResourceReadOneResourceString(char *s, wxExprDatabase& db, bool *eof, wxResourceTable *table)
aad5220b
JS
2662{
2663 if (!table)
2664 table = wxDefaultResourceTable;
8bbe427f 2665
aad5220b
JS
2666 // static or #define
2667 if (!wxGetResourceTokenString(s))
2668 {
2669 *eof = TRUE;
2670 return FALSE;
2671 }
2672
2673 if (strcmp(wxResourceBuffer, "#define") == 0)
2674 {
2675 wxGetResourceTokenString(s);
2676 char *name = copystring(wxResourceBuffer);
2677 wxGetResourceTokenString(s);
2678 char *value = copystring(wxResourceBuffer);
2679 if (isalpha(value[0]))
2680 {
2681 int val = (int)atol(value);
2682 wxResourceAddIdentifier(name, val, table);
2683 }
2684 else
2685 {
e17e4f28 2686 wxLogWarning(_("#define %s must be an integer."), name);
aad5220b
JS
2687 delete[] name;
2688 delete[] value;
2689 return FALSE;
2690 }
2691 delete[] name;
2692 delete[] value;
8bbe427f 2693
aad5220b
JS
2694 return TRUE;
2695 }
2696/*
2697 else if (strcmp(wxResourceBuffer, "#include") == 0)
2698 {
2699 wxGetResourceTokenString(s);
2700 char *name = copystring(wxResourceBuffer);
2701 char *actualName = name;
2702 if (name[0] == '"')
2703 actualName = name + 1;
2704 int len = strlen(name);
2705 if ((len > 0) && (name[len-1] == '"'))
2706 name[len-1] = 0;
2707 if (!wxResourceParseIncludeFile(actualName, table))
2708 {
2709 char buf[400];
1a5a8367 2710 sprintf(buf, _("Could not find resource include file %s."), actualName);
e17e4f28 2711 wxLogWarning(buf);
aad5220b
JS
2712 }
2713 delete[] name;
2714 return TRUE;
2715 }
2716*/
2717 else if (strcmp(wxResourceBuffer, "static") != 0)
2718 {
2719 char buf[300];
1a5a8367 2720 strcpy(buf, _("Found "));
aad5220b 2721 strncat(buf, wxResourceBuffer, 30);
1a5a8367 2722 strcat(buf, _(", expected static, #include or #define\nwhilst parsing resource."));
e17e4f28 2723 wxLogWarning(buf);
aad5220b
JS
2724 return FALSE;
2725 }
2726
2727 // char
2728 if (!wxGetResourceTokenString(s))
2729 {
e17e4f28 2730 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
2731 *eof = TRUE;
2732 return FALSE;
2733 }
2734
2735 if (strcmp(wxResourceBuffer, "char") != 0)
2736 {
e17e4f28 2737 wxLogWarning(_("Expected 'char' whilst parsing resource."));
aad5220b
JS
2738 return FALSE;
2739 }
8bbe427f 2740
aad5220b
JS
2741 // *name
2742 if (!wxGetResourceTokenString(s))
2743 {
e17e4f28 2744 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
2745 *eof = TRUE;
2746 return FALSE;
2747 }
2748
2749 if (wxResourceBuffer[0] != '*')
2750 {
e17e4f28 2751 wxLogWarning(_("Expected '*' whilst parsing resource."));
aad5220b
JS
2752 return FALSE;
2753 }
2754 char nameBuf[100];
2755 strncpy(nameBuf, wxResourceBuffer+1, 99);
8bbe427f 2756
aad5220b
JS
2757 // =
2758 if (!wxGetResourceTokenString(s))
2759 {
e17e4f28 2760 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
2761 *eof = TRUE;
2762 return FALSE;
2763 }
2764
2765 if (strcmp(wxResourceBuffer, "=") != 0)
2766 {
e17e4f28 2767 wxLogWarning(_("Expected '=' whilst parsing resource."));
aad5220b
JS
2768 return FALSE;
2769 }
2770
2771 // String
2772 if (!wxGetResourceTokenString(s))
2773 {
e17e4f28 2774 wxLogWarning(_("Unexpected end of file whilst parsing resource."));
aad5220b
JS
2775 *eof = TRUE;
2776 return FALSE;
2777 }
2778 else
2779 {
2780 if (!db.ReadPrologFromString(wxResourceBuffer))
2781 {
e17e4f28 2782 wxLogWarning(_("%s: ill-formed resource file syntax."), nameBuf);
aad5220b
JS
2783 return FALSE;
2784 }
2785 }
2786 // Semicolon
2787 if (!wxGetResourceTokenString(s))
2788 {
2789 *eof = TRUE;
2790 }
2791 return TRUE;
2792}
2793
2794bool wxResourceParseString(char *s, wxResourceTable *table)
2795{
2796 if (!table)
2797 table = wxDefaultResourceTable;
8bbe427f 2798
aad5220b
JS
2799 if (!s)
2800 return FALSE;
8bbe427f
VZ
2801
2802 // Turn backslashes into spaces
aad5220b
JS
2803 if (s)
2804 {
2805 int len = strlen(s);
2806 int i;
2807 for (i = 0; i < len; i++)
2808 if (s[i] == 92 && s[i+1] == 13)
2809 {
2810 s[i] = ' ';
2811 s[i+1] = ' ';
2812 }
2813 }
2814
fd71308f 2815 wxExprDatabase db;
aad5220b
JS
2816 wxResourceStringPtr = 0;
2817
2818 bool eof = FALSE;
2819 while (wxResourceReadOneResourceString(s, db, &eof, table) && !eof)
2820 {
2821 // Loop
2822 }
2823 return wxResourceInterpretResources(*table, db);
2824}
2825
2826/*
2827 * resource loading facility
2828 */
2829
2830bool wxWindow::LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table)
2831{
2832 if (!table)
2833 table = wxDefaultResourceTable;
8bbe427f 2834
aad5220b
JS
2835 wxItemResource *resource = table->FindResource((const char *)resourceName);
2836// if (!resource || (resource->GetType() != wxTYPE_DIALOG_BOX))
2432b92d
JS
2837 if (!resource || (resource->GetType() == "") ||
2838 ! ((resource->GetType() == "wxDialog") || (resource->GetType() == "wxPanel")))
aad5220b
JS
2839 return FALSE;
2840
fd71308f 2841 wxString title(resource->GetTitle());
aad5220b
JS
2842 long theWindowStyle = resource->GetStyle();
2843 bool isModal = (resource->GetValue1() != 0);
2844 int x = resource->GetX();
2845 int y = resource->GetY();
2846 int width = resource->GetWidth();
2847 int height = resource->GetHeight();
fd71308f 2848 wxString name = resource->GetName();
aad5220b
JS
2849
2850 if (IsKindOf(CLASSINFO(wxDialog)))
2851 {
2852 wxDialog *dialogBox = (wxDialog *)this;
fd71308f 2853 long modalStyle = isModal ? wxDIALOG_MODAL : 0;
aad5220b
JS
2854 if (!dialogBox->Create(parent, -1, title, wxPoint(x, y), wxSize(width, height), theWindowStyle|modalStyle, name))
2855 return FALSE;
fd71308f
JS
2856
2857 // Only reset the client size if we know we're not going to do it again below.
2858 if ((resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) == 0)
2859 dialogBox->SetClientSize(width, height);
2860 }
2861 else if (IsKindOf(CLASSINFO(wxPanel)))
2862 {
2863 wxPanel* panel = (wxPanel *)this;
2864 if (!panel->Create(parent, -1, wxPoint(x, y), wxSize(width, height), theWindowStyle, name))
2865 return FALSE;
aad5220b
JS
2866 }
2867 else
2868 {
fd71308f 2869 if (!this->Create(parent, -1, wxPoint(x, y), wxSize(width, height), theWindowStyle, name))
aad5220b
JS
2870 return FALSE;
2871 }
2872
fd71308f
JS
2873 if ((resource->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0)
2874 {
2875 // No need to do this since it's done in wxPanel or wxDialog constructor.
2876 // SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
2877 }
2878 else
2879 {
2880 if (resource->GetFont().Ok())
2881 SetFont(resource->GetFont());
2882 if (resource->GetBackgroundColour().Ok())
2883 SetBackgroundColour(resource->GetBackgroundColour());
2884 }
aad5220b 2885
fd71308f 2886 // Should have some kind of font at this point
c0ed460c 2887 if (!GetFont().Ok())
fd71308f
JS
2888 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
2889 if (!GetBackgroundColour().Ok())
2890 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
2891
2892 // Only when we've created the window and set the font can we set the correct size,
2893 // if based on dialog units.
2894 if ((resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
2895 {
2896 wxSize sz = ConvertDialogToPixels(wxSize(width, height));
2897 SetClientSize(sz.x, sz.y);
2898
2899 wxPoint pt = ConvertDialogToPixels(wxPoint(x, y));
2900 Move(pt.x, pt.y);
2901 }
aad5220b 2902
aad5220b
JS
2903 // Now create children
2904 wxNode *node = resource->GetChildren().First();
2905 while (node)
2906 {
2907 wxItemResource *childResource = (wxItemResource *)node->Data();
8bbe427f 2908
fd71308f 2909 (void) CreateItem(childResource, resource, table);
aad5220b
JS
2910
2911 node = node->Next();
2912 }
2913 return TRUE;
2914}
2915
fd71308f 2916wxControl *wxWindow::CreateItem(const wxItemResource *resource, const wxItemResource* parentResource, const wxResourceTable *table)
aad5220b
JS
2917{
2918 if (!table)
2919 table = wxDefaultResourceTable;
fd71308f 2920 return table->CreateItem((wxWindow *)this, resource, parentResource);
aad5220b
JS
2921}
2922
3f4a0c5b 2923#ifdef __VISUALC__
fd3f686c
VZ
2924 #pragma warning(default:4706) // assignment within conditional expression
2925#endif // VC++
2926
3b1de9c2
JS
2927#endif
2928 // BC++/Win16
2929
47d67540 2930#endif // wxUSE_WX_RESOURCES