www.pudn.com > MicroWindows-Source-200606.zip > calc.cpp


// 
// Micro Windows Modules 
// calc.h: a simple-minded calculator 
// 
// $Revision: 1.3 $ 
// $Source: D:/DENG/PRG/MWINDOWS/APP/rcs/calc.cpp $ 
// $Date: 1993/10/18 12:35:36 $ 
// 
 
#include "shape.h" 
#include "calc.h" 
 
Calculator::Calculator (View *parent, Point *spot) 
{ 
    strcpy (last, ""); 
    strcpy (current, ""); 
    action = 0; 
    clean = FALSE; 
 
    Rect calcRect; 
    Point tmp; 
    if (spot == NULL) parent->getRandomAttachPoint (&tmp); else tmp = *spot; 
    calcRect.set (&tmp, &tmp); 
    calcRect.resize (200, 170); 
    evaluator.set (10, 10, 10, 10); 
    evaluator.resize (160, 20); 
 
    calcWindow = new Window ("Calculator", &calcRect, parent, this, 
                                 TRUE, TRUE); 
    calcWindow->setResizable (FALSE); 
 
    Point orig (10, 40); 
    Rect btnRect (0, 0, 20, 20); 
    char btnText[2]; 
    for (int i = 1; i < 10; i++) 
    { 
        btnRect.set (0, 0, 20, 20); 
        Point btnPtn (((i-1) % 3) * 30, ((i-1) / 3) * 30); 
        btnPtn.move (&orig); 
        btnRect.move (&btnPtn); 
        itoa (i, btnText, 10); 
 
        numBtn[i] = new Button (btnText, &btnRect, calcWindow, this); 
    } 
 
    btnRect.set (90 + 10, 40, 110 + 10, 60); 
    cBtn = new Button ("C", &btnRect, calcWindow, this); 
    btnRect.move (0, 30); 
    equBtn = new Button ("=", &btnRect, calcWindow, this); 
    btnRect.move (0, 30); 
    numBtn[0] = new Button ("0", &btnRect, calcWindow, this); 
    btnRect.move (30, -60); 
    plusBtn = new Button ("+", &btnRect, calcWindow, this); 
    btnRect.move (0, 30); 
    minusBtn = new Button ("-",&btnRect, calcWindow, this); 
    btnRect.move (0, 30); 
    mulBtn = new Button ("*", &btnRect, calcWindow, this); 
    btnRect.move (30, -60); 
    divBtn = new Button ("/", &btnRect, calcWindow, this); 
} 
 
void Calculator::fromView (View *from) 
{ 
    if (from == equBtn) 
    { 
        long x = atol (last), y = atol (current), z = y; 
 
        switch (action) 
        { 
            case 1: z = x+y; break; 
            case 2: z = x-y; break; 
            case 3: z = x*y; break; 
            case 4: 
                 if (!y) 
                 { 
                    strcpy (last, ""); 
                    strcpy (current, ""); 
                    drawCalculator (calcWindow->getClientPort()); 
                    action = 0; 
                    return; 
                 } 
                 else 
                 { 
                    z = x/y; 
                 } 
                 break; 
        } 
        strcpy (last, ""); 
        ltoa (z, current, 10); 
        action = -1; 
    } 
    else if (from == cBtn) 
    { 
        action = 0; 
        strcpy (last, ""); 
        strcpy (current, ""); 
    } 
    else if (from == plusBtn) 
    { 
        action = 1; 
        strcpy (last, current); 
        clean = TRUE; 
    } 
    else if (from == minusBtn) 
    { 
        action = 2; 
        strcpy (last, current); 
        clean = TRUE; 
    } 
    else if (from == mulBtn) 
    { 
        action = 3; 
        strcpy (last, current); 
        clean = TRUE; 
    } 
    else if (from == divBtn) 
    { 
        action = 4; 
        strcpy (last, current); 
        clean = TRUE; 
    } 
    else 
    { 
        if (action == -1) fromView (cBtn); 
        if (clean) 
        { 
            clean = FALSE; 
            strcpy (current, ""); 
        } 
 
        if (strlen (current) > 10) 
        { 
            return; 
        } 
 
        char toAdd[2]; 
        toAdd[1] = 0; 
 
        for (int i = 0; i < 10; i++) 
            if (from == numBtn[i]) toAdd[0] = i + '0'; 
 
        strcat (current, toAdd); 
    } 
 
    drawCalculator (calcWindow->getClientPort()); 
} 
 
void Calculator::drawCalculator (Port *port) 
{ 
    char bar[25]; 
    long num = atol (current); 
 
    switch (action) 
    { 
        case -1: strcpy (bar, "="); break; 
        case 1: strcpy (bar, "+"); break; 
        case 2: strcpy (bar, "-"); break; 
        case 3: strcpy (bar, "*"); break; 
        case 4: strcpy (bar, "/"); break; 
        default: strcpy (bar, " "); break; 
    } 
 
    sprintf (bar + 1, "%13ld", num); 
 
    port->draw (&StereoBorder (&evaluator, Concave, 1)); 
    port->setPenColor (PPC_White); 
    port->setBgColor (PPC_Gray); 
    port->draw (&Text (bar, &evaluator)); 
} 
 
void Calculator::draw (View *from, Port *port, Rect *area) 
{ 
    drawCalculator (port); 
}