home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / TBEXPERT.PAK / GADGFACT.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  7.2 KB  |  332 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1995, 1995 by Borland International, All Rights Reserved
  4. //
  5. // Filename:    gadgfact.cpp
  6. //
  7. // Date:        27-Sep-95
  8. //
  9. // Description:
  10. //----------------------------------------------------------------------------
  11. #include <owl/pch.h>
  12. #include "TBExpert.h"
  13.  
  14. int CountOfGadgetFactories = 0;
  15. TGadgetFactory** GadgetFactories;
  16.  
  17. void
  18. TGadgetFactory::Init(int id, TGadget::TBorderStyle border, const char* resId)
  19. {
  20.   Id = id;
  21.   BorderStyle = border;
  22.   if (resId)
  23.     ResId = strnewdup(resId);
  24.   else
  25.     ResId = 0;
  26. }
  27.  
  28. TGadgetFactory::TGadgetFactory(int id, TGadget::TBorderStyle border) // time gadget
  29. :
  30.   Type(Time)
  31. {
  32.   Init(id, border, 0);
  33. }
  34.  
  35. TGadgetFactory::TGadgetFactory(int id, TGadget::TBorderStyle border, int data)
  36. :
  37.   Type(Separator)
  38. {
  39.   Init(id, border, 0);
  40.   Width = data;
  41. }
  42.  
  43. TGadgetFactory::TGadgetFactory(int id, TGadget::TBorderStyle border, int key, const char* text)
  44. :
  45.   Type(Mode),
  46.   Key(key)
  47. {
  48.   Init(id, border, 0);
  49.   GadgetText = strnewdup(text);
  50. }
  51.  
  52. TGadgetFactory::TGadgetFactory(int id, TGadget::TBorderStyle border,
  53.                                TTextGadget::TAlign align, uint chars,
  54.                                const char* text)
  55. :
  56.   Type(Text),
  57.   Align(align),
  58.   NumChars(chars)
  59. {
  60.   Init(id, border, 0);
  61.   GadgetText = strnewdup(text);
  62. }
  63.  
  64. TGadgetFactory::TGadgetFactory(int id, TGadget::TBorderStyle border,
  65.                                TButtonGadget::TType type,
  66.                                TButtonGadget::TState state, const char* bmp)
  67. :
  68.   Type(Button),
  69.   ButtonType(type),
  70.   ButtonState(state)
  71. {
  72.   Init(id, border, 0);
  73.   PathToBmp = strnewdup(bmp);
  74. }
  75.  
  76. TGadgetFactory::~TGadgetFactory()
  77. {
  78.   delete[] ResId;
  79.   if (Type == Text || Type == Mode)
  80.     delete[] GadgetText;
  81.   else if (Type == Button)
  82.     delete[] PathToBmp;
  83. }
  84.  
  85.  
  86. TGadget*
  87. TGadgetFactory::CreateGadget(int index)
  88. {
  89.   TGadget* gadget = 0;
  90.  
  91.   switch (Type) {
  92.     case Separator: {
  93.       gadget = new TSeparatorGadget(Width, DummyGadgetIdBase);
  94.       break;
  95.     }
  96.     case Mode: {
  97.       gadget = new TModeGadget(Key, GadgetText, DummyGadgetIdBase + index);
  98.       break;
  99.     }
  100.     case Time: {
  101.       gadget = new TTimeGadget(&TTimeGadget::GetTTime, DummyGadgetIdBase + index);
  102.       break;
  103.     }
  104.     case Text: {
  105.       gadget = new TTextGadget(DummyGadgetIdBase + index, BorderStyle, Align, NumChars, GadgetText);
  106.       break;
  107.     }
  108.     case Button: {
  109.       gadget = new TDynamicButtonGadget(PathToBmp, DummyGadgetIdBase + index,
  110.                    ButtonType, false, ButtonState);
  111.       break;
  112.     }
  113.   }
  114.  
  115.   if (gadget != 0)
  116.     if (!(Type == Separator || Type == Button))
  117.       gadget->SetBorderStyle(BorderStyle);
  118.  
  119.   return gadget;
  120. }
  121.  
  122. void
  123. TGadgetFactory::GenerateDefine(ofstream& f)
  124. {
  125.   if (ResId && strlen(ResId) > 0)
  126.     f << "#define " << ResId << " " << Id << endl;
  127. }
  128.  
  129. void
  130. TGadgetFactory::GenerateProperId(ofstream& f)
  131. {
  132.   if (ResId && strlen(ResId) > 0) {
  133.     f << ResId;
  134.   }
  135.   else {
  136.     f << Id;
  137.   }
  138. }
  139.  
  140. static void
  141. GenerateBorderStyle(TGadget::TBorderStyle bs, ofstream& f)
  142. {
  143.   struct {
  144.     TGadget::TBorderStyle BorderStyle;
  145.     char*                 Name;
  146.   } mapping[] = {
  147.     { TGadget::None, "TGadget::None" },
  148.     { TGadget::Plain, "TGadget::Plain" },
  149.     { TGadget::Raised, "TGadget::Raised" },
  150.     { TGadget::Recessed, "TGadget::Recessed" },
  151.     { TGadget::Embossed, "TGadget::Embossed" },
  152.     { TGadget::Grooved, "TGadget::Grooved" },
  153.     { TGadget::ButtonUp, "TGadget::ButtonUp" },
  154.     { TGadget::ButtonDn, "TGadget::ButtonDn" },
  155.     { TGadget::WndRaised, "TGadget::WndRaised" },
  156.     { TGadget::WndRecessed, "TGadget::WndRecessed" },
  157.     { TGadget::WellSet, "TGadget::WellSet" }
  158.   };
  159.  
  160.   for (int i = 0; i < sizeof mapping/sizeof mapping[0]; i++) {
  161.     if (mapping[i].BorderStyle == bs) {
  162.       f << mapping[i].Name;
  163.       return;
  164.     }
  165.   }
  166. }
  167.  
  168. static void
  169. GenerateAlign(TTextGadget::TAlign align, ofstream& f)
  170. {
  171.   struct {
  172.     TTextGadget::TAlign Align;
  173.     char*               Name;
  174.   } mapping[] = {
  175.     { TTextGadget::Left,   "TGadget::Left" },
  176.     { TTextGadget::Center, "TGadget::Center" },
  177.     { TTextGadget::Right,  "TGadget::Right" }
  178.   };
  179.  
  180.   for (int i = 0; i < sizeof mapping/sizeof mapping[0]; i++) {
  181.     if (mapping[i].Align == align) {
  182.       f << mapping[i].Name;
  183.       return;
  184.     }
  185.   }
  186. }
  187.  
  188. void
  189. TGadgetFactory::GenerateCode(ofstream& f)
  190. {
  191.   switch (Type) {
  192.     case Separator: {
  193.       f << "*new TSeparatorGadget(" << Width << ", ";
  194.       GenerateProperId(f);
  195.       f << ")";
  196.       break;
  197.     }
  198.     case Mode: {
  199.       f << "*new TModeGadget( 0x" << hex << Key << dec << ", " << '\"' << GadgetText << '\"' << ", ";
  200.       GenerateProperId(f);
  201.       f << ", ";
  202.       GenerateBorderStyle(BorderStyle, f);
  203.       f << ")";
  204.       break;
  205.     }
  206.     case Time: {
  207.       f << "*new TTimeGadget(&TTimeGadget::GetTTime, ";
  208.       GenerateProperId(f);
  209.       f << ")";
  210.       break;
  211.     }
  212.     case Text: {
  213.       f << "*new TTextGadget(";
  214.       GenerateProperId(f);
  215.       f << ", ";
  216.       GenerateBorderStyle(BorderStyle, f);
  217.       f << ", ";
  218.       GenerateAlign(Align, f);
  219.       f << ", " << NumChars << ", " << '\"' << GadgetText << '\"';
  220.       f << ")";
  221.       break;
  222.     }
  223.     case Button: {
  224.       f << "*new TButtonGadget(";
  225.       GenerateProperId(f);
  226.       f << ", ";
  227.       GenerateProperId(f);
  228.       f << ")";
  229.       break;
  230.     }
  231.   }
  232. }
  233.  
  234.  
  235. void
  236. TGadgetFactory::SetId(int id)
  237. {
  238.   Id = id;
  239. }
  240.  
  241. void
  242. TGadgetFactory::SetBorderStyle(int style)
  243. {
  244.   struct {
  245.     TGadget::TBorderStyle BorderStyle;
  246.   } mapping[] = {
  247.     { TGadget::None },
  248.     { TGadget::Plain },
  249.     { TGadget::Raised },
  250.     { TGadget::Recessed },
  251.     { TGadget::Embossed },
  252.     { TGadget::Grooved },
  253.     { TGadget::ButtonUp },
  254.     { TGadget::ButtonDn },
  255.     { TGadget::WndRaised },
  256.     { TGadget::WndRecessed },
  257.     { TGadget::WellSet }
  258.   };
  259.  
  260.   BorderStyle = mapping[style].BorderStyle;
  261. }
  262.  
  263. void
  264. TGadgetFactory::SetResId(const char* resId)
  265. {
  266.   delete ResId;
  267.   ResId = strnewdup(resId);
  268. }
  269.  
  270. void
  271. TGadgetFactory::SetAlign(int align)
  272. {
  273.   struct {
  274.     TTextGadget::TAlign Align;
  275.   } mapping[] = {
  276.     { TTextGadget::Left },
  277.     { TTextGadget::Center },
  278.     { TTextGadget::Right }
  279.   };
  280.  
  281.   Align = mapping[align].Align;
  282. }
  283.  
  284. void
  285. TGadgetFactory::SetNumChars(uint numChars)
  286. {
  287.   NumChars = numChars;
  288. }
  289.  
  290. void
  291. TGadgetFactory::SetGadgetText(const char* text)
  292. {
  293.   delete[] GadgetText;
  294.   GadgetText = strnewdup(text);
  295. }
  296.  
  297. void
  298. TGadgetFactory::SetKey(int key)
  299. {
  300.   Key = key;
  301. }
  302.  
  303. void
  304. TGadgetFactory::SetButtonType(int type)
  305. {
  306.   struct {
  307.     TButtonGadget::TType Type;
  308.   } mapping[] = {
  309.     { TButtonGadget::Command },
  310.     { TButtonGadget::Exclusive },
  311.     { TButtonGadget::NonExclusive },
  312.     { TButtonGadget::SemiExclusive },
  313.     { TButtonGadget::RepeatCmd }
  314.   };
  315.  
  316.   ButtonType = mapping[type].Type;
  317. }
  318.  
  319. void
  320. TGadgetFactory::SetButtonState(int state)
  321. {
  322.   struct {
  323.     TButtonGadget::TState State;
  324.   } mapping[] = {
  325.     { TButtonGadget::Up },
  326.     { TButtonGadget::Down },
  327.     { TButtonGadget::Indeterminate }
  328.   };
  329.  
  330.   ButtonState = mapping[state].State;
  331. }
  332.