home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / autocalc.pak / AUTOCALC.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  7KB  |  210 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents - (C) Copyright 1994 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include "autocalc.h"
  5. #include "autocalc.hh"  // help constants (HC_???)
  6.  
  7. TLangId TLocaleString::NativeLangId=MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
  8.  
  9.   DEFINE_AUTOENUM(CalcOps, TAutoShort)
  10.   AUTOENUM("!Add",      OP_PLUS)
  11.   AUTOENUM("!Subtract", OP_MINUS)
  12.   AUTOENUM("!Multiply", OP_MULT)
  13.   AUTOENUM("!Divide",   OP_DIV)
  14.   AUTOENUM("!Equals",   OP_EQUALS)
  15.   AUTOENUM("!Clear",    OP_CLEAR)
  16.   END_AUTOENUM(CalcOps, TAutoShort)
  17.  
  18. DEFINE_AUTOCLASS(TCalc)
  19.   EXPOSE_PROPRW(Opnd,      TAutoLong,  "Operand",      "@Operand_", HC_TCALC_OPERAND)
  20.   EXPOSE_PROPRW_ID(0,Accum,TAutoLong,  "!Accumulator", "@Accumulator_", HC_TCALC_ACCUMULATOR)
  21.   EXPOSE_PROPRW(Op,        CalcOps,    "Op",           "@Op_", HC_TCALC_OPERATOR)
  22.   EXPOSE_METHOD(Eval,      TAutoBool,  "!Evaluate",    "@Evaluate_", HC_TCALC_EVALUATE)
  23.   EXPOSE_METHOD(Clear,     TAutoVoid,  "!Clear",       "@Clear_", HC_TCALC_CLEAR)
  24.   EXPOSE_METHOD(Display,   TAutoVoid,  "!Display",     "@Display_", HC_TCALC_DISPLAY)
  25.   EXPOSE_QUIT(                         "!Quit",        "@Quit_", HC_TCALC_QUIT)
  26.   EXPOSE_METHOD(Button,    TAutoBool,  "!Button",      "@Button_", HC_TCALC_BUTTON)
  27.     REQUIRED_ARG(           TAutoString,"!Key")
  28.   EXPOSE_PROPRO(Window,    TCalcWindow,"!Window",      "@Window_", HC_TCALC_WINDOW)
  29.   EXPOSE_METHOD(LookAt,    TAutoLong,  "!LookAtWindow","@LookAtWindow_", HC_TCALC_LOOKATWINDOW)
  30.     REQUIRED_ARG(           TCalcWindow,"!Window")
  31.   EXPOSE_PROPRO(MyArray,   TMyArray,   "!Array",       "@Array_", HC_TCALC_ARRAY)
  32.   EXPOSE_PROPRW(Update,    TAutoDispatch, "!Update",   "@Update_", HC_TCALC_UPDATE)
  33.   EXPOSE_PROPRW(Visible,   TAutoBool,  "!Visible",     "@Visible_", HC_TCALC_VISIBLE)
  34.   EXPOSE_APPLICATION(      TCalc,      "!Application", "@Application_", HC_TCALC_APPLICATION)
  35. END_AUTOCLASS(TCalc, tfAppObject|tfCanCreate, "TCalc", "@TCalc", HC_TCALC)
  36.  
  37. DEFINE_AUTOCLASS(TCalcWindow)
  38.   EXPOSE_PROPRW(Caption,    TAutoString, "!Caption",    "@Caption_",HC_TCALCWINDOW_TITLE)
  39.   EXPOSE_PROPRW(Background, TAutoLong,   "!Color",      "@Color_",  HC_TCALCWINDOW_BKGNDCOLOR)
  40.   EXPOSE_PROPRW(Height,     TAutoLong,   "!Height",     "@Height_", HC_TCALCWINDOW_HEIGHT)
  41.   EXPOSE_PROPRW(Width,      TAutoLong,   "!Width",      "@Width_",  HC_TCALCWINDOW_WIDTH)
  42.   EXPOSE_PROPRO(Buttons,    TCalcButtons,"!Buttons",    "@Buttons_",HC_TCALCWINDOW_BUTTONS)
  43.   EXPOSE_APPLICATION(       TCalc,       "!Application","@Application_", HC_TCALC_APPLICATION)
  44. END_AUTOCLASS(TCalcWindow,  tfNormal,    "TCalcWindow", "@TCalcWindow", HC_TCALCWINDOW)
  45.  
  46. DEFINE_AUTOCLASS(TMyArray)
  47.   EXPOSE_PROPRO(Count,      TAutoLong,  "!Count", "@CountAr_", HC_TMYARRAY_COUNT)
  48.   EXPOSE_ITERATOR(          TAutoShort,           "Array Iterator", HC_TMYARRAY_ITERATOR)
  49.   EXPOSE_METHOD_ID(0, Item, TAutoShort, "!Item",  "@ItemAr_", 0)
  50.     REQUIRED_ARG(            TAutoShort, "!Index")
  51. END_AUTOCLASS(TMyArray,     tfNormal,   "TCalcArray", "@TMyArray", HC_TMYARRAY)
  52.  
  53. DEFINE_AUTOCLASS(TCalcButtons)
  54.   EXPOSE_PROPRO(Count,      TAutoLong,  "!Count",      "@CountBu_", HC_TCALCBUTTONS_COUNT)
  55.   EXPOSE_ITERATOR(          TCalcButton,          "Button Iterator", HC_TCALCBUTTONS_ITERATOR)
  56.   EXPOSE_METHOD_ID(0, Item, TCalcButton,"!Item",  "@ItemBu_", 0)
  57.     REQUIRED_ARG(            TAutoShort, "!Index")
  58. END_AUTOCLASS(TCalcButtons, tfNormal,   "TButtonList", "@TCalcButtons", HC_TCALCBUTTONS)
  59.  
  60. DEFINE_AUTOCLASS(TCalcButton)
  61.   EXPOSE_PROPRW(Text,    TAutoString, "!Text",    "@Text_", HC_TCALCBUTTON_TEXT)
  62.   EXPOSE_PROPRW(Push,    TAutoBool,   "!Activate","@Activate_", HC_TCALCBUTTON_STATE)
  63.   EXPOSE_APPLICATION(    TCalc,       "!Application", "@Application_", HC_TCALC_APPLICATION)
  64. END_AUTOCLASS(TCalcButton,tfNormal,   "TCalcButton", "@TCalcButton", HC_TCALCBUTTON)
  65.  
  66. DEFINE_AUTOEVENTCLASS(TCalcEvents)
  67.   EXPOSE_PROPWO_ID(0, , TAutoLong, "Value", "Result update", 0)
  68. END_AUTOEVENTCLASS(TCalcEvents,tfDefault,"TCalcEvents", "Calculator Events", 0)
  69.  
  70. void TUpdate::SetResult(long val)
  71. {
  72.   AUTONAMES0("Value")
  73.   AUTOARGS0()
  74.   AUTOCALL_PROP_SET(val)
  75. }
  76.  
  77. TCalc::TCalc(HINSTANCE hInst, uint32 options) : Options(options)
  78. {
  79.   Window.hWnd = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_CALC), 0, 0);
  80.   ::SetWindowLong(Window, DLGWINDOWEXTRA, (long)this);
  81.   ::ShowWindow(Window, SW_SHOW);
  82.   Clear();
  83.   Display();
  84.   for (int i = 0; i < COUNT; i++)
  85.     Elem[i] = short((i+1)*10);
  86. }
  87.  
  88. void TCalc::Clear()
  89. {
  90.   Op = OP_CLEAR;
  91.   Eval();
  92. }
  93.  
  94. bool TCalc::Eval()
  95. {
  96.   switch(Op) {
  97.   case OP_PLUS:   Accum += Opnd; break;
  98.   case OP_MINUS:  Accum -= Opnd; break;
  99.   case OP_MULT:   Accum *= Opnd; break;
  100.   case OP_DIV:    if (!Opnd) return false; Accum /= Opnd; break;
  101.   case OP_EQUALS: Accum = Opnd;  break;
  102.   case OP_CLEAR:  Accum = 0;     break;
  103.   case OP_NONE:   break;
  104.   default:        return false;
  105.   }
  106.   Op = OP_EQUALS; // in case clear or if Eval called again with no op
  107.   Opnd = 0;
  108.   Entry = false;
  109.   if (Update.IsBound())
  110.     Update.SetResult(Accum);
  111.   return true;
  112. }
  113.  
  114. void TCalc::Display()
  115. {
  116.   long val = Entry ? Opnd : Accum;
  117.   char buf[20];
  118.   wsprintf(buf, "%ld", val);
  119.   SetDlgItemText(Window, IDC_DISPLAY, buf);
  120. }
  121.  
  122. bool TCalc::Button(const char far* txt)
  123. {
  124.   short ret = true;
  125.   const char* list = BUTTON_CHARS;
  126.   while (*txt) {
  127.      const char far* s = strchr(list, *txt++);
  128.      if (s)
  129.         ButtonPush(int(s-list) + IDC_FIRSTID);
  130.      else
  131.         ret = false;
  132.   }
  133.   return ret;
  134. }
  135.  
  136. int TCalc::ButtonPush(int button)  // internal call, not automated
  137. {
  138.   if(button >= IDC_FIRSTDIGIT && button <= IDC_LASTDIGIT) {
  139.      Opnd  = (Opnd * 10) + long(button - IDC_FIRSTDIGIT);
  140.      Entry = true;
  141.   } else if(button >= IDC_FIRSTOP && button <= IDC_LASTOP) {
  142.      if (button == IDC_CLEAR) {
  143.         Clear();
  144.      } else {
  145.         if (Entry)
  146.           Eval();
  147.         Op = short(button-IDC_FIRSTOP);
  148.      }
  149.   }else{
  150.      return 0; // unknown button
  151.   }
  152.   Display();
  153.   return 1;
  154. }
  155.  
  156. bool TCalc::GetVisible()
  157. {
  158.   return (bool)Window && ::IsWindowVisible(Window);
  159. }
  160.  
  161. void TCalc::SetVisible(bool show)
  162. {
  163.   ::ShowWindow(Window, show);
  164. }
  165.  
  166. void TCalcWindow::SetCaption(const char far* text)
  167. {
  168.   ::SetWindowText(hWnd, text);
  169. }
  170.  
  171. const char* TCalcWindow::GetCaption()
  172. {
  173.   static char buf[256];
  174.   return ::GetWindowText(hWnd, buf, sizeof(buf)-1) ? buf : 0;
  175. }
  176.  
  177. int TCalcWindow::GetWidth()
  178. {
  179.   RECT rect;
  180.   ::GetWindowRect(hWnd, &rect);
  181.   return rect.right - rect.left;
  182. }
  183.  
  184. void TCalcWindow::SetWidth(int width)
  185. {
  186.   RECT rect;
  187.   ::GetWindowRect(hWnd, &rect);
  188.   ::MoveWindow(hWnd, rect.left, rect.top, width, rect.bottom-rect.top, TRUE);
  189. }
  190.  
  191. int TCalcWindow::GetHeight()
  192. {
  193.   RECT rect;
  194.   ::GetWindowRect(hWnd, &rect);
  195.   return rect.bottom - rect.top;
  196. }
  197.  
  198. void TCalcWindow::SetHeight(int height)
  199. {
  200.   RECT rect;
  201.   ::GetWindowRect(hWnd, &rect);
  202.   ::MoveWindow(hWnd, rect.left, rect.top, rect.right-rect.left, height,TRUE);
  203. }
  204.  
  205. void TCalcWindow::SetBackground(long color)
  206. {
  207.   Background = color;
  208.   ::InvalidateRect(hWnd, 0, TRUE);
  209. }
  210.