/* * editWindow.c * * Edit window dialogue box * * © 1994-1998 Straylight */ /*----- Licensing note ----------------------------------------------------* * * This file is part of Straylight's Glass. * * Glass is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * Glass is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Glass. If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*----- Header files ------------------------------------------------------*/ /* * ANSI standard headers */ #include #include #include /* * Steel headers */ #define _STDAPP #define _LOWLVL #include "steel/Steel.h" #include "steel/buttons.h" #include "steel/fontMenu.h" #include "steel/akbd.h" #include "steel/buffer.h" #include "steel/font.h" /* * Glass headers */ #include "glass.h" #include "tfile.h" #include "window.h" #include "intMsgs.h" #include "editWin.h" #include "colSelect.h" #include "indir.h" #include "gPrefs.h" #include "gStruct.h" #include "gMenus.h" #include "gIcons.h" /*----- Static variables --------------------------------------------------*/ static char *editWindow__panels[]= { "windChars", "windGadgets", "windButton", "iconData", "iconAppear", "windColours", "windSize", }; #define editWindow__ICAPPHEIGHT -504 /*----- New RISC OS 3 window flags ----------------------------------------*/ #define wimp_WONSCREEN (1<<13) #define wimp_WRUBBERH (1<<14) #define wimp_WRUBBERV (1<<15) /*----- Support routines --------------------------------------------------*/ #define max2(a,b) ((a)>(b) ? (a) : (b)) #define min2(a,b) ((a)<(b) ? (a) : (b)) /* * void editWindow__checkExtents(glass_editWindow *ed,BOOL redraw, * BOOL read) * * Use * Ensures that the window extents are correctly set according to window * size etc. * * Parameters * glass_editWindow *ed == the edit * BOOL rbl == whether to redraw the bottom left setting * BOOL rtr == whether to redraw the top right setting * BOOL read == whether to read settings from dbox */ static void editWindow__checkExtents(glass_editWindow *ed,BOOL rbl, BOOL rtr,BOOL read) { BOOL bl=rbl; BOOL tr=rtr; int x,y; if (ed->e.panel==glass_EWWORKAREA && read) { dbox_scanfield(ed->e.pd, glass_EWSBOTTOMLEFT, "%d,%d", &ed->wdef.ex.x0, &ed->wdef.ex.y0); dbox_scanfield(ed->e.pd, glass_EWSTOPRIGHT, "%d,%d", &ed->wdef.ex.x1, &ed->wdef.ex.y1); } if (ed->e.panel==glass_EWWORKAREA) { dbox_scanfield(ed->e.pd,glass_EWSMINWIDTH,"%d",&x); dbox_scanfield(ed->e.pd,glass_EWSMINHEIGHT,"%d",&y); } else { x=ed->wdef.minsize & 0xffff; y=(ed->wdef.minsize>>16) & 0xffff; } if (gPrefs_current()->mVisInWork) { if (ed->wdef.ex.x0>ed->w->def->desc.w.scx) { ed->wdef.ex.x0=ed->w->def->desc.w.scx; bl=TRUE; } if (ed->wdef.ex.y0>ed->w->def->desc.w.scy+ ed->w->def->desc.w.box.y0- ed->w->def->desc.w.box.y1) { ed->wdef.ex.y0=ed->w->def->desc.w.scy+ ed->w->def->desc.w.box.y0- ed->w->def->desc.w.box.y1; bl=TRUE; } if (ed->wdef.ex.x1w->def->desc.w.scx+ ed->w->def->desc.w.box.x1- ed->w->def->desc.w.box.x0) { ed->wdef.ex.x1=ed->w->def->desc.w.scx+ ed->w->def->desc.w.box.x1- ed->w->def->desc.w.box.x0; tr=TRUE; } if (ed->wdef.ex.y1w->def->desc.w.scy) { ed->wdef.ex.y1=ed->w->def->desc.w.scy; tr=TRUE; } } if (bl && ed->e.panel==glass_EWWORKAREA) { dbox_setfield(ed->e.pd, glass_EWSBOTTOMLEFT, "%i,%i", ed->wdef.ex.x0, ed->wdef.ex.y0); } if (tr && ed->e.panel==glass_EWWORKAREA) { dbox_setfield(ed->e.pd, glass_EWSTOPRIGHT, "%i,%i", ed->wdef.ex.x1, ed->wdef.ex.y1); } bl=rbl; tr=rtr; if (gPrefs_current()->mVisInWork) { if (x>ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0) { x=ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0; bl=TRUE; } if (y>ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0) { y=ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0; tr=TRUE; } } else { if (x>ed->wdef.ex.x1-ed->wdef.ex.x0) { x=ed->wdef.ex.x1-ed->wdef.ex.x0; bl=TRUE; } if (y>ed->wdef.ex.y1-ed->wdef.ex.y0) { y=ed->wdef.ex.y1-ed->wdef.ex.y0; tr=TRUE; } } ed->wdef.minsize=x+(y<<16); if (bl && ed->e.panel==glass_EWWORKAREA) dbox_setfield(ed->e.pd,glass_EWSMINWIDTH,"%i",x); if (tr && ed->e.panel==glass_EWWORKAREA) dbox_setfield(ed->e.pd,glass_EWSMINHEIGHT,"%i",y); } /* * void editWindow__setupPanel(glass_editWindow *ed) * * Use * Sets up a panel from the icon description given. * * Parameters * glass_editWindow *ed == the edit to handle. */ static void editWindow__setupPanel(glass_editWindow *ed) { char *buf=buffer_find(); switch (ed->e.panel) { case glass_EWCHARS: dbox_selecticon(ed->e.pd, glass_EWCMOVE, !!(ed->wdef.flags & wimp_WMOVEABLE)); dbox_selecticon(ed->e.pd, glass_EWCREDRAW, !!(ed->wdef.flags & wimp_REDRAW_OK)); dbox_selecticon(ed->e.pd, glass_EWCPANE, !!(ed->wdef.flags & wimp_WPANE)); dbox_selecticon(ed->e.pd, glass_EWCNOBOUNDS, !!(ed->wdef.flags & wimp_WTRESPASS)); dbox_selecticon(ed->e.pd, glass_EWCONSCREEN, !!(ed->wdef.flags & wimp_WONSCREEN)); if (ed->wdef.flags & wimp_WSCROLL_R1) { dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,TRUE); dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,FALSE); dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,FALSE); } else if (ed->wdef.flags & wimp_SCROLL_R2) { dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,FALSE); dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,TRUE); dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,FALSE); } else { dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,FALSE); dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,FALSE); dbox_selecticon(ed->e.pd,glass_EWCSCRLQ,TRUE); } dbox_selecticon(ed->e.pd, glass_EWCGCOL, !!(ed->wdef.flags & wimp_REAL_COLOURS)); dbox_selecticon(ed->e.pd, glass_EWCBACK, !!(ed->wdef.flags & wimp_BACK_WINDOW)); dbox_selecticon(ed->e.pd, glass_EWCHOTKEYS, !!(ed->wdef.flags & wimp_HOT_KEYS)); break; case glass_EWGADGETS: if (tst(ed->wdef.flags,31)) { dbox_shadeicon(ed->e.pd,glass_EWGOTITLE,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGOCLOSEBACK,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGOHORIZ,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGOVERT,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNTITLE,FALSE); dbox_shadeicon(ed->e.pd,glass_EWGNHORIZ,FALSE); dbox_shadeicon(ed->e.pd,glass_EWGNVERT,FALSE); dbox_selecticon(ed->e.pd,glass_EWGNEW,TRUE); dbox_selecticon(ed->e.pd,glass_EWGOLD,FALSE); dbox_selecticon(ed->e.pd,glass_EWGOTITLE,tst(ed->wdef.flags,26)); dbox_selecticon(ed->e.pd, glass_EWGOCLOSEBACK, tst(ed->wdef.flags,24) || tst(ed->wdef.flags,25)); dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,tst(ed->wdef.flags,30)); dbox_selecticon(ed->e.pd,glass_EWGOVERT,tst(ed->wdef.flags,28)); dbox_selecticon(ed->e.pd,glass_EWGNTITLE,tst(ed->wdef.flags,26)); dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,tst(ed->wdef.flags,25)); dbox_shadeicon(ed->e.pd,glass_EWGNCLOSE,!tst(ed->wdef.flags,26)); dbox_selecticon(ed->e.pd,glass_EWGNRESIZE,tst(ed->wdef.flags,29)); dbox_shadeicon(ed->e.pd, glass_EWGNRESIZE, !(tst(ed->wdef.flags,28) || tst(ed->wdef.flags,30))); dbox_selecticon(ed->e.pd,glass_EWGNBACK,tst(ed->wdef.flags,24)); dbox_shadeicon(ed->e.pd,glass_EWGNBACK,!tst(ed->wdef.flags,26)); dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,tst(ed->wdef.flags,27)); dbox_shadeicon(ed->e.pd, glass_EWGNTOGGLE, !(tst(ed->wdef.flags,26) || tst(ed->wdef.flags,28))); dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,tst(ed->wdef.flags,30)); dbox_selecticon(ed->e.pd,glass_EWGNVERT,tst(ed->wdef.flags,28)); } else { dbox_shadeicon(ed->e.pd,glass_EWGOTITLE,FALSE); dbox_shadeicon(ed->e.pd,glass_EWGOHORIZ,FALSE); dbox_shadeicon(ed->e.pd,glass_EWGOVERT,FALSE); dbox_shadeicon(ed->e.pd,glass_EWGNTITLE,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNCLOSE,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNRESIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNBACK,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNTOGGLE,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNHORIZ,TRUE); dbox_shadeicon(ed->e.pd,glass_EWGNVERT,TRUE); dbox_selecticon(ed->e.pd,glass_EWGNEW,FALSE); dbox_selecticon(ed->e.pd,glass_EWGOLD,TRUE); dbox_selecticon(ed->e.pd,glass_EWGOTITLE,tst(ed->wdef.flags,0)); dbox_selecticon(ed->e.pd, glass_EWGOCLOSEBACK, !tst(ed->wdef.flags,7)); dbox_shadeicon(ed->e.pd, glass_EWGOCLOSEBACK, !tst(ed->wdef.flags,0)); dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,tst(ed->wdef.flags,3)); dbox_selecticon(ed->e.pd,glass_EWGOVERT,tst(ed->wdef.flags,2)); dbox_selecticon(ed->e.pd,glass_EWGNTITLE,tst(ed->wdef.flags,0)); dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,!tst(ed->wdef.flags,7)); dbox_selecticon(ed->e.pd, glass_EWGNRESIZE, tst(ed->wdef.flags,2) || tst(ed->wdef.flags,3)); dbox_selecticon(ed->e.pd,glass_EWGNBACK,!tst(ed->wdef.flags,7)); dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,tst(ed->wdef.flags,2)); dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,tst(ed->wdef.flags,3)); dbox_selecticon(ed->e.pd,glass_EWGNVERT,tst(ed->wdef.flags,2)); } break; case glass_EWBTYPE: sprintf(buf,"ewBTYPE%i",(ed->wdef.workflags>>12) & 0x0f); dbox_setfield(ed->e.pd,glass_EWBBTDISP,"%s",msgs_lookup(buf)); break; case glass_EWTDATA: dbox_setfield(ed->e.pd,glass_EIDVALSTRING,"%s",ed->valid); dbox_setfield(ed->e.pd,glass_EIDDATA,"%s",ed->data); if (!(ed->wdef.titleflags & 3)) { dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE); dbox_selecticon(ed->e.pd,glass_EIDINDIR,FALSE); dbox_selecticon(ed->e.pd,glass_EIDVALID,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",12); } else if (ed->wdef.titleflags & wimp_INDIRECT) { dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE); dbox_selecticon(ed->e.pd,glass_EIDINDIR,TRUE); dbox_selecticon(ed->e.pd,glass_EIDVALID,ed->hasValid); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,!ed->hasValid); dbox_shadeicon(ed->e.pd, glass_EIDVALID, !(ed->wdef.titleflags&wimp_ITEXT)); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE); dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",ed->indLen); } else { dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE); dbox_selecticon(ed->e.pd,glass_EIDINDIR,FALSE); dbox_selecticon(ed->e.pd,glass_EIDVALID,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); dbox_setfield(ed->e.pd,glass_EIDINDSIZE,"%i",12); } dbox_selecticon(ed->e.pd, glass_EIDTEXT, !!(ed->wdef.titleflags&wimp_ITEXT)); dbox_selecticon(ed->e.pd, glass_EIDSPRITE, !!(ed->wdef.titleflags&wimp_ISPRITE)); break; case glass_EWTAPPEAR: dbox_setfield(ed->e.pd,glass_EIAFONTNAME,"%.%s",ed->font); dbox_setfield(ed->e.pd,glass_EIAFSIZEWRITE,"%i",ed->fontSize); if (ed->wdef.titleflags & wimp_ITEXT) { if (ed->wdef.titleflags & wimp_IFONT) { dbox_selecticon(ed->e.pd,glass_EIAFONT,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFONT,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,FALSE); } else { dbox_selecticon(ed->e.pd,glass_EIAFONT,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFONT,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,TRUE); } } else { dbox_selecticon(ed->e.pd,glass_EIAFONT,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAFONT,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFONTNAME,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFONTMENU,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFSIZEWRITE,TRUE); } dbox_selecticon(ed->e.pd, glass_EIAHCENTRE, !!(ed->wdef.titleflags & wimp_IHCENTRE)); dbox_selecticon(ed->e.pd, glass_EIAVCENTRE, !!(ed->wdef.titleflags & wimp_IVCENTRE)); dbox_selecticon(ed->e.pd, glass_EIARALIGN, !!(ed->wdef.titleflags & wimp_IRJUST)); if (ed->wdef.titleflags & wimp_ISPRITE) { dbox_selecticon(ed->e.pd, glass_EIAHALFSIZE, !!(ed->wdef.titleflags & wimp_IHALVESPRITE)); dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,FALSE); } else { dbox_selecticon(ed->e.pd,glass_EIAHALFSIZE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIAHALFSIZE,TRUE); } dbox_selecticon(ed->e.pd,glass_EIABORDER,FALSE); dbox_selecticon(ed->e.pd,glass_EIAFILL,FALSE); dbox_selecticon(ed->e.pd,glass_EIANEEDSHELP,FALSE); dbox_shadeicon(ed->e.pd,glass_EIABORDER,TRUE); dbox_shadeicon(ed->e.pd,glass_EIAFILL,TRUE); dbox_shadeicon(ed->e.pd,glass_EIANEEDSHELP,TRUE); /* The above aren't relevant to a window title */ break; case glass_EWCOLOURS: colSelect_setColourButton(ed->e.pd, glass_EWCTBFORE, ed->wdef.colours[0]); colSelect_setColourButton(ed->e.pd, glass_EWCTBBACK, ed->wdef.colours[1]); colSelect_setColourButton(ed->e.pd, glass_EWCWAFORE, ed->wdef.colours[2]); colSelect_setColourButton(ed->e.pd, glass_EWCWABACK, ed->wdef.colours[3]); colSelect_setColourButton(ed->e.pd, glass_EWCSCFORE, ed->wdef.colours[5]); colSelect_setColourButton(ed->e.pd, glass_EWCSCBACK, ed->wdef.colours[4]); colSelect_setColourButton(ed->e.pd, glass_EWCHIGH, ed->wdef.colours[6]); break; case glass_EWWORKAREA: dbox_setfield(ed->e.pd, glass_EWSMINWIDTH, "%i", ed->wdef.minsize & 0xffff); dbox_setfield(ed->e.pd, glass_EWSMINHEIGHT, "%i", (ed->wdef.minsize>>16) & 0xffff); editWindow__checkExtents(ed,TRUE,TRUE,FALSE); dbox_selecticon(ed->e.pd, glass_EWSRUBBERH, !!(ed->wdef.flags & wimp_WRUBBERH)); dbox_selecticon(ed->e.pd, glass_EWSRUBBERV, !!(ed->wdef.flags & wimp_WRUBBERV)); break; } } /* * void editWindow__closePanel(glass_editWindow *ed) * * Use * Records the settings in a panel for future reference, for example when * the panel is being replaced by a different one. * * Parameters * glass_editWindow *ed == the edit box we're talking about */ #define Q dbox_READSTATE static void editWindow__closePanel(glass_editWindow *ed) { switch (ed->e.panel) { case glass_EWCHARS: ed->wdef.flags&=~0x00003f72; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCMOVE,Q)<<1; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCREDRAW,Q)<<4; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCPANE,Q)<<5; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCNOBOUNDS,Q)<<6; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCONSCREEN,Q)<<13; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCSCRLREP,Q)<<8; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCSCRLDEB,Q)<<9; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCGCOL,Q)<<10; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCBACK,Q)<<11; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWCHOTKEYS,Q)<<12; break; case glass_EWGADGETS: ed->wdef.flags&=~0xff00008d; if (dbox_selecticon(ed->e.pd,glass_EWGOLD,Q)) { ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOTITLE,Q)<<0; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOVERT,Q)<<2; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGOHORIZ,Q)<<3; ed->wdef.flags|=(!dbox_selecticon(ed->e.pd, glass_EWGOCLOSEBACK, Q))<<7; } else { ed->wdef.flags|=wimp_WNEW; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNBACK,Q)<<24; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNCLOSE,Q)<<25; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNTITLE,Q)<<26; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNTOGGLE,Q)<<27; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNVERT,Q)<<28; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNRESIZE,Q)<<29; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWGNHORIZ,Q)<<30; } break; case glass_EWTDATA: dbox_getfield(ed->e.pd,glass_EIDDATA,ed->data,256); dbox_getfield(ed->e.pd,glass_EIDVALSTRING,ed->valid,256); dbox_scanfield(ed->e.pd,glass_EIDINDSIZE,"%d",&ed->indLen); ed->hasValid=dbox_selecticon(ed->e.pd,glass_EIDVALID,Q); ed->wdef.titleflags&=~0x00000103; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDTEXT,Q)<<0; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDSPRITE,Q)<<1; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIDINDIR,Q)<<8; break; case glass_EWTAPPEAR: ed->wdef.titleflags&=~0x00000afc; dbox_scanfield(ed->e.pd,glass_EIAFSIZEWRITE,"%d",&ed->fontSize); ed->wdef.titleflags|=dbox_selecticon(ed->e.pd, glass_EIAHCENTRE, Q)<<3; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAVCENTRE,Q)<<4; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAFONT,Q)<<6; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIARALIGN,Q)<<9; ed->wdef.titleflags|=dbox_selecticon(ed->e.pd,glass_EIAHALFSIZE,Q)<<11; break; case glass_EWWORKAREA: ed->wdef.flags&=~0x0000c000; editWindow__checkExtents(ed,FALSE,FALSE,TRUE); ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWSRUBBERH,Q)<<14; ed->wdef.flags|=dbox_selecticon(ed->e.pd,glass_EWSRUBBERV,Q)<<15; break; } } #undef Q /* * void editWindow__setPanel(glass_editWindow *ed,dbox_field f) * * Use * Creates a new panel based on a radio button click or some-such. * * Parameters * glass_editWindow *ed == the edit window to change panel * dbox_field f == the radio button associated with the desired panel */ static void editWindow__panelHandler(dbox d,dbox_field f,void *handle); static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle); static void editWindow__setPanel(glass_editWindow *ed,dbox_field f) { dbox d; wimp_wstate s; wimp_icon i; int width,height; int ox,oy; wimp_w behind; wimp_caretstr c; wimp_redrawstr r; BOOL ownCaret=TRUE; if (f==ed->e.panel) return; editWindow__closePanel(ed); wimpt_noerr(wimp_get_wind_state(dbox_syshandle(ed->e.d),&s)); wimpt_noerr(wimp_get_icon_info(dbox_syshandle(ed->e.d), glass_EWPOSN,&i)); ox=s.o.box.x0-s.o.x; oy=s.o.box.y1-s.o.y; mem_useUser(indir_alloc,indir_free); if (f==-1) d=dbox_create("iconNowt"); else d=dbox_create(editWindow__panels[f-glass_EWCHARS]); if (!d) { mem_useMalloc(); return; } dbox_eventHandler(d,editWindow__panelHandler,ed); dbox_rawEventHandler(d,editWindow__panelRaw,ed); if (ed->e.panel) { wimpt_noerr(wimp_get_caret_pos(&c)); ownCaret=(c.w==dbox_syshandle(ed->e.pd)); dbox_selecticon(ed->e.d,ed->e.panel,dbox_RESETSTATE); wimpt_noerr(wimp_get_wind_state(dbox_syshandle(ed->e.pd),&s)); pane_removePane(ed->e.p,dbox_syshandle(ed->e.pd)); dbox_delete(ed->e.pd); } dbox_selecticon(ed->e.d,f,dbox_SETSTATE); behind=s.o.behind; wimpt_noerr(wimp_get_wind_state(dbox_syshandle(d),&s)); width=s.o.box.x1-s.o.box.x0; height=s.o.box.y1-s.o.box.y0; s.o.box.x0=i.box.x0+ox+wimpt_dx(); s.o.box.y0=i.box.y0+oy+wimpt_dy(); s.o.box.x1=s.o.box.x0+width; s.o.box.y1=s.o.box.y0+height; s.o.y=10000; s.o.behind=behind; ed->e.pd=d; ed->e.panel=f; editWindow__setupPanel(ed); if (f==glass_EWTAPPEAR) { r.w=s.o.w; r.box.x0=0; r.box.x1=s.o.box.x1-s.o.box.x0; r.box.y1=0; r.box.y0=editWindow__ICAPPHEIGHT; wimpt_noerr(wimp_set_extent(&r)); } wimpt_noerr(wimp_open_wind(&s.o)); if (ownCaret) { c.w=dbox_syshandle(d); c.i=-1; c.x=-500000; c.y=0; c.height=0x02000000; wimpt_noerr(wimp_set_caret_pos(&c)); } pane_addPane(ed->e.p,dbox_syshandle(d)); mem_useMalloc(); } /* * void editWindow__recreate(glass_editWindow *ed) * * Use * Recreates the icon from the dialogue box settings * * Parameters * glass_editWindow *ed == info about the edit */ static void editWindow__recreate(glass_editWindow *ed) { char *p=0; char *q=0; char newname[15]; int fhandle; ed->w->edit=0; /* Delink temporarily */ editWindow__checkExtents(ed,FALSE,FALSE,TRUE); if (!(ed->wdef.titleflags & wimp_INDIRECT)) { ed->indLen=12; ed->hasValid=FALSE; } if (strlen(ed->data)>=ed->indLen) { ed->wdef.titleflags|=wimp_INDIRECT; ed->indLen=strlen(ed->data)+1; } if (ed->wdef.titleflags & wimp_INDIRECT) { if (p=indir_alloc(ed->indLen),!p) { werr(FALSE,msgs_lookup("ewNEMUW")); return; } if (ed->hasValid && (ed->wdef.titleflags & wimp_ITEXT)) { if (q=indir_alloc(strlen(ed->valid)+1),!q) { indir_free(p); werr(FALSE, msgs_lookup("ewNEMUW")); return; } strcpy(q,ed->valid); ed->w->size+=strlen(ed->valid)+1; } strcpy(p,ed->data); ed->w->size+=ed->indLen; } if (ed->w->def->desc.w.titleflags & wimp_IFONT) /* Was old antialiased? */ { fhandle=(ed->w->def->desc.w.titleflags >> 24) & 255; wimpt_noerr(font_lose(fhandle)); ed->w->fonts[fhandle]--; } if (ed->wdef.titleflags & wimp_IFONT) /* Is new title antialiased? */ { if (font_find(ed->font,ed->fontSize*16,ed->fontSize*16,0,0,&fhandle)) { werr(FALSE,msgs_lookup("ewCFF"),ed->font); ed->wdef.titleflags&=~wimp_IFONT; } else { ed->w->antiAliased=TRUE; ed->w->fonts[fhandle]++; ed->wdef.titleflags=(ed->wdef.titleflags & 0x00ffffff) | (fhandle<<24); } } if (ed->w->def->desc.w.titleflags & wimp_INDIRECT) { indir_free(ed->w->def->desc.w.title.indirecttext.buffer); ed->w->size-=ed->w->def->desc.w.title.indirecttext.bufflen; if ((ed->w->def->desc.w.titleflags & wimp_ITEXT) && (ed->w->def->desc.w.title.indirecttext.validstring!=(char *)-1)) { ed->w->size-= strlen(ed->w->def->desc.w.title.indirecttext.validstring)+1; indir_free(ed->w->def->desc.w.title.indirecttext.validstring); } } if (p) { ed->wdef.title.indirecttext.buffer=p; ed->wdef.title.indirecttext.bufflen=ed->indLen; if (q) ed->wdef.title.indirecttext.validstring=q; else if (ed->wdef.titleflags & wimp_ITEXT) ed->wdef.title.indirecttext.validstring=(char *)-1; else ed->wdef.title.indirectsprite.spritearea=ed->w->t->s; } else memcpy(ed->wdef.title.text,ed->data,12); ed->wdef.box=ed->w->def->desc.w.box; ed->wdef.scx=ed->w->def->desc.w.scx; ed->wdef.scy=ed->w->def->desc.w.scy; ed->wdef.behind=ed->w->def->desc.w.behind; ed->wdef.nicons=ed->w->def->desc.w.nicons; ed->w->def->desc.w=ed->wdef; dbox_getfield(ed->e.d,glass_EWIDWRITE,newname,15); tfile_rename(newname,ed->w); dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id); ed->w->edit=ed; /* Relink again */ window_recreate(ed->w); tfile_markAsAltered(ed->w->t); } /* * void editWindow__nextPanel(glass_editWindow *ed,int dir) * * Use * Changes panel to the next one in the given direction. Skips shaded * panels and handles everything nicely. * * Parameters * glass_editWindow *ed == the edit dialogue box to move about in * int dir == the direction (-1 for up, 1 for down) */ static void editWindow__nextPanel(glass_editWindow *ed,int dir) { int i=ed->e.panel; if (i==-1) i=(dir==1 ? glass_EWCHARS : glass_EWWORKAREA); else i+=dir; for (;i>=glass_EWCHARS && i<=glass_EWWORKAREA;i+=dir) { if (!dbox_shadeicon(ed->e.d,i,dbox_READSTATE)) { editWindow__setPanel(ed,i); break; } } } /*----- Event handlers ----------------------------------------------------*/ /* * void editWindow__dboxHandler(dbox d,dbox_field f,void *handle) * * Use * Handles any and all events directed at the dbox. Well, almost all... * * Parameters * dbox d == the dbox handle * dbox_field f == the event that happened * void *handle == pointer to the dialogue box control info */ static void editWindow__dboxHandler(dbox d,dbox_field f,void *handle) { glass_editWindow *ed=handle; switch (f) { case dbox_CLOSE: editWindow_close(ed->w); break; case dbox_HELP: help_startHelp(); help_addLine(msgs_lookup("ewhEIDB")); help_readFromIcon(); help_endHelp(); break; case glass_EWCAN: dbox_clickicon(d,f); if (!dbox_wasAdjustClick()) pane_close(ed->e.p); else { /* --- set up for old window --- */ ed->wdef=ed->w->def->desc.w; editWindow_readData(ed->w); dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id); editWindow__setupPanel(ed); } dbox_unclick(); if (!dbox_wasAdjustClick()) editWindow_close(ed->w); break; case glass_EWOK: dbox_clickicon(d,f); editWindow__closePanel(ed); if (!dbox_wasAdjustClick()) { pane_close(ed->e.p); editWindow__recreate(ed); dbox_unclick(); editWindow_close(ed->w); } else { editWindow__recreate(ed); editWindow_readData(ed->w); editWindow__setupPanel(ed); dbox_unclick(); } break; case glass_EWDEL: dbox_clickicon(d,f); if (gPrefs_current()->cDelWind) { if (!warning(msgs_lookup("ewCDWP"), msgs_lookup("ewCDW"))) { dbox_unclick(); return; } } pane_close(ed->e.p); dbox_unclick(); tfile_markAsAltered(ed->w->t); tfile_deleteWindow(ed->w->i,ed->w); /* This causes a close for us */ break; case glass_EWSAVE: dbox_clickicon(d,f); dbox_unclick(); tfile_saveWindow(ed->w); break; case glass_EWCHARS: case glass_EWGADGETS: case glass_EWBTYPE: case glass_EWTDATA: case glass_EWTAPPEAR: case glass_EWCOLOURS: case glass_EWWORKAREA: editWindow__setPanel(ed,f); break; } } /* * BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle) * * Use * Handles open window requests and things for the main Preferences dbox. * * Parameters * dbox d == the dbox handle * wimp_eventstr *e == the event that happened * void *handle == a unused pointer * * Returns * TRUE if the event has been handled; */ static BOOL editWindow__dboxRaw(dbox d,wimp_eventstr *e,void *handle) { BOOL handled=FALSE; glass_editWindow *ed=handle; glass_intMsgstr *m; unused(d); switch (e->e) { case wimp_EOPEN: pane_moved(ed->e.p); handled=TRUE; break; case wimp_EKEY: switch (e->data.key.chcode) { case akbd_UpK+akbd_Sh: editWindow__nextPanel(ed,-1); handled=TRUE; break; case akbd_DownK+akbd_Sh: editWindow__nextPanel(ed,+1); handled=TRUE; break; } break; case wimp_ESEND: case wimp_ESENDWANTACK: switch (e->data.msg.hdr.action) { case wimp_MINTERNAL: m=intMsgs_receive(e); switch(e->data.msg.data.words[0]) { case glass_DELETEFILE: if (m->df.t==ed->w->t) editWindow_close(ed->w); break; case glass_SAVEFILE: if (m->df.t==ed->w->t) dbox_setfield(ed->e.d,glass_EWFILEDISP,"%.%s", ed->w->t->filename); break; case glass_DELETEWINDOW: if (m->dw.w==ed->w) editWindow_close(ed->w); break; case glass_RENAME: if (m->rn.w==ed->w) dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",ed->w->id); break; } break; } break; } return (handled); } /* * menu editWindow__fontMaker(void *handle) * * Use * Sets up the font menu. * * Parameters * void *handle == pointer to this edit * * Returns * A menu to display */ static menu editWindow__fontMaker(void *handle) { glass_editWindow *ed=handle; menu m=fontMenu_createFontMenu(FALSE); fontMenu_tickGivenName(ed->font); return (m); } /* * void editWindow__fontHandler(int hit[],void *handle) * * Use * Gets the font chosen from the font menu. * * Parameters * int hit[] == the hit string * void *handle == pointer to this edit */ static void editWindow__fontHandler(int hit[],void *handle) { glass_editWindow *ed=handle; if (hit[0]) { strcpy(ed->font,fontMenu_fontname(hit[0],hit[1])); dbox_setfield(ed->e.pd,glass_EIAFONTNAME,"%.%s",ed->font); } } /* * void editWindow__fontHelp(int hit[],void *handle) * * Use * Gives help on a font menu item * * Parameters * int hit[] == the hit string * void *handle == pointer to this edit */ static void editWindow__fontHelp(int hit[],void *handle) { unused(handle); if (hit[0]) { help_startHelp(); help_addLine(msgs_lookup("ewmhFONT"),fontMenu_fontname(hit[0],hit[1])); help_endHelp(); } } /* * menu editWindow__btypeMaker(void *handle) * * Use * Generates and sets up a button type menu for an edit dialogue box * * Parameters * void *handle == pointer to the edit * * Returns * The menu to use */ static menu editWindow__btypeMaker(void *handle) { static menu m; static int ticked; glass_editWindow *ed=handle; int i; char *buf=buffer_find(); if (!m) { m=menu_new(msgs_lookup("eiBTMT"),msgs_lookup("ewBTYPE0")); for (i=1;i<=15;i++) { sprintf(buf,"ewBTYPE%i",i); menu_extend(m,msgs_lookup(buf)); } } if (ticked) menu_setflags(m,ticked,FALSE,FALSE); ticked=((ed->wdef.workflags>>12)&0x0f)+1; menu_setflags(m,ticked,TRUE,FALSE); return (m); } /* * void editWindow__btypeHandler(int hit[],void *handle) * * Use * Handles a click on the button type menu. * * Parameters * int hit[] == the mouse click info * void *handle == pointer to edit information */ static void editWindow__btypeHandler(int hit[],void *handle) { glass_editWindow *ed=handle; char *buf=buffer_find(); if (hit[0]) { ed->wdef.workflags&=~0x0000f000; ed->wdef.workflags+=(hit[0]-1)<<12; sprintf(buf,"ewBTYPE%i",hit[0]-1); dbox_setfield(ed->e.pd,glass_EIABTYPE,"%s",msgs_lookup(buf)); } } /* * void editWindow__colProc(dbox d,dbox_field f,int colour, void *handle) * * Use * This routine is called when a colour is selected in the colours panel. * * Parameters * dbox d == the panel's handle * dbox_field f == the colour button that has changed * int colour == the new colour for the button * void *handle == pointer to this edit */ static void editWindow__colProc(dbox d,dbox_field f,int colour,void *handle) { glass_editWindow *ed=handle; unused(d); switch (f) { case glass_EWCTBFORE: ed->wdef.colours[0]=colour; dbox_shadeicon(ed->e.d,glass_EWGADGETS,colour==255); if ((tst(ed->wdef.flags,31) && tst(ed->wdef.flags,26)) || (!tst(ed->wdef.flags,31) && tst(ed->wdef.flags,0))) { dbox_shadeicon(ed->e.d,glass_EWTDATA,colour==255); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,colour==255); } break; case glass_EWCTBBACK: ed->wdef.colours[1]=colour; break; case glass_EWCWAFORE: ed->wdef.colours[2]=colour; break; case glass_EWCWABACK: ed->wdef.colours[3]=colour; break; case glass_EWCSCFORE: ed->wdef.colours[5]=colour; break; case glass_EWCSCBACK: ed->wdef.colours[4]=colour; break; case glass_EWCHIGH: ed->wdef.colours[6]=colour; break; } } /* * void editWindow__btypeHelp(int hit[],void *handle) * * Use * Handles a help request for the button type menu. * * Parameters * int hit[] == the helpq info * void *handle == pointer to edit information */ static void editWindow__btypeHelp(int hit[],void *handle) { char *buf=buffer_find(); unused(handle); if (hit[0]) { help_startHelp(); sprintf(buf,"ewBTYPE%i",hit[0]-1); help_addLine(msgs_lookup("ewmhBTYPE"),msgs_lookup(buf)); help_endHelp(); } } /* * void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle) * * Use * Handles a click on one of the (many!) arrow buttons in the extends panel. */ typedef struct { BOOL xOrY; BOOL topOrBottom; glass_editWindow *ed; } editWindow__extArrowstr; static void editWindow__extArrows(dbox d,dbox_field f,int diff,void *handle) { editWindow__extArrowstr *a=handle; wimp_box *b=&a->ed->wdef.ex; int *v; unused(f); if (a->xOrY) v=(a->topOrBottom ? &b->x1 : &b->x0); else v=(a->topOrBottom ? &b->y1 : &b->y0); dbox_scanfield(d,glass_EWSBOTTOMLEFT,"%d,%d",&b->x0,&b->y0); dbox_scanfield(d,glass_EWSTOPRIGHT,"%d,%d",&b->x1,&b->y1); *v+=diff; editWindow__checkExtents(a->ed,!a->topOrBottom,a->topOrBottom,FALSE); } /* * void editWindow__panelHandler(dbox d,dbox_field f,void *handle) * * Use * Handles simple click events for the current panel in an edit dbox * * Parameters * dbox d == the panel's dbox handle * dbox_field f == the icon that was clicked * void *handle == pointer to edit information */ static void editWindow__panelHandler(dbox d,dbox_field f,void *handle) { glass_editWindow *ed=handle; int on; buttons_simpleArrow sa={0,9999,FALSE}; editWindow__extArrowstr eas; BOOL indon; switch (f) { case dbox_CLOSE: case dbox_HELP: case glass_EIOK: case glass_EICAN: editWindow__dboxHandler(ed->e.d,f,ed); return; break; } switch (ed->e.panel) { case glass_EWGADGETS: on=!dbox_selecticon(d,f,dbox_READSTATE); switch (f) { case glass_EWGOLD: if (on) { dbox_selecticon(d,glass_EWGOLD,TRUE); dbox_selecticon(d,glass_EWGNEW,FALSE); dbox_shadeicon(d,glass_EWGOTITLE,FALSE); dbox_shadeicon(d,glass_EWGOCLOSEBACK, !dbox_selecticon(d,glass_EWGOTITLE,dbox_READSTATE)); dbox_shadeicon(d,glass_EWGOHORIZ,FALSE); dbox_shadeicon(d,glass_EWGOVERT,FALSE); dbox_shadeicon(d,glass_EWGNTITLE,TRUE); dbox_shadeicon(d,glass_EWGNCLOSE,TRUE); dbox_shadeicon(d,glass_EWGNBACK,TRUE); dbox_shadeicon(d,glass_EWGNTOGGLE,TRUE); dbox_shadeicon(d,glass_EWGNRESIZE,TRUE); dbox_shadeicon(d,glass_EWGNHORIZ,TRUE); dbox_shadeicon(d,glass_EWGNVERT,TRUE); } break; case glass_EWGNEW: if (on) { dbox_selecticon(d,glass_EWGOLD,FALSE); dbox_selecticon(d,glass_EWGNEW,TRUE); dbox_shadeicon(d,glass_EWGOTITLE,TRUE); dbox_shadeicon(d,glass_EWGOCLOSEBACK,TRUE); dbox_shadeicon(d,glass_EWGOHORIZ,TRUE); dbox_shadeicon(d,glass_EWGOVERT,TRUE); dbox_shadeicon(d,glass_EWGNTITLE,FALSE); dbox_shadeicon(d,glass_EWGNCLOSE, !dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE)); dbox_shadeicon(d,glass_EWGNBACK, !dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE)); dbox_shadeicon(d,glass_EWGNTOGGLE, !(dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE) || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE))); dbox_shadeicon(d,glass_EWGNRESIZE, !(dbox_selecticon(d,glass_EWGNHORIZ,dbox_READSTATE) || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE))); dbox_shadeicon(d,glass_EWGNHORIZ,FALSE); dbox_shadeicon(d,glass_EWGNVERT,FALSE); } break; case glass_EWGOTITLE: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGNTITLE,on); dbox_shadeicon(d,glass_EWGOCLOSEBACK,!on); dbox_shadeicon(ed->e.d,glass_EWTDATA,!on); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,!on); break; case glass_EWGOCLOSEBACK: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGNCLOSE,on); dbox_selecticon(d,glass_EWGNBACK,on); break; case glass_EWGOHORIZ: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGNHORIZ,on); dbox_selecticon(d,glass_EWGNRESIZE, (on || dbox_selecticon(d,glass_EWGOVERT,dbox_READSTATE))); break; case glass_EWGOVERT: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGNVERT,on); dbox_selecticon(d,glass_EWGNTOGGLE,on); dbox_selecticon(d,glass_EWGNRESIZE, (on || dbox_selecticon(d,glass_EWGOHORIZ,dbox_READSTATE))); break; case glass_EWGNTITLE: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGOTITLE,on); dbox_shadeicon(d,glass_EWGNCLOSE,!on); dbox_shadeicon(d,glass_EWGNBACK,!on); dbox_shadeicon(d,glass_EWGNTOGGLE, !(on || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE))); dbox_shadeicon(ed->e.d,glass_EWTDATA,!on); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,!on); break; case glass_EWGNCLOSE: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGOCLOSEBACK, (on || dbox_selecticon(d,glass_EWGNBACK,dbox_READSTATE))); break; case glass_EWGNBACK: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGOCLOSEBACK, (on || dbox_selecticon(d,glass_EWGNCLOSE,dbox_READSTATE))); break; case glass_EWGNTOGGLE: case glass_EWGNRESIZE: dbox_selecticon(d,f,on); break; case glass_EWGNHORIZ: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGOHORIZ,on); dbox_shadeicon(d,glass_EWGNRESIZE, !(on || dbox_selecticon(d,glass_EWGNVERT,dbox_READSTATE))); break; case glass_EWGNVERT: dbox_selecticon(d,f,on); dbox_selecticon(d,glass_EWGOVERT,on); dbox_shadeicon(d,glass_EWGNRESIZE, !(on || dbox_selecticon(d,glass_EWGNHORIZ,dbox_READSTATE))); dbox_shadeicon(d,glass_EWGNTOGGLE, !(on || dbox_selecticon(d,glass_EWGNTITLE,dbox_READSTATE))); break; } break; case glass_EWTDATA: switch (f) { case glass_EIDINDIR: if (dbox_selecticon(d,f,dbox_READSTATE)) { if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDVALID,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING, !dbox_selecticon(ed->e.pd,glass_EIDVALID,dbox_READSTATE)); } dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE); } else { dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); } break; case glass_EIDINDUP: buttons_arrow(d,f,d,glass_EIDINDSIZE,0,+1,&sa); break; case glass_EIDINDDOWN: buttons_arrow(d,f,d,glass_EIDINDSIZE,0,-1,&sa); break; case glass_EIDVALID: dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,dbox_TOGGLESTATE); break; case glass_EIDMINIMISE: dbox_clickicon(d,f); dbox_getfield(d,glass_EIDDATA,ed->data,256); dbox_setfield(d,glass_EIDINDSIZE,"%i",strlen(ed->data)+1); dbox_unclick(); break; case glass_EIDTEXT: if (dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE); if (dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDVALID,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING, !dbox_selecticon(ed->e.pd,glass_EIDVALID,dbox_READSTATE)); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,FALSE); } else { dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); } } else { dbox_shadeicon(ed->e.pd,glass_EIDVALID,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDVALSTRING,TRUE); if (dbox_selecticon(d,glass_EIDSPRITE,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE); indon=dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,!indon); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,!indon); } else { dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); } } break; case glass_EIDSPRITE: if (dbox_selecticon(ed->e.pd,glass_EIDSPRITE,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDDATA,FALSE); dbox_shadeicon(ed->e.pd,glass_EIDINDIR,FALSE); indon=dbox_selecticon(d,glass_EIDINDIR,dbox_READSTATE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,!indon); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,!indon); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,!indon); } else if (!dbox_selecticon(ed->e.pd,glass_EIDTEXT,dbox_READSTATE)) { dbox_shadeicon(ed->e.pd,glass_EIDDATA,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDIR,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDSIZE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDUP,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDDOWN,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDMINIMISE,TRUE); dbox_shadeicon(ed->e.pd,glass_EIDINDPART,TRUE); } break; } break; case glass_EWTAPPEAR: switch (f) { case glass_EIAFONT: if (dbox_selecticon(d,f,dbox_READSTATE) || fontMenu_createFontMenu(FALSE)) { dbox_selecticon(d,f,dbox_TOGGLESTATE); dbox_shadeicon(d,glass_EIAFONTNAME,dbox_TOGGLESTATE); dbox_shadeicon(d,glass_EIAFONTMENU,dbox_TOGGLESTATE); dbox_shadeicon(d,glass_EIAFSIZEUP,dbox_TOGGLESTATE); dbox_shadeicon(d,glass_EIAFSIZEDOWN,dbox_TOGGLESTATE); dbox_shadeicon(d,glass_EIAFSIZEWRITE,dbox_TOGGLESTATE); } break; case glass_EIAFSIZEUP: buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,+1,&sa); break; case glass_EIAFSIZEDOWN: buttons_arrow(d,f,d,glass_EIAFSIZEWRITE,0,-1,&sa); break; } break; case glass_EWWORKAREA: eas.ed=ed; switch (f) { case glass_EWSTOPUP: eas.xOrY=FALSE; eas.topOrBottom=TRUE; buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas); break; case glass_EWSTOPDOWN: eas.xOrY=FALSE; eas.topOrBottom=TRUE; buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas); break; case glass_EWSLEFTLEFT: eas.xOrY=TRUE; eas.topOrBottom=FALSE; buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas); break; case glass_EWSLEFTRIGHT: eas.xOrY=TRUE; eas.topOrBottom=FALSE; buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas); break; case glass_EWSRIGHTLEFT: eas.xOrY=TRUE; eas.topOrBottom=TRUE; buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dx(),&eas); break; case glass_EWSRIGHTRIGHT: eas.xOrY=TRUE; eas.topOrBottom=TRUE; buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dx(),&eas); break; case glass_EWSBOTTOMUP: eas.xOrY=FALSE; eas.topOrBottom=FALSE; buttons_arrow(d,f,d,0,editWindow__extArrows,+wimpt_dy(),&eas); break; case glass_EWSBOTTOMDOWN: eas.xOrY=FALSE; eas.topOrBottom=FALSE; buttons_arrow(d,f,d,0,editWindow__extArrows,-wimpt_dy(),&eas); break; case glass_EWSEXTLOCK: dbox_clickicon(d,f); ed->wdef.ex.x0=ed->w->def->desc.w.scx; ed->wdef.ex.x1=ed->w->def->desc.w.scx+ ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0; ed->wdef.ex.y0=ed->w->def->desc.w.scy+ ed->w->def->desc.w.box.y0-ed->w->def->desc.w.box.y1; ed->wdef.ex.y1=ed->w->def->desc.w.scy; editWindow__checkExtents(ed,TRUE,TRUE,FALSE); dbox_unclick(); break; case glass_EWSTLLARGE: dbox_clickicon(d,f); ed->wdef.ex.x0=(ed->wdef.ex.x0 - 2000) / 2000 * 2000; ed->wdef.ex.y1=(ed->wdef.ex.y1 + 2000) / 2000 * 2000; editWindow__checkExtents(ed,TRUE,TRUE,FALSE); dbox_unclick(); break; case glass_EWSBRLARGE: dbox_clickicon(d,f); ed->wdef.ex.x1=(ed->wdef.ex.x1 + 2000) / 2000 * 2000; ed->wdef.ex.y0=(ed->wdef.ex.y0 - 2000) / 2000 * 2000; editWindow__checkExtents(ed,TRUE,TRUE,FALSE); dbox_unclick(); break; case glass_EWSMINWSET: dbox_clickicon(d,f); dbox_setfield(d,glass_EWSMINWIDTH,"%i", ed->w->def->desc.w.box.x1-ed->w->def->desc.w.box.x0); dbox_unclick(); break; case glass_EWSMINHSET: dbox_clickicon(d,f); dbox_setfield(d,glass_EWSMINHEIGHT,"%i", ed->w->def->desc.w.box.y1-ed->w->def->desc.w.box.y0); dbox_unclick(); break; } break; } } /* * BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle) * * Use * Handles the more wierd events for a particular panel. * * Parameters * dbox d == the dbox handle of the panel * wimp_eventstr *e == the event to look at * void *handle == pointer to the current edit * * Returns * TRUE if the event is dead (long live the event...) */ static BOOL editWindow__panelRaw(dbox d,wimp_eventstr *e,void *handle) { BOOL handled=FALSE; glass_editWindow *ed=handle; if (e->e==wimp_EKEY) { switch (e->data.key.chcode) { case akbd_UpK+akbd_Sh: editWindow__nextPanel(ed,-1); handled=TRUE; break; case akbd_DownK+akbd_Sh: editWindow__nextPanel(ed,+1); handled=TRUE; break; } } if (!handled) switch (ed->e.panel) { case glass_EWTDATA: /* Nothin' doing */ break; case glass_EWTAPPEAR: switch (e->e) { case wimp_EBUT: switch (e->data.but.m.i) { case glass_EIAFONTNAME: menu_make(editWindow__fontMaker,editWindow__fontHandler, editWindow__fontHelp,ed); handled=TRUE; break; case glass_EIAFONTMENU: dbox_clickicon(d,glass_EIAFONTMENU); menu_make(editWindow__fontMaker,editWindow__fontHandler, editWindow__fontHelp,ed); dbox_unclick(); handled=TRUE; break; } break; } break; case glass_EWBTYPE: switch (e->e) { case wimp_EBUT: switch (e->data.but.m.i) { case glass_EWBBTDISP: menu_make(editWindow__btypeMaker,editWindow__btypeHandler, editWindow__btypeHelp,ed); handled=TRUE; break; case glass_EWBBTMENU: dbox_clickicon(d,glass_EWBBTMENU); menu_make(editWindow__btypeMaker,editWindow__btypeHandler, editWindow__btypeHelp,ed); dbox_unclick(); handled=TRUE; break; } break; } break; case glass_EWCOLOURS: switch (e->e) { case wimp_EBUT: switch (e->data.but.m.i) { case glass_EWCTBFORE: colSelect(ed->e.pd,glass_EWCTBFORE,e->data.but.m.bbits, msgs_lookup("ewTBFG"),TRUE,editWindow__colProc,ed); break; case glass_EWCTBBACK: colSelect(ed->e.pd,glass_EWCTBBACK,e->data.but.m.bbits, msgs_lookup("ewTBBG"),FALSE,editWindow__colProc,ed); break; case glass_EWCWAFORE: colSelect(ed->e.pd,glass_EWCWAFORE,e->data.but.m.bbits, msgs_lookup("ewWAFG"),FALSE,editWindow__colProc,ed); break; case glass_EWCWABACK: colSelect(ed->e.pd,glass_EWCWABACK,e->data.but.m.bbits, msgs_lookup("ewWABG"),TRUE,editWindow__colProc,ed); break; case glass_EWCSCFORE: colSelect(ed->e.pd,glass_EWCSCFORE,e->data.but.m.bbits, msgs_lookup("ewSCFG"),FALSE,editWindow__colProc,ed); break; case glass_EWCSCBACK: colSelect(ed->e.pd,glass_EWCSCBACK,e->data.but.m.bbits, msgs_lookup("ewSCBG"),FALSE,editWindow__colProc,ed); break; case glass_EWCHIGH: colSelect(ed->e.pd,glass_EWCHIGH,e->data.but.m.bbits, msgs_lookup("ewTBHI"),FALSE,editWindow__colProc,ed); } break; } break; } return (FALSE); } /*----- External routines -------------------------------------------------*/ /* * void editWindow_windowMoved(glass_windPointer *w) * * Use * Informs an edit dialogue that a window has been moved. * * Parameters * glass_windPointer *w == the window containing the icon */ void editWindow_windowMoved(glass_windPointer *w) { glass_editWindow *ed=w->edit; if (!ed) return; editWindow__checkExtents(ed,FALSE,FALSE,TRUE); } /* * void editWindow_readData(glass_windPointer *w) * * Use * Forces a re-read of the title data for the given window edit. Since * this is called on setting up an edit and cancelling one, it also does * some * * Parameters * glass_windPointer *w == the window containing the icon */ void editWindow_readData(glass_windPointer *w) { glass_editWindow *ed=w->edit; if (!ed) return; ed->wdef.title=ed->w->def->desc.w.title; if (ed->wdef.titleflags & wimp_INDIRECT) { utils_ctermToNterm(ed->wdef.title.indirecttext.buffer); strcpy(ed->data,ed->wdef.title.indirecttext.buffer); ed->indLen=ed->wdef.title.indirecttext.bufflen; if (ed->wdef.titleflags & wimp_ITEXT && ed->wdef.title.indirecttext.validstring!=(char *)-1) { utils_ctermToNterm(ed->wdef.title.indirecttext.validstring); strcpy(ed->valid,ed->wdef.title.indirecttext.validstring); ed->hasValid=TRUE; } else { ed->valid[0]=0; ed->hasValid=FALSE; } } else { ed->data[12]=0; memcpy(ed->data,ed->wdef.title.text,12); utils_ctermToNterm(ed->data); ed->valid[0]=0; ed->indLen=12; } if (ed->wdef.colours[0]==255) /* If no system area */ { dbox_shadeicon(ed->e.d,glass_EWTDATA,TRUE); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,TRUE); dbox_shadeicon(ed->e.d,glass_EWGADGETS,TRUE); if (ed->e.panel==glass_EWTDATA || ed->e.panel==glass_EWTAPPEAR || ed->e.panel==glass_EWGADGETS) editWindow__setPanel(ed,-1); } else if ((tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,26)) || (!tst(ed->wdef.flags,31) && !tst(ed->wdef.flags,0))) { dbox_shadeicon(ed->e.d,glass_EWTDATA,TRUE); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,TRUE); dbox_shadeicon(ed->e.d,glass_EWGADGETS,FALSE); if (ed->e.panel==glass_EWTDATA || ed->e.panel==glass_EWTAPPEAR) editWindow__setPanel(ed,-1); } else { dbox_shadeicon(ed->e.d,glass_EWTDATA,FALSE); dbox_shadeicon(ed->e.d,glass_EWTAPPEAR,FALSE); dbox_shadeicon(ed->e.d,glass_EWGADGETS,FALSE); } if (ed->e.panel==glass_EWTDATA) editWindow__setupPanel(ed); } /* * void editWindow_close(glass_windPointer *w) * * Use * Closes an edit window * * Parameters * glass_windPointer *w == the window containing the icon */ void editWindow_close(glass_windPointer *w) { glass_editWindow *ed=w->edit; if (ed) { if (ed->e.pd) dbox_deleteNoUpdate(ed->e.pd); pane_delete(ed->e.p); dbox_deleteNoUpdate(ed->e.d); ed->w->edit=0; mem_free(ed); } } /* * void editWindow(glass_windPointer *w) * * Use * Edits the given window in a dialogue box. * * Parameters * glass_windPointer *w == the window to edit */ void editWindow(glass_windPointer *w) { glass_editWindow *ed; os_regset r; if (w->edit) { dbox_display(w->edit->e.d,TRUE); pane_front(w->edit->e.p); return; } mem_useUser(indir_alloc,indir_free); ed=mem_alloc(sizeof(glass_editWindow)); if (!ed) { mem_useMalloc(); werr(FALSE,msgs_lookup("ewNEM")); return; } if (ed->e.d=dbox_create("editWindow"),!ed->e.d) { mem_free(ed); mem_useMalloc(); return; } if (ed->e.p=pane_create(dbox_syshandle(ed->e.d)),!ed->e.p) { dbox_delete(ed->e.d); mem_useMalloc(); mem_free(ed); return; } ed->w=w; ed->wdef=w->def->desc.w; w->edit=ed; ed->e.panel=0; /* --- Set up icon data now --- */ editWindow_readData(w); if (ed->wdef.titleflags & wimp_IFONT) { r.r[0]=ed->wdef.titleflags >> 24; r.r[1]=(int)(ed->font); wimpt_noerr(os_swix(XFont_ReadDefn,&r)); utils_ctermToNterm(ed->font); ed->fontSize=r.r[2]/16; } else { strcpy(ed->font,"Homerton.Medium"); ed->fontSize=12; } /* --- Now do handlers, and final setting up --- */ dbox_setfield(ed->e.d,glass_EWIDWRITE,"%s",w->id); dbox_setfield(ed->e.d,glass_EWFILEDISP,"%.%s",w->t->filename); dbox_eventHandler(ed->e.d,editWindow__dboxHandler,ed); dbox_rawEventHandler(ed->e.d,editWindow__dboxRaw,ed); dbox_openDisplaced(ed->e.d); editWindow__setPanel(ed,glass_EWCHARS); mem_useMalloc(); }