chiark / gitweb /
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 }