4 * Editing icons in tearoff menus
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
39 * Steel and RISC_OSLib headers
43 #include "steel/Steel.h"
45 #include "steel/buttons.h"
46 #include "steel/akbd.h"
47 #include "steel/buffer.h"
48 #include "steel/colourtran.h"
49 #include "steel/tearoff.h"
63 /*----- Static variables --------------------------------------------------*/
65 static glass_windPointer *tearEdit__window; /* The window with the icon */
66 static int tearEdit__icon=-1; /* The icon we're editing */
68 static tearoff tearEdit__main; /* The main tearoff edit menu */
69 static tearoff tearEdit__data;
70 static tearoff tearEdit__appear;
71 static tearoff tearEdit__actions;
72 static tearoff tearEdit__btype;
73 static tearoff tearEdit__colours;
75 /*----- Menu structure ----------------------------------------------------*
77 * Icon data => Data => [dbox]
78 * Indirected => [dbox]
81 * Appearance => Anti-aliased => Font => [font menu]
83 * Horizontally centred
90 * Actions => Button type => [type menu]
95 * Colours => Foreground => [dbox]
96 * Background => [dbox]
101 /*----- Icon numbers for dialogues ----------------------------------------*/
103 #define tearEdit__DATAOK 0
104 #define tearEdit__DATAWRITE 1
106 #define tearEdit__ESGOK 0
107 #define tearEdit__ESGUP 1
108 #define tearEdit__ESGDOWN 2
109 #define tearEdit__ESGWRITE 3
111 #define tearEdit__INDOK 0
112 #define tearEdit__INDINDIR 2
113 #define tearEdit__INDSWRITE 4
114 #define tearEdit__INDSUP 5
115 #define tearEdit__INDSDOWN 6
116 #define tearEdit__INDMINIMISE 7
117 #define tearEdit__INDPART 8
118 #define tearEdit__INDVALID 9
119 #define tearEdit__INDVALSTRING 10
121 #define tearEdit__COLOUROK 0
122 #define tearEdit__COLOURCOLS 2
124 #define tearEdit__POSOK 0
125 #define tearEdit__POSUP 2
126 #define tearEdit__POSDOWN 3
127 #define tearEdit__POSLEFT 4
128 #define tearEdit__POSRIGHT 5
129 #define tearEdit__POSWRITE 6
131 /*----- Item numbers for menus --------------------------------------------*/
135 tearEdit__MAINDATA=1,
136 tearEdit__MAINAPPEAR,
137 tearEdit__MAINACTIONS,
138 tearEdit__MAINCOLOURS,
145 tearEdit__DATADATA=1,
153 tearEdit__APPEARHCENTRE=1,
154 tearEdit__APPEARVCENTRE,
155 tearEdit__APPEARRALIGN,
156 tearEdit__APPEARBORDER,
157 tearEdit__APPEARFILLED,
158 tearEdit__APPEARHALF,
164 tearEdit__ACTIONSBTYPE=1,
165 tearEdit__ACTIONSESG,
166 tearEdit__ACTIONSADJUST,
167 tearEdit__ACTIONSSELECT,
168 tearEdit__ACTIONSSHADE
173 tearEdit__COLOURSFORE=1,
174 tearEdit__COLOURSBACK
177 /*----- Messing about with indirected data --------------------------------*/
180 * void tearEdit__setData(wimp_icon *icn,
186 * Sets an icon's data as required, possibly extending the data buffer and
187 * indirecting if required. Old buffers are freed and new ones allocated
191 * wimp_icon *icn == the icon to edit in this way
192 * char *data == pointer to the new data string, or 0 to leave it alone
193 * char *valid == pointer to the new validation string, or 0 to leave it
194 * alone, or tearEdit__NOVALID to delete it
195 * int newsize == the size of the new indirection buffer, or
196 * tearEdit__NOINDIR to not indirect the string
199 #define tearEdit__NOVALID ((char *)(-1))
200 #define tearEdit__NOINDIR (-1)
201 #define tearEdit__NOCHANGE (-2)
203 static void tearEdit__setData(wimp_icon *icn,
210 wimp_iconflags nf=icn->flags;
213 /* --- Fill in default arguments --- */
217 if (tst(icn->flags,8))
219 data=icn->data.indirecttext.buffer;
220 utils_ctermToNterm(data);
224 memcpy(nonind,icn->data.text,12);
226 utils_ctermToNterm(nonind);
233 if (tst(icn->flags,0) && tst(icn->flags,8))
235 valid=icn->data.indirecttext.validstring;
236 if (valid!=tearEdit__NOVALID)
237 utils_ctermToNterm(valid);
240 valid=tearEdit__NOVALID;
243 if (maxlen==tearEdit__NOCHANGE)
245 if (tst(icn->flags,8))
246 maxlen=icn->data.indirecttext.bufflen;
248 maxlen=tearEdit__NOINDIR;
251 /* --- Set up new icon flags --- */
253 if (maxlen==tearEdit__NOINDIR)
261 if (strlen(data)>=maxlen)
264 maxlen=strlen(data)+1;
267 /* --- Set up new buffers for data --- */
271 if (p=indir_alloc(maxlen),!p)
273 werr(FALSE,msgs_lookup("teNEMUI"));
276 if (tst(nf,0) && valid!=tearEdit__NOVALID)
278 if (q=indir_alloc(strlen(valid)+1),!q)
281 werr(FALSE,msgs_lookup("teNEMUI"));
284 window_redrawIcon(tearEdit__window,tearEdit__icon);
287 tearEdit__window->size+=strlen(valid)+1;
290 tearEdit__window->size+=maxlen;
293 /* --- Clear out the old buffers now --- */
295 if (tst(icn->flags,8))
297 tearEdit__window->size-=icn->data.indirecttext.bufflen;
298 if (tst(icn->flags,0) &&
299 icn->data.indirecttext.validstring!=tearEdit__NOVALID)
301 utils_ctermToNterm(icn->data.indirecttext.validstring);
302 tearEdit__window->size-=strlen(icn->data.indirecttext.validstring)+1;
306 /* --- Now copy the new data across --- */
310 icn->data.indirecttext.bufflen=maxlen;
311 icn->data.indirecttext.buffer=p;
313 icn->data.indirectsprite.spritearea=tearEdit__window->t->s;
315 icn->data.indirecttext.validstring=valid;
318 memcpy(icn->data.text,data,12);
322 /* --- That's it (phew!) --- */
324 window_redrawIcon(tearEdit__window,tearEdit__icon);
325 tfile_markAsAltered(tearEdit__window->t);
328 /*----- Icon data dialogue boxes ------------------------------------------*/
330 /* --- Alter data --- */
333 * void tearEdit__dataBox(void)
336 * Displays a dialogue box allowing the user to change an icon's data.
339 static void tearEdit__dataBox(void)
347 if (!tearEdit__window || tearEdit__icon==-1)
349 icn=&tearEdit__window->def->i[tearEdit__icon].i;
350 if (!(icn->flags & 3))
353 if (tst(icn->flags,8))
354 data=icn->data.indirecttext.buffer;
357 memcpy(nonind,icn->data.text,12);
361 utils_ctermToNterm(data);
363 d=dbox_create("teditData");
367 dbox_setfield(d,tearEdit__DATAWRITE,"%s",data);
368 dbox_display(d,dbox_MENU_OVERPTR);
372 switch (dbox_fillin(d))
377 case tearEdit__DATAOK:
378 dbox_clickicon(d,tearEdit__DATAOK);
379 dbox_getfield(d,tearEdit__DATAWRITE,nonind,256);
380 tearEdit__setData(icn,nonind,0,tearEdit__NOCHANGE);
381 if (dbox_wasAdjustClick())
396 /* --- Alter indirection --- */
399 * void tearEdit__setupIndBox(dbox d,wimp_icon *icn,BOOL *ind,BOOL *val)
402 * Sets up the icons in an indirection dialogue box.
405 * dbox d == the dialogue box's handle
406 * wimp_icon *icn == the icon to read the definition from
407 * BOOL *ind == (output) whether the icon is indirected
408 * BOOL *val == (output) whether the icon has a validation string
411 static void tearEdit__setupIndBox(dbox d,wimp_icon *icn,BOOL *ind,BOOL *val)
413 if (tst(icn->flags,8))
416 dbox_selecticon(d,tearEdit__INDINDIR,TRUE);
417 dbox_shadeicon(d,tearEdit__INDSUP,FALSE);
418 dbox_shadeicon(d,tearEdit__INDSDOWN,FALSE);
419 dbox_shadeicon(d,tearEdit__INDSWRITE,FALSE);
420 dbox_shadeicon(d,tearEdit__INDMINIMISE,FALSE);
421 dbox_shadeicon(d,tearEdit__INDPART,FALSE);
422 dbox_setfield(d,tearEdit__INDSWRITE,"%i",icn->data.indirecttext.bufflen);
423 if (tst(icn->flags,0))
425 if (icn->data.indirecttext.validstring!=tearEdit__NOVALID)
428 dbox_selecticon(d,tearEdit__INDVALID,TRUE);
429 dbox_shadeicon(d,tearEdit__INDVALSTRING,FALSE);
430 utils_ctermToNterm(icn->data.indirecttext.validstring);
432 tearEdit__INDVALSTRING,
434 icn->data.indirecttext.validstring);
439 dbox_selecticon(d,tearEdit__INDVALID,FALSE);
440 dbox_shadeicon(d,tearEdit__INDVALID,FALSE);
441 dbox_shadeicon(d,tearEdit__INDVALSTRING,TRUE);
442 dbox_setfield(d,tearEdit__INDVALSTRING,"");
448 dbox_selecticon(d,tearEdit__INDVALID,FALSE);
449 dbox_shadeicon(d,tearEdit__INDVALID,TRUE);
450 dbox_shadeicon(d,tearEdit__INDVALSTRING,TRUE);
451 dbox_setfield(d,tearEdit__INDVALSTRING,"");
457 dbox_selecticon(d,tearEdit__INDINDIR,FALSE);
458 dbox_shadeicon(d,tearEdit__INDSUP,TRUE);
459 dbox_shadeicon(d,tearEdit__INDSDOWN,TRUE);
460 dbox_shadeicon(d,tearEdit__INDSWRITE,TRUE);
461 dbox_shadeicon(d,tearEdit__INDMINIMISE,TRUE);
462 dbox_shadeicon(d,tearEdit__INDPART,TRUE);
463 dbox_setfield(d,tearEdit__INDSWRITE,"12");
465 dbox_selecticon(d,tearEdit__INDVALID,FALSE);
466 dbox_shadeicon(d,tearEdit__INDVALID,TRUE);
467 dbox_shadeicon(d,tearEdit__INDVALSTRING,TRUE);
468 dbox_setfield(d,tearEdit__INDVALSTRING,"");
473 * void tearEdit__indirBox(void)
476 * Displays and handles an indirection dialogue box.
479 static void tearEdit__indirBox(void)
488 buttons_simpleArrow sa={0,9999,FALSE};
491 if (!tearEdit__window || tearEdit__icon==-1)
494 icn=&tearEdit__window->def->i[tearEdit__icon].i;
495 if (!(icn->flags & 3))
498 d=dbox_create("teditIndir");
502 tearEdit__setupIndBox(d,icn,&ind,&val);
504 dbox_display(d,dbox_MENU_OVERPTR);
507 switch (f=dbox_fillin(d),f)
512 case tearEdit__INDINDIR:
514 dbox_shadeicon(d,tearEdit__INDSUP,!ind);
515 dbox_shadeicon(d,tearEdit__INDSDOWN,!ind);
516 dbox_shadeicon(d,tearEdit__INDSWRITE,!ind);
517 dbox_shadeicon(d,tearEdit__INDMINIMISE,!ind);
518 dbox_shadeicon(d,tearEdit__INDPART,!ind);
519 if (tst(icn->flags,0))
521 dbox_shadeicon(d,tearEdit__INDVALID,!ind);
522 dbox_shadeicon(d,tearEdit__INDVALSTRING,!(ind && val));
525 case tearEdit__INDSUP:
526 buttons_arrow(d,f,d,tearEdit__INDSWRITE,0,+1,&sa);
528 case tearEdit__INDSDOWN:
529 buttons_arrow(d,f,d,tearEdit__INDSWRITE,0,-1,&sa);
531 case tearEdit__INDMINIMISE:
533 if (icn->flags & wimp_INDIRECT)
535 dbox_setfield(d,tearEdit__INDSWRITE,"%i",
536 strlen(icn->data.indirecttext.buffer)+1);
541 memcpy(buff,icn->data.text,12);
543 utils_ctermToNterm(buff);
544 dbox_setfield(d,tearEdit__INDSWRITE,"%i",strlen(buff)+1);
548 case tearEdit__INDVALID:
550 dbox_shadeicon(d,tearEdit__INDVALSTRING,!val);
552 case tearEdit__INDOK:
553 dbox_clickicon(d,tearEdit__INDOK);
556 dbox_scanfield(d,tearEdit__INDSWRITE,"%d",&size);
559 dbox_getfield(d,tearEdit__INDVALSTRING,buff,256);
560 tearEdit__setData(icn,0,buff,size);
563 tearEdit__setData(icn,0,tearEdit__NOVALID,size);
566 tearEdit__setData(icn,0,tearEdit__NOVALID,tearEdit__NOINDIR);
567 if (dbox_wasAdjustClick())
569 tearEdit__setupIndBox(d,icn,&ind,&val);
585 /*----- ESG dialogue box --------------------------------------------------*/
588 * BOOL tearEdit__esgRaw(dbox d,wimp_eventstr *e,void *handle)
591 * Handles raw events for the ESG dialogue box (basically, it forces the
592 * ESG number to be in the correct range when you type it in.
595 * dbox d == the dialogue box handle for the ESG dbox
596 * wimp_eventstr *e == the event wot happened
597 * void *handle == a handle wot we ignore
600 static BOOL tearEdit__esgRaw(dbox d,wimp_eventstr *e,void *handle)
609 switch (e->data.key.c.i)
611 case tearEdit__ESGWRITE:
612 switch (e->data.key.chcode)
617 case akbd_TabK+akbd_Sh:
618 case akbd_UpK+akbd_Ctl:
619 case akbd_DownK+akbd_Ctl:
623 handled=buttons_insertChar(d,e->data.key.chcode,'0','9');
624 if (handled || cursor)
625 buttons_arrowClick(d,tearEdit__ESGWRITE,0,31,0,FALSE);
634 * void tearEdit__esgBox(void)
637 * Allows the user to choose an exclusive selection group for an icon.
640 static void tearEdit__esgBox(void)
646 buttons_simpleArrow sa={0,31,FALSE};
649 if (!tearEdit__window || tearEdit__icon==-1)
652 d=dbox_create("teditESG");
656 icn=&tearEdit__window->def->i[tearEdit__icon].i;
658 dbox_setfield(d,tearEdit__ESGWRITE,"%i",(icn->flags & 0x001F0000)>>16);
659 dbox_rawEventHandler(d,tearEdit__esgRaw,0);
661 dbox_display(d,dbox_MENU_OVERPTR);
664 switch (f=dbox_fillin(d),f)
669 case tearEdit__ESGUP:
670 buttons_arrow(d,f,d,tearEdit__ESGWRITE,0,+1,&sa);
672 case tearEdit__ESGDOWN:
673 buttons_arrow(d,f,d,tearEdit__ESGWRITE,0,-1,&sa);
675 case tearEdit__ESGOK:
676 dbox_clickicon(d,tearEdit__ESGOK);
677 dbox_scanfield(d,tearEdit__ESGWRITE,"%d",&esg);
678 icn->flags &= ~0x001F0000;
679 icn->flags |= esg<<16;
680 window_redrawIcon(tearEdit__window,tearEdit__icon);
681 tfile_markAsAltered(tearEdit__window->t);
682 if (dbox_wasAdjustClick())
697 /*----- Colour dialogue boxes ---------------------------------------------*/
700 * void tearEdit__addBorder(dbox d,int colour)
703 * Adds a border around the specified colour.
706 * dbox d == the colour dialogue box's handle
707 * int colour == the number of the colour to select
710 static void tearEdit__addBorder(dbox d,int colour)
712 static wimp_paletteword blacknwhite[]={0,0,0,0, 0,255,255,255,};
713 static wimp_palettestr wimppal;
716 wimpt_noerr(wimp_readpalette(&wimppal));
717 wimpt_noerr(colourtran_return_Oppcolourformode(wimppal.c[colour],
721 wimpt_noerr(colourtran_return_colourformode(blacknwhite[col],
726 /* --- We now have the correctly contrasting colour in col --- */
728 wimpt_noerr(wimp_set_icon_state(dbox_syshandle(d),
729 colour+tearEdit__COLOURCOLS,
734 #define tearEdit__removeBorder(d,colour) \
735 wimpt_noerr(wimp_set_icon_state(dbox_syshandle(d), \
736 colour+tearEdit__COLOURCOLS, \
741 * void tearEdit__colourBox(BOOL fore)
744 * Displays a dialogue box from which the user may choose an icon colour.
747 * BOOL fore == whether this is the foreground or background we're editing
750 static void tearEdit__colourBox(BOOL fore)
758 if (!tearEdit__window || tearEdit__icon==-1)
761 icn=&tearEdit__window->def->i[tearEdit__icon].i;
763 if (tst(icn->flags,6))
766 d=dbox_create("teditColour");
771 colour=(icn->flags & 0x0F000000)>>24;
773 colour=(icn->flags & 0xF0000000)>>28;
775 win_settitle(dbox_syshandle(d),msgs_lookup(fore ? "teFG" : "teBG"));
777 tearEdit__addBorder(d,colour);
779 dbox_display(d,dbox_MENU_OVERPTR);
782 switch (f=dbox_fillin(d),f)
787 case tearEdit__COLOUROK:
788 dbox_clickicon(d,tearEdit__COLOUROK);
791 icn->flags &= ~0x0F000000;
792 icn->flags |= colour<<24;
796 icn->flags &= ~0xF0000000;
797 icn->flags |= colour<<28;
799 window_redrawIcon(tearEdit__window,tearEdit__icon);
800 tfile_markAsAltered(tearEdit__window->t);
801 if (dbox_wasAdjustClick())
811 if (f>=tearEdit__COLOURCOLS &&
812 f<tearEdit__COLOURCOLS+16 &&
813 f!=colour+tearEdit__COLOURCOLS)
815 tearEdit__removeBorder(d,colour);
816 colour=f-tearEdit__COLOURCOLS;
817 tearEdit__addBorder(d,colour);
826 /*----- Size and position dialogue boxes ----------------------------------*/
829 * void tearEdit__coordsArrows(dbox d,dbox_field f,int diff,void *handle)
832 * Handles a click event on one of the position or size arrow buttons in
833 * the dialogue box. See the structure definition below for a description
834 * of the data structure required.
842 tearEdit__coordsArrowstr;
844 static void tearEdit__coordsArrows(dbox d,
849 tearEdit__coordsArrowstr *s=handle;
853 dbox_scanfield(d,f,"%d,%d",&x,&y);
856 if (s->sizing && *v<0)
858 dbox_setfield(d,f,"%i,%i",x,y);
862 * void tearEdit__coordsBox(BOOL size)
865 * Displays a dialogue box and allows the user to alter either the size or
866 * position of an icon.
869 * BOOL size == whether to alter the size or position
872 static void tearEdit__coordsBox(BOOL size)
879 tearEdit__coordsArrowstr ca;
881 if (!tearEdit__window || tearEdit__icon==-1)
884 d=dbox_create(size ? "teditSize" : "teditPos");
888 icn=&tearEdit__window->def->i[tearEdit__icon].i;
891 x=icn->box.x1-icn->box.x0;
892 y=icn->box.y1-icn->box.y0;
901 dbox_setfield(d,tearEdit__POSWRITE,"%i,%i",x,y);
902 dbox_display(d,dbox_MENU_OVERPTR);
912 case tearEdit__POSUP:
914 buttons_arrow(d,f,d,tearEdit__POSWRITE,
915 tearEdit__coordsArrows,+wimpt_dy(),&ca);
917 case tearEdit__POSDOWN:
919 buttons_arrow(d,f,d,tearEdit__POSWRITE,
920 tearEdit__coordsArrows,-wimpt_dy(),&ca);
922 case tearEdit__POSLEFT:
924 buttons_arrow(d,f,d,tearEdit__POSWRITE,
925 tearEdit__coordsArrows,-wimpt_dx(),&ca);
927 case tearEdit__POSRIGHT:
929 buttons_arrow(d,f,d,tearEdit__POSWRITE,
930 tearEdit__coordsArrows,+wimpt_dx(),&ca);
932 case tearEdit__POSOK:
934 dbox_scanfield(d,tearEdit__POSWRITE,"%d,%d",&x,&y);
935 window_redrawIcon(tearEdit__window,tearEdit__icon);
938 icn->box.x1=icn->box.x0+x;
939 icn->box.y1=icn->box.y0+y;
943 icn->box.x1+=x-icn->box.x0;
944 icn->box.y1+=y-icn->box.y0;
948 window_redrawIcon(tearEdit__window,tearEdit__icon);
949 tfile_markAsAltered(tearEdit__window->t);
950 if (dbox_wasAdjustClick())
964 /*----- Menu handling -----------------------------------------------------*/
967 * void tearEdit__mainHits(tearoff_message m,int hit,void *handle)
971 * Handles menu events for the main edit icon menu level
974 * tearoff_message m == the type of event that happened
975 * int hit == the item it happened to
976 * void *handle == a waste of a good argument register
979 static void tearEdit__mainHits(tearoff_message m,int hit,void *handle)
984 case tearoff_SELECTION:
985 case tearoff_SUBMENU:
988 case tearEdit__MAINPOS:
989 tearEdit__coordsBox(FALSE);
991 case tearEdit__MAINSIZE:
992 tearEdit__coordsBox(TRUE);
999 static void tearEdit__dataHits(tearoff_message m,int hit,void *handle)
1004 case tearoff_SELECTION:
1005 case tearoff_SUBMENU:
1008 case tearEdit__DATADATA:
1009 tearEdit__dataBox();
1011 case tearEdit__DATAINDIR:
1012 tearEdit__indirBox();
1014 case tearEdit__DATATEXT:
1015 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_ITEXT;
1016 tearEdit__setData(&tearEdit__window->def->i[tearEdit__icon].i,
1019 tearEdit__NOCHANGE);
1021 case tearEdit__DATASPRITE:
1022 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_ISPRITE;
1023 tearEdit__setData(&tearEdit__window->def->i[tearEdit__icon].i,
1026 tearEdit__NOCHANGE);
1033 static void tearEdit__appearHits(tearoff_message m,int hit,void *handle)
1038 case tearoff_SELECTION:
1039 case tearoff_SUBMENU:
1042 case tearEdit__APPEARHCENTRE:
1043 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IHCENTRE;
1044 window_redrawIcon(tearEdit__window,tearEdit__icon);
1045 tfile_markAsAltered(tearEdit__window->t);
1047 case tearEdit__APPEARVCENTRE:
1048 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IVCENTRE;
1049 window_redrawIcon(tearEdit__window,tearEdit__icon);
1050 tfile_markAsAltered(tearEdit__window->t);
1052 case tearEdit__APPEARRALIGN:
1053 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IRJUST;
1054 window_redrawIcon(tearEdit__window,tearEdit__icon);
1055 tfile_markAsAltered(tearEdit__window->t);
1057 case tearEdit__APPEARBORDER:
1058 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IBORDER;
1059 window_redrawIcon(tearEdit__window,tearEdit__icon);
1060 tfile_markAsAltered(tearEdit__window->t);
1062 case tearEdit__APPEARFILLED:
1063 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IFILLED;
1064 window_redrawIcon(tearEdit__window,tearEdit__icon);
1065 tfile_markAsAltered(tearEdit__window->t);
1067 case tearEdit__APPEARHALF:
1068 tearEdit__window->def->i[tearEdit__icon].i.flags ^=
1070 window_redrawIcon(tearEdit__window,tearEdit__icon);
1071 tfile_markAsAltered(tearEdit__window->t);
1073 case tearEdit__APPEARHELP:
1074 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IREDRAW;
1075 window_redrawIcon(tearEdit__window,tearEdit__icon);
1076 tfile_markAsAltered(tearEdit__window->t);
1083 static void tearEdit__actionsHits(tearoff_message m,int hit,void *handle)
1088 case tearoff_SELECTION:
1089 case tearoff_SUBMENU:
1092 case tearEdit__ACTIONSESG:
1095 case tearEdit__ACTIONSADJUST:
1096 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_IESG_NOC;
1097 window_redrawIcon(tearEdit__window,tearEdit__icon);
1098 tfile_markAsAltered(tearEdit__window->t);
1100 case tearEdit__ACTIONSSELECT:
1101 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_ISELECTED;
1102 window_redrawIcon(tearEdit__window,tearEdit__icon);
1103 tfile_markAsAltered(tearEdit__window->t);
1105 case tearEdit__ACTIONSSHADE:
1106 tearEdit__window->def->i[tearEdit__icon].i.flags ^= wimp_INOSELECT;
1107 window_redrawIcon(tearEdit__window,tearEdit__icon);
1108 tfile_markAsAltered(tearEdit__window->t);
1115 static void tearEdit__btypeHits(tearoff_message m,int hit,void *handle)
1118 if (m==tearoff_SELECTION && hit>=1 && hit<=16)
1120 tearEdit__window->def->i[tearEdit__icon].i.flags &= ~0x0000F000;
1121 tearEdit__window->def->i[tearEdit__icon].i.flags |= (hit-1)<<12;
1122 window_redrawIcon(tearEdit__window,tearEdit__icon);
1123 tfile_markAsAltered(tearEdit__window->t);
1127 static void tearEdit__coloursHits(tearoff_message m,int hit,void *handle)
1132 case tearoff_SELECTION:
1133 case tearoff_SUBMENU:
1136 case tearEdit__COLOURSFORE:
1137 tearEdit__colourBox(TRUE);
1139 case tearEdit__COLOURSBACK:
1140 tearEdit__colourBox(FALSE);
1147 /*----- External functions ------------------------------------------------*/
1150 * void tearEdit_open(void)
1153 * Opens the edit icon menu, as a submenu if appropriate, otherwise as a
1157 void tearEdit_open(void)
1159 tearoff_displayMenu(tearEdit__main,0);
1163 * void tearEdit_update(glass_windPointer *w,int icon)
1166 * Updates the edit icon menu from the specified window and icon. If the
1167 * window handle is 0, or the icon is -1 then the menu is made unavailable
1168 * (i.e. its items are shaded). Otherwise, the menu is updated to reflect
1169 * the state of the icon.
1172 * glass_windPointer *w == the window containing the icon to edit
1173 * int icon == the icon to be editing in the menu
1176 void tearEdit_update(glass_windPointer *w,int icon)
1182 /* --- Remember the new magic icon --- */
1185 tearEdit__icon=icon;
1187 /* --- If there isn't an icon any more, shade the menu --- */
1191 for (i=tearEdit__MAINDATA;i<=tearEdit__MAINSIZE;i++)
1193 tearoff_shadeItem(tearEdit__main,i,TRUE);
1194 tearoff_selectItem(tearEdit__main,i,FALSE);
1196 for (i=tearEdit__DATADATA;i<=tearEdit__DATASPRITE;i++)
1198 tearoff_shadeItem(tearEdit__data,i,TRUE);
1199 tearoff_selectItem(tearEdit__data,i,FALSE);
1201 for (i=tearEdit__APPEARHCENTRE;i<=tearEdit__APPEARHELP;i++)
1203 tearoff_shadeItem(tearEdit__appear,i,TRUE);
1204 tearoff_selectItem(tearEdit__appear,i,FALSE);
1206 for (i=tearEdit__ACTIONSBTYPE;i<=tearEdit__ACTIONSSHADE;i++)
1208 tearoff_shadeItem(tearEdit__actions,i,TRUE);
1209 tearoff_selectItem(tearEdit__actions,i,FALSE);
1213 tearoff_shadeItem(tearEdit__btype,i,TRUE);
1214 tearoff_selectItem(tearEdit__btype,i,FALSE);
1216 for (i=tearEdit__COLOURSFORE;i<=tearEdit__COLOURSBACK;i++)
1217 tearoff_shadeItem(tearEdit__colours,i,TRUE);
1221 /* --- Read information about the icon --- */
1223 f=w->def->i[icon].i.flags;
1225 /* --- Unshade the main menu --- */
1227 tearoff_shadeItem(tearEdit__main,tearEdit__MAINDATA,FALSE);
1228 tearoff_shadeItem(tearEdit__main,tearEdit__MAINAPPEAR,FALSE);
1229 tearoff_shadeItem(tearEdit__main,tearEdit__MAINACTIONS,FALSE);
1230 tearoff_shadeItem(tearEdit__main,tearEdit__MAINCOLOURS,tst(f,6));
1231 tearoff_shadeItem(tearEdit__main,tearEdit__MAINPOS,FALSE);
1232 tearoff_shadeItem(tearEdit__main,tearEdit__MAINSIZE,FALSE);
1234 /* --- Handle data things --- */
1236 tearoff_shadeItem(tearEdit__data,tearEdit__DATADATA,!(f & 3));
1237 tearoff_shadeItem(tearEdit__data,tearEdit__DATAINDIR,!(f & 3));
1238 tearoff_selectItem(tearEdit__data,tearEdit__DATAINDIR,tst(f,8));
1239 tearoff_shadeItem(tearEdit__data,tearEdit__DATATEXT,FALSE);
1240 tearoff_selectItem(tearEdit__data,tearEdit__DATATEXT,tst(f,0));
1241 tearoff_shadeItem(tearEdit__data,tearEdit__DATASPRITE,FALSE);
1242 tearoff_selectItem(tearEdit__data,tearEdit__DATASPRITE,tst(f,1));
1244 /* --- Handle appearance things --- */
1246 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARHCENTRE,FALSE);
1247 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARHCENTRE,tst(f,3));
1248 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARVCENTRE,FALSE);
1249 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARVCENTRE,tst(f,4));
1250 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARRALIGN,FALSE);
1251 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARRALIGN,tst(f,9));
1253 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARBORDER,FALSE);
1254 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARBORDER,tst(f,2));
1255 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARFILLED,FALSE);
1256 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARFILLED,tst(f,5));
1257 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARHALF,!tst(f,1));
1258 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARHALF,tst(f,11));
1259 tearoff_shadeItem(tearEdit__appear,tearEdit__APPEARHELP,FALSE);
1260 tearoff_selectItem(tearEdit__appear,tearEdit__APPEARHELP,tst(f,7));
1262 /* --- Handle actions things --- */
1264 tearoff_shadeItem(tearEdit__actions,tearEdit__ACTIONSBTYPE,FALSE);
1265 tearoff_shadeItem(tearEdit__actions,tearEdit__ACTIONSESG,FALSE);
1266 tearoff_shadeItem(tearEdit__actions,tearEdit__ACTIONSADJUST,FALSE);
1267 tearoff_selectItem(tearEdit__actions,tearEdit__ACTIONSADJUST,tst(f,10));
1268 tearoff_shadeItem(tearEdit__actions,tearEdit__ACTIONSSELECT,FALSE);
1269 tearoff_selectItem(tearEdit__actions,tearEdit__ACTIONSSELECT,tst(f,21));
1270 tearoff_shadeItem(tearEdit__actions,tearEdit__ACTIONSSHADE,FALSE);
1271 tearoff_selectItem(tearEdit__actions,tearEdit__ACTIONSSHADE,tst(f,22));
1273 /* --- Handle button type --- */
1275 b=(f & 0x0000F000)>>12;
1278 tearoff_shadeItem(tearEdit__btype,i,FALSE);
1279 tearoff_selectItem(tearEdit__btype,i,(i-1==b) ?
1284 /* --- Handle colours --- */
1286 tearoff_shadeItem(tearEdit__colours,tearEdit__COLOURSFORE,tst(f,6));
1287 tearoff_shadeItem(tearEdit__colours,tearEdit__COLOURSBACK,tst(f,6));
1292 * void tearEdit_init(void)
1295 * Initialises the tearoff menus for editing icons and starts up the tearoff
1299 void tearEdit_init(void)
1301 char *buf=buffer_find();
1304 /* --- If we're already up and running, then someone's stupid --- */
1311 tearEdit__main=tearoff_create(msgs_lookup("teEIMT"),
1312 msgs_lookup("teEIM"),
1318 tearEdit__data=tearoff_create(msgs_lookup("teEIDT"),
1319 msgs_lookup("teEID"),
1325 tearEdit__appear=tearoff_create(msgs_lookup("teAPMT"),
1326 msgs_lookup("teAPM"),
1328 tearEdit__appearHits,
1332 tearEdit__actions=tearoff_create(msgs_lookup("teACMT"),
1333 msgs_lookup("teACM"),
1335 tearEdit__actionsHits,
1339 tearEdit__colours=tearoff_create(msgs_lookup("teCMT"),
1340 msgs_lookup("teCM"),
1342 tearEdit__coloursHits,
1346 /* --- Change this code to use Edit Icon messages --- */
1348 tearEdit__btype=tearoff_create(msgs_lookup("eiBTMT"),
1349 msgs_lookup("eiBTYPE0"),
1351 tearEdit__btypeHits,
1356 sprintf(buf,"eiBTYPE%i",i);
1357 tearEdit__btype=tearoff_extendMenu(tearEdit__btype,msgs_lookup(buf));
1359 tearoff_shadeItem(tearEdit__btype,13,TRUE);
1360 tearoff_shadeItem(tearEdit__btype,14,TRUE);
1362 if (!tearEdit__main ||
1364 !tearEdit__appear ||
1365 !tearEdit__actions ||
1366 !tearEdit__colours ||
1370 tearoff_attachSubMenu(tearEdit__main,
1373 tearoff_attachSubMenu(tearEdit__main,
1374 tearEdit__MAINAPPEAR,
1376 tearoff_attachSubMenu(tearEdit__main,
1377 tearEdit__MAINACTIONS,
1379 tearoff_attachSubMenu(tearEdit__main,
1380 tearEdit__MAINCOLOURS,
1382 tearoff_attachSubMenu(tearEdit__actions,
1383 tearEdit__ACTIONSBTYPE,
1386 tearEdit_update(0,-1);