Starshatter_Open
Open source Starshatter engine
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
FormDef.cpp
Go to the documentation of this file.
1 /* Project nGenEx
2  Destroyer Studios LLC
3  Copyright © 1997-2004. All Rights Reserved.
4 
5  SUBSYSTEM: nGenEx.lib
6  FILE: FormDef.cpp
7  AUTHOR: John DiCamillo
8 
9 
10  OVERVIEW
11  ========
12  Form and Control Definition Resources
13 */
14 
15 #include "MemDebug.h"
16 #include "FormDef.h"
17 #include "ParseUtil.h"
18 #include "DataLoader.h"
19 #include "Bitmap.h"
20 #include "Game.h"
21 
22 // +----------------------------------------------------------------------+
23 
25 : width(10), align(0), sort(0), color(Color::White), use_color(false)
26 { }
27 
28 ColumnDef::ColumnDef(const char* t, int w, int a, int s)
29 : title(t), width(w), align(a), sort(s),
30 color(Color::White), use_color(false)
31 { }
32 
33 // +----------------------------------------------------------------------+
34 
35 WinDef::WinDef(DWORD a_id, DWORD a_type, const char* a_text, DWORD a_style)
36 : id(a_id), pid(0), type(a_type), text(a_text), style(a_style)
37 {
38  rect = Rect(0,0,0,0);
39  text_align = 0;
40  single_line = false;
41  enabled = true;
42  transparent = false;
43  hide_partial = true;
47  fixed_width = 0;
48  fixed_height = 0;
49 }
50 
51 void WinDef::SetID(DWORD i) { id = i; }
52 void WinDef::SetParentID(DWORD i) { pid = i; }
53 void WinDef::SetType(DWORD t) { type = t; }
54 void WinDef::SetRect(const Rect& r) { rect = r; }
55 void WinDef::SetEnabled(bool e) { enabled = e; }
56 void WinDef::SetStyle(DWORD s) { style = s; }
57 void WinDef::SetFont(const char* t) { font = t; }
58 void WinDef::SetText(const char* t) { text = t; }
59 void WinDef::SetAltText(const char* t) { alt_text = t; }
60 void WinDef::SetTexture(const char* t) { texture = t; }
64 void WinDef::SetTextAlign(DWORD a) { text_align = a; }
65 void WinDef::SetSingleLine(bool a) { single_line = a; }
66 void WinDef::SetTransparent(bool t) { transparent = t; }
67 void WinDef::SetHidePartial(bool a) { hide_partial = a; }
68 
69 void WinDef::SetMargins(const Insets& m) { margins = m; }
70 void WinDef::SetTextInsets(const Insets& t) { text_insets = t; }
71 void WinDef::SetCellInsets(const Insets& c) { cell_insets = c; }
72 void WinDef::SetCells(const Rect& r) { cells = r; }
73 
74 // +----------------------------------------------------------------------+
75 
76 #define CTRL_DEF_ANIMATED 0x0001
77 #define CTRL_DEF_BORDER 0x0002
78 #define CTRL_DEF_DROP_SHADOW 0x0004
79 #define CTRL_DEF_INDENT 0x0008
80 #define CTRL_DEF_INVERT_LABEL 0x0010
81 #define CTRL_DEF_GLOW 0x0020
82 #define CTRL_DEF_SIMPLE 0x0040
83 #define CTRL_DEF_STICKY 0x0080
84 
85 CtrlDef::CtrlDef(DWORD a_id, DWORD a_type, const char* a_text, DWORD a_style)
86 : WinDef(a_id, a_type, a_text, a_style)
87 {
89  bevel_width = 5;
90  picture_loc = 1; // North
92 
93  active = false;
94  show_headings = false;
95 
96  leading = 0;
97  line_height = 0;
98  multiselect = 0;
99  dragdrop = 0;
100  orientation = 0;
101  scroll_bar = 1;
102  num_leds = 1;
103 
104  smooth_scroll = false;
105 
106  item_style = 0;
107  selected_style = 0;
108  pass_char = 0;
109 
110  items.destroy();
111 
112  ZeroMemory(tabs, sizeof(tabs));
113  ntabs = 0;
114 }
115 
117 {
118  items.destroy();
119  columns.destroy();
120 }
121 
123 {
124  WinDef::operator=(ctrl);
125 
126  ctrl_flags = ctrl.ctrl_flags;
127  bevel_width = ctrl.bevel_width;
128  picture_loc = ctrl.picture_loc;
129  picture_type = ctrl.picture_type;
130 
131  active = ctrl.active;
133 
134  leading = ctrl.leading;
135  line_height = ctrl.line_height;
136  multiselect = ctrl.multiselect;
137  dragdrop = ctrl.dragdrop;
138  orientation = ctrl.orientation;
139  scroll_bar = ctrl.scroll_bar;
140  pass_char = ctrl.pass_char;
141  active_color = ctrl.active_color;
142  border_color = ctrl.border_color;
143 
145 
146  item_style = ctrl.item_style;
148  pass_char = ctrl.pass_char;
149 
153 
154  return *this;
155 }
156 
158 {
159  return orientation;
160 }
161 
163 {
164  orientation = o;
165 }
166 
167 bool CtrlDef::GetActive() const
168 {
169  return active;
170 }
171 
172 void CtrlDef::SetActive(bool c)
173 {
174  active = c;
175 }
176 
178 {
179  return active_color;
180 }
181 
183 {
184  active_color = c;
185 }
186 
188 {
189  return ctrl_flags & CTRL_DEF_ANIMATED;
190 }
191 
192 void CtrlDef::SetAnimated(bool bNewValue)
193 {
194  if (bNewValue)
196  else
198 }
199 
201 {
202  return bevel_width;
203 }
204 
205 void CtrlDef::SetBevelWidth(short nNewValue)
206 {
207  bevel_width = nNewValue;
208 }
209 
210 bool CtrlDef::GetBorder() const
211 {
212  return (ctrl_flags & CTRL_DEF_BORDER)?true:false;
213 }
214 
215 void CtrlDef::SetBorder(bool bNewValue)
216 {
217  if (bNewValue)
219  else
221 }
222 
224 {
225  return border_color;
226 }
227 
229 {
230  border_color = c;
231 }
232 
234 {
235  return (ctrl_flags & CTRL_DEF_DROP_SHADOW)?true:false;
236 }
237 
238 void CtrlDef::SetDropShadow(bool bNewValue)
239 {
240  if (bNewValue)
242  else
244 }
245 
246 bool CtrlDef::GetIndent() const
247 {
248  return (ctrl_flags & CTRL_DEF_INDENT)?true:false;
249 }
250 
251 void CtrlDef::SetIndent(bool bNewValue)
252 {
253  if (bNewValue)
255  else
257 }
258 
260 {
261  return (ctrl_flags & CTRL_DEF_INVERT_LABEL)?true:false;
262 }
263 
264 void CtrlDef::SetInvertLabel(bool bNewValue)
265 {
266  if (bNewValue)
268  else
270 }
271 
273 {
274  return picture;
275 }
276 
277 void CtrlDef::SetPicture(const Text& img_name)
278 {
279  picture = img_name;
280 }
281 
283 {
284  return picture_loc;
285 }
286 
287 void CtrlDef::SetPictureLocation(short nNewValue)
288 {
289  picture_loc = nNewValue;
290 }
291 
293 {
294  return picture_type;
295 }
296 
297 void CtrlDef::SetPictureType(short nNewValue)
298 {
299  picture_type = nNewValue;
300 }
301 
302 bool CtrlDef::GetSticky() const
303 {
304  return (ctrl_flags & CTRL_DEF_STICKY)?true:false;
305 }
306 
307 void CtrlDef::SetSticky(bool bNewValue)
308 {
309  if (bNewValue)
311  else
313 }
314 
316 {
317  return num_leds;
318 }
319 
321 {
322  if (n > 0)
323  num_leds = n;
324 }
325 
326 int CtrlDef::NumItems() const
327 {
328  return items.size();
329 }
330 
331 Text CtrlDef::GetItem(int i) const
332 {
333  Text result;
334 
335  if (i >= 0 && i < items.size())
336  result = *(items[i]);
337 
338  return result;
339 }
340 
341 void CtrlDef::AddItem(const char* t)
342 {
343  items.append(new(__FILE__,__LINE__) Text(t));
344 }
345 
347 {
348  return columns.size();
349 }
350 
352 {
353  ColumnDef* result = 0;
354 
355  if (i >= 0 && i < columns.size())
356  result = columns[i];
357 
358  return result;
359 }
360 
361 void CtrlDef::AddColumn(const char* t, int w, int a, int s)
362 {
363  columns.append(new(__FILE__,__LINE__) ColumnDef(t,w,a,s));
364 }
365 
366 int CtrlDef::NumTabs() const
367 {
368  return ntabs;
369 }
370 
371 int CtrlDef::GetTab(int i) const
372 {
373  if (i >= 0 && i < ntabs)
374  return tabs[i];
375  return 0;
376 }
377 
378 void CtrlDef::SetTab(int i, int t)
379 {
380  if (i >= 0 && i < 10) {
381  tabs[i] = t;
382  if (i >= ntabs)
383  ntabs = i+1;
384  }
385 }
386 
387 void CtrlDef::AddTab(int i)
388 {
389  if (ntabs < 10)
390  tabs[ntabs++] = i;
391 }
392 
394 {
395  return show_headings;
396 }
397 
398 void CtrlDef::SetShowHeadings(bool bNewValue)
399 {
400  show_headings = bNewValue;
401 }
402 
404 {
405  return leading;
406 }
407 
408 void CtrlDef::SetLeading(int nNewValue)
409 {
410  leading = nNewValue;
411 }
412 
414 {
415  return line_height;
416 }
417 
418 void CtrlDef::SetLineHeight(int nNewValue)
419 {
420  line_height = nNewValue;
421 }
422 
424 {
425  return multiselect;
426 }
427 
428 void CtrlDef::SetMultiSelect(int nNewValue)
429 {
430  multiselect = nNewValue;
431 }
432 
434 {
435  return dragdrop;
436 }
437 
438 void CtrlDef::SetDragDrop(int nNewValue)
439 {
440  dragdrop = nNewValue;
441 }
442 
444 {
445  return scroll_bar;
446 }
447 
448 void CtrlDef::SetScrollBarVisible(int nNewValue)
449 {
450  scroll_bar = nNewValue;
451 }
452 
454 {
455  return smooth_scroll;
456 }
457 
458 void CtrlDef::SetSmoothScroll(bool bNewValue)
459 {
460  smooth_scroll = bNewValue;
461 }
462 
464 {
465  return item_style;
466 }
467 
468 void CtrlDef::SetItemStyle(short nNewValue)
469 {
470  item_style = nNewValue;
471 }
472 
474 {
475  return selected_style;
476 }
477 
478 void CtrlDef::SetSelectedStyle(short nNewValue)
479 {
480  selected_style = nNewValue;
481 }
482 
484 {
485  return pass_char;
486 }
487 
488 void CtrlDef::SetPasswordChar(char nNewValue)
489 {
490  pass_char = nNewValue;
491 }
492 
494 {
495  return standard_image;
496 }
497 
498 void CtrlDef::SetStandardImage(const Text& img_name)
499 {
500  standard_image = img_name;
501 }
502 
504 {
505  return activated_image;
506 }
507 
508 void CtrlDef::SetActivatedImage(const Text& img_name)
509 {
510  activated_image = img_name;
511 }
512 
514 {
515  return transition_image;
516 }
517 
518 void CtrlDef::SetTransitionImage(const Text& img_name)
519 {
520  transition_image = img_name;
521 }
522 
523 
524 // +----------------------------------------------------------------------+
525 
526 FormDef::FormDef(const char* a_text, DWORD a_style)
527 : WinDef(0, WIN_DEF_FORM, a_text, a_style)
528 {
529 }
530 
532 {
533  controls.destroy();
534 }
535 
537 {
538  if (def)
539  controls.append(def);
540 }
541 
543 {
544  if (ctrl_id > 0) {
545  CtrlDef test(ctrl_id, 0);
546  return controls.find(&test);
547  }
548 
549  return 0;
550 }
551 
554 {
555  // cast away const
556  FormDef* f = (FormDef*) this;
557  return f->controls;
558 }
559 
560 // +----------------------------------------------------------------------+
561 
562 static char filename[64];
563 static char path_name[64];
564 
565 void
566 FormDef::Load(const char* fname)
567 {
568  sprintf_s(filename, "%s.frm", fname);
569 
570  Print("Loading Form '%s'\n", fname);
571 
572  sprintf_s(path_name, "Screens/");
573 
574  // Load Design File:
575  DataLoader* loader = DataLoader::GetLoader();
576  loader->SetDataPath(path_name);
577 
578  BYTE* block;
579  int blocklen = loader->LoadBuffer(filename, block, true);
580 
581  if (!block || blocklen < 4)
582  return;
583 
584  Parser parser(new(__FILE__,__LINE__) BlockReader((const char*) block, blocklen));
585  Term* term = parser.ParseTerm();
586 
587  if (!term) {
588  Print("ERROR: could not parse '%s'\n", filename);
589  return;
590  }
591  else {
592  TermText* file_type = term->isText();
593  if (!file_type || file_type->value() != "FORM") {
594  Print("ERROR: invalid form file '%s'\n", filename);
595  return;
596  }
597  }
598 
599  do {
600  delete term;
601 
602  term = parser.ParseTerm();
603 
604  if (term) {
605  TermDef* def = term->isDef();
606  if (def) {
607  if (def->name()->value() == "form") {
608 
609  if (!def->term() || !def->term()->isStruct()) {
610  Print("WARNING: form structure missing in '%s'\n", filename);
611  }
612  else {
613  FormDef* form = this;
614  TermStruct* val = def->term()->isStruct();
615 
616  for (int i = 0; i < val->elements()->size(); i++) {
617  char buf[256];
618 
619  TermDef* pdef = val->elements()->at(i)->isDef();
620  if (pdef) {
621  if (pdef->name()->value() == "text" ||
622  pdef->name()->value() == "caption") {
623 
624  GetDefText(buf, pdef, filename);
625  form->SetText(Game::GetText(buf));
626  }
627 
628  else if (pdef->name()->value() == "id") {
629  DWORD id;
630  GetDefNumber(id, pdef, filename);
631  form->SetID(id);
632  }
633 
634  else if (pdef->name()->value() == "pid") {
635  DWORD id;
636  GetDefNumber(id, pdef, filename);
637  form->SetParentID(id);
638  }
639 
640  else if (pdef->name()->value() == "rect") {
641  Rect r;
642  GetDefRect(r, pdef, filename);
643  form->SetRect(r);
644  }
645 
646  else if (pdef->name()->value() == "font") {
647  GetDefText(buf, pdef, filename);
648  form->SetFont(buf);
649  }
650 
651  else if (pdef->name()->value() == "back_color") {
652  Color c;
653  GetDefColor(c, pdef, filename);
654  form->SetBackColor(c);
655  }
656 
657  else if (pdef->name()->value() == "base_color") {
658  Color c;
659  GetDefColor(c, pdef, filename);
660  form->SetBaseColor(c);
661  }
662 
663  else if (pdef->name()->value() == "fore_color") {
664  Color c;
665  GetDefColor(c, pdef, filename);
666  form->SetForeColor(c);
667  }
668 
669  else if (pdef->name()->value() == "margins") {
670  GetDefInsets(form->margins, pdef, filename);
671  }
672 
673  else if (pdef->name()->value() == "text_insets") {
674  GetDefInsets(form->text_insets, pdef, filename);
675  }
676 
677  else if (pdef->name()->value() == "cell_insets") {
678  GetDefInsets(form->cell_insets, pdef, filename);
679  }
680 
681  else if (pdef->name()->value() == "cells") {
682  GetDefRect(form->cells, pdef, filename);
683  }
684 
685  else if (pdef->name()->value() == "texture") {
686  GetDefText(buf, pdef, filename);
687 
688  if (*buf && !strchr(buf, '.'))
689  strcat_s(buf, ".pcx");
690 
691  form->SetTexture(buf);
692  }
693 
694  else if (pdef->name()->value() == "transparent") {
695  bool b;
696  GetDefBool(b, pdef, filename);
697  form->SetTransparent(b);
698  }
699 
700  else if (pdef->name()->value() == "style") {
701  DWORD s;
702  GetDefNumber(s, pdef, filename);
703  form->SetStyle(s);
704  }
705 
706  else if (pdef->name()->value() == "align" ||
707  pdef->name()->value() == "text_align") {
708  DWORD a = DT_LEFT;
709 
710  if (GetDefText(buf, pdef, filename)) {
711  if (!_stricmp(buf, "left"))
712  a = DT_LEFT;
713  else if (!_stricmp(buf, "right"))
714  a = DT_RIGHT;
715  else if (!_stricmp(buf, "center"))
716  a = DT_CENTER;
717  }
718 
719  else {
720  GetDefNumber(a, pdef, filename);
721  }
722 
723  form->SetTextAlign(a);
724  }
725 
726  // layout constraints:
727 
728  else if (pdef->name()->value() == "layout") {
729 
730  if (!pdef->term() || !pdef->term()->isStruct()) {
731  Print("WARNING: layout structure missing in '%s'\n", filename);
732  }
733  else {
734  TermStruct* val = pdef->term()->isStruct();
735  ParseLayoutDef(&form->layout, val);
736  }
737  }
738 
739  // controls:
740 
741  else if (pdef->name()->value() == "defctrl") {
742 
743  if (!pdef->term() || !pdef->term()->isStruct()) {
744  Print("WARNING: defctrl structure missing in '%s'\n", filename);
745  }
746  else {
747  TermStruct* val = pdef->term()->isStruct();
748  ParseCtrlDef(&form->defctrl, val);
749  }
750  }
751 
752  else if (pdef->name()->value() == "ctrl") {
753 
754  if (!pdef->term() || !pdef->term()->isStruct()) {
755  Print("WARNING: ctrl structure missing in '%s'\n", filename);
756  }
757  else {
758  CtrlDef* ctrl = new(__FILE__,__LINE__) CtrlDef;
759  TermStruct* val = pdef->term()->isStruct();
760 
761  form->AddCtrl(ctrl);
762  *ctrl = form->defctrl; // copy default params
763 
764  ParseCtrlDef(ctrl, val);
765  }
766  }
767 
768  // end of controls.
769  }
770  } // end form params
771  } // end form struct
772  } // end form
773 
774  else
775  Print("WARNING: unknown object '%s' in '%s'\n",
776  def->name()->value().data(), filename);
777  }
778  else {
779  Print("WARNING: term ignored in '%s'\n", filename);
780  term->print();
781  }
782  }
783  }
784  while (term);
785 
786  loader->ReleaseBuffer(block);
787  loader->SetDataPath(0);
788 }
789 
791 {
792  Text buf;
793 
794  ctrl->SetText("");
795 
796  for (int i = 0; i < val->elements()->size(); i++) {
797  TermDef* pdef = val->elements()->at(i)->isDef();
798  if (pdef) {
799  if (pdef->name()->value() == "text" ||
800  pdef->name()->value() == "caption") {
801  GetDefText(buf, pdef, filename);
802  ctrl->SetText(Game::GetText(buf));
803  }
804 
805  else if (pdef->name()->value() == "id") {
806  DWORD id;
807  GetDefNumber(id, pdef, filename);
808  ctrl->SetID(id);
809  }
810 
811  else if (pdef->name()->value() == "pid") {
812  DWORD id;
813  GetDefNumber(id, pdef, filename);
814  ctrl->SetParentID(id);
815  }
816 
817  else if (pdef->name()->value() == "alt") {
818  GetDefText(buf, pdef, filename);
819  ctrl->SetAltText(Game::GetText(buf));
820  }
821 
822  else if (pdef->name()->value() == "type") {
823  DWORD type = WIN_DEF_LABEL;
824 
825  GetDefText(buf, pdef, filename);
826  Text type_name(buf);
827 
828  if (type_name == "button")
829  type = WIN_DEF_BUTTON;
830 
831  else if (type_name == "combo")
832  type = WIN_DEF_COMBO;
833 
834  else if (type_name == "edit")
835  type = WIN_DEF_EDIT;
836 
837  else if (type_name == "image")
838  type = WIN_DEF_IMAGE;
839 
840  else if (type_name == "slider")
841  type = WIN_DEF_SLIDER;
842 
843  else if (type_name == "list")
844  type = WIN_DEF_LIST;
845 
846  else if (type_name == "rich" || type_name == "text" || type_name == "rich_text")
847  type = WIN_DEF_RICH;
848 
849  ctrl->SetType(type);
850  }
851 
852  else if (pdef->name()->value() == "rect") {
853  Rect r;
854  GetDefRect(r, pdef, filename);
855  ctrl->SetRect(r);
856  }
857 
858  else if (pdef->name()->value() == "font") {
859  GetDefText(buf, pdef, filename);
860  ctrl->SetFont(buf);
861  }
862 
863  else if (pdef->name()->value() == "active_color") {
864  Color c;
865  GetDefColor(c, pdef, filename);
866  ctrl->SetActiveColor(c);
867  }
868 
869  else if (pdef->name()->value() == "back_color") {
870  Color c;
871  GetDefColor(c, pdef, filename);
872  ctrl->SetBackColor(c);
873  }
874 
875  else if (pdef->name()->value() == "base_color") {
876  Color c;
877  GetDefColor(c, pdef, filename);
878  ctrl->SetBaseColor(c);
879  }
880 
881  else if (pdef->name()->value() == "border_color") {
882  Color c;
883  GetDefColor(c, pdef, filename);
884  ctrl->SetBorderColor(c);
885  }
886 
887  else if (pdef->name()->value() == "fore_color") {
888  Color c;
889  GetDefColor(c, pdef, filename);
890  ctrl->SetForeColor(c);
891  }
892 
893  else if (pdef->name()->value() == "texture") {
894  GetDefText(buf, pdef, filename);
895 
896  if (buf.length() > 0 && !buf.contains('.'))
897  buf.append(".pcx");
898 
899  ctrl->SetTexture(buf);
900  }
901 
902  else if (pdef->name()->value() == "margins") {
903  GetDefInsets(ctrl->margins, pdef, filename);
904  }
905 
906  else if (pdef->name()->value() == "text_insets") {
907  GetDefInsets(ctrl->text_insets, pdef, filename);
908  }
909 
910  else if (pdef->name()->value() == "cell_insets") {
911  GetDefInsets(ctrl->cell_insets, pdef, filename);
912  }
913 
914  else if (pdef->name()->value() == "cells") {
915  GetDefRect(ctrl->cells, pdef, filename);
916  }
917 
918  else if (pdef->name()->value() == "fixed_width") {
919  GetDefNumber(ctrl->fixed_width, pdef, filename);
920  }
921 
922  else if (pdef->name()->value() == "fixed_height") {
923  GetDefNumber(ctrl->fixed_height, pdef, filename);
924  }
925 
926  else if (pdef->name()->value() == "standard_image") {
927  GetDefText(buf, pdef, filename);
928 
929  if (buf.length() > 0 && !buf.contains('.'))
930  buf.append(".pcx");
931 
932  ctrl->SetStandardImage(buf);
933  }
934 
935  else if (pdef->name()->value() == "activated_image") {
936  GetDefText(buf, pdef, filename);
937 
938  if (buf.length() > 0 && !buf.contains('.'))
939  buf.append(".pcx");
940 
941  ctrl->SetActivatedImage(buf);
942  }
943 
944  else if (pdef->name()->value() == "transition_image") {
945  GetDefText(buf, pdef, filename);
946 
947  if (buf.length() > 0 && !buf.contains('.'))
948  buf.append(".pcx");
949 
950  ctrl->SetTransitionImage(buf);
951  }
952 
953  else if (pdef->name()->value() == "picture") {
954  GetDefText(buf, pdef, filename);
955 
956  if (buf.length() > 0 && !buf.contains('.'))
957  buf.append(".pcx");
958 
959  ctrl->SetPicture(buf);
960  }
961 
962  else if (pdef->name()->value() == "enabled") {
963  bool e;
964  GetDefBool(e, pdef, filename);
965  ctrl->SetEnabled(e);
966  }
967 
968  else if (pdef->name()->value() == "item") {
969  GetDefText(buf, pdef, filename);
970  ctrl->AddItem(Game::GetText(buf));
971  }
972 
973  else if (pdef->name()->value() == "tab") {
974  int tab = 0;
975  GetDefNumber(tab, pdef, filename);
976  ctrl->AddTab(tab);
977  }
978 
979  else if (pdef->name()->value() == "column") {
980 
981  if (!pdef->term() || !pdef->term()->isStruct()) {
982  Print("WARNING: column structure missing in '%s'\n", filename);
983  }
984  else {
985  TermStruct* val = pdef->term()->isStruct();
986  ParseColumnDef(ctrl, val);
987  }
988  }
989 
990  else if (pdef->name()->value() == "orientation") {
991  int n;
992  GetDefNumber(n, pdef, filename);
993  ctrl->SetOrientation(n);
994  }
995 
996  else if (pdef->name()->value() == "leading") {
997  int n;
998  GetDefNumber(n, pdef, filename);
999  ctrl->SetLeading(n);
1000  }
1001 
1002  else if (pdef->name()->value() == "line_height") {
1003  int n;
1004  GetDefNumber(n, pdef, filename);
1005  ctrl->SetLineHeight(n);
1006  }
1007 
1008  else if (pdef->name()->value() == "multiselect") {
1009  int n;
1010  GetDefNumber(n, pdef, filename);
1011  ctrl->SetMultiSelect(n);
1012  }
1013 
1014  else if (pdef->name()->value() == "dragdrop") {
1015  int n;
1016  GetDefNumber(n, pdef, filename);
1017  ctrl->SetDragDrop(n);
1018  }
1019 
1020  else if (pdef->name()->value() == "scroll_bar") {
1021  int n;
1022  GetDefNumber(n, pdef, filename);
1023  ctrl->SetScrollBarVisible(n);
1024  }
1025 
1026  else if (pdef->name()->value() == "smooth_scroll") {
1027  bool b;
1028  GetDefBool(b, pdef, filename);
1029  ctrl->SetSmoothScroll(b);
1030  }
1031 
1032  else if (pdef->name()->value() == "picture_loc") {
1033  int n;
1034  GetDefNumber(n, pdef, filename);
1035  ctrl->SetPictureLocation((short) n);
1036  }
1037 
1038  else if (pdef->name()->value() == "picture_type") {
1039  int n;
1040  GetDefNumber(n, pdef, filename);
1041  ctrl->SetPictureType((short) n);
1042  }
1043 
1044  else if (pdef->name()->value() == "style") {
1045  DWORD s;
1046  GetDefNumber(s, pdef, filename);
1047  ctrl->SetStyle(s);
1048  }
1049 
1050  else if (pdef->name()->value() == "align" ||
1051  pdef->name()->value() == "text_align") {
1052  DWORD a = DT_LEFT;
1053 
1054  if (GetDefText(buf, pdef, filename)) {
1055  if (!_stricmp(buf, "left"))
1056  a = DT_LEFT;
1057  else if (!_stricmp(buf, "right"))
1058  a = DT_RIGHT;
1059  else if (!_stricmp(buf, "center"))
1060  a = DT_CENTER;
1061  }
1062 
1063  else {
1064  GetDefNumber(a, pdef, filename);
1065  }
1066 
1067  ctrl->SetTextAlign(a);
1068  }
1069 
1070  else if (pdef->name()->value() == "single_line") {
1071  bool single = false;
1072  GetDefBool(single, pdef, filename);
1073  ctrl->SetSingleLine(single);
1074  }
1075 
1076  else if (pdef->name()->value() == "bevel_width") {
1077  DWORD s;
1078  GetDefNumber(s, pdef, filename);
1079  ctrl->SetBevelWidth((short) s);
1080  }
1081 
1082  else if (pdef->name()->value() == "active") {
1083  bool b;
1084  GetDefBool(b, pdef, filename);
1085  ctrl->SetActive(b);
1086  }
1087 
1088  else if (pdef->name()->value() == "animated") {
1089  bool b;
1090  GetDefBool(b, pdef, filename);
1091  ctrl->SetAnimated(b);
1092  }
1093 
1094  else if (pdef->name()->value() == "border") {
1095  bool b;
1096  GetDefBool(b, pdef, filename);
1097  ctrl->SetBorder(b);
1098  }
1099 
1100  else if (pdef->name()->value() == "drop_shadow") {
1101  bool b;
1102  GetDefBool(b, pdef, filename);
1103  ctrl->SetDropShadow(b);
1104  }
1105 
1106  else if (pdef->name()->value() == "show_headings") {
1107  bool b;
1108  GetDefBool(b, pdef, filename);
1109  ctrl->SetShowHeadings(b);
1110  }
1111 
1112  else if (pdef->name()->value() == "sticky") {
1113  bool b;
1114  GetDefBool(b, pdef, filename);
1115  ctrl->SetSticky(b);
1116  }
1117 
1118  else if (pdef->name()->value() == "transparent") {
1119  bool b;
1120  GetDefBool(b, pdef, filename);
1121  ctrl->SetTransparent(b);
1122  }
1123 
1124  else if (pdef->name()->value() == "hide_partial") {
1125  bool b;
1126  GetDefBool(b, pdef, filename);
1127  ctrl->SetHidePartial(b);
1128  }
1129 
1130  else if (pdef->name()->value() == "num_leds") {
1131  int n;
1132  GetDefNumber(n, pdef, filename);
1133  ctrl->SetNumLeds(n);
1134  }
1135 
1136  else if (pdef->name()->value() == "item_style") {
1137  int n;
1138  GetDefNumber(n, pdef, filename);
1139  ctrl->SetItemStyle((short) n);
1140  }
1141 
1142  else if (pdef->name()->value() == "selected_style") {
1143  int n;
1144  GetDefNumber(n, pdef, filename);
1145  ctrl->SetSelectedStyle((short) n);
1146  }
1147 
1148  else if (pdef->name()->value() == "password") {
1149  Text password;
1150  GetDefText(password, pdef, filename);
1151  ctrl->SetPasswordChar((char) password[0]);
1152  }
1153 
1154  // layout constraints:
1155 
1156  else if (pdef->name()->value() == "layout") {
1157 
1158  if (!pdef->term() || !pdef->term()->isStruct()) {
1159  Print("WARNING: layout structure missing in '%s'\n", filename);
1160  }
1161  else {
1162  TermStruct* val = pdef->term()->isStruct();
1163  ParseLayoutDef(&ctrl->layout, val);
1164  }
1165  }
1166  }
1167  }
1168 }
1169 
1171 {
1172  Text text;
1173  char buf[256];
1174  int width = 0;
1175  int align = 0;
1176  int sort = 0;
1177  Color c;
1178  bool use_color = false;
1179 
1180  for (int i = 0; i < val->elements()->size(); i++) {
1181  TermDef* pdef = val->elements()->at(i)->isDef();
1182  if (pdef) {
1183  if (pdef->name()->value() == "text" ||
1184  pdef->name()->value() == "title") {
1185  GetDefText(buf, pdef, filename);
1186  text = Game::GetText(buf);
1187  }
1188 
1189  else if (pdef->name()->value() == "width") {
1190  GetDefNumber(width, pdef, filename);
1191  }
1192 
1193  else if (pdef->name()->value() == "align") {
1194  align = DT_LEFT;
1195 
1196  if (GetDefText(buf, pdef, filename)) {
1197  if (!_stricmp(buf, "left"))
1198  align = DT_LEFT;
1199  else if (!_stricmp(buf, "right"))
1200  align = DT_RIGHT;
1201  else if (!_stricmp(buf, "center"))
1202  align = DT_CENTER;
1203  }
1204 
1205  else {
1206  GetDefNumber(align, pdef, filename);
1207  }
1208  }
1209 
1210  else if (pdef->name()->value() == "sort") {
1211  GetDefNumber(sort, pdef, filename);
1212  }
1213 
1214  else if (pdef->name()->value() == "color") {
1215  GetDefColor(c, pdef, filename);
1216  use_color = true;
1217  }
1218  }
1219  }
1220 
1221  ctrl->AddColumn(text, width, align, sort);
1222 
1223  if (use_color) {
1224  int index = ctrl->NumColumns()-1;
1225  ColumnDef* column = ctrl->GetColumn(index);
1226 
1227  if (column) {
1228  column->color = c;
1229  column->use_color = true;
1230  }
1231  }
1232 }
1233 
1235 {
1236  if (!def || !val)
1237  return;
1238 
1239  for (int i = 0; i < val->elements()->size(); i++) {
1240  TermDef* pdef = val->elements()->at(i)->isDef();
1241  if (pdef) {
1242  if (pdef->name()->value() == "x_mins" ||
1243  pdef->name()->value() == "cols") {
1244  GetDefArray(def->x_mins, pdef, filename);
1245  }
1246 
1247  else
1248  if (pdef->name()->value() == "y_mins" ||
1249  pdef->name()->value() == "rows") {
1250  GetDefArray(def->y_mins, pdef, filename);
1251  }
1252 
1253  else
1254  if (pdef->name()->value() == "x_weights" ||
1255  pdef->name()->value() == "col_wts") {
1256  GetDefArray(def->x_weights, pdef, filename);
1257  }
1258 
1259  else
1260  if (pdef->name()->value() == "y_weights" ||
1261  pdef->name()->value() == "row_wts") {
1262  GetDefArray(def->y_weights, pdef, filename);
1263  }
1264  }
1265  }
1266 
1267 }
1268 
1269