Initial revision
[ssr] / StraySrc / Glass / !Glass / c / editWin
1 /*
2 * editWindow.c
3 *
4 * Edit window dialogue box
5 *
6 * © 1994-1998 Straylight
7 */
8
9 /*----- Licensing note ----------------------------------------------------*
10 *
11 * This file is part of Straylight's Glass.
12 *
13 * Glass is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2, or (at your option)
16 * any later version.
17 *
18 * Glass is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with Glass. If not, write to the Free Software Foundation,
25 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 */
27
28 /*----- Header files ------------------------------------------------------*/
29
30 /*
31 * ANSI standard headers
32 */
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37
38 /*
39 * Steel headers
40 */
41
42 #define _STDAPP
43 #define _LOWLVL
44 #include "steel/Steel.h"
45
46 #include "steel/buttons.h"
47 #include "steel/fontMenu.h"
48 #include "steel/akbd.h"
49 #include "steel/buffer.h"
50 #include "steel/font.h"
51
52 /*
53 * Glass headers
54 */
55
56 #include "glass.h"
57 #include "tfile.h"
58 #include "window.h"
59 #include "intMsgs.h"
60 #include "editWin.h"
61 #include "colSelect.h"
62 #include "indir.h"
63 #include "gPrefs.h"
64
65 #include "gStruct.h"
66 #include "gMenus.h"
67 #include "gIcons.h"
68
69 /*----- Static variables --------------------------------------------------*/
70
71 static char *editWindow__panels[]=
72 {
73 "windChars",
74 "windGadgets",
75 "windButton",
76 "iconData",
77 "iconAppear",
78 "windColours",
79 "windSize",
80 };
81
82 #define editWindow__ICAPPHEIGHT -504
83
84 /*----- New RISC OS 3 window flags ----------------------------------------*/
85
86 #define wimp_WONSCREEN (1<<13)
87 #define wimp_WRUBBERH (1<<14)
88 #define wimp_WRUBBERV (1<<15)
89
90 /*----- Support routines --------------------------------------------------*/
91
92 #define max2(a,b) ((a)>(b) ? (a) : (b))
93 #define min2(a,b) ((a)<(b) ? (a) : (b))
94
95 /*
96 * void editWindow__checkExtents(glass_editWindow *ed,BOOL redraw,
97 * BOOL read)
98 *
99 * Use
100 * Ensures that the window extents are correctly set according to window
101 * size etc.
102 *
103 * Parameters
104 * glass_editWindow *ed == the edit
105 * BOOL rbl == whether to redraw the bottom left setting
106 * BOOL rtr == whether to redraw the top right setting
107 * BOOL read == whether to read settings from dbox
108 */
109
110 static void editWindow__checkExtents(glass_editWindow *ed,BOOL rbl,
111 BOOL rtr,BOOL read)
112 {
113 BOOL bl=rbl;
114 BOOL tr=rtr;
115 int x,y;
116 if (ed->e.panel==glass_EWWORKAREA && read)
117 {
118 dbox_scanfield(ed->e.pd,
119 glass_EWSBOTTOMLEFT,
120 "%d,%d",
121 &ed->wdef.ex.x0,
122 &ed->wdef.ex.y0);
123 dbox_scanfield(ed->e.pd,
124 glass_EWSTOPRIGHT,
125 "%d,%d",
126 &ed->wdef.ex.x1,
127 &ed->wdef.ex.y1);
128 }
129 if (ed->e.panel==glass_EWWORKAREA)
130 {
131 dbox_scanfield(ed->e.pd,glass_EWSMINWIDTH,"%d",&x);
132 dbox_scanfield(ed->e.pd,glass_EWSMINHEIGHT,"%d",&y);
133 }
134 else
135 {
136 x=ed->wdef.minsize & 0xffff;
137 y=(ed->wdef.minsize>>16) & 0xffff;
138 }
139
140 if (gPrefs_current()->mVisInWork)
141 {
142 if (ed->wdef.ex.x0>ed->w->def->desc.w.scx)
143 {
144 ed->wdef.ex.x0=ed->w->def->desc.w.scx;
145 bl=TRUE;
146 }
147 if (ed->wdef.ex.y0>ed->w->def->desc.w.scy+
148 ed->w->def->desc.w.box.y0-
149 ed->w->def->desc.w.box.y1)
150 {
151 ed->wdef.ex.y0=ed->w->def->desc.w.scy+
152 ed->w->def->desc.w.box.y0-
153 ed->w->def->desc.w.box.y1;
154 bl=TRUE;
155 }
156 if (ed->wdef.ex.x1<ed->w->def->desc.w.scx+
157 ed->w->def->desc.w.box.x1-
158 ed->w->def->desc.w.box.x0)
159 {
160 ed->wdef.ex.x1=ed->w->def->desc.w.scx+
161 ed->w->def->desc.w.box.x1-
162 ed->w->def->desc.w.box.x0;
163 tr=TRUE;
164 }
165 if (ed->wdef.ex.y1<ed->w->def->desc.w.scy)
166 {
167 ed->wdef.ex.y1=ed->w->def->desc.w.scy;
168 tr=TRUE;
169 }
170 }
171 if (bl && ed->e.panel==glass_EWWORKAREA)
172 {
173 dbox_setfield(ed->e.pd,
174 glass_EWSBOTTOMLEFT,
175 "%i,%i",
176 ed->wdef.ex.x0,
177 ed->wdef.ex.y0);
178 }
179 if (tr && ed->e.panel==glass_EWWORKAREA)
180 {
181 dbox_setfield(ed->e.pd,
182 glass_EWSTOPRIGHT,
183 "%i,%i",
184 ed->wdef.ex.x1,
185 ed->wdef.ex.y1);
186 }
187 bl=rbl;
188 tr=rtr;
189 if (gPrefs_current()->mVisInWork)
190 {
191 if (x>ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0)
192 {
193 x=ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0;
194 bl=TRUE;
195 }
196 if (y>ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0)
197 {
198 y=ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0;
199 tr=TRUE;
200 }
201 }
202 else
203 {
204 if (x>ed->wdef.ex.x1-ed->wdef.ex.x0)
205 {
206 x=ed->wdef.ex.x1-ed->wdef.ex.x0;
207 bl=TRUE;
208 }
209 if (y>ed->wdef.ex.y1-ed->wdef.ex.y0)
210 {
211 y=ed->wdef.ex.y1-ed->wdef.ex.y0;
212 tr=TRUE;
213 }
214 }
215 ed->wdef.minsize=x+(y<<16);
216 if (bl && ed->e.panel==glass_EWWORKAREA)
217 dbox_setfield(ed->e.pd,glass_EWSMINWIDTH,"%i",x);
218 if (tr && ed->e.panel==glass_EWWORKAREA)
219 dbox_setfield(ed->e.pd,glass_EWSMINHEIGHT,"%i",y);
220 }
221
222 /*
223 * void editWindow__setupPanel(glass_editWindow *ed)
224 *
225 * Use
226 * Sets up a panel from the icon description given.
227 *
228 * Parameters
229 * glass_editWindow *ed == the edit to handle.
230 */
231
232 static void editWindow__setupPanel(glass_editWindow *ed)
233 {
234 char *buf=buffer_find();
235
236 switch (ed->e.panel)
237 {
238 case glass_EWCHARS:
239 dbox_selecticon(ed->e.pd,
240 glass_EWCMOVE,
241 !!(ed->wdef.flags & wimp_WMOVEABLE));
242 dbox_selecticon(ed->e.pd,
243 glass_EWCREDRAW,
244 !!(ed->wdef.flags & wimp_REDRAW_OK));
245 dbox_selecticon(ed->e.pd,
246 glass_EWCPANE,
247 !!(ed->wdef.flags & wimp_WPANE));
248 dbox_selecticon(ed->e.pd,
249 glass_EWCNOBOUNDS,
250 !!(ed->wdef.flags & wimp_WTRESPASS));
251 dbox_selecticon(ed->e.pd,
252 glass_EWCONSCREEN,
253 !!(ed->wdef.flags & wimp_WONSCREEN));
254 if (ed->wdef.flags & wimp_WSCROLL_R1)
255 {
256 dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,TRUE);
257 dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,FALSE);
258 dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,FALSE);
259 }
260 else if (ed->wdef.flags & wimp_SCROLL_R2)
261 {
262 dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,FALSE);
263 dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,TRUE);
264 dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,FALSE);
265 }
266 else
267 {
268 dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,FALSE);
269 dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,FALSE);
270 dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,TRUE);
271 }
272 dbox_selecticon(ed->e.pd,
273 glass_EWCGCOL,
274 !!(ed->wdef.flags & wimp_REAL_COLOURS));
275 dbox_selecticon(ed->e.pd,
276 glass_EWCBACK,
277 !!(ed->wdef.flags & wimp_BACK_WINDOW));
278 dbox_selecticon(ed->e.pd,
279 glass_EWCHOTKEYS,
280 !!(ed->wdef.flags & wimp_HOT_KEYS));
281 break;
282 case glass_EWGADGETS:
283 if (tst(ed->wdef.flags,31))
284 {
285 dbox_shadeicon(ed->e.pd,glass_EWGOTITLE,TRUE);
286 dbox_shadeicon(ed->e.pd,glass_EWGOCLOSEBACK,TRUE);
287 dbox_shadeicon(ed->e.pd,glass_EWGOHORIZ,TRUE);
288 dbox_shadeicon(ed->e.pd,glass_EWGOVERT,TRUE);
289 dbox_shadeicon(ed->e.pd,glass_EWGNTITLE,FALSE);
290 dbox_shadeicon(ed->e.pd,glass_EWGNHORIZ,FALSE);
291 dbox_shadeicon(ed->e.pd,glass_EWGNVERT,FALSE);
292 dbox_selecticon(ed->e.pd,glass_EWGNEW,TRUE);
293 dbox_selecticon(ed->e.pd,glass_EWGOLD,FALSE);
294 dbox_selecticon(ed->e.pd,glass_EWGOTITLE,tst(ed->wdef.flags,26));
295 dbox_selecticon(ed->e.pd,
296 glass_EWGOCLOSEBACK,
297 tst(ed->wdef.flags,24) || tst(ed->wdef.flags,25));
298 dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,tst(ed->wdef.flags,30));
299 dbox_selecticon(ed->e.pd,glass_EWGOVERT,tst(ed->wdef.flags,28));
300 dbox_selecticon(ed->e.pd,glass_EWGNTITLE,tst(ed->wdef.flags,26));
301 dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,tst(ed->wdef.flags,25));
302 dbox_shadeicon(ed->e.pd,glass_EWGNCLOSE,!tst(ed->wdef.flags,26));
303 dbox_selecticon(ed->e.pd,glass_EWGNRESIZE,tst(ed->wdef.flags,29));
304 dbox_shadeicon(ed->e.pd,
305 glass_EWGNRESIZE,
306 !(tst(ed->wdef.flags,28) || tst(ed->wdef.flags,30)));
307 dbox_selecticon(ed->e.pd,glass_EWGNBACK,tst(ed->wdef.flags,24));
308 dbox_shadeicon(ed->e.pd,glass_EWGNBACK,!tst(ed->wdef.flags,26));
309 dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,tst(ed->wdef.flags,27));
310 dbox_shadeicon(ed->e.pd,
311 glass_EWGNTOGGLE,
312 !(tst(ed->wdef.flags,26) || tst(ed->wdef.flags,28)));
313 dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,tst(ed->wdef.flags,30));
314 dbox_selecticon(ed->e.pd,glass_EWGNVERT,tst(ed->wdef.flags,28));
315 }
316 else
317 {
318 dbox_shadeicon(ed->e.pd,glass_EWGOTITLE,FALSE);
319 dbox_shadeicon(ed->e.pd,glass_EWGOHORIZ,FALSE);
320 dbox_shadeicon(ed->e.pd,glass_EWGOVERT,FALSE);
321 dbox_shadeicon(ed->e.pd,glass_EWGNTITLE,TRUE);
322 dbox_shadeicon(ed->e.pd,glass_EWGNCLOSE,TRUE);
323 dbox_shadeicon(ed->e.pd,glass_EWGNRESIZE,TRUE);
324 dbox_shadeicon(ed->e.pd,glass_EWGNBACK,TRUE);
325 dbox_shadeicon(ed->e.pd,glass_EWGNTOGGLE,TRUE);
326 dbox_shadeicon(ed->e.pd,glass_EWGNHORIZ,TRUE);
327 dbox_shadeicon(ed->e.pd,glass_EWGNVERT,TRUE);
328 dbox_selecticon(ed->e.pd,glass_EWGNEW,FALSE);
329 dbox_selecticon(ed->e.pd,glass_EWGOLD,TRUE);
330 dbox_selecticon(ed->e.pd,glass_EWGOTITLE,tst(ed->wdef.flags,0));
331 dbox_selecticon(ed->e.pd,
332 glass_EWGOCLOSEBACK,
333 !tst(ed->wdef.flags,7));
334 dbox_shadeicon(ed->e.pd,
335 glass_EWGOCLOSEBACK,
336 !tst(ed->wdef.flags,0));
337 dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,tst(ed->wdef.flags,3));
338 dbox_selecticon(ed->e.pd,glass_EWGOVERT,tst(ed->wdef.flags,2));
339 dbox_selecticon(ed->e.pd,glass_EWGNTITLE,tst(ed->wdef.flags,0));
340 dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,!tst(ed->wdef.flags,7));
341 dbox_selecticon(ed->e.pd,
342 glass_EWGNRESIZE,
343 tst(ed->wdef.flags,2) || tst(ed->wdef.flags,3));
344 dbox_selecticon(ed->e.pd,glass_EWGNBACK,!tst(ed->wdef.flags,7));
345 dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,tst(ed->wdef.flags,2));
346 dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,tst(ed->wdef.flags,3));
347 dbox_selecticon(ed->e.pd,glass_EWGNVERT,tst(ed->wdef.flags,2));
348 }
349 break;
350 case glass_EWBTYPE:
351 sprintf(buf,"ewBTYPE%i",(ed->wdef.workflags>>12) & 0x0f);
352 dbox_setfield(ed->e.pd,glass_EWBBTDISP,"%s",msgs_lookup(buf));
353 break;
354 case glass_EWTDATA:
355 dbox_setfield(ed->e.pd,glass_EIDVALSTRING,"%s",ed->valid);
356 dbox_setfield(ed->e.pd,glass_EIDDATA,"%s",ed->data);
357 if (!(ed->wdef.titleflags & 3))
358 {
359 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE);
360 dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE);
361 dbox_selecticon(ed->e.pd,glass_EIDINDIR,FALSE);
362 dbox_selecticon(ed->e.pd,glass_EIDVALID,FALSE);
363 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE);
364 dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE);
365 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
366 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
367 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
368 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
369 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
370 dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",12);
371 }
372 else if (ed->wdef.titleflags & wimp_INDIRECT)
373 {
374 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE);
375 dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE);
376 dbox_selecticon(ed->e.pd,glass_EIDINDIR,TRUE);
377 dbox_selecticon(ed->e.pd,glass_EIDVALID,ed->hasValid);
378 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,!ed->hasValid);
379 dbox_shadeicon(ed->e.pd,
380 glass_EIDVALID,
381 !(ed->wdef.titleflags&wimp_ITEXT));
382 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE);
383 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE);
384 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE);
385 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE);
386 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE);
387 dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",ed->indLen);
388 }
389 else
390 {
391 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE);
392 dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE);
393 dbox_selecticon(ed->e.pd,glass_EIDINDIR,FALSE);
394 dbox_selecticon(ed->e.pd,glass_EIDVALID,FALSE);
395 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE);
396 dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE);
397 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
398 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
399 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
400 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
401 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
402 dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",12);
403 }
404 dbox_selecticon(ed->e.pd,
405 glass_EIDTEXT,
406 !!(ed->wdef.titleflags&wimp_ITEXT));
407 dbox_selecticon(ed->e.pd,
408 glass_EIDSPRITE,
409 !!(ed->wdef.titleflags&wimp_ISPRITE));
410 break;
411 case glass_EWTAPPEAR:
412 dbox_setfield(ed->e.pd,glass_EIAFONTNAME,"%.%s",ed->font);
413 dbox_setfield(ed->e.pd,glass_EIAFSIZEWRITE,"%i",ed->fontSize);
414 if (ed->wdef.titleflags & wimp_ITEXT)
415 {
416 if (ed->wdef.titleflags & wimp_IFONT)
417 {
418 dbox_selecticon(ed->e.pd,glass_EIAFONT,TRUE);
419 dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,FALSE);
420 dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,FALSE);
421 dbox_shadeicon(ed->e.pd,glass_EIAFONT,FALSE);
422 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,FALSE);
423 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,FALSE);
424 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,FALSE);
425 }
426 else
427 {
428 dbox_selecticon(ed->e.pd,glass_EIAFONT,FALSE);
429 dbox_shadeicon(ed->e.pd,glass_EIAFONT,FALSE);
430 dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,TRUE);
431 dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,TRUE);
432 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,TRUE);
433 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,TRUE);
434 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,TRUE);
435 }
436 }
437 else
438 {
439 dbox_selecticon(ed->e.pd,glass_EIAFONT,FALSE);
440 dbox_shadeicon(ed->e.pd,glass_EIAFONT,TRUE);
441 dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,TRUE);
442 dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,TRUE);
443 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,TRUE);
444 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,TRUE);
445 dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,TRUE);
446 }
447 dbox_selecticon(ed->e.pd,
448 glass_EIAHCENTRE,
449 !!(ed->wdef.titleflags & wimp_IHCENTRE));
450 dbox_selecticon(ed->e.pd,
451 glass_EIAVCENTRE,
452 !!(ed->wdef.titleflags & wimp_IVCENTRE));
453 dbox_selecticon(ed->e.pd,
454 glass_EIARALIGN,
455 !!(ed->wdef.titleflags & wimp_IRJUST));
456 if (ed->wdef.titleflags & wimp_ISPRITE)
457 {
458 dbox_selecticon(ed->e.pd,
459 glass_EIAHALFSIZE,
460 !!(ed->wdef.titleflags & wimp_IHALVESPRITE));
461 dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,FALSE);
462 }
463 else
464 {
465 dbox_selecticon(ed->e.pd,glass_EIAHALFSIZE,FALSE);
466 dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,TRUE);
467 }
468 dbox_selecticon(ed->e.pd,glass_EIABORDER,FALSE);
469 dbox_selecticon(ed->e.pd,glass_EIAFILL,FALSE);
470 dbox_selecticon(ed->e.pd,glass_EIANEEDSHELP,FALSE);
471 dbox_shadeicon(ed->e.pd,glass_EIABORDER,TRUE);
472 dbox_shadeicon(ed->e.pd,glass_EIAFILL,TRUE);
473 dbox_shadeicon(ed->e.pd,glass_EIANEEDSHELP,TRUE);
474 /* The above aren't relevant to a window title */
475 break;
476 case glass_EWCOLOURS:
477 colSelect_setColourButton(ed->e.pd,
478 glass_EWCTBFORE,
479 ed->wdef.colours[0]);
480 colSelect_setColourButton(ed->e.pd,
481 glass_EWCTBBACK,
482 ed->wdef.colours[1]);
483 colSelect_setColourButton(ed->e.pd,
484 glass_EWCWAFORE,
485 ed->wdef.colours[2]);
486 colSelect_setColourButton(ed->e.pd,
487 glass_EWCWABACK,
488 ed->wdef.colours[3]);
489 colSelect_setColourButton(ed->e.pd,
490 glass_EWCSCFORE,
491 ed->wdef.colours[5]);
492 colSelect_setColourButton(ed->e.pd,
493 glass_EWCSCBACK,
494 ed->wdef.colours[4]);
495 colSelect_setColourButton(ed->e.pd,
496 glass_EWCHIGH,
497 ed->wdef.colours[6]);
498 break;
499 case glass_EWWORKAREA:
500 dbox_setfield(ed->e.pd,
501 glass_EWSMINWIDTH,
502 "%i",
503 ed->wdef.minsize & 0xffff);
504 dbox_setfield(ed->e.pd,
505 glass_EWSMINHEIGHT,
506 "%i",
507 (ed->wdef.minsize>>16) & 0xffff);
508 editWindow__checkExtents(ed,TRUE,TRUE,FALSE);
509 dbox_selecticon(ed->e.pd,
510 glass_EWSRUBBERH,
511 !!(ed->wdef.flags & wimp_WRUBBERH));
512 dbox_selecticon(ed->e.pd,
513 glass_EWSRUBBERV,
514 !!(ed->wdef.flags & wimp_WRUBBERV));
515 break;
516 }
517 }
518
519 /*
520 * void editWindow__closePanel(glass_editWindow *ed)
521 *
522 * Use
523 * Records the settings in a panel for future reference, for example when
524 * the panel is being replaced by a different one.
525 *
526 * Parameters
527 * glass_editWindow *ed == the edit box we're talking about
528 */
529
530 #define Q dbox_READSTATE
531
532 static void editWindow__closePanel(glass_editWindow *ed)
533 {
534 switch (ed->e.panel)
535 {
536 case glass_EWCHARS:
537 ed->wdef.flags&=~0x00003f72;
538 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCMOVE,Q)<<1;
539 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCREDRAW,Q)<<4;
540 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCPANE,Q)<<5;
541 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCNOBOUNDS,Q)<<6;
542 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCONSCREEN,Q)<<13;
543 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,Q)<<8;
544 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,Q)<<9;
545 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCGCOL,Q)<<10;
546 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCBACK,Q)<<11;
547 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCHOTKEYS,Q)<<12;
548 break;
549 case glass_EWGADGETS:
550 ed->wdef.flags&=~0xff00008d;
551 if (dbox_selecticon(ed->e.pd,glass_EWGOLD,Q))
552 {
553 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOTITLE,Q)<<0;
554 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOVERT,Q)<<2;
555 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,Q)<<3;
556 ed->wdef.flags|=(!dbox_selecticon(ed->e.pd,
557 glass_EWGOCLOSEBACK,
558 Q))<<7;
559 }
560 else
561 {
562 ed->wdef.flags|=wimp_WNEW;
563 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNBACK,Q)<<24;
564 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,Q)<<25;
565 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNTITLE,Q)<<26;
566 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,Q)<<27;
567 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNVERT,Q)<<28;
568 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNRESIZE,Q)<<29;
569 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,Q)<<30;
570 }
571 break;
572 case glass_EWTDATA:
573 dbox_getfield(ed->e.pd,glass_EIDDATA,ed->data,256);
574 dbox_getfield(ed->e.pd,glass_EIDVALSTRING,ed->valid,256);
575 dbox_scanfield(ed->e.pd,glass_EIDINDSIZE,"%d",&ed->indLen);
576 ed->hasValid=dbox_selecticon(ed->e.pd,glass_EIDVALID,Q);
577 ed->wdef.titleflags&=~0x00000103;
578 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDTEXT,Q)<<0;
579 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDSPRITE,Q)<<1;
580 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDINDIR,Q)<<8;
581 break;
582 case glass_EWTAPPEAR:
583 ed->wdef.titleflags&=~0x00000afc;
584 dbox_scanfield(ed->e.pd,glass_EIAFSIZEWRITE,"%d",&ed->fontSize);
585 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,
586 glass_EIAHCENTRE,
587 Q)<<3;
588 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAVCENTRE,Q)<<4;
589 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAFONT,Q)<<6;
590 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIARALIGN,Q)<<9;
591 ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAHALFSIZE,Q)<<11;
592 break;
593 case glass_EWWORKAREA:
594 ed->wdef.flags&=~0x0000c000;
595 editWindow__checkExtents(ed,FALSE,FALSE,TRUE);
596 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWSRUBBERH,Q)<<14;
597 ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWSRUBBERV,Q)<<15;
598 break;
599 }
600 }
601
602 #undef Q
603
604 /*
605 * void editWindow__setPanel(glass_editWindow *ed,dbox_field f)
606 *
607 * Use
608 * Creates a new panel based on a radio button click or some-such.
609 *
610 * Parameters
611 * glass_editWindow *ed == the edit window to change panel
612 * dbox_field f == the radio button associated with the desired panel
613 */
614
615 static void editWindow__panelHandler(dbox d,dbox_field f,void *handle);
616 static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle);
617
618 static void editWindow__setPanel(glass_editWindow *ed,dbox_field f)
619 {
620 dbox d;
621 wimp_wstate s;
622 wimp_icon i;
623 int width,height;
624 int ox,oy;
625 wimp_w behind;
626 wimp_caretstr c;
627 wimp_redrawstr r;
628 BOOL ownCaret=TRUE;
629
630 if (f==ed->e.panel)
631 return;
632 editWindow__closePanel(ed);
633 wimpt_noerr(wimp_get_wind_state(dbox_syshandle(ed->e.d),&s));
634 wimpt_noerr(wimp_get_icon_info(dbox_syshandle(ed->e.d),
635 glass_EWPOSN,&i));
636 ox=s.o.box.x0-s.o.x;
637 oy=s.o.box.y1-s.o.y;
638 mem_useUser(indir_alloc,indir_free);
639 if (f==-1)
640 d=dbox_create("iconNowt");
641 else
642 d=dbox_create(editWindow__panels[f-glass_EWCHARS]);
643 if (!d)
644 {
645 mem_useMalloc();
646 return;
647 }
648 dbox_eventHandler(d,editWindow__panelHandler,ed);
649 dbox_rawEventHandler(d,editWindow__panelRaw,ed);
650 if (ed->e.panel)
651 {
652 wimpt_noerr(wimp_get_caret_pos(&c));
653 ownCaret=(c.w==dbox_syshandle(ed->e.pd));
654 dbox_selecticon(ed->e.d,ed->e.panel,dbox_RESETSTATE);
655 wimpt_noerr(wimp_get_wind_state(dbox_syshandle(ed->e.pd),&s));
656 pane_removePane(ed->e.p,dbox_syshandle(ed->e.pd));
657 dbox_delete(ed->e.pd);
658 }
659 dbox_selecticon(ed->e.d,f,dbox_SETSTATE);
660 behind=s.o.behind;
661 wimpt_noerr(wimp_get_wind_state(dbox_syshandle(d),&s));
662 width=s.o.box.x1-s.o.box.x0;
663 height=s.o.box.y1-s.o.box.y0;
664 s.o.box.x0=i.box.x0+ox+wimpt_dx();
665 s.o.box.y0=i.box.y0+oy+wimpt_dy();
666 s.o.box.x1=s.o.box.x0+width;
667 s.o.box.y1=s.o.box.y0+height;
668 s.o.y=10000;
669 s.o.behind=behind;
670 ed->e.pd=d;
671 ed->e.panel=f;
672 editWindow__setupPanel(ed);
673 if (f==glass_EWTAPPEAR)
674 {
675 r.w=s.o.w;
676 r.box.x0=0;
677 r.box.x1=s.o.box.x1-s.o.box.x0;
678 r.box.y1=0;
679 r.box.y0=editWindow__ICAPPHEIGHT;
680 wimpt_noerr(wimp_set_extent(&r));
681 }
682 wimpt_noerr(wimp_open_wind(&s.o));
683 if (ownCaret)
684 {
685 c.w=dbox_syshandle(d);
686 c.i=-1;
687 c.x=-500000;
688 c.y=0;
689 c.height=0x02000000;
690 wimpt_noerr(wimp_set_caret_pos(&c));
691 }
692 pane_addPane(ed->e.p,dbox_syshandle(d));
693 mem_useMalloc();
694 }
695
696 /*
697 * void editWindow__recreate(glass_editWindow *ed)
698 *
699 * Use
700 * Recreates the icon from the dialogue box settings
701 *
702 * Parameters
703 * glass_editWindow *ed == info about the edit
704 */
705
706 static void editWindow__recreate(glass_editWindow *ed)
707 {
708 char *p=0;
709 char *q=0;
710 char newname[15];
711 int fhandle;
712 ed->w->edit=0; /* Delink temporarily */
713
714 editWindow__checkExtents(ed,FALSE,FALSE,TRUE);
715 if (!(ed->wdef.titleflags & wimp_INDIRECT))
716 {
717 ed->indLen=12;
718 ed->hasValid=FALSE;
719 }
720 if (strlen(ed->data)>=ed->indLen)
721 {
722 ed->wdef.titleflags|=wimp_INDIRECT;
723 ed->indLen=strlen(ed->data)+1;
724 }
725 if (ed->wdef.titleflags & wimp_INDIRECT)
726 {
727 if (p=indir_alloc(ed->indLen),!p)
728 {
729 werr(FALSE,msgs_lookup("ewNEMUW"));
730 return;
731 }
732 if (ed->hasValid && (ed->wdef.titleflags & wimp_ITEXT))
733 {
734 if (q=indir_alloc(strlen(ed->valid)+1),!q)
735 {
736 indir_free(p);
737 werr(FALSE,
738 msgs_lookup("ewNEMUW"));
739 return;
740 }
741 strcpy(q,ed->valid);
742 ed->w->size+=strlen(ed->valid)+1;
743 }
744 strcpy(p,ed->data);
745 ed->w->size+=ed->indLen;
746 }
747
748 if (ed->w->def->desc.w.titleflags & wimp_IFONT) /* Was old antialiased? */
749 {
750 fhandle=(ed->w->def->desc.w.titleflags >> 24) & 255;
751 wimpt_noerr(font_lose(fhandle));
752 ed->w->fonts[fhandle]--;
753 }
754 if (ed->wdef.titleflags & wimp_IFONT) /* Is new title antialiased? */
755 {
756 if (font_find(ed->font,ed->fontSize*16,ed->fontSize*16,0,0,&fhandle))
757 {
758 werr(FALSE,msgs_lookup("ewCFF"),ed->font);
759 ed->wdef.titleflags&=~wimp_IFONT;
760 }
761 else
762 {
763 ed->w->antiAliased=TRUE;
764 ed->w->fonts[fhandle]++;
765 ed->wdef.titleflags=(ed->wdef.titleflags & 0x00ffffff) | (fhandle<<24);
766 }
767 }
768
769 if (ed->w->def->desc.w.titleflags & wimp_INDIRECT)
770 {
771 indir_free(ed->w->def->desc.w.title.indirecttext.buffer);
772 ed->w->size-=ed->w->def->desc.w.title.indirecttext.bufflen;
773 if ((ed->w->def->desc.w.titleflags & wimp_ITEXT) &&
774 (ed->w->def->desc.w.title.indirecttext.validstring!=(char *)-1))
775 {
776 ed->w->size-=
777 strlen(ed->w->def->desc.w.title.indirecttext.validstring)+1;
778 indir_free(ed->w->def->desc.w.title.indirecttext.validstring);
779 }
780 }
781
782 if (p)
783 {
784 ed->wdef.title.indirecttext.buffer=p;
785 ed->wdef.title.indirecttext.bufflen=ed->indLen;
786 if (q)
787 ed->wdef.title.indirecttext.validstring=q;
788 else if (ed->wdef.titleflags & wimp_ITEXT)
789 ed->wdef.title.indirecttext.validstring=(char *)-1;
790 else
791 ed->wdef.title.indirectsprite.spritearea=ed->w->t->s;
792 }
793 else
794 memcpy(ed->wdef.title.text,ed->data,12);
795
796 ed->wdef.box=ed->w->def->desc.w.box;
797 ed->wdef.scx=ed->w->def->desc.w.scx;
798 ed->wdef.scy=ed->w->def->desc.w.scy;
799 ed->wdef.behind=ed->w->def->desc.w.behind;
800 ed->wdef.nicons=ed->w->def->desc.w.nicons;
801 ed->w->def->desc.w=ed->wdef;
802 dbox_getfield(ed->e.d,glass_EWIDWRITE,newname,15);
803 tfile_rename(newname,ed->w);
804 dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id);
805
806 ed->w->edit=ed; /* Relink again */
807 window_recreate(ed->w);
808 tfile_markAsAltered(ed->w->t);
809 }
810
811 /*
812 * void editWindow__nextPanel(glass_editWindow *ed,int dir)
813 *
814 * Use
815 * Changes panel to the next one in the given direction. Skips shaded
816 * panels and handles everything nicely.
817 *
818 * Parameters
819 * glass_editWindow *ed == the edit dialogue box to move about in
820 * int dir == the direction (-1 for up, 1 for down)
821 */
822
823 static void editWindow__nextPanel(glass_editWindow *ed,int dir)
824 {
825 int i=ed->e.panel;
826
827 if (i==-1)
828 i=(dir==1 ? glass_EWCHARS : glass_EWWORKAREA);
829 else
830 i+=dir;
831
832 for (;i>=glass_EWCHARS && i<=glass_EWWORKAREA;i+=dir)
833 {
834 if (!dbox_shadeicon(ed->e.d,i,dbox_READSTATE))
835 {
836 editWindow__setPanel(ed,i);
837 break;
838 }
839 }
840 }
841
842 /*----- Event handlers ----------------------------------------------------*/
843
844 /*
845 * void editWindow__dboxHandler(dbox d,dbox_field f,void *handle)
846 *
847 * Use
848 * Handles any and all events directed at the dbox. Well, almost all...
849 *
850 * Parameters
851 * dbox d == the dbox handle
852 * dbox_field f == the event that happened
853 * void *handle == pointer to the dialogue box control info
854 */
855
856 static void editWindow__dboxHandler(dbox d,dbox_field f,void *handle)
857 {
858 glass_editWindow *ed=handle;
859 switch (f)
860 {
861 case dbox_CLOSE:
862 editWindow_close(ed->w);
863 break;
864 case dbox_HELP:
865 help_startHelp();
866 help_addLine(msgs_lookup("ewhEIDB"));
867 help_readFromIcon();
868 help_endHelp();
869 break;
870 case glass_EWCAN:
871 dbox_clickicon(d,f);
872 if (!dbox_wasAdjustClick())
873 pane_close(ed->e.p);
874 else
875 {
876 /* --- set up for old window --- */
877 ed->wdef=ed->w->def->desc.w;
878 editWindow_readData(ed->w);
879 dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id);
880 editWindow__setupPanel(ed);
881 }
882 dbox_unclick();
883 if (!dbox_wasAdjustClick())
884 editWindow_close(ed->w);
885 break;
886 case glass_EWOK:
887 dbox_clickicon(d,f);
888 editWindow__closePanel(ed);
889 if (!dbox_wasAdjustClick())
890 {
891 pane_close(ed->e.p);
892 editWindow__recreate(ed);
893 dbox_unclick();
894 editWindow_close(ed->w);
895 }
896 else
897 {
898 editWindow__recreate(ed);
899 editWindow_readData(ed->w);
900 editWindow__setupPanel(ed);
901 dbox_unclick();
902 }
903 break;
904 case glass_EWDEL:
905 dbox_clickicon(d,f);
906 if (gPrefs_current()->cDelWind)
907 {
908 if (!warning(msgs_lookup("ewCDWP"),
909 msgs_lookup("ewCDW")))
910 {
911 dbox_unclick();
912 return;
913 }
914 }
915 pane_close(ed->e.p);
916 dbox_unclick();
917 tfile_markAsAltered(ed->w->t);
918 tfile_deleteWindow(ed->w->i,ed->w); /* This causes a close for us */
919 break;
920 case glass_EWSAVE:
921 dbox_clickicon(d,f);
922 dbox_unclick();
923 tfile_saveWindow(ed->w);
924 break;
925 case glass_EWCHARS:
926 case glass_EWGADGETS:
927 case glass_EWBTYPE:
928 case glass_EWTDATA:
929 case glass_EWTAPPEAR:
930 case glass_EWCOLOURS:
931 case glass_EWWORKAREA:
932 editWindow__setPanel(ed,f);
933 break;
934 }
935 }
936
937 /*
938 * BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle)
939 *
940 * Use
941 * Handles open window requests and things for the main Preferences dbox.
942 *
943 * Parameters
944 * dbox d == the dbox handle
945 * wimp_eventstr *e == the event that happened
946 * void *handle == a unused pointer
947 *
948 * Returns
949 * TRUE if the event has been handled;
950 */
951
952 static BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle)
953 {
954 BOOL handled=FALSE;
955 glass_editWindow *ed=handle;
956 glass_intMsgstr *m;
957 unused(d);
958 switch (e->e)
959 {
960 case wimp_EOPEN:
961 pane_moved(ed->e.p);
962 handled=TRUE;
963 break;
964 case wimp_EKEY:
965 switch (e->data.key.chcode)
966 {
967 case akbd_UpK+akbd_Sh:
968 editWindow__nextPanel(ed,-1);
969 handled=TRUE;
970 break;
971 case akbd_DownK+akbd_Sh:
972 editWindow__nextPanel(ed,+1);
973 handled=TRUE;
974 break;
975 }
976 break;
977 case wimp_ESEND:
978 case wimp_ESENDWANTACK:
979 switch (e->data.msg.hdr.action)
980 {
981 case wimp_MINTERNAL:
982 m=intMsgs_receive(e);
983 switch(e->data.msg.data.words[0])
984 {
985 case glass_DELETEFILE:
986 if (m->df.t==ed->w->t)
987 editWindow_close(ed->w);
988 break;
989 case glass_SAVEFILE:
990 if (m->df.t==ed->w->t)
991 dbox_setfield(ed->e.d,glass_EWFILEDISP,"%.%s",
992 ed->w->t->filename);
993 break;
994 case glass_DELETEWINDOW:
995 if (m->dw.w==ed->w)
996 editWindow_close(ed->w);
997 break;
998 case glass_RENAME:
999 if (m->rn.w==ed->w)
1000 dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id);
1001 break;
1002 }
1003 break;
1004 }
1005 break;
1006 }
1007 return (handled);
1008 }
1009
1010 /*
1011 * menu editWindow__fontMaker(void *handle)
1012 *
1013 * Use
1014 * Sets up the font menu.
1015 *
1016 * Parameters
1017 * void *handle == pointer to this edit
1018 *
1019 * Returns
1020 * A menu to display
1021 */
1022
1023 static menu editWindow__fontMaker(void *handle)
1024 {
1025 glass_editWindow *ed=handle;
1026 menu m=fontMenu_createFontMenu(FALSE);
1027 fontMenu_tickGivenName(ed->font);
1028 return (m);
1029 }
1030
1031 /*
1032 * void editWindow__fontHandler(int hit[],void *handle)
1033 *
1034 * Use
1035 * Gets the font chosen from the font menu.
1036 *
1037 * Parameters
1038 * int hit[] == the hit string
1039 * void *handle == pointer to this edit
1040 */
1041
1042 static void editWindow__fontHandler(int hit[],void *handle)
1043 {
1044 glass_editWindow *ed=handle;
1045 if (hit[0])
1046 {
1047 strcpy(ed->font,fontMenu_fontname(hit[0],hit[1]));
1048 dbox_setfield(ed->e.pd,glass_EIAFONTNAME,"%.%s",ed->font);
1049 }
1050 }
1051
1052 /*
1053 * void editWindow__fontHelp(int hit[],void *handle)
1054 *
1055 * Use
1056 * Gives help on a font menu item
1057 *
1058 * Parameters
1059 * int hit[] == the hit string
1060 * void *handle == pointer to this edit
1061 */
1062
1063 static void editWindow__fontHelp(int hit[],void *handle)
1064 {
1065 unused(handle);
1066 if (hit[0])
1067 {
1068 help_startHelp();
1069 help_addLine(msgs_lookup("ewmhFONT"),fontMenu_fontname(hit[0],hit[1]));
1070 help_endHelp();
1071 }
1072 }
1073
1074 /*
1075 * menu editWindow__btypeMaker(void *handle)
1076 *
1077 * Use
1078 * Generates and sets up a button type menu for an edit dialogue box
1079 *
1080 * Parameters
1081 * void *handle == pointer to the edit
1082 *
1083 * Returns
1084 * The menu to use
1085 */
1086
1087 static menu editWindow__btypeMaker(void *handle)
1088 {
1089 static menu m;
1090 static int ticked;
1091 glass_editWindow *ed=handle;
1092 int i;
1093 char *buf=buffer_find();
1094
1095 if (!m)
1096 {
1097 m=menu_new(msgs_lookup("eiBTMT"),msgs_lookup("ewBTYPE0"));
1098 for (i=1;i<=15;i++)
1099 {
1100 sprintf(buf,"ewBTYPE%i",i);
1101 menu_extend(m,msgs_lookup(buf));
1102 }
1103 }
1104 if (ticked)
1105 menu_setflags(m,ticked,FALSE,FALSE);
1106 ticked=((ed->wdef.workflags>>12)&0x0f)+1;
1107 menu_setflags(m,ticked,TRUE,FALSE);
1108 return (m);
1109 }
1110
1111 /*
1112 * void editWindow__btypeHandler(int hit[],void *handle)
1113 *
1114 * Use
1115 * Handles a click on the button type menu.
1116 *
1117 * Parameters
1118 * int hit[] == the mouse click info
1119 * void *handle == pointer to edit information
1120 */
1121
1122 static void editWindow__btypeHandler(int hit[],void *handle)
1123 {
1124 glass_editWindow *ed=handle;
1125 char *buf=buffer_find();
1126
1127 if (hit[0])
1128 {
1129 ed->wdef.workflags&=~0x0000f000;
1130 ed->wdef.workflags+=(hit[0]-1)<<12;
1131 sprintf(buf,"ewBTYPE%i",hit[0]-1);
1132 dbox_setfield(ed->e.pd,glass_EIABTYPE,"%s",msgs_lookup(buf));
1133 }
1134 }
1135
1136 /*
1137 * void editWindow__colProc(dbox d,dbox_field f,int colour, void *handle)
1138 *
1139 * Use
1140 * This routine is called when a colour is selected in the colours panel.
1141 *
1142 * Parameters
1143 * dbox d == the panel's handle
1144 * dbox_field f == the colour button that has changed
1145 * int colour == the new colour for the button
1146 * void *handle == pointer to this edit
1147 */
1148
1149 static void editWindow__colProc(dbox d,dbox_field f,int colour,void *handle)
1150 {
1151 glass_editWindow *ed=handle;
1152 unused(d);
1153 switch (f)
1154 {
1155 case glass_EWCTBFORE:
1156 ed->wdef.colours[0]=colour;
1157 dbox_shadeicon(ed->e.d,glass_EWGADGETS,colour==255);
1158 if ((tst(ed->wdef.flags,31) && tst(ed->wdef.flags,26))
1159 || (!tst(ed->wdef.flags,31) && tst(ed->wdef.flags,0)))
1160 {
1161 dbox_shadeicon(ed->e.d,glass_EWTDATA,colour==255);
1162 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,colour==255);
1163 }
1164 break;
1165 case glass_EWCTBBACK:
1166 ed->wdef.colours[1]=colour;
1167 break;
1168 case glass_EWCWAFORE:
1169 ed->wdef.colours[2]=colour;
1170 break;
1171 case glass_EWCWABACK:
1172 ed->wdef.colours[3]=colour;
1173 break;
1174 case glass_EWCSCFORE:
1175 ed->wdef.colours[5]=colour;
1176 break;
1177 case glass_EWCSCBACK:
1178 ed->wdef.colours[4]=colour;
1179 break;
1180 case glass_EWCHIGH:
1181 ed->wdef.colours[6]=colour;
1182 break;
1183 }
1184 }
1185
1186 /*
1187 * void editWindow__btypeHelp(int hit[],void *handle)
1188 *
1189 * Use
1190 * Handles a help request for the button type menu.
1191 *
1192 * Parameters
1193 * int hit[] == the helpq info
1194 * void *handle == pointer to edit information
1195 */
1196
1197 static void editWindow__btypeHelp(int hit[],void *handle)
1198 {
1199 char *buf=buffer_find();
1200 unused(handle);
1201 if (hit[0])
1202 {
1203 help_startHelp();
1204 sprintf(buf,"ewBTYPE%i",hit[0]-1);
1205 help_addLine(msgs_lookup("ewmhBTYPE"),msgs_lookup(buf));
1206 help_endHelp();
1207 }
1208 }
1209
1210 /*
1211 * void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle)
1212 *
1213 * Use
1214 * Handles a click on one of the (many!) arrow buttons in the extends panel.
1215 */
1216
1217 typedef struct
1218 {
1219 BOOL xOrY;
1220 BOOL topOrBottom;
1221 glass_editWindow *ed;
1222 }
1223 editWindow__extArrowstr;
1224
1225 static void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle)
1226 {
1227 editWindow__extArrowstr *a=handle;
1228 wimp_box *b=&a->ed->wdef.ex;
1229 int *v;
1230 unused(f);
1231
1232 if (a->xOrY)
1233 v=(a->topOrBottom ? &b->x1 : &b->x0);
1234 else
1235 v=(a->topOrBottom ? &b->y1 : &b->y0);
1236
1237 dbox_scanfield(d,glass_EWSBOTTOMLEFT,"%d,%d",&b->x0,&b->y0);
1238 dbox_scanfield(d,glass_EWSTOPRIGHT,"%d,%d",&b->x1,&b->y1);
1239
1240 *v+=diff;
1241
1242 editWindow__checkExtents(a->ed,!a->topOrBottom,a->topOrBottom,FALSE);
1243 }
1244
1245 /*
1246 * void editWindow__panelHandler(dbox d,dbox_field f,void *handle)
1247 *
1248 * Use
1249 * Handles simple click events for the current panel in an edit dbox
1250 *
1251 * Parameters
1252 * dbox d == the panel's dbox handle
1253 * dbox_field f == the icon that was clicked
1254 * void *handle == pointer to edit information
1255 */
1256
1257 static void editWindow__panelHandler(dbox d,dbox_field f,void *handle)
1258 {
1259 glass_editWindow *ed=handle;
1260 int on;
1261 buttons_simpleArrow sa={0,9999,FALSE};
1262 editWindow__extArrowstr eas;
1263 BOOL indon;
1264
1265 switch (f)
1266 {
1267 case dbox_CLOSE:
1268 case dbox_HELP:
1269 case glass_EIOK:
1270 case glass_EICAN:
1271 editWindow__dboxHandler(ed->e.d,f,ed);
1272 return;
1273 break;
1274 }
1275 switch (ed->e.panel)
1276 {
1277 case glass_EWGADGETS:
1278 on=!dbox_selecticon(d,f,dbox_READSTATE);
1279 switch (f)
1280 {
1281 case glass_EWGOLD:
1282 if (on)
1283 {
1284 dbox_selecticon(d,glass_EWGOLD,TRUE);
1285 dbox_selecticon(d,glass_EWGNEW,FALSE);
1286 dbox_shadeicon(d,glass_EWGOTITLE,FALSE);
1287 dbox_shadeicon(d,glass_EWGOCLOSEBACK,
1288 !dbox_selecticon(d,glass_EWGOTITLE,dbox_READSTATE));
1289 dbox_shadeicon(d,glass_EWGOHORIZ,FALSE);
1290 dbox_shadeicon(d,glass_EWGOVERT,FALSE);
1291 dbox_shadeicon(d,glass_EWGNTITLE,TRUE);
1292 dbox_shadeicon(d,glass_EWGNCLOSE,TRUE);
1293 dbox_shadeicon(d,glass_EWGNBACK,TRUE);
1294 dbox_shadeicon(d,glass_EWGNTOGGLE,TRUE);
1295 dbox_shadeicon(d,glass_EWGNRESIZE,TRUE);
1296 dbox_shadeicon(d,glass_EWGNHORIZ,TRUE);
1297 dbox_shadeicon(d,glass_EWGNVERT,TRUE);
1298 }
1299 break;
1300 case glass_EWGNEW:
1301 if (on)
1302 {
1303 dbox_selecticon(d,glass_EWGOLD,FALSE);
1304 dbox_selecticon(d,glass_EWGNEW,TRUE);
1305 dbox_shadeicon(d,glass_EWGOTITLE,TRUE);
1306 dbox_shadeicon(d,glass_EWGOCLOSEBACK,TRUE);
1307 dbox_shadeicon(d,glass_EWGOHORIZ,TRUE);
1308 dbox_shadeicon(d,glass_EWGOVERT,TRUE);
1309 dbox_shadeicon(d,glass_EWGNTITLE,FALSE);
1310 dbox_shadeicon(d,glass_EWGNCLOSE,
1311 !dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE));
1312 dbox_shadeicon(d,glass_EWGNBACK,
1313 !dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE));
1314 dbox_shadeicon(d,glass_EWGNTOGGLE,
1315 !(dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE)
1316 || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE)));
1317 dbox_shadeicon(d,glass_EWGNRESIZE,
1318 !(dbox_selecticon(d,glass_EWGNHORIZ,dbox_READSTATE)
1319 || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE)));
1320 dbox_shadeicon(d,glass_EWGNHORIZ,FALSE);
1321 dbox_shadeicon(d,glass_EWGNVERT,FALSE);
1322 }
1323 break;
1324 case glass_EWGOTITLE:
1325 dbox_selecticon(d,f,on);
1326 dbox_selecticon(d,glass_EWGNTITLE,on);
1327 dbox_shadeicon(d,glass_EWGOCLOSEBACK,!on);
1328 dbox_shadeicon(ed->e.d,glass_EWTDATA,!on);
1329 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,!on);
1330 break;
1331 case glass_EWGOCLOSEBACK:
1332 dbox_selecticon(d,f,on);
1333 dbox_selecticon(d,glass_EWGNCLOSE,on);
1334 dbox_selecticon(d,glass_EWGNBACK,on);
1335 break;
1336 case glass_EWGOHORIZ:
1337 dbox_selecticon(d,f,on);
1338 dbox_selecticon(d,glass_EWGNHORIZ,on);
1339 dbox_selecticon(d,glass_EWGNRESIZE,
1340 (on || dbox_selecticon(d,glass_EWGOVERT,dbox_READSTATE)));
1341 break;
1342 case glass_EWGOVERT:
1343 dbox_selecticon(d,f,on);
1344 dbox_selecticon(d,glass_EWGNVERT,on);
1345 dbox_selecticon(d,glass_EWGNTOGGLE,on);
1346 dbox_selecticon(d,glass_EWGNRESIZE,
1347 (on || dbox_selecticon(d,glass_EWGOHORIZ,dbox_READSTATE)));
1348 break;
1349 case glass_EWGNTITLE:
1350 dbox_selecticon(d,f,on);
1351 dbox_selecticon(d,glass_EWGOTITLE,on);
1352 dbox_shadeicon(d,glass_EWGNCLOSE,!on);
1353 dbox_shadeicon(d,glass_EWGNBACK,!on);
1354 dbox_shadeicon(d,glass_EWGNTOGGLE,
1355 !(on || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE)));
1356 dbox_shadeicon(ed->e.d,glass_EWTDATA,!on);
1357 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,!on);
1358 break;
1359 case glass_EWGNCLOSE:
1360 dbox_selecticon(d,f,on);
1361 dbox_selecticon(d,glass_EWGOCLOSEBACK,
1362 (on || dbox_selecticon(d,glass_EWGNBACK,dbox_READSTATE)));
1363 break;
1364 case glass_EWGNBACK:
1365 dbox_selecticon(d,f,on);
1366 dbox_selecticon(d,glass_EWGOCLOSEBACK,
1367 (on || dbox_selecticon(d,glass_EWGNCLOSE,dbox_READSTATE)));
1368 break;
1369 case glass_EWGNTOGGLE:
1370 case glass_EWGNRESIZE:
1371 dbox_selecticon(d,f,on);
1372 break;
1373 case glass_EWGNHORIZ:
1374 dbox_selecticon(d,f,on);
1375 dbox_selecticon(d,glass_EWGOHORIZ,on);
1376 dbox_shadeicon(d,glass_EWGNRESIZE,
1377 !(on || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE)));
1378 break;
1379 case glass_EWGNVERT:
1380 dbox_selecticon(d,f,on);
1381 dbox_selecticon(d,glass_EWGOVERT,on);
1382 dbox_shadeicon(d,glass_EWGNRESIZE,
1383 !(on || dbox_selecticon(d,glass_EWGNHORIZ,dbox_READSTATE)));
1384 dbox_shadeicon(d,glass_EWGNTOGGLE,
1385 !(on || dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE)));
1386 break;
1387 }
1388 break;
1389 case glass_EWTDATA:
1390 switch (f)
1391 {
1392 case glass_EIDINDIR:
1393 if (dbox_selecticon(d,f,dbox_READSTATE))
1394 {
1395 if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
1396 {
1397 dbox_shadeicon(ed->e.pd,glass_EIDVALID,FALSE);
1398 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,
1399 !dbox_selecticon(ed->e.pd,glass_EIDVALID,dbox_READSTATE));
1400 }
1401 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE);
1402 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE);
1403 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE);
1404 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE);
1405 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE);
1406 }
1407 else
1408 {
1409 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE);
1410 dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE);
1411 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
1412 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
1413 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
1414 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
1415 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
1416 }
1417 break;
1418 case glass_EIDINDUP:
1419 buttons_arrow(d,f,d,glass_EIDINDSIZE,0,+1,&sa);
1420 break;
1421 case glass_EIDINDDOWN:
1422 buttons_arrow(d,f,d,glass_EIDINDSIZE,0,-1,&sa);
1423 break;
1424 case glass_EIDVALID:
1425 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,dbox_TOGGLESTATE);
1426 break;
1427 case glass_EIDMINIMISE:
1428 dbox_clickicon(d,f);
1429 dbox_getfield(d,glass_EIDDATA,ed->data,256);
1430 dbox_setfield(d,glass_EIDINDSIZE,"%i",strlen(ed->data)+1);
1431 dbox_unclick();
1432 break;
1433 case glass_EIDTEXT:
1434 if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
1435 {
1436 dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE);
1437 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE);
1438 if (dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE))
1439 {
1440 dbox_shadeicon(ed->e.pd,glass_EIDVALID,FALSE);
1441 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,
1442 !dbox_selecticon(ed->e.pd,glass_EIDVALID,dbox_READSTATE));
1443 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE);
1444 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE);
1445 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE);
1446 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE);
1447 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE);
1448 }
1449 else
1450 {
1451 dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE);
1452 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE);
1453 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
1454 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
1455 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
1456 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
1457 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
1458 }
1459 }
1460 else
1461 {
1462 dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE);
1463 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE);
1464 if (dbox_selecticon(d,glass_EIDSPRITE,dbox_READSTATE))
1465 {
1466 dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE);
1467 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE);
1468 indon=dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE);
1469 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,!indon);
1470 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,!indon);
1471 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,!indon);
1472 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,!indon);
1473 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,!indon);
1474 }
1475 else
1476 {
1477 dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE);
1478 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE);
1479 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
1480 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
1481 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
1482 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
1483 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
1484 }
1485 }
1486 break;
1487 case glass_EIDSPRITE:
1488 if (dbox_selecticon(ed->e.pd,glass_EIDSPRITE,dbox_READSTATE))
1489 {
1490 dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE);
1491 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE);
1492 indon=dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE);
1493 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,!indon);
1494 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,!indon);
1495 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,!indon);
1496 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,!indon);
1497 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,!indon);
1498 }
1499 else if (!dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
1500 {
1501 dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE);
1502 dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE);
1503 dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE);
1504 dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE);
1505 dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE);
1506 dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE);
1507 dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE);
1508 }
1509 break;
1510 }
1511 break;
1512 case glass_EWTAPPEAR:
1513 switch (f)
1514 {
1515 case glass_EIAFONT:
1516 if (dbox_selecticon(d,f,dbox_READSTATE) ||
1517 fontMenu_createFontMenu(FALSE))
1518 {
1519 dbox_selecticon(d,f,dbox_TOGGLESTATE);
1520 dbox_shadeicon(d,glass_EIAFONTNAME,dbox_TOGGLESTATE);
1521 dbox_shadeicon(d,glass_EIAFONTMENU,dbox_TOGGLESTATE);
1522 dbox_shadeicon(d,glass_EIAFSIZEUP,dbox_TOGGLESTATE);
1523 dbox_shadeicon(d,glass_EIAFSIZEDOWN,dbox_TOGGLESTATE);
1524 dbox_shadeicon(d,glass_EIAFSIZEWRITE,dbox_TOGGLESTATE);
1525 }
1526 break;
1527 case glass_EIAFSIZEUP:
1528 buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,+1,&sa);
1529 break;
1530 case glass_EIAFSIZEDOWN:
1531 buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,-1,&sa);
1532 break;
1533 }
1534 break;
1535 case glass_EWWORKAREA:
1536 eas.ed=ed;
1537 switch (f)
1538 {
1539 case glass_EWSTOPUP:
1540 eas.xOrY=FALSE;
1541 eas.topOrBottom=TRUE;
1542 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas);
1543 break;
1544 case glass_EWSTOPDOWN:
1545 eas.xOrY=FALSE;
1546 eas.topOrBottom=TRUE;
1547 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas);
1548 break;
1549 case glass_EWSLEFTLEFT:
1550 eas.xOrY=TRUE;
1551 eas.topOrBottom=FALSE;
1552 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas);
1553 break;
1554 case glass_EWSLEFTRIGHT:
1555 eas.xOrY=TRUE;
1556 eas.topOrBottom=FALSE;
1557 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas);
1558 break;
1559 case glass_EWSRIGHTLEFT:
1560 eas.xOrY=TRUE;
1561 eas.topOrBottom=TRUE;
1562 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas);
1563 break;
1564 case glass_EWSRIGHTRIGHT:
1565 eas.xOrY=TRUE;
1566 eas.topOrBottom=TRUE;
1567 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas);
1568 break;
1569 case glass_EWSBOTTOMUP:
1570 eas.xOrY=FALSE;
1571 eas.topOrBottom=FALSE;
1572 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas);
1573 break;
1574 case glass_EWSBOTTOMDOWN:
1575 eas.xOrY=FALSE;
1576 eas.topOrBottom=FALSE;
1577 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas);
1578 break;
1579 case glass_EWSEXTLOCK:
1580 dbox_clickicon(d,f);
1581 ed->wdef.ex.x0=ed->w->def->desc.w.scx;
1582 ed->wdef.ex.x1=ed->w->def->desc.w.scx+
1583 ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0;
1584 ed->wdef.ex.y0=ed->w->def->desc.w.scy+
1585 ed->w->def->desc.w.box.y0-ed->w->def->desc.w.box.y1;
1586 ed->wdef.ex.y1=ed->w->def->desc.w.scy;
1587 editWindow__checkExtents(ed,TRUE,TRUE,FALSE);
1588 dbox_unclick();
1589 break;
1590 case glass_EWSTLLARGE:
1591 dbox_clickicon(d,f);
1592 ed->wdef.ex.x0=(ed->wdef.ex.x0 - 2000) / 2000 * 2000;
1593 ed->wdef.ex.y1=(ed->wdef.ex.y1 + 2000) / 2000 * 2000;
1594 editWindow__checkExtents(ed,TRUE,TRUE,FALSE);
1595 dbox_unclick();
1596 break;
1597 case glass_EWSBRLARGE:
1598 dbox_clickicon(d,f);
1599 ed->wdef.ex.x1=(ed->wdef.ex.x1 + 2000) / 2000 * 2000;
1600 ed->wdef.ex.y0=(ed->wdef.ex.y0 - 2000) / 2000 * 2000;
1601 editWindow__checkExtents(ed,TRUE,TRUE,FALSE);
1602 dbox_unclick();
1603 break;
1604 case glass_EWSMINWSET:
1605 dbox_clickicon(d,f);
1606 dbox_setfield(d,glass_EWSMINWIDTH,"%i",
1607 ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0);
1608 dbox_unclick();
1609 break;
1610 case glass_EWSMINHSET:
1611 dbox_clickicon(d,f);
1612 dbox_setfield(d,glass_EWSMINHEIGHT,"%i",
1613 ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0);
1614 dbox_unclick();
1615 break;
1616 }
1617 break;
1618 }
1619 }
1620
1621 /*
1622 * BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle)
1623 *
1624 * Use
1625 * Handles the more wierd events for a particular panel.
1626 *
1627 * Parameters
1628 * dbox d == the dbox handle of the panel
1629 * wimp_eventstr *e == the event to look at
1630 * void *handle == pointer to the current edit
1631 *
1632 * Returns
1633 * TRUE if the event is dead (long live the event...)
1634 */
1635
1636 static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle)
1637 {
1638 BOOL handled=FALSE;
1639 glass_editWindow *ed=handle;
1640 if (e->e==wimp_EKEY)
1641 {
1642 switch (e->data.key.chcode)
1643 {
1644 case akbd_UpK+akbd_Sh:
1645 editWindow__nextPanel(ed,-1);
1646 handled=TRUE;
1647 break;
1648 case akbd_DownK+akbd_Sh:
1649 editWindow__nextPanel(ed,+1);
1650 handled=TRUE;
1651 break;
1652 }
1653 }
1654 if (!handled) switch (ed->e.panel)
1655 {
1656 case glass_EWTDATA:
1657 /* Nothin' doing */
1658 break;
1659 case glass_EWTAPPEAR:
1660 switch (e->e)
1661 {
1662 case wimp_EBUT:
1663 switch (e->data.but.m.i)
1664 {
1665 case glass_EIAFONTNAME:
1666 menu_make(editWindow__fontMaker,editWindow__fontHandler,
1667 editWindow__fontHelp,ed);
1668 handled=TRUE;
1669 break;
1670 case glass_EIAFONTMENU:
1671 dbox_clickicon(d,glass_EIAFONTMENU);
1672 menu_make(editWindow__fontMaker,editWindow__fontHandler,
1673 editWindow__fontHelp,ed);
1674 dbox_unclick();
1675 handled=TRUE;
1676 break;
1677 }
1678 break;
1679 }
1680 break;
1681 case glass_EWBTYPE:
1682 switch (e->e)
1683 {
1684 case wimp_EBUT:
1685 switch (e->data.but.m.i)
1686 {
1687 case glass_EWBBTDISP:
1688 menu_make(editWindow__btypeMaker,editWindow__btypeHandler,
1689 editWindow__btypeHelp,ed);
1690 handled=TRUE;
1691 break;
1692 case glass_EWBBTMENU:
1693 dbox_clickicon(d,glass_EWBBTMENU);
1694 menu_make(editWindow__btypeMaker,editWindow__btypeHandler,
1695 editWindow__btypeHelp,ed);
1696 dbox_unclick();
1697 handled=TRUE;
1698 break;
1699 }
1700 break;
1701 }
1702 break;
1703 case glass_EWCOLOURS:
1704 switch (e->e)
1705 {
1706 case wimp_EBUT:
1707 switch (e->data.but.m.i)
1708 {
1709 case glass_EWCTBFORE:
1710 colSelect(ed->e.pd,glass_EWCTBFORE,e->data.but.m.bbits,
1711 msgs_lookup("ewTBFG"),TRUE,editWindow__colProc,ed);
1712 break;
1713 case glass_EWCTBBACK:
1714 colSelect(ed->e.pd,glass_EWCTBBACK,e->data.but.m.bbits,
1715 msgs_lookup("ewTBBG"),FALSE,editWindow__colProc,ed);
1716 break;
1717 case glass_EWCWAFORE:
1718 colSelect(ed->e.pd,glass_EWCWAFORE,e->data.but.m.bbits,
1719 msgs_lookup("ewWAFG"),FALSE,editWindow__colProc,ed);
1720 break;
1721 case glass_EWCWABACK:
1722 colSelect(ed->e.pd,glass_EWCWABACK,e->data.but.m.bbits,
1723 msgs_lookup("ewWABG"),TRUE,editWindow__colProc,ed);
1724 break;
1725 case glass_EWCSCFORE:
1726 colSelect(ed->e.pd,glass_EWCSCFORE,e->data.but.m.bbits,
1727 msgs_lookup("ewSCFG"),FALSE,editWindow__colProc,ed);
1728 break;
1729 case glass_EWCSCBACK:
1730 colSelect(ed->e.pd,glass_EWCSCBACK,e->data.but.m.bbits,
1731 msgs_lookup("ewSCBG"),FALSE,editWindow__colProc,ed);
1732 break;
1733 case glass_EWCHIGH:
1734 colSelect(ed->e.pd,glass_EWCHIGH,e->data.but.m.bbits,
1735 msgs_lookup("ewTBHI"),FALSE,editWindow__colProc,ed);
1736 }
1737 break;
1738 }
1739 break;
1740 }
1741 return (FALSE);
1742 }
1743
1744 /*----- External routines -------------------------------------------------*/
1745
1746 /*
1747 * void editWindow_windowMoved(glass_windPointer *w)
1748 *
1749 * Use
1750 * Informs an edit dialogue that a window has been moved.
1751 *
1752 * Parameters
1753 * glass_windPointer *w == the window containing the icon
1754 */
1755
1756 void editWindow_windowMoved(glass_windPointer *w)
1757 {
1758 glass_editWindow *ed=w->edit;
1759 if (!ed)
1760 return;
1761 editWindow__checkExtents(ed,FALSE,FALSE,TRUE);
1762 }
1763
1764 /*
1765 * void editWindow_readData(glass_windPointer *w)
1766 *
1767 * Use
1768 * Forces a re-read of the title data for the given window edit. Since
1769 * this is called on setting up an edit and cancelling one, it also does
1770 * some
1771 *
1772 * Parameters
1773 * glass_windPointer *w == the window containing the icon
1774 */
1775
1776 void editWindow_readData(glass_windPointer *w)
1777 {
1778 glass_editWindow *ed=w->edit;
1779 if (!ed)
1780 return;
1781 ed->wdef.title=ed->w->def->desc.w.title;
1782 if (ed->wdef.titleflags & wimp_INDIRECT)
1783 {
1784 utils_ctermToNterm(ed->wdef.title.indirecttext.buffer);
1785 strcpy(ed->data,ed->wdef.title.indirecttext.buffer);
1786 ed->indLen=ed->wdef.title.indirecttext.bufflen;
1787 if (ed->wdef.titleflags & wimp_ITEXT &&
1788 ed->wdef.title.indirecttext.validstring!=(char *)-1)
1789 {
1790 utils_ctermToNterm(ed->wdef.title.indirecttext.validstring);
1791 strcpy(ed->valid,ed->wdef.title.indirecttext.validstring);
1792 ed->hasValid=TRUE;
1793 }
1794 else
1795 {
1796 ed->valid[0]=0;
1797 ed->hasValid=FALSE;
1798 }
1799 }
1800 else
1801 {
1802 ed->data[12]=0;
1803 memcpy(ed->data,ed->wdef.title.text,12);
1804 utils_ctermToNterm(ed->data);
1805 ed->valid[0]=0;
1806 ed->indLen=12;
1807 }
1808
1809 if (ed->wdef.colours[0]==255) /* If no system area */
1810 {
1811 dbox_shadeicon(ed->e.d,glass_EWTDATA,TRUE);
1812 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,TRUE);
1813 dbox_shadeicon(ed->e.d,glass_EWGADGETS,TRUE);
1814 if (ed->e.panel==glass_EWTDATA
1815 || ed->e.panel==glass_EWTAPPEAR
1816 || ed->e.panel==glass_EWGADGETS)
1817 editWindow__setPanel(ed,-1);
1818 }
1819 else if ((tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,26))
1820 || (!tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,0)))
1821 {
1822 dbox_shadeicon(ed->e.d,glass_EWTDATA,TRUE);
1823 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,TRUE);
1824 dbox_shadeicon(ed->e.d,glass_EWGADGETS,FALSE);
1825 if (ed->e.panel==glass_EWTDATA
1826 || ed->e.panel==glass_EWTAPPEAR)
1827 editWindow__setPanel(ed,-1);
1828 }
1829 else
1830 {
1831 dbox_shadeicon(ed->e.d,glass_EWTDATA,FALSE);
1832 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,FALSE);
1833 dbox_shadeicon(ed->e.d,glass_EWGADGETS,FALSE);
1834 }
1835
1836 if (ed->e.panel==glass_EWTDATA)
1837 editWindow__setupPanel(ed);
1838 }
1839
1840 /*
1841 * void editWindow_close(glass_windPointer *w)
1842 *
1843 * Use
1844 * Closes an edit window
1845 *
1846 * Parameters
1847 * glass_windPointer *w == the window containing the icon
1848 */
1849
1850 void editWindow_close(glass_windPointer *w)
1851 {
1852 glass_editWindow *ed=w->edit;
1853 if (ed)
1854 {
1855 if (ed->e.pd)
1856 dbox_deleteNoUpdate(ed->e.pd);
1857 pane_delete(ed->e.p);
1858 dbox_deleteNoUpdate(ed->e.d);
1859 ed->w->edit=0;
1860 mem_free(ed);
1861 }
1862 }
1863
1864 /*
1865 * void editWindow(glass_windPointer *w)
1866 *
1867 * Use
1868 * Edits the given window in a dialogue box.
1869 *
1870 * Parameters
1871 * glass_windPointer *w == the window to edit
1872 */
1873
1874 void editWindow(glass_windPointer *w)
1875 {
1876 glass_editWindow *ed;
1877 os_regset r;
1878 if (w->edit)
1879 {
1880 dbox_display(w->edit->e.d,TRUE);
1881 pane_front(w->edit->e.p);
1882 return;
1883 }
1884 mem_useUser(indir_alloc,indir_free);
1885 ed=mem_alloc(sizeof(glass_editWindow));
1886 if (!ed)
1887 {
1888 mem_useMalloc();
1889 werr(FALSE,msgs_lookup("ewNEM"));
1890 return;
1891 }
1892 if (ed->e.d=dbox_create("editWindow"),!ed->e.d)
1893 {
1894 mem_free(ed);
1895 mem_useMalloc();
1896 return;
1897 }
1898 if (ed->e.p=pane_create(dbox_syshandle(ed->e.d)),!ed->e.p)
1899 {
1900 dbox_delete(ed->e.d);
1901 mem_useMalloc();
1902 mem_free(ed);
1903 return;
1904 }
1905 ed->w=w;
1906 ed->wdef=w->def->desc.w;
1907 w->edit=ed;
1908 ed->e.panel=0;
1909
1910 /* --- Set up icon data now --- */
1911 editWindow_readData(w);
1912 if (ed->wdef.titleflags & wimp_IFONT)
1913 {
1914 r.r[0]=ed->wdef.titleflags >> 24;
1915 r.r[1]=(int)(ed->font);
1916 wimpt_noerr(os_swix(XFont_ReadDefn,&r));
1917 utils_ctermToNterm(ed->font);
1918 ed->fontSize=r.r[2]/16;
1919 }
1920 else
1921 {
1922 strcpy(ed->font,"Homerton.Medium");
1923 ed->fontSize=12;
1924 }
1925
1926 /* --- Now do handlers, and final setting up --- */
1927 dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",w->id);
1928 dbox_setfield(ed->e.d,glass_EWFILEDISP,"%.%s",w->t->filename);
1929 dbox_eventHandler(ed->e.d,editWindow__dboxHandler,ed);
1930 dbox_rawEventHandler(ed->e.d,editWindow__dboxRaw,ed);
1931 dbox_openDisplaced(ed->e.d);
1932 editWindow__setPanel(ed,glass_EWCHARS);
1933 mem_useMalloc();
1934 }