Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1805 | yogev_ezra | 1 | #ifndef _HEADER_BUTTONS_H |
2 | #define _HEADER_BUTTONS_H |
||
3 | |||
4 | #ifndef __MENUET__ |
||
5 | #include |
||
6 | #include |
||
7 | #include |
||
8 | #endif |
||
9 | #include "gr-draw.h" |
||
10 | |||
11 | struct TXButton |
||
12 | { |
||
13 | TXButton(int n = -1, int w = 100, int h = 20) : num(n), w(w), h(h), drw(1) {} |
||
14 | TXButton(const TXButton &b) : w(b.w), h(b.h) {} |
||
15 | |||
16 | TXButton &operator=(const TXButton &b) {w = b.w; h = b.h; num = b.num; return *this;} |
||
17 | |||
18 | virtual void Draw(TGraphDraw *drw, int x0, int y0, |
||
19 | unsigned long dcolor, unsigned long lcolor, unsigned long tcolor, int ins = 0); |
||
20 | virtual int ButtonPnt(int xp, int yp, int &n, int kind = 0); |
||
21 | |||
22 | int num, w, h, drw; |
||
23 | }; |
||
24 | |||
25 | void TXButton::Draw(TGraphDraw *drw, int x0, int y0, |
||
26 | unsigned long dcolor, unsigned long /*lcolor*/, |
||
27 | unsigned long /*tcolor*/, int /*ins*/) |
||
28 | { |
||
29 | if (!drw || !drw->IsDraw()) return; |
||
30 | drw->SetColor(dcolor); |
||
31 | drw->DrawLine(x0, y0, x0 + w, y0); |
||
32 | drw->DrawLine(x0, y0, x0, y0 + h); |
||
33 | drw->DrawLine(x0 + w, y0, x0 + w, y0 + h); |
||
34 | drw->DrawLine(x0, y0 + h, x0 + w, y0 + h); |
||
35 | } |
||
36 | |||
37 | int TXButton::ButtonPnt(int xp, int yp, int &n, int /*kind*/) |
||
38 | { |
||
39 | n = num; |
||
40 | return (xp >= 0 && yp >= 0 && xp <= w && yp <= h) ? 1 : INT_MIN; |
||
41 | } |
||
42 | |||
43 | |||
44 | struct TextButton : public TXButton |
||
45 | { |
||
46 | enum {thick_def = 3}; |
||
47 | |||
48 | TextButton(int n = -1, int w = 100, int h = 20, char *text = 0, int thick = thick_def) |
||
49 | : TXButton(n, w, h), text(text), thick(thick) {CheckDefW();} |
||
50 | TextButton(const TXButton &b, char *text = 0, int thick = thick_def) |
||
51 | : TXButton(b), text(text), thick(thick) {CheckDefW();} |
||
52 | TextButton(const TextButton &b) : TXButton(b), text(b.text), thick(b.thick) {} |
||
53 | |||
54 | TextButton &operator=(const TextButton &b); |
||
55 | |||
56 | virtual void Draw(TGraphDraw *drw, int x0, int y0, |
||
57 | unsigned long dcolor, unsigned long lcolor, unsigned long tcolor, int ins = 0); |
||
58 | void CheckDefW(); |
||
59 | |||
60 | int thick; |
||
61 | char *text; |
||
62 | }; |
||
63 | |||
64 | inline TextButton &TextButton::operator=(const TextButton &b) |
||
65 | { |
||
66 | text = b.text; |
||
67 | TXButton::operator=(b); |
||
68 | return *this; |
||
69 | } |
||
70 | |||
71 | void TextButton::Draw(TGraphDraw *drw, int x0, int y0, |
||
72 | unsigned long dcolor, unsigned long lcolor, unsigned long tcolor, int ins) |
||
73 | { |
||
74 | if (!drw || !drw->IsDraw()) return; |
||
75 | int i; |
||
76 | if (thick <= -1 && thick >= -5) |
||
77 | { |
||
78 | drw->SetColor(dcolor); |
||
79 | for (i = 0; i < -thick; i++) |
||
80 | { |
||
81 | drw->DrawLine(x0 + i, y0 + i, x0 + w - i, y0 + i); |
||
82 | drw->DrawLine(x0 + i, y0 + i, x0 + i, y0 + h - i); |
||
83 | drw->DrawLine(x0 + w - i, y0 + i, x0 + w - i, y0 + h - i); |
||
84 | drw->DrawLine(x0 + i, y0 + h - i, x0 + w - i, y0 + h - i); |
||
85 | } |
||
86 | } |
||
87 | else if (thick > 0) |
||
88 | { |
||
89 | for (i = 0; i < thick; i++) |
||
90 | { |
||
91 | drw->SetColor(ins ? dcolor : lcolor); |
||
92 | drw->DrawLine(x0 + i, y0 + i, x0 + w - i, y0 + i); |
||
93 | drw->DrawLine(x0 + i, y0 + i, x0 + i, y0 + h - i); |
||
94 | drw->SetColor(ins ? lcolor : dcolor); |
||
95 | drw->DrawLine(x0 + w - i, y0 + i, x0 + w - i, y0 + h - i); |
||
96 | drw->DrawLine(x0 + i, y0 + h - i, x0 + w - i, y0 + h - i); |
||
97 | } |
||
98 | } |
||
99 | else TXButton::Draw(drw, x0, y0, dcolor, lcolor, tcolor, ins); |
||
100 | if (text) |
||
101 | { |
||
102 | drw->SetColor(tcolor); |
||
103 | drw->DrawText(x0 + 7, y0 + (h - drw->GetTextH(text)) / 2, text); |
||
104 | } |
||
105 | } |
||
106 | |||
107 | inline void TextButton::CheckDefW() |
||
108 | { |
||
109 | if (w < 0 && text) w = 15 + strlen(text) * 8; |
||
110 | } |
||
111 | |||
112 | class TXButtonArray |
||
113 | { |
||
114 | public: |
||
115 | TXButtonArray(int d = 10) : button(0), nbutton(0), mbutton(0), |
||
116 | delt(d), ins(-1), k_ins(0) {} |
||
117 | ~TXButtonArray() {Clear();} |
||
118 | |||
119 | void Clear(); |
||
120 | void Add(TXButton *bt); |
||
121 | void Add(int n = -1, int w = 100, int h = 20, char *str = 0, |
||
122 | int thick = TextButton::thick_def); |
||
123 | TXButton *operator[](int i) {return button[i];} |
||
124 | int GetNButton() const {return nbutton;} |
||
125 | int GetInsert() const {return ins;} |
||
126 | TXButton *GetButton(int n); |
||
127 | |||
128 | int GetDelt() const {return delt;} |
||
129 | void SetDelt(int d) {delt = d;} |
||
130 | |||
131 | int GetParam(int w, int p) const; |
||
132 | int GetNumStr(int w) const {return GetParam(w, 0);} |
||
133 | int GetHeight(int w) const {return GetParam(w, 1);} |
||
134 | int GetFWidth() const; |
||
135 | |||
136 | void Draw(TGraphDraw *drw, int x0, int y0, int w); |
||
137 | void Draw(TGraphDraw *drw, int x0, int y0, int w, |
||
138 | unsigned long dcolor, unsigned long lcolor, unsigned long tcolor, int insd = 1); |
||
139 | int ButtonPnt(int xp, int yp, int w, int &n, int kind = 0); |
||
140 | protected: |
||
141 | void Extend(int n = -1); |
||
142 | |||
143 | TXButton **button; |
||
144 | int nbutton, mbutton; |
||
145 | int delt; |
||
146 | int ins, k_ins; |
||
147 | }; |
||
148 | |||
149 | void TXButtonArray::Clear() |
||
150 | { |
||
151 | int i; |
||
152 | if (button) |
||
153 | { |
||
154 | for (i = 0; i < nbutton; i++) if (button[i]) delete button[i]; |
||
155 | delete[] button; |
||
156 | } |
||
157 | button = 0; nbutton = 0; mbutton = 0; |
||
158 | } |
||
159 | |||
160 | void TXButtonArray::Extend(int n) |
||
161 | { |
||
162 | if (n < 0) n = nbutton + 1; |
||
163 | if (mbutton < n) |
||
164 | { |
||
165 | typedef TXButton *TXButtonPnt; |
||
166 | TXButton **b_old = button; |
||
167 | int m_old = mbutton; |
||
168 | mbutton = n * 2; |
||
169 | button = new TXButtonPnt[mbutton]; |
||
170 | for (int i = 0; i < mbutton; i++) button[i] = 0; |
||
171 | if (b_old) |
||
172 | { |
||
173 | for (int i = 0; i < m_old; i++) button[i] = b_old[i]; |
||
174 | delete[] b_old; |
||
175 | } |
||
176 | } |
||
177 | } |
||
178 | |||
179 | void TXButtonArray::Add(TXButton *bt) |
||
180 | { |
||
181 | Extend(); |
||
182 | if (button[nbutton]) delete[] button[nbutton]; |
||
183 | button[nbutton] = bt; |
||
184 | nbutton++; |
||
185 | } |
||
186 | |||
187 | void TXButtonArray::Add(int n, int w, int h, char *str, int thick) |
||
188 | { |
||
189 | if (thick < 0 && !str) Add(new TXButton(n, w, h)); |
||
190 | else Add(new TextButton(n, w, h, str, thick)); |
||
191 | } |
||
192 | |||
193 | TXButton *TXButtonArray::GetButton(int n) |
||
194 | { |
||
195 | int i; |
||
196 | for (i = 0; i < nbutton; i++) |
||
197 | { |
||
198 | if (button[i] && button[i]->num == n) return button[i]; |
||
199 | } |
||
200 | return 0; |
||
201 | } |
||
202 | |||
203 | int TXButtonArray::GetFWidth() const |
||
204 | { |
||
205 | int i, x = 0; |
||
206 | for (i = 0; i < nbutton; i++) |
||
207 | { |
||
208 | if (button[i] && button[i]->drw > 0) x += button[i]->w + delt; |
||
209 | } |
||
210 | if (x != 0) x -= delt; |
||
211 | return x; |
||
212 | } |
||
213 | |||
214 | int TXButtonArray::GetParam(int w, int p) const |
||
215 | { |
||
216 | int i, k = 0; |
||
217 | int x = 0, y = 0, ym = 0; |
||
218 | for (i = 0; i < nbutton; i++) if (button[i] && button[i]->drw > 0) |
||
219 | { |
||
220 | int xx = x + button[i]->w + delt; |
||
221 | if (x != 0 && xx > w + delt) |
||
222 | { |
||
223 | k++; y += ym + delt; ym = 0; |
||
224 | x = 0; xx = x + button[i]->w + delt; |
||
225 | } |
||
226 | x = xx; |
||
227 | if (ym < button[i]->h) ym = button[i]->h; |
||
228 | } |
||
229 | if (x != 0) {k++; y += ym;} |
||
230 | else if (y != 0) y -= delt; |
||
231 | if (p == 0) return k; |
||
232 | else if (p == 1) return y; |
||
233 | else return -1; |
||
234 | } |
||
235 | |||
236 | void TXButtonArray::Draw(TGraphDraw *drw, int x0, int y0, int w) |
||
237 | { |
||
238 | const unsigned short power_gray = 49152U; |
||
239 | unsigned long black = drw->GetBlackColor(); |
||
240 | unsigned long grey = drw->CreateColor(power_gray, power_gray, power_gray); |
||
241 | Draw(drw, x0, y0, w, black, grey, black, 1); |
||
242 | drw->FreeColor(grey); |
||
243 | } |
||
244 | |||
245 | void TXButtonArray::Draw(TGraphDraw *drw, int x0, int y0, int w, |
||
246 | unsigned long dcolor, unsigned long lcolor, unsigned long tcolor, int insd) |
||
247 | { |
||
248 | int i; |
||
249 | int x = 0, y = 0, ym = 0; |
||
250 | if (!insd && ins >= 0) k_ins = 2; |
||
251 | for (i = 0; i < nbutton; i++) if (button[i] && button[i]->drw > 0) |
||
252 | { |
||
253 | int xx = x + button[i]->w + delt; |
||
254 | if (x != 0 && xx > w + delt) |
||
255 | { |
||
256 | y += ym + delt; ym = 0; |
||
257 | x = 0; xx = x + button[i]->w + delt; |
||
258 | } |
||
259 | button[i]->Draw(drw, x0 + x, y0 + y, |
||
260 | dcolor, lcolor, tcolor, k_ins == 1 && ins == i); |
||
261 | x = xx; |
||
262 | if (ym < button[i]->h) ym = button[i]->h; |
||
263 | } |
||
264 | } |
||
265 | |||
266 | int TXButtonArray::ButtonPnt(int xp, int yp, int w, int &n, int kind) |
||
267 | { |
||
268 | int i; |
||
269 | int x = 0, y = 0, ym = 0; |
||
270 | if (ins < 0 && (kind == 2 || kind == 3)) return INT_MIN; |
||
271 | for (i = 0; i < nbutton; i++) if (button[i] && button[i]->drw > 0) |
||
272 | { |
||
273 | int xx = x + button[i]->w + delt; |
||
274 | if (x != 0 && xx > w + delt) |
||
275 | { |
||
276 | y += ym + delt; ym = 0; |
||
277 | x = 0; xx = x + button[i]->w + delt; |
||
278 | } |
||
279 | if (ins < 0 || i == ins) |
||
280 | { |
||
281 | int wh = button[i]->ButtonPnt(xp - x, yp - y, n, kind); |
||
282 | if (n == -1) n = i; |
||
283 | if (i == ins) |
||
284 | { |
||
285 | if (kind == 1) return wh; |
||
286 | else if (kind == 2) |
||
287 | { |
||
288 | if (wh == INT_MIN || n < 0) |
||
289 | { |
||
290 | if (k_ins != 2) {k_ins = 2; n = -10; return 1000;} |
||
291 | } |
||
292 | else if (k_ins != 1) {k_ins = 1; return 1000;} |
||
293 | return wh; |
||
294 | } |
||
295 | else if (kind == 3) |
||
296 | { |
||
297 | if (wh == INT_MIN) |
||
298 | { |
||
299 | n = -10; |
||
300 | if (k_ins == 1) wh = 1000; |
||
301 | } |
||
302 | k_ins = 0; ins = -1; |
||
303 | return wh; |
||
304 | } |
||
305 | else return wh; |
||
306 | } |
||
307 | else if (wh != INT_MIN) |
||
308 | { |
||
309 | if (kind == 1) {ins = i; k_ins = 1; return wh;} |
||
310 | else if (kind == 2 || kind == 3) return INT_MIN; |
||
311 | else return wh; |
||
312 | } |
||
313 | } |
||
314 | x = xx; |
||
315 | if (ym < button[i]->h) ym = button[i]->h; |
||
316 | } |
||
317 | n = -10; |
||
318 | return INT_MIN; |
||
319 | } |
||
320 | |||
321 | struct TMultiButton : public TXButton |
||
322 | { |
||
323 | TMultiButton(int n = -1, int w = 100, int h = 20, int d = 2) |
||
324 | : TXButton(n, w, h), a(d) {} |
||
325 | |||
326 | virtual void Draw(TGraphDraw *drw, int x0, int y0, unsigned long dcolor, |
||
327 | unsigned long lcolor, unsigned long tcolor, int ins = 0); |
||
328 | virtual int ButtonPnt(int xp, int yp, int &n, int kind = 0); |
||
329 | |||
330 | void SetDefW(); |
||
331 | |||
332 | TXButtonArray a; |
||
333 | }; |
||
334 | |||
335 | void TMultiButton::Draw(TGraphDraw *drw, int x0, int y0, unsigned long dcolor, |
||
336 | unsigned long lcolor, unsigned long tcolor, int ins) |
||
337 | { |
||
338 | a.Draw(drw, x0, y0, w, dcolor, lcolor, tcolor, ins); |
||
339 | } |
||
340 | |||
341 | int TMultiButton::ButtonPnt(int xp, int yp, int &n, int kind) |
||
342 | { |
||
343 | if (a.GetInsert() < 0 && (xp < 0 || yp < 0 || xp > w || yp > h)) return INT_MIN; |
||
344 | return a.ButtonPnt(xp, yp, w, n, kind); |
||
345 | } |
||
346 | |||
347 | void TMultiButton::SetDefW() |
||
348 | { |
||
349 | w = a.GetFWidth(); |
||
350 | if (w < 0) w = 0; |
||
351 | h = a.GetHeight(w); |
||
352 | } |
||
353 | |||
354 | #endif //_HEADER_BUTTONS_H>>>>>>>>>>>>>>>>>>>>>>>>=>=>=> |
||
355 |