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


// 
// Micro Windows Example 
// A Simple Draw 
// 
// $Revision$ 
// $Source$ 
// $Date$ 
// 
 
#include "port.h" 
#include "shape.h" 
#include "global.h" 
#include "model.h" 
#include "button.h" 
#include "window.h" 
#include "gui.h" 
 
class ColorButton : public Button 
{ 
public: 
    ColorButton (PortPenColor color, Rect *prect, View *pparent, 
            Model *client, 
            BOOL attach = TRUE, BOOL killModel = FALSE) 
        : Button ("", prect, pparent, client, attach, killModel) 
    { 
        c = color; 
    } 
 
    virtual void selfDraw (Port *port, Rect *area) 
    { 
        Rect pr = clientRect; 
        pr.move (2, 2); 
        pr.resize (pr.width() -2, pr.height() -2); 
        port->setPenColor (c); 
        port->draw (&FilledRectangle (&pr)); 
    } 
 
    void changeColor (PortPenColor cc) 
    { 
        c = cc; 
        draw (NULL); 
    } 
 
    PortPenColor getColor () 
    { 
        return c; 
    } 
 
protected: 
    PortPenColor c; 
}; 
 
class ColorPalette : public Model 
{ 
public: 
    ColorPalette (Point *orig) 
    { 
        beingClosed = FALSE; 
 
        paletteWindow = new Window ("Color", &Rect (orig->x, orig->y, 
                                           orig->x + 80, orig->y + 180 + 26), 
                                    desktop, this, TRUE, FALSE); 
 
        for (int i = 0; i < 16; i++) 
        { 
            buttonArray[i] = new ColorButton (i, &Rect(0, i*10, 69, i*10 + 8), 
                                              paletteWindow, this); 
        } 
 
        currentColor = new ColorButton (0, &Rect (0, i*10 + 5, 39, i*10+13), 
                                        paletteWindow, this); 
    } 
 
    ~ColorPalette () 
    { 
        beingClosed = TRUE; 
    } 
 
 
    virtual BOOL close (View *from) 
    { 
        return (beingClosed); 
    } 
 
    virtual void fromView (View *from) 
    { 
        for (int i = 0; i< 16; i++) if (buttonArray[i] == from) 
            currentColor->changeColor (i); 
    } 
 
    PortPenColor getColor () 
    { 
        return (currentColor->getColor()); 
    } 
 
protected: 
    Window *paletteWindow; 
    ColorButton *buttonArray[16]; 
    ColorButton *currentColor; 
    BOOL beingClosed; 
}; 
 
class ColorObject : public Object 
{ 
public: 
    ColorObject (int c) 
    { 
        color = c; 
    } 
 
    int color; 
}; 
 
class DrawWindow : public Model 
{ 
public: 
    DrawWindow (Point *p, View *pparent, ColorPalette *ppalette) 
    { 
        lineList = new List; 
        palette = ppalette; 
        new Window ("Draw Window", &Rect (p->x, p->y, p->x + 200, p->y +100), 
                    pparent, this, TRUE, TRUE); 
        beingDrawn = FALSE; 
    } 
 
    ~DrawWindow () 
    { 
        Object *p = lineList->first(); 
        do 
        { 
            if (p == NULL) break; 
            delete p; 
            p = lineList->next(); 
        } while (1); 
 
        delete lineList; 
    } 
 
    virtual void draw (View *from, Port *port, Rect *area) 
    { 
        port->setPenColor (PPC_White); 
        port->draw (&FilledRectangle (area)); 
        Line *line = (Line*)lineList->first (); 
        do 
        { 
            if (line == NULL) break; 
            ColorObject *obj = (ColorObject*)lineList->next(); 
            port->setPenColor (obj->color); 
            port->draw (line); 
            line = (Line*)lineList->next (); 
        } while (1); 
    } 
 
    virtual void leftButtonDown (View *from, Point *pnt) 
    { 
        if (beingDrawn == FALSE) 
        { 
            beingDrawn = TRUE; 
            currentLine = new Line (pnt, pnt); 
            (from->getClientPort())->setPenMode (PPM_XOR); 
            (from->getClientPort())->draw (currentLine); 
            return; 
        } 
 
        (from->getClientPort())->setPenMode (PPM_XOR); 
        (from->getClientPort())->draw (currentLine); 
 
        pnt->move (20, 20); 
        currentLine->setDest (pnt); 
        (from->getClientPort())->draw (currentLine); 
    } 
 
    virtual void leftButtonUp (View *from, Point *pnt) 
    { 
        if (beingDrawn == FALSE) return; 
        beingDrawn = FALSE; 
        (from->getClientPort())->setPenMode (PPM_XOR); 
        (from->getClientPort())->draw (currentLine); 
        (from->getClientPort())->setPenMode (PPM_Normal); 
        (from->getClientPort())->setPenColor (palette->getColor()); 
        (from->getClientPort())->draw (currentLine); 
        lineList->put (currentLine); 
        lineList->put (new ColorObject (palette->getColor())); 
    } 
 
protected: 
    ColorPalette *palette; 
    List *lineList; 
 
    Line *currentLine; 
    BOOL beingDrawn; 
}; 
 
class DrawApp : public Model 
{ 
public: 
    DrawApp () 
    { 
        myWindow = new Window ("Simple Draw", &Rect (100, 0, 639, 479), desktop, 
                               this, TRUE, TRUE); 
        palette = new ColorPalette (&Point (10, 10)); 
        closeButton = new Button ("Close", &Rect (10, 300, 60, 320), 
                                  desktop, this, TRUE); 
        newButton = new Button ("New", &Rect (10, 340, 60, 360), 
                                desktop, this, TRUE); 
        x = 0; 
    } 
 
    ~DrawApp () 
    { 
    } 
 
    virtual void fromView (View *from) 
    { 
        if (from == closeButton) 
        { 
            delete palette; 
            desktop->quit (); 
        } 
        if (from == newButton) 
        { 
            if (x > 100) x = 0; 
            new DrawWindow (&Point (x, x), myWindow, palette); 
            x+=10; 
        } 
    } 
 
protected: 
    int x; 
    Window *myWindow; 
    ColorPalette *palette; 
    Button *closeButton, *newButton; 
}; 
 
int main () 
{ 
    Driver g; 
    new DrawApp; 
    return (g.run()); 
}