]> git.vomp.tv Git - vompclient.git/blob - boxx.h
Switch trunk code to new boxes
[vompclient.git] / boxx.h
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #ifndef BOXX_H
22 #define BOXX_H
23
24 #include <stdio.h>
25 #include <vector>
26
27 using namespace std;
28
29 #include "colour.h"
30 #include "region.h"
31 #include "message.h"
32
33 #ifdef WIN32
34 #include "surfacewin.h"
35 #else
36 #include "surfacemvp.h"
37 #endif
38
39 class Boxx
40 {
41   public:
42     Boxx();
43     virtual ~Boxx();
44
45     virtual void setSize(UINT w, UINT h);
46     void setPosition(UINT x, UINT y); // Set position on parent. Even numbers only!!!
47     void createBuffer(); // Make this a root view that goes in the BoxStack
48
49     void setGap(UINT gap);
50
51     // Not really for box.. see .cc
52     virtual void draw();
53     virtual int handleCommand(int);
54     virtual void processMessage(Message*);
55
56     void setBackgroundColour(Colour& colour);
57     void setVisible(bool isVisible);
58     
59     // Drawing functions level 1
60     void fillColour(Colour& colour);
61     void drawPara(char* text, int x, int y, Colour& colour);
62
63     // Drawing functions level 0
64     void rectangle(UINT x, UINT y, UINT w, UINT h, Colour& colour);
65     void rectangle(Region& region, Colour& colour);
66
67     void drawText(const char* text, int x, int y, Colour& colour);
68     void drawTextRJ(const char* text, int x, int y, Colour& colour);
69     void drawTextCentre(const char* text, int x, int y, Colour& colour);
70     void drawPixel(UINT x, UINT y, Colour& colour);
71
72     int charWidth(char c);
73
74     // Following 4 used by mouse stuff only, except 1 getWidth/getHeight? in orig. vtabsman
75     int getScreenX();
76     int getScreenY();
77     int getRootBoxOffsetX();
78     int getRootBoxOffsetY();
79     int getX();
80     int getY();
81     UINT getWidth();
82     UINT getHeight();
83     bool getVisible();
84
85     void add(Boxx*); // a boxx has a set of child boxxs
86     void remove(Boxx*);
87
88     /*
89     The following function sets the child's parent pointer without adding the child to the children vector.
90     It's a hack (that should be deprecated?) to allow things like WSymbol to be created, do some drawing on
91     the surface and then be deleted again, leaving the drawing present.
92     A better design would be to create many WSymbols - one per symbol and leave them created - then the
93     automatic draw code (not written yet) will be able to redraw the symbols without all that code needing
94     to be in the derived boxx's draw method.
95     */    
96     void TEMPADD(Boxx* child) { child->setParent(this); }
97
98   friend class BoxStack;
99   protected:
100     Boxx* parent;
101     Region area;
102     vector<Boxx*> children;
103
104     void setParent(Boxx*);    
105     void blt(Region& r);
106
107     static const int paraMargin = 10;
108     UINT paraVSpace;
109
110     Colour backgroundColour;
111     bool backgroundColourSet;
112     bool visible;
113
114     static char numBoxxes;
115     Surface* surface;
116 };
117
118 #endif
119
120
121 /*
122
123 New Boxx design
124
125 It's "Boxx" because "Box" was already taken.
126
127 BoxStack replaces Viewman and handles displaying a stack of root boxxs (boxxs with surfaces) on the screen.
128
129 Boxx relaces Box, Widget and parts of View and represents a box with or without a surface.
130 Let's call a Boxx with a surface a root box, and a boxx without a surface a child box.
131
132 A boxx with a surface (root) is like an old View and is handled by BoxStack.
133 A boxx without a surface (child) is like and old Widget and needs to be a child box of another boxx (root or not).
134
135 Don't add a boxx with a surface to another boxx. That isn't the design.
136
137 So, when you create a boxx, either that boxx calls createBuffer() on itself,
138 or some other box add()s the new box to itself.
139
140 Root boxxs can overlap each other - this is managed by boxstack.
141 Child boxxs within a parent boxx do not overlap each other.
142 However, a grandchild box can overlap a child box (but must be entirely contained within the child box).
143
144 TBBoxx replaces View but is now only a convenience class for the window dressing stuff. It isn't required anymore since
145 all the real work that view used to do is done in Boxx now.
146
147 Obseleted classes: Box, View, Viewman, Widget, others?
148 No code outside boxx should talk about surfaces anymore. Hopefully.
149
150 */
151