]> git.saurik.com Git - wxWidgets.git/blame - utils/dialoged/src/reswrite.cpp
fixed a logical error (! isempty) instead of isempty
[wxWidgets.git] / utils / dialoged / src / reswrite.cpp
CommitLineData
457814b5
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: reswrite.cpp
3// Purpose: Resource writing functionality
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx/wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/wx.h"
25#endif
26
27#include <ctype.h>
28#include <stdlib.h>
29#include <math.h>
30#include <string.h>
31
2049ba38 32#if defined(__WXMSW__) && !defined(__GNUWIN32__)
457814b5
JS
33#include <strstrea.h>
34#else
35#include <strstream.h>
36#endif
37
38#include <fstream.h>
39
40#include "wx/scrolbar.h"
41#include "wx/string.h"
42
43#include "reseditr.h"
44
45char *SafeString(char *s);
46char *SafeWord(char *s);
47
48// Save an association between the child resource and the panel item, to allow
49// us not to require unique window names.
50wxControl *wxResourceTableWithSaving::CreateItem(wxPanel *panel, wxItemResource *childResource)
51{
52 wxControl *item = wxResourceTable::CreateItem(panel, childResource);
53 if (item)
ae8351fc 54 wxResourceManager::GetCurrentResourceManager()->GetResourceAssociations().Put((long)childResource, item);
457814b5
JS
55 return item;
56}
57
58void wxResourceTableWithSaving::OutputFont(ostream& stream, wxFont *font)
59{
60 stream << "[" << font->GetPointSize() << ", '";
61 stream << font->GetFamilyString() << "', '";
62 stream << font->GetStyleString() << "', '";
63 stream << font->GetWeightString() << "', ";
64 stream << (int)font->GetUnderlined();
65 if (font->GetFaceName() != "")
66 stream << ", '" << font->GetFaceName() << "'";
67 stream << "]";
68}
69
70/*
71 * Resource table with saving (basic one only has loading)
72 */
73
74bool wxResourceTableWithSaving::Save(const wxString& filename)
75{
76 ofstream stream(((wxString &) filename).GetData());
77 if (stream.bad())
78 return FALSE;
79
80 BeginFind();
81 wxNode *node = NULL;
82 while (node = Next())
83 {
84 wxItemResource *item = (wxItemResource *)node->Data();
85 wxString resType(item->GetType());
86
87 if (resType == "wxDialogBox" || resType == "wxDialog" || resType == "wxPanel" || resType == "wxBitmap")
88 {
89 if (!SaveResource(stream, item))
90 return FALSE;
91 }
92 }
93 return TRUE;
94}
95
96bool wxResourceTableWithSaving::SaveResource(ostream& stream, wxItemResource *item)
97{
98 char styleBuf[400];
99 wxString itemType(item->GetType());
100
101 if (itemType == "wxDialogBox" || itemType == "wxDialog" || itemType == "wxPanel")
102 {
103 if (itemType == "wxDialogBox" || itemType == "wxDialog")
104 {
105 stream << "static char *" << item->GetName() << " = \"dialog(name = '" << item->GetName() << "',\\\n";
106 GenerateDialogStyleString(item->GetStyle(), styleBuf);
107 }
108 else
109 {
110 stream << "static char *" << item->GetName() << " = \"panel(name = '" << item->GetName() << "',\\\n";
bbcdf8bc 111 GenerateDialogStyleString(item->GetStyle(), styleBuf);
457814b5
JS
112 }
113 stream << " style = '" << styleBuf << "',\\\n";
114 stream << " title = '" << item->GetTitle() << "',\\\n";
bbcdf8bc 115 stream << " id = " << item->GetId() << ",\\\n";
457814b5 116 stream << " x = " << item->GetX() << ", y = " << item->GetY();
ae8351fc 117 stream << ", width = " << item->GetWidth() << ", height = " << item->GetHeight();
bbcdf8bc 118
ae8351fc 119 if (1) // item->GetStyle() & wxNO_3D)
457814b5
JS
120 {
121 if (item->GetBackgroundColour())
122 {
123 char buf[7];
124 wxDecToHex(item->GetBackgroundColour()->Red(), buf);
125 wxDecToHex(item->GetBackgroundColour()->Green(), buf+2);
126 wxDecToHex(item->GetBackgroundColour()->Blue(), buf+4);
127 buf[6] = 0;
128
129 stream << ",\\\n " << "background_colour = '" << buf << "'";
130 }
457814b5
JS
131 }
132
ae8351fc 133 if (item->GetFont() && item->GetFont()->Ok())
457814b5
JS
134 {
135 stream << ",\\\n font = ";
136 OutputFont(stream, item->GetFont());
137 }
ae8351fc 138
457814b5
JS
139 if (item->GetChildren().Number() > 0)
140 stream << ",\\\n";
141 else
142 stream << "\\\n";
143 wxNode *node = item->GetChildren().First();
144 while (node)
145 {
146 wxItemResource *child = (wxItemResource *)node->Data();
147
148 stream << " control = [";
149
150 SaveResource(stream, child);
151
152 stream << "]";
153
154 if (node->Next())
155 stream << ",\\\n";
156 node = node->Next();
157 }
158 stream << ").\";\n\n";
159 }
ae8351fc 160 else if (itemType == "wxButton" || itemType == "wxBitmapButton")
457814b5 161 {
bbcdf8bc
JS
162 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
163 stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
164 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
165 stream << item->GetWidth() << ", " << item->GetHeight();
166 if (item->GetValue4())
167 stream << ", '" << item->GetValue4() << "'";
168 if (item->GetFont())
169 {
170 stream << ",\\\n ";
171 OutputFont(stream, item->GetFont());
172 }
173 }
ae8351fc 174 else if (itemType == "wxStaticText" || itemType == "wxStaticBitmap")
457814b5 175 {
bbcdf8bc
JS
176 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
177 stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
178 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
179 stream << item->GetWidth() << ", " << item->GetHeight();
180 if (item->GetValue4())
181 stream << ", '" << item->GetValue4() << "'";
182 if (item->GetFont())
183 {
184 stream << ",\\\n ";
185 OutputFont(stream, item->GetFont());
186 }
187 }
188 else if (itemType == "wxCheckBox")
189 {
bbcdf8bc
JS
190 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
191 stream << item->GetId() << ", " << "wxCheckBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
192 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
193 stream << item->GetWidth() << ", " << item->GetHeight();
194 stream << ", " << item->GetValue1();
195 if (item->GetFont())
196 {
197 stream << ",\\\n ";
198 OutputFont(stream, item->GetFont());
199 }
200 }
03f68f12
JS
201 else if (itemType == "wxRadioButton")
202 {
bbcdf8bc
JS
203 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
204 stream << item->GetId() << ", " << "wxRadioButton, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
03f68f12
JS
205 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
206 stream << item->GetWidth() << ", " << item->GetHeight();
207 stream << ", " << item->GetValue1();
208 if (item->GetFont())
209 {
210 stream << ",\\\n ";
211 OutputFont(stream, item->GetFont());
212 }
213 }
ae8351fc 214 else if (itemType == "wxStaticBox")
457814b5 215 {
bbcdf8bc 216 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
9c331ded 217 stream << item->GetId() << ", " << "wxStaticBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
218 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
219 stream << item->GetWidth() << ", " << item->GetHeight();
220 if (item->GetFont())
221 {
222 stream << ",\\\n ";
223 OutputFont(stream, item->GetFont());
224 }
225 }
ae8351fc 226 else if (itemType == "wxText" || itemType == "wxMultiText" || itemType == "wxTextCtrl")
457814b5 227 {
bbcdf8bc
JS
228 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
229 stream << item->GetId() << ", " << "wxTextCtrl, ";
457814b5
JS
230 stream << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
231 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
232 stream << item->GetWidth() << ", " << item->GetHeight();
233 stream << ", " << SafeWord(item->GetValue4());
234 if (item->GetFont())
235 {
236 stream << ",\\\n ";
237 OutputFont(stream, item->GetFont());
238 }
239 }
240 else if (itemType == "wxGauge")
241 {
bbcdf8bc
JS
242 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
243 stream << item->GetId() << ", " << "wxGauge, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
244 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
245 stream << item->GetWidth() << ", " << item->GetHeight();
246 stream << ", " << item->GetValue1() << ", " << item->GetValue2();
247 if (item->GetFont())
248 {
249 stream << ",\\\n ";
250 OutputFont(stream, item->GetFont());
251 }
252 }
253 else if (itemType == "wxSlider")
254 {
bbcdf8bc
JS
255 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
256 stream << item->GetId() << ", " << "wxSlider, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
257 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
258 stream << item->GetWidth() << ", " << item->GetHeight();
259 stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3();
260 if (item->GetFont())
261 {
262 stream << ",\\\n ";
263 OutputFont(stream, item->GetFont());
264 }
265 }
266 else if (itemType == "wxScrollBar")
267 {
bbcdf8bc
JS
268 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
269 stream << item->GetId() << ", " << "wxScrollBar, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
270 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
271 stream << item->GetWidth() << ", " << item->GetHeight();
272 stream << ", " << item->GetValue1() << ", " << item->GetValue2() << ", " << item->GetValue3() << ", ";
273 stream << item->GetValue5();
274 }
275 else if (itemType == "wxListBox")
276 {
bbcdf8bc
JS
277 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
278 stream << item->GetId() << ", " << "wxListBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
279 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
280 stream << item->GetWidth() << ", " << item->GetHeight();
281
282 // Default list of values
283
284 stream << ", [";
285 if (item->GetStringValues())
286 {
287 wxNode *node = item->GetStringValues()->First();
288 while (node)
289 {
290 char *s = (char *)node->Data();
291 stream << SafeWord(s);
292 if (node->Next())
293 stream << ", ";
294 node = node->Next();
295 }
296 }
297 stream << "], ";
298 switch (item->GetValue1())
299 {
300 case wxLB_MULTIPLE:
301 {
302 stream << "'wxLB_MULTIPLE'";
303 break;
304 }
305 case wxLB_EXTENDED:
306 {
307 stream << "'wxLB_EXTENDED'";
308 break;
309 }
310 case wxLB_SINGLE:
311 default:
312 {
313 stream << "'wxLB_SINGLE'";
314 break;
315 }
316 }
317 if (item->GetFont())
318 {
319 stream << ",\\\n ";
320 OutputFont(stream, item->GetFont());
321 }
322 }
bbcdf8bc 323 else if (itemType == "wxChoice" || itemType == "wxComboBox")
457814b5 324 {
bbcdf8bc
JS
325 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
326
327 stream << item->GetId() << ", " << itemType << ", " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
328 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
329 stream << item->GetWidth() << ", " << item->GetHeight();
330
bbcdf8bc 331 if (itemType == "wxComboBox")
9c331ded 332 stream << ", " << SafeWord(item->GetValue4());
bbcdf8bc 333
457814b5
JS
334 // Default list of values
335
336 stream << ", [";
337 if (item->GetStringValues())
338 {
339 wxNode *node = item->GetStringValues()->First();
340 while (node)
341 {
342 char *s = (char *)node->Data();
343 stream << SafeWord(s);
344 if (node->Next())
345 stream << ", ";
346 node = node->Next();
347 }
348 }
349 stream << "]";
350 if (item->GetFont())
351 {
352 stream << ",\\\n ";
353 OutputFont(stream, item->GetFont());
354 }
355 }
356 else if (itemType == "wxRadioBox")
357 {
358 // Must write out the orientation and number of rows/cols!!
bbcdf8bc
JS
359 GenerateControlStyleString(itemType, item->GetStyle(), styleBuf);
360 stream << item->GetId() << ", " << "wxRadioBox, " << SafeWord(item->GetTitle()) << ", '" << styleBuf << "', ";
457814b5
JS
361 stream << SafeWord(item->GetName()) << ", " << item->GetX() << ", " << item->GetY() << ", ";
362 stream << item->GetWidth() << ", " << item->GetHeight();
363
364 // Default list of values
365
366 stream << ", [";
367 if (item->GetStringValues())
368 {
369 wxNode *node = item->GetStringValues()->First();
370 while (node)
371 {
372 char *s = (char *)node->Data();
373 stream << SafeWord(s);
374 if (node->Next())
375 stream << ", ";
376 node = node->Next();
377 }
378 }
379 stream << "], " << item->GetValue1();
380 if (item->GetFont())
381 {
382 stream << ",\\\n ";
383 OutputFont(stream, item->GetFont());
384 }
385 }
386 else if (itemType == "wxBitmap")
387 {
388 stream << "static char *" << item->GetName() << " = \"bitmap(name = '" << item->GetName() << "',\\\n";
389
390 wxNode *node = item->GetChildren().First();
391 while (node)
392 {
393 wxItemResource *child = (wxItemResource *)node->Data();
394 stream << " bitmap = [";
395
396 char buf[400];
397 strcpy(buf, child->GetName());
2049ba38 398#ifdef __WXMSW__
457814b5
JS
399 wxDos2UnixFilename(buf);
400#endif
401
402 stream << "'" << buf << "', ";
403
404 int bitmapType = (int)child->GetValue1();
405 switch (bitmapType)
406 {
407 case wxBITMAP_TYPE_XBM_DATA:
408 {
409 stream << "wxBITMAP_TYPE_XBM_DATA";
410 break;
411 }
412 case wxBITMAP_TYPE_XPM_DATA:
413 {
414 stream << "wxBITMAP_TYPE_XPM_DATA";
415 break;
416 }
417 case wxBITMAP_TYPE_XBM:
418 {
419 stream << "wxBITMAP_TYPE_XBM";
420 break;
421 }
422 case wxBITMAP_TYPE_XPM:
423 {
424 stream << "wxBITMAP_TYPE_XPM";
425 break;
426 }
427 case wxBITMAP_TYPE_BMP:
428 {
429 stream << "wxBITMAP_TYPE_BMP";
430 break;
431 }
432 case wxBITMAP_TYPE_BMP_RESOURCE:
433 {
434 stream << "wxBITMAP_TYPE_BMP_RESOURCE";
435 break;
436 }
437 case wxBITMAP_TYPE_GIF:
438 {
439 stream << "wxBITMAP_TYPE_GIF";
440 break;
441 }
442 case wxBITMAP_TYPE_TIF:
443 {
444 stream << "wxBITMAP_TYPE_TIF";
445 break;
446 }
447 case wxBITMAP_TYPE_ICO:
448 {
449 stream << "wxBITMAP_TYPE_ICO";
450 break;
451 }
452 case wxBITMAP_TYPE_ICO_RESOURCE:
453 {
454 stream << "wxBITMAP_TYPE_ICO_RESOURCE";
455 break;
456 }
457 case wxBITMAP_TYPE_CUR:
458 {
459 stream << "wxBITMAP_TYPE_CUR";
460 break;
461 }
462 case wxBITMAP_TYPE_CUR_RESOURCE:
463 {
464 stream << "wxBITMAP_TYPE_CUR_RESOURCE";
465 break;
466 }
467 default:
468 case wxBITMAP_TYPE_ANY:
469 {
470 stream << "wxBITMAP_TYPE_ANY";
471 break;
472 }
473 }
474 stream << ", ";
475 int platform = child->GetValue2();
476 switch (platform)
477 {
478 case RESOURCE_PLATFORM_WINDOWS:
479 {
480 stream << "'WINDOWS'";
481 break;
482 }
483 case RESOURCE_PLATFORM_X:
484 {
485 stream << "'X'";
486 break;
487 }
488 case RESOURCE_PLATFORM_MAC:
489 {
490 stream << "'MAC'";
491 break;
492 }
493 case RESOURCE_PLATFORM_ANY:
494 {
495 stream << "'ANY'";
496 break;
497 }
498 }
499 int noColours = (int)child->GetValue3();
500 if (noColours > 0)
501 stream << ", " << noColours;
502
503 stream << "]";
504
505 if (node->Next())
506 stream << ",\\\n";
507
508 node = node->Next();
509 }
510 stream << ").\";\n\n";
511 }
9c331ded
JS
512 else
513 {
514 wxString str("Unimplemented resource type: ");
515 str += itemType;
516 wxMessageBox(str);
517 }
457814b5
JS
518 return TRUE;
519}
520
457814b5
JS
521void wxResourceTableWithSaving::GenerateDialogStyleString(long windowStyle, char *buf)
522{
523 buf[0] = 0;
bbcdf8bc
JS
524 m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
525 m_styleTable.GenerateStyleStrings("wxPanel", windowStyle, buf);
526 m_styleTable.GenerateStyleStrings("wxDialog", windowStyle, buf);
457814b5 527
457814b5
JS
528 if (strlen(buf) == 0)
529 strcat(buf, "0");
530}
531
532void wxResourceTableWithSaving::GeneratePanelStyleString(long windowStyle, char *buf)
533{
534 buf[0] = 0;
bbcdf8bc
JS
535 m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
536 m_styleTable.GenerateStyleStrings("wxPanel", windowStyle, buf);
457814b5 537
457814b5
JS
538 if (strlen(buf) == 0)
539 strcat(buf, "0");
540}
541
457814b5 542
bbcdf8bc 543void wxResourceTableWithSaving::GenerateControlStyleString(const wxString& windowClass, long windowStyle, char *buf)
457814b5
JS
544{
545 buf[0] = 0;
bbcdf8bc
JS
546 m_styleTable.GenerateStyleStrings("wxWindow", windowStyle, buf);
547 m_styleTable.GenerateStyleStrings("wxControl", windowStyle, buf);
548 m_styleTable.GenerateStyleStrings(windowClass, windowStyle, buf);
457814b5 549
457814b5
JS
550 if (strlen(buf) == 0)
551 strcat(buf, "0");
552}
553
457814b5
JS
554// Returns quoted string or "NULL"
555char *SafeString(char *s)
556{
557 if (!s)
558 return "NULL";
559 else
560 {
561 strcpy(wxBuffer, "\"");
562 strcat(wxBuffer, s);
563 strcat(wxBuffer, "\"");
564 return wxBuffer;
565 }
566}
567
568// Returns quoted string or ''
569char *SafeWord(char *s)
570{
571 if (!s)
572 return "''";
573 else
574 {
575 strcpy(wxBuffer, "'");
576 strcat(wxBuffer, s);
577 strcat(wxBuffer, "'");
578 return wxBuffer;
579 }
580}
581