home *** CD-ROM | disk | FTP | other *** search
- //----------------------------------------------------------------------------
- // ObjectComponents - (C) Copyright 1994 by Borland International
- //----------------------------------------------------------------------------
- #include "autocalc.h"
- #include "autocalc.hh" // help constants (HC_???)
-
- TLangId TLocaleString::NativeLangId=MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
-
- DEFINE_AUTOENUM(CalcOps, TAutoShort)
- AUTOENUM("!Add", OP_PLUS)
- AUTOENUM("!Subtract", OP_MINUS)
- AUTOENUM("!Multiply", OP_MULT)
- AUTOENUM("!Divide", OP_DIV)
- AUTOENUM("!Equals", OP_EQUALS)
- AUTOENUM("!Clear", OP_CLEAR)
- END_AUTOENUM(CalcOps, TAutoShort)
-
- DEFINE_AUTOCLASS(TCalc)
- EXPOSE_PROPRW(Opnd, TAutoLong, "Operand", "@Operand_", HC_TCALC_OPERAND)
- EXPOSE_PROPRW_ID(0,Accum,TAutoLong, "!Accumulator", "@Accumulator_", HC_TCALC_ACCUMULATOR)
- EXPOSE_PROPRW(Op, CalcOps, "Op", "@Op_", HC_TCALC_OPERATOR)
- EXPOSE_METHOD(Eval, TAutoBool, "!Evaluate", "@Evaluate_", HC_TCALC_EVALUATE)
- EXPOSE_METHOD(Clear, TAutoVoid, "!Clear", "@Clear_", HC_TCALC_CLEAR)
- EXPOSE_METHOD(Display, TAutoVoid, "!Display", "@Display_", HC_TCALC_DISPLAY)
- EXPOSE_QUIT( "!Quit", "@Quit_", HC_TCALC_QUIT)
- EXPOSE_METHOD(Button, TAutoBool, "!Button", "@Button_", HC_TCALC_BUTTON)
- REQUIRED_ARG( TAutoString,"!Key")
- EXPOSE_PROPRO(Window, TCalcWindow,"!Window", "@Window_", HC_TCALC_WINDOW)
- EXPOSE_METHOD(LookAt, TAutoLong, "!LookAtWindow","@LookAtWindow_", HC_TCALC_LOOKATWINDOW)
- REQUIRED_ARG( TCalcWindow,"!Window")
- EXPOSE_PROPRO(MyArray, TMyArray, "!Array", "@Array_", HC_TCALC_ARRAY)
- EXPOSE_PROPRW(Update, TAutoDispatch, "!Update", "@Update_", HC_TCALC_UPDATE)
- EXPOSE_PROPRW(Visible, TAutoBool, "!Visible", "@Visible_", HC_TCALC_VISIBLE)
- EXPOSE_APPLICATION( TCalc, "!Application", "@Application_", HC_TCALC_APPLICATION)
- END_AUTOCLASS(TCalc, tfAppObject|tfCanCreate, "TCalc", "@TCalc", HC_TCALC)
-
- DEFINE_AUTOCLASS(TCalcWindow)
- EXPOSE_PROPRW(Caption, TAutoString, "!Caption", "@Caption_",HC_TCALCWINDOW_TITLE)
- EXPOSE_PROPRW(Background, TAutoLong, "!Color", "@Color_", HC_TCALCWINDOW_BKGNDCOLOR)
- EXPOSE_PROPRW(Height, TAutoLong, "!Height", "@Height_", HC_TCALCWINDOW_HEIGHT)
- EXPOSE_PROPRW(Width, TAutoLong, "!Width", "@Width_", HC_TCALCWINDOW_WIDTH)
- EXPOSE_PROPRO(Buttons, TCalcButtons,"!Buttons", "@Buttons_",HC_TCALCWINDOW_BUTTONS)
- EXPOSE_APPLICATION( TCalc, "!Application","@Application_", HC_TCALC_APPLICATION)
- END_AUTOCLASS(TCalcWindow, tfNormal, "TCalcWindow", "@TCalcWindow", HC_TCALCWINDOW)
-
- DEFINE_AUTOCLASS(TMyArray)
- EXPOSE_PROPRO(Count, TAutoLong, "!Count", "@CountAr_", HC_TMYARRAY_COUNT)
- EXPOSE_ITERATOR( TAutoShort, "Array Iterator", HC_TMYARRAY_ITERATOR)
- EXPOSE_METHOD_ID(0, Item, TAutoShort, "!Item", "@ItemAr_", 0)
- REQUIRED_ARG( TAutoShort, "!Index")
- END_AUTOCLASS(TMyArray, tfNormal, "TCalcArray", "@TMyArray", HC_TMYARRAY)
-
- DEFINE_AUTOCLASS(TCalcButtons)
- EXPOSE_PROPRO(Count, TAutoLong, "!Count", "@CountBu_", HC_TCALCBUTTONS_COUNT)
- EXPOSE_ITERATOR( TCalcButton, "Button Iterator", HC_TCALCBUTTONS_ITERATOR)
- EXPOSE_METHOD_ID(0, Item, TCalcButton,"!Item", "@ItemBu_", 0)
- REQUIRED_ARG( TAutoShort, "!Index")
- END_AUTOCLASS(TCalcButtons, tfNormal, "TButtonList", "@TCalcButtons", HC_TCALCBUTTONS)
-
- DEFINE_AUTOCLASS(TCalcButton)
- EXPOSE_PROPRW(Text, TAutoString, "!Text", "@Text_", HC_TCALCBUTTON_TEXT)
- EXPOSE_PROPRW(Push, TAutoBool, "!Activate","@Activate_", HC_TCALCBUTTON_STATE)
- EXPOSE_APPLICATION( TCalc, "!Application", "@Application_", HC_TCALC_APPLICATION)
- END_AUTOCLASS(TCalcButton,tfNormal, "TCalcButton", "@TCalcButton", HC_TCALCBUTTON)
-
- DEFINE_AUTOEVENTCLASS(TCalcEvents)
- EXPOSE_PROPWO_ID(0, , TAutoLong, "Value", "Result update", 0)
- END_AUTOEVENTCLASS(TCalcEvents,tfDefault,"TCalcEvents", "Calculator Events", 0)
-
- void TUpdate::SetResult(long val)
- {
- AUTONAMES0("Value")
- AUTOARGS0()
- AUTOCALL_PROP_SET(val)
- }
-
- TCalc::TCalc(HINSTANCE hInst, uint32 options) : Options(options)
- {
- Window.hWnd = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_CALC), 0, 0);
- ::SetWindowLong(Window, DLGWINDOWEXTRA, (long)this);
- ::ShowWindow(Window, SW_SHOW);
- Clear();
- Display();
- for (int i = 0; i < COUNT; i++)
- Elem[i] = short((i+1)*10);
- }
-
- void TCalc::Clear()
- {
- Op = OP_CLEAR;
- Eval();
- }
-
- bool TCalc::Eval()
- {
- switch(Op) {
- case OP_PLUS: Accum += Opnd; break;
- case OP_MINUS: Accum -= Opnd; break;
- case OP_MULT: Accum *= Opnd; break;
- case OP_DIV: if (!Opnd) return false; Accum /= Opnd; break;
- case OP_EQUALS: Accum = Opnd; break;
- case OP_CLEAR: Accum = 0; break;
- case OP_NONE: break;
- default: return false;
- }
- Op = OP_EQUALS; // in case clear or if Eval called again with no op
- Opnd = 0;
- Entry = false;
- if (Update.IsBound())
- Update.SetResult(Accum);
- return true;
- }
-
- void TCalc::Display()
- {
- long val = Entry ? Opnd : Accum;
- char buf[20];
- wsprintf(buf, "%ld", val);
- SetDlgItemText(Window, IDC_DISPLAY, buf);
- }
-
- bool TCalc::Button(const char far* txt)
- {
- short ret = true;
- const char* list = BUTTON_CHARS;
- while (*txt) {
- const char far* s = strchr(list, *txt++);
- if (s)
- ButtonPush(int(s-list) + IDC_FIRSTID);
- else
- ret = false;
- }
- return ret;
- }
-
- int TCalc::ButtonPush(int button) // internal call, not automated
- {
- if(button >= IDC_FIRSTDIGIT && button <= IDC_LASTDIGIT) {
- Opnd = (Opnd * 10) + long(button - IDC_FIRSTDIGIT);
- Entry = true;
- } else if(button >= IDC_FIRSTOP && button <= IDC_LASTOP) {
- if (button == IDC_CLEAR) {
- Clear();
- } else {
- if (Entry)
- Eval();
- Op = short(button-IDC_FIRSTOP);
- }
- }else{
- return 0; // unknown button
- }
- Display();
- return 1;
- }
-
- bool TCalc::GetVisible()
- {
- return (bool)Window && ::IsWindowVisible(Window);
- }
-
- void TCalc::SetVisible(bool show)
- {
- ::ShowWindow(Window, show);
- }
-
- void TCalcWindow::SetCaption(const char far* text)
- {
- ::SetWindowText(hWnd, text);
- }
-
- const char* TCalcWindow::GetCaption()
- {
- static char buf[256];
- return ::GetWindowText(hWnd, buf, sizeof(buf)-1) ? buf : 0;
- }
-
- int TCalcWindow::GetWidth()
- {
- RECT rect;
- ::GetWindowRect(hWnd, &rect);
- return rect.right - rect.left;
- }
-
- void TCalcWindow::SetWidth(int width)
- {
- RECT rect;
- ::GetWindowRect(hWnd, &rect);
- ::MoveWindow(hWnd, rect.left, rect.top, width, rect.bottom-rect.top, TRUE);
- }
-
- int TCalcWindow::GetHeight()
- {
- RECT rect;
- ::GetWindowRect(hWnd, &rect);
- return rect.bottom - rect.top;
- }
-
- void TCalcWindow::SetHeight(int height)
- {
- RECT rect;
- ::GetWindowRect(hWnd, &rect);
- ::MoveWindow(hWnd, rect.left, rect.top, rect.right-rect.left, height,TRUE);
- }
-
- void TCalcWindow::SetBackground(long color)
- {
- Background = color;
- ::InvalidateRect(hWnd, 0, TRUE);
- }
-