4 * Edit window dialogue box
6 * © 1994-1998 Straylight
9 /*----- Licensing note ----------------------------------------------------*
11 * This file is part of Straylight's Glass.
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)
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.
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.
28 /*----- Header files ------------------------------------------------------*/
31 * ANSI standard headers
44 #include "steel/Steel.h"
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"
61 #include "colSelect.h"
69 /*----- Static variables --------------------------------------------------*/
71 static char *editWindow__panels[]=
82 #define editWindow__ICAPPHEIGHT -504
84 /*----- New RISC OS 3 window flags ----------------------------------------*/
86 #define wimp_WONSCREEN (1<<13)
87 #define wimp_WRUBBERH (1<<14)
88 #define wimp_WRUBBERV (1<<15)
90 /*----- Support routines --------------------------------------------------*/
92 #define max2(a,b) ((a)>(b) ? (a) : (b))
93 #define min2(a,b) ((a)<(b) ? (a) : (b))
96 * void editWindow__checkExtents(glass_editWindow *ed,BOOL redraw,
100 * Ensures that the window extents are correctly set according to window
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
110 static void editWindow__checkExtents(glass_editWindow *ed,BOOL rbl,
116 if (ed->e.panel==glass_EWWORKAREA && read)
118 dbox_scanfield(ed->e.pd,
123 dbox_scanfield(ed->e.pd,
129 if (ed->e.panel==glass_EWWORKAREA)
131 dbox_scanfield(ed->e.pd,glass_EWSMINWIDTH,"%d",&x);
132 dbox_scanfield(ed->e.pd,glass_EWSMINHEIGHT,"%d",&y);
136 x=ed->wdef.minsize & 0xffff;
137 y=(ed->wdef.minsize>>16) & 0xffff;
140 if (gPrefs_current()->mVisInWork)
142 if (ed->wdef.ex.x0>ed->w->def->desc.w.scx)
144 ed->wdef.ex.x0=ed->w->def->desc.w.scx;
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)
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;
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)
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;
165 if (ed->wdef.ex.y1<ed->w->def->desc.w.scy)
167 ed->wdef.ex.y1=ed->w->def->desc.w.scy;
171 if (bl && ed->e.panel==glass_EWWORKAREA)
173 dbox_setfield(ed->e.pd,
179 if (tr && ed->e.panel==glass_EWWORKAREA)
181 dbox_setfield(ed->e.pd,
189 if (gPrefs_current()->mVisInWork)
191 if (x>ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0)
193 x=ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0;
196 if (y>ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0)
198 y=ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0;
204 if (x>ed->wdef.ex.x1-ed->wdef.ex.x0)
206 x=ed->wdef.ex.x1-ed->wdef.ex.x0;
209 if (y>ed->wdef.ex.y1-ed->wdef.ex.y0)
211 y=ed->wdef.ex.y1-ed->wdef.ex.y0;
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);
223 * void editWindow__setupPanel(glass_editWindow *ed)
226 * Sets up a panel from the icon description given.
229 * glass_editWindow *ed == the edit to handle.
232 static void editWindow__setupPanel(glass_editWindow *ed)
234 char *buf=buffer_find();
239 dbox_selecticon(ed->e.pd,
241 !!(ed->wdef.flags & wimp_WMOVEABLE));
242 dbox_selecticon(ed->e.pd,
244 !!(ed->wdef.flags & wimp_REDRAW_OK));
245 dbox_selecticon(ed->e.pd,
247 !!(ed->wdef.flags & wimp_WPANE));
248 dbox_selecticon(ed->e.pd,
250 !!(ed->wdef.flags & wimp_WTRESPASS));
251 dbox_selecticon(ed->e.pd,
253 !!(ed->wdef.flags & wimp_WONSCREEN));
254 if (ed->wdef.flags & wimp_WSCROLL_R1)
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);
260 else if (ed->wdef.flags & wimp_SCROLL_R2)
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);
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);
272 dbox_selecticon(ed->e.pd,
274 !!(ed->wdef.flags & wimp_REAL_COLOURS));
275 dbox_selecticon(ed->e.pd,
277 !!(ed->wdef.flags & wimp_BACK_WINDOW));
278 dbox_selecticon(ed->e.pd,
280 !!(ed->wdef.flags & wimp_HOT_KEYS));
282 case glass_EWGADGETS:
283 if (tst(ed->wdef.flags,31))
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,
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,
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,
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));
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,
333 !tst(ed->wdef.flags,7));
334 dbox_shadeicon(ed->e.pd,
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,
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));
351 sprintf(buf,"ewBTYPE%i",(ed->wdef.workflags>>12) & 0x0f);
352 dbox_setfield(ed->e.pd,glass_EWBBTDISP,"%s",msgs_lookup(buf));
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))
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);
372 else if (ed->wdef.titleflags & wimp_INDIRECT)
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,
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);
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);
404 dbox_selecticon(ed->e.pd,
406 !!(ed->wdef.titleflags&wimp_ITEXT));
407 dbox_selecticon(ed->e.pd,
409 !!(ed->wdef.titleflags&wimp_ISPRITE));
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)
416 if (ed->wdef.titleflags & wimp_IFONT)
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);
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);
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);
447 dbox_selecticon(ed->e.pd,
449 !!(ed->wdef.titleflags & wimp_IHCENTRE));
450 dbox_selecticon(ed->e.pd,
452 !!(ed->wdef.titleflags & wimp_IVCENTRE));
453 dbox_selecticon(ed->e.pd,
455 !!(ed->wdef.titleflags & wimp_IRJUST));
456 if (ed->wdef.titleflags & wimp_ISPRITE)
458 dbox_selecticon(ed->e.pd,
460 !!(ed->wdef.titleflags & wimp_IHALVESPRITE));
461 dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,FALSE);
465 dbox_selecticon(ed->e.pd,glass_EIAHALFSIZE,FALSE);
466 dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,TRUE);
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 */
476 case glass_EWCOLOURS:
477 colSelect_setColourButton(ed->e.pd,
479 ed->wdef.colours[0]);
480 colSelect_setColourButton(ed->e.pd,
482 ed->wdef.colours[1]);
483 colSelect_setColourButton(ed->e.pd,
485 ed->wdef.colours[2]);
486 colSelect_setColourButton(ed->e.pd,
488 ed->wdef.colours[3]);
489 colSelect_setColourButton(ed->e.pd,
491 ed->wdef.colours[5]);
492 colSelect_setColourButton(ed->e.pd,
494 ed->wdef.colours[4]);
495 colSelect_setColourButton(ed->e.pd,
497 ed->wdef.colours[6]);
499 case glass_EWWORKAREA:
500 dbox_setfield(ed->e.pd,
503 ed->wdef.minsize & 0xffff);
504 dbox_setfield(ed->e.pd,
507 (ed->wdef.minsize>>16) & 0xffff);
508 editWindow__checkExtents(ed,TRUE,TRUE,FALSE);
509 dbox_selecticon(ed->e.pd,
511 !!(ed->wdef.flags & wimp_WRUBBERH));
512 dbox_selecticon(ed->e.pd,
514 !!(ed->wdef.flags & wimp_WRUBBERV));
520 * void editWindow__closePanel(glass_editWindow *ed)
523 * Records the settings in a panel for future reference, for example when
524 * the panel is being replaced by a different one.
527 * glass_editWindow *ed == the edit box we're talking about
530 #define Q dbox_READSTATE
532 static void editWindow__closePanel(glass_editWindow *ed)
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;
549 case glass_EWGADGETS:
550 ed->wdef.flags&=~0xff00008d;
551 if (dbox_selecticon(ed->e.pd,glass_EWGOLD,Q))
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,
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;
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;
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,
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;
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;
605 * void editWindow__setPanel(glass_editWindow *ed,dbox_field f)
608 * Creates a new panel based on a radio button click or some-such.
611 * glass_editWindow *ed == the edit window to change panel
612 * dbox_field f == the radio button associated with the desired panel
615 static void editWindow__panelHandler(dbox d,dbox_field f,void *handle);
616 static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle);
618 static void editWindow__setPanel(glass_editWindow *ed,dbox_field f)
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),
638 mem_useUser(indir_alloc,indir_free);
640 d=dbox_create("iconNowt");
642 d=dbox_create(editWindow__panels[f-glass_EWCHARS]);
648 dbox_eventHandler(d,editWindow__panelHandler,ed);
649 dbox_rawEventHandler(d,editWindow__panelRaw,ed);
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);
659 dbox_selecticon(ed->e.d,f,dbox_SETSTATE);
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;
672 editWindow__setupPanel(ed);
673 if (f==glass_EWTAPPEAR)
677 r.box.x1=s.o.box.x1-s.o.box.x0;
679 r.box.y0=editWindow__ICAPPHEIGHT;
680 wimpt_noerr(wimp_set_extent(&r));
682 wimpt_noerr(wimp_open_wind(&s.o));
685 c.w=dbox_syshandle(d);
690 wimpt_noerr(wimp_set_caret_pos(&c));
692 pane_addPane(ed->e.p,dbox_syshandle(d));
697 * void editWindow__recreate(glass_editWindow *ed)
700 * Recreates the icon from the dialogue box settings
703 * glass_editWindow *ed == info about the edit
706 static void editWindow__recreate(glass_editWindow *ed)
712 ed->w->edit=0; /* Delink temporarily */
714 editWindow__checkExtents(ed,FALSE,FALSE,TRUE);
715 if (!(ed->wdef.titleflags & wimp_INDIRECT))
720 if (strlen(ed->data)>=ed->indLen)
722 ed->wdef.titleflags|=wimp_INDIRECT;
723 ed->indLen=strlen(ed->data)+1;
725 if (ed->wdef.titleflags & wimp_INDIRECT)
727 if (p=indir_alloc(ed->indLen),!p)
729 werr(FALSE,msgs_lookup("ewNEMUW"));
732 if (ed->hasValid && (ed->wdef.titleflags & wimp_ITEXT))
734 if (q=indir_alloc(strlen(ed->valid)+1),!q)
738 msgs_lookup("ewNEMUW"));
742 ed->w->size+=strlen(ed->valid)+1;
745 ed->w->size+=ed->indLen;
748 if (ed->w->def->desc.w.titleflags & wimp_IFONT) /* Was old antialiased? */
750 fhandle=(ed->w->def->desc.w.titleflags >> 24) & 255;
751 wimpt_noerr(font_lose(fhandle));
752 ed->w->fonts[fhandle]--;
754 if (ed->wdef.titleflags & wimp_IFONT) /* Is new title antialiased? */
756 if (font_find(ed->font,ed->fontSize*16,ed->fontSize*16,0,0,&fhandle))
758 werr(FALSE,msgs_lookup("ewCFF"),ed->font);
759 ed->wdef.titleflags&=~wimp_IFONT;
763 ed->w->antiAliased=TRUE;
764 ed->w->fonts[fhandle]++;
765 ed->wdef.titleflags=(ed->wdef.titleflags & 0x00ffffff) | (fhandle<<24);
769 if (ed->w->def->desc.w.titleflags & wimp_INDIRECT)
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))
777 strlen(ed->w->def->desc.w.title.indirecttext.validstring)+1;
778 indir_free(ed->w->def->desc.w.title.indirecttext.validstring);
784 ed->wdef.title.indirecttext.buffer=p;
785 ed->wdef.title.indirecttext.bufflen=ed->indLen;
787 ed->wdef.title.indirecttext.validstring=q;
788 else if (ed->wdef.titleflags & wimp_ITEXT)
789 ed->wdef.title.indirecttext.validstring=(char *)-1;
791 ed->wdef.title.indirectsprite.spritearea=ed->w->t->s;
794 memcpy(ed->wdef.title.text,ed->data,12);
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);
806 ed->w->edit=ed; /* Relink again */
807 window_recreate(ed->w);
808 tfile_markAsAltered(ed->w->t);
812 * void editWindow__nextPanel(glass_editWindow *ed,int dir)
815 * Changes panel to the next one in the given direction. Skips shaded
816 * panels and handles everything nicely.
819 * glass_editWindow *ed == the edit dialogue box to move about in
820 * int dir == the direction (-1 for up, 1 for down)
823 static void editWindow__nextPanel(glass_editWindow *ed,int dir)
828 i=(dir==1 ? glass_EWCHARS : glass_EWWORKAREA);
832 for (;i>=glass_EWCHARS && i<=glass_EWWORKAREA;i+=dir)
834 if (!dbox_shadeicon(ed->e.d,i,dbox_READSTATE))
836 editWindow__setPanel(ed,i);
842 /*----- Event handlers ----------------------------------------------------*/
845 * void editWindow__dboxHandler(dbox d,dbox_field f,void *handle)
848 * Handles any and all events directed at the dbox. Well, almost all...
851 * dbox d == the dbox handle
852 * dbox_field f == the event that happened
853 * void *handle == pointer to the dialogue box control info
856 static void editWindow__dboxHandler(dbox d,dbox_field f,void *handle)
858 glass_editWindow *ed=handle;
862 editWindow_close(ed->w);
866 help_addLine(msgs_lookup("ewhEIDB"));
872 if (!dbox_wasAdjustClick())
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);
883 if (!dbox_wasAdjustClick())
884 editWindow_close(ed->w);
888 editWindow__closePanel(ed);
889 if (!dbox_wasAdjustClick())
892 editWindow__recreate(ed);
894 editWindow_close(ed->w);
898 editWindow__recreate(ed);
899 editWindow_readData(ed->w);
900 editWindow__setupPanel(ed);
906 if (gPrefs_current()->cDelWind)
908 if (!warning(msgs_lookup("ewCDWP"),
909 msgs_lookup("ewCDW")))
917 tfile_markAsAltered(ed->w->t);
918 tfile_deleteWindow(ed->w->i,ed->w); /* This causes a close for us */
923 tfile_saveWindow(ed->w);
926 case glass_EWGADGETS:
929 case glass_EWTAPPEAR:
930 case glass_EWCOLOURS:
931 case glass_EWWORKAREA:
932 editWindow__setPanel(ed,f);
938 * BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle)
941 * Handles open window requests and things for the main Preferences dbox.
944 * dbox d == the dbox handle
945 * wimp_eventstr *e == the event that happened
946 * void *handle == a unused pointer
949 * TRUE if the event has been handled;
952 static BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle)
955 glass_editWindow *ed=handle;
965 switch (e->data.key.chcode)
967 case akbd_UpK+akbd_Sh:
968 editWindow__nextPanel(ed,-1);
971 case akbd_DownK+akbd_Sh:
972 editWindow__nextPanel(ed,+1);
978 case wimp_ESENDWANTACK:
979 switch (e->data.msg.hdr.action)
982 m=intMsgs_receive(e);
983 switch(e->data.msg.data.words[0])
985 case glass_DELETEFILE:
986 if (m->df.t==ed->w->t)
987 editWindow_close(ed->w);
990 if (m->df.t==ed->w->t)
991 dbox_setfield(ed->e.d,glass_EWFILEDISP,"%.%s",
994 case glass_DELETEWINDOW:
996 editWindow_close(ed->w);
1000 dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id);
1011 * menu editWindow__fontMaker(void *handle)
1014 * Sets up the font menu.
1017 * void *handle == pointer to this edit
1023 static menu editWindow__fontMaker(void *handle)
1025 glass_editWindow *ed=handle;
1026 menu m=fontMenu_createFontMenu(FALSE);
1027 fontMenu_tickGivenName(ed->font);
1032 * void editWindow__fontHandler(int hit[],void *handle)
1035 * Gets the font chosen from the font menu.
1038 * int hit[] == the hit string
1039 * void *handle == pointer to this edit
1042 static void editWindow__fontHandler(int hit[],void *handle)
1044 glass_editWindow *ed=handle;
1047 strcpy(ed->font,fontMenu_fontname(hit[0],hit[1]));
1048 dbox_setfield(ed->e.pd,glass_EIAFONTNAME,"%.%s",ed->font);
1053 * void editWindow__fontHelp(int hit[],void *handle)
1056 * Gives help on a font menu item
1059 * int hit[] == the hit string
1060 * void *handle == pointer to this edit
1063 static void editWindow__fontHelp(int hit[],void *handle)
1069 help_addLine(msgs_lookup("ewmhFONT"),fontMenu_fontname(hit[0],hit[1]));
1075 * menu editWindow__btypeMaker(void *handle)
1078 * Generates and sets up a button type menu for an edit dialogue box
1081 * void *handle == pointer to the edit
1087 static menu editWindow__btypeMaker(void *handle)
1091 glass_editWindow *ed=handle;
1093 char *buf=buffer_find();
1097 m=menu_new(msgs_lookup("eiBTMT"),msgs_lookup("ewBTYPE0"));
1100 sprintf(buf,"ewBTYPE%i",i);
1101 menu_extend(m,msgs_lookup(buf));
1105 menu_setflags(m,ticked,FALSE,FALSE);
1106 ticked=((ed->wdef.workflags>>12)&0x0f)+1;
1107 menu_setflags(m,ticked,TRUE,FALSE);
1112 * void editWindow__btypeHandler(int hit[],void *handle)
1115 * Handles a click on the button type menu.
1118 * int hit[] == the mouse click info
1119 * void *handle == pointer to edit information
1122 static void editWindow__btypeHandler(int hit[],void *handle)
1124 glass_editWindow *ed=handle;
1125 char *buf=buffer_find();
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));
1137 * void editWindow__colProc(dbox d,dbox_field f,int colour, void *handle)
1140 * This routine is called when a colour is selected in the colours panel.
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
1149 static void editWindow__colProc(dbox d,dbox_field f,int colour,void *handle)
1151 glass_editWindow *ed=handle;
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)))
1161 dbox_shadeicon(ed->e.d,glass_EWTDATA,colour==255);
1162 dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,colour==255);
1165 case glass_EWCTBBACK:
1166 ed->wdef.colours[1]=colour;
1168 case glass_EWCWAFORE:
1169 ed->wdef.colours[2]=colour;
1171 case glass_EWCWABACK:
1172 ed->wdef.colours[3]=colour;
1174 case glass_EWCSCFORE:
1175 ed->wdef.colours[5]=colour;
1177 case glass_EWCSCBACK:
1178 ed->wdef.colours[4]=colour;
1181 ed->wdef.colours[6]=colour;
1187 * void editWindow__btypeHelp(int hit[],void *handle)
1190 * Handles a help request for the button type menu.
1193 * int hit[] == the helpq info
1194 * void *handle == pointer to edit information
1197 static void editWindow__btypeHelp(int hit[],void *handle)
1199 char *buf=buffer_find();
1204 sprintf(buf,"ewBTYPE%i",hit[0]-1);
1205 help_addLine(msgs_lookup("ewmhBTYPE"),msgs_lookup(buf));
1211 * void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle)
1214 * Handles a click on one of the (many!) arrow buttons in the extends panel.
1221 glass_editWindow *ed;
1223 editWindow__extArrowstr;
1225 static void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle)
1227 editWindow__extArrowstr *a=handle;
1228 wimp_box *b=&a->ed->wdef.ex;
1233 v=(a->topOrBottom ? &b->x1 : &b->x0);
1235 v=(a->topOrBottom ? &b->y1 : &b->y0);
1237 dbox_scanfield(d,glass_EWSBOTTOMLEFT,"%d,%d",&b->x0,&b->y0);
1238 dbox_scanfield(d,glass_EWSTOPRIGHT,"%d,%d",&b->x1,&b->y1);
1242 editWindow__checkExtents(a->ed,!a->topOrBottom,a->topOrBottom,FALSE);
1246 * void editWindow__panelHandler(dbox d,dbox_field f,void *handle)
1249 * Handles simple click events for the current panel in an edit dbox
1252 * dbox d == the panel's dbox handle
1253 * dbox_field f == the icon that was clicked
1254 * void *handle == pointer to edit information
1257 static void editWindow__panelHandler(dbox d,dbox_field f,void *handle)
1259 glass_editWindow *ed=handle;
1261 buttons_simpleArrow sa={0,9999,FALSE};
1262 editWindow__extArrowstr eas;
1271 editWindow__dboxHandler(ed->e.d,f,ed);
1275 switch (ed->e.panel)
1277 case glass_EWGADGETS:
1278 on=!dbox_selecticon(d,f,dbox_READSTATE);
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);
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);
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);
1331 case glass_EWGOCLOSEBACK:
1332 dbox_selecticon(d,f,on);
1333 dbox_selecticon(d,glass_EWGNCLOSE,on);
1334 dbox_selecticon(d,glass_EWGNBACK,on);
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)));
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)));
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);
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)));
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)));
1369 case glass_EWGNTOGGLE:
1370 case glass_EWGNRESIZE:
1371 dbox_selecticon(d,f,on);
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)));
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)));
1392 case glass_EIDINDIR:
1393 if (dbox_selecticon(d,f,dbox_READSTATE))
1395 if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
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));
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);
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);
1418 case glass_EIDINDUP:
1419 buttons_arrow(d,f,d,glass_EIDINDSIZE,0,+1,&sa);
1421 case glass_EIDINDDOWN:
1422 buttons_arrow(d,f,d,glass_EIDINDSIZE,0,-1,&sa);
1424 case glass_EIDVALID:
1425 dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,dbox_TOGGLESTATE);
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);
1434 if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
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))
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);
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);
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))
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);
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);
1487 case glass_EIDSPRITE:
1488 if (dbox_selecticon(ed->e.pd,glass_EIDSPRITE,dbox_READSTATE))
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);
1499 else if (!dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE))
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);
1512 case glass_EWTAPPEAR:
1516 if (dbox_selecticon(d,f,dbox_READSTATE) ||
1517 fontMenu_createFontMenu(FALSE))
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);
1527 case glass_EIAFSIZEUP:
1528 buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,+1,&sa);
1530 case glass_EIAFSIZEDOWN:
1531 buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,-1,&sa);
1535 case glass_EWWORKAREA:
1539 case glass_EWSTOPUP:
1541 eas.topOrBottom=TRUE;
1542 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas);
1544 case glass_EWSTOPDOWN:
1546 eas.topOrBottom=TRUE;
1547 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas);
1549 case glass_EWSLEFTLEFT:
1551 eas.topOrBottom=FALSE;
1552 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas);
1554 case glass_EWSLEFTRIGHT:
1556 eas.topOrBottom=FALSE;
1557 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas);
1559 case glass_EWSRIGHTLEFT:
1561 eas.topOrBottom=TRUE;
1562 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas);
1564 case glass_EWSRIGHTRIGHT:
1566 eas.topOrBottom=TRUE;
1567 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas);
1569 case glass_EWSBOTTOMUP:
1571 eas.topOrBottom=FALSE;
1572 buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas);
1574 case glass_EWSBOTTOMDOWN:
1576 eas.topOrBottom=FALSE;
1577 buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas);
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);
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);
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);
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);
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);
1622 * BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle)
1625 * Handles the more wierd events for a particular panel.
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
1633 * TRUE if the event is dead (long live the event...)
1636 static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle)
1639 glass_editWindow *ed=handle;
1640 if (e->e==wimp_EKEY)
1642 switch (e->data.key.chcode)
1644 case akbd_UpK+akbd_Sh:
1645 editWindow__nextPanel(ed,-1);
1648 case akbd_DownK+akbd_Sh:
1649 editWindow__nextPanel(ed,+1);
1654 if (!handled) switch (ed->e.panel)
1659 case glass_EWTAPPEAR:
1663 switch (e->data.but.m.i)
1665 case glass_EIAFONTNAME:
1666 menu_make(editWindow__fontMaker,editWindow__fontHandler,
1667 editWindow__fontHelp,ed);
1670 case glass_EIAFONTMENU:
1671 dbox_clickicon(d,glass_EIAFONTMENU);
1672 menu_make(editWindow__fontMaker,editWindow__fontHandler,
1673 editWindow__fontHelp,ed);
1685 switch (e->data.but.m.i)
1687 case glass_EWBBTDISP:
1688 menu_make(editWindow__btypeMaker,editWindow__btypeHandler,
1689 editWindow__btypeHelp,ed);
1692 case glass_EWBBTMENU:
1693 dbox_clickicon(d,glass_EWBBTMENU);
1694 menu_make(editWindow__btypeMaker,editWindow__btypeHandler,
1695 editWindow__btypeHelp,ed);
1703 case glass_EWCOLOURS:
1707 switch (e->data.but.m.i)
1709 case glass_EWCTBFORE:
1710 colSelect(ed->e.pd,glass_EWCTBFORE,e->data.but.m.bbits,
1711 msgs_lookup("ewTBFG"),TRUE,editWindow__colProc,ed);
1713 case glass_EWCTBBACK:
1714 colSelect(ed->e.pd,glass_EWCTBBACK,e->data.but.m.bbits,
1715 msgs_lookup("ewTBBG"),FALSE,editWindow__colProc,ed);
1717 case glass_EWCWAFORE:
1718 colSelect(ed->e.pd,glass_EWCWAFORE,e->data.but.m.bbits,
1719 msgs_lookup("ewWAFG"),FALSE,editWindow__colProc,ed);
1721 case glass_EWCWABACK:
1722 colSelect(ed->e.pd,glass_EWCWABACK,e->data.but.m.bbits,
1723 msgs_lookup("ewWABG"),TRUE,editWindow__colProc,ed);
1725 case glass_EWCSCFORE:
1726 colSelect(ed->e.pd,glass_EWCSCFORE,e->data.but.m.bbits,
1727 msgs_lookup("ewSCFG"),FALSE,editWindow__colProc,ed);
1729 case glass_EWCSCBACK:
1730 colSelect(ed->e.pd,glass_EWCSCBACK,e->data.but.m.bbits,
1731 msgs_lookup("ewSCBG"),FALSE,editWindow__colProc,ed);
1734 colSelect(ed->e.pd,glass_EWCHIGH,e->data.but.m.bbits,
1735 msgs_lookup("ewTBHI"),FALSE,editWindow__colProc,ed);
1744 /*----- External routines -------------------------------------------------*/
1747 * void editWindow_windowMoved(glass_windPointer *w)
1750 * Informs an edit dialogue that a window has been moved.
1753 * glass_windPointer *w == the window containing the icon
1756 void editWindow_windowMoved(glass_windPointer *w)
1758 glass_editWindow *ed=w->edit;
1761 editWindow__checkExtents(ed,FALSE,FALSE,TRUE);
1765 * void editWindow_readData(glass_windPointer *w)
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
1773 * glass_windPointer *w == the window containing the icon
1776 void editWindow_readData(glass_windPointer *w)
1778 glass_editWindow *ed=w->edit;
1781 ed->wdef.title=ed->w->def->desc.w.title;
1782 if (ed->wdef.titleflags & wimp_INDIRECT)
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)
1790 utils_ctermToNterm(ed->wdef.title.indirecttext.validstring);
1791 strcpy(ed->valid,ed->wdef.title.indirecttext.validstring);
1803 memcpy(ed->data,ed->wdef.title.text,12);
1804 utils_ctermToNterm(ed->data);
1809 if (ed->wdef.colours[0]==255) /* If no system area */
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);
1819 else if ((tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,26))
1820 || (!tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,0)))
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);
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);
1836 if (ed->e.panel==glass_EWTDATA)
1837 editWindow__setupPanel(ed);
1841 * void editWindow_close(glass_windPointer *w)
1844 * Closes an edit window
1847 * glass_windPointer *w == the window containing the icon
1850 void editWindow_close(glass_windPointer *w)
1852 glass_editWindow *ed=w->edit;
1856 dbox_deleteNoUpdate(ed->e.pd);
1857 pane_delete(ed->e.p);
1858 dbox_deleteNoUpdate(ed->e.d);
1865 * void editWindow(glass_windPointer *w)
1868 * Edits the given window in a dialogue box.
1871 * glass_windPointer *w == the window to edit
1874 void editWindow(glass_windPointer *w)
1876 glass_editWindow *ed;
1880 dbox_display(w->edit->e.d,TRUE);
1881 pane_front(w->edit->e.p);
1884 mem_useUser(indir_alloc,indir_free);
1885 ed=mem_alloc(sizeof(glass_editWindow));
1889 werr(FALSE,msgs_lookup("ewNEM"));
1892 if (ed->e.d=dbox_create("editWindow"),!ed->e.d)
1898 if (ed->e.p=pane_create(dbox_syshandle(ed->e.d)),!ed->e.p)
1900 dbox_delete(ed->e.d);
1906 ed->wdef=w->def->desc.w;
1910 /* --- Set up icon data now --- */
1911 editWindow_readData(w);
1912 if (ed->wdef.titleflags & wimp_IFONT)
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;
1922 strcpy(ed->font,"Homerton.Medium");
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);