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

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