/*

Directory Opus 4
Original GPL release version 4.12
Copyright 1993-2000 Jonathan Potter

This program 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
of the License, or (at your option) any later version.

This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

All users of Directory Opus 4 (including versions distributed
under the GPL) are entitled to upgrade to the latest version of
Directory Opus version 5 at a reduced price. Please see
http://www.gpsoft.com.au for more information.

The release of Directory Opus 4 under the GPL in NO WAY affects
the existing commercial status of Directory Opus 5.

*/

#include "config.h"

char old_general_font[30];

doscreenconfig()
{
    ULONG class;
    USHORT code,gadgetid,qual;
    struct ConfigUndo *undo;
    struct Gadget *gad;
    int mode=-1,realpen=1,x,y,cursel=-1,a,b,fontnum=0,arrowact=0,c;
    char *fg=NULL,*bg=NULL,buf[256],*ptr;
    struct DOpusListView *view;
    struct Screen scrbuf;

    showconfigscreen(CFG_SCREEN);
    undo=makeundo(UNDO_MAIN);
    curmode=NULL;
    if (version2) fontsizelistview.h=52;

    FOREVER {
        Wait(1<<Window->UserPort->mp_SigBit);
        while (IMsg=getintuimsg()) {
            if (!(mode==SCREEN_SCREENMODE &&
                (view=ListViewIDCMP(&screenmodeview,IMsg))!=(struct DOpusListView *)-1) &&
                !(mode==SCREEN_FONTS &&
                (view=ListViewIDCMP(&fontplacelist,IMsg))!=(struct DOpusListView *)-1) &&
                !(mode==SCREEN_PALETTE &&
                (view=ListViewIDCMP(&palettelist,IMsg))!=(struct DOpusListView *)-1)) {
                class=IMsg->Class; code=IMsg->Code; qual=IMsg->Qualifier;
                x=IMsg->MouseX; y=IMsg->MouseY;
                if (class==GADGETUP || class==GADGETDOWN) {
                    gad=(struct Gadget *)IMsg->IAddress;
                    gadgetid=gad->GadgetID;
                }
                ReplyMsg((struct Message *)IMsg);
                switch (class) {
                    case IDCMP_MENUPICK:
                        if (code==MENUNULL) break;
                        if (mode>-1) {
                            select_gadget(&maingad[mode],0);
                            removescreenedit(mode);
                            mode=realpen=cursel=-1;
                        }
                        switch ((a=ITEMNUM(code))) {
                            case 0:
                            case 1:
                                if (doload(CFG_SCREEN,a)) {
                                    if (config->scrdepth!=screen_depth)
                                        close_screen();
                                    open_screen();
                                    showconfigscreen(CFG_SCREEN);
                                }
                                break;
                        }
                        break;

                    case IDCMP_MOUSEBUTTONS:
                        if (code==SELECTDOWN) {
                            if (mode==SCREEN_PALETTE) {
                                if (x>x_off+297 && y>y_off+33 && x<x_off+514 && y<y_off+46) {
                                    for (a=0;a<(1<<((screen_depth > 4) ? 4 : screen_depth));a++) {
                                        if (x>=palettegad_xy[a][0] && x<=palettegad_xy[a][2] &&
                                            y>=palettegad_xy[a][1] && y<=palettegad_xy[a][3]) {
                                            realpen=screen_pens[a].pen;
                                            showcolourvals(realpen,1);
                                            showpalettegad(a);
                                            break;
                                        }
                                    }
                                }
                            }
                            else if (mode==SCREEN_ARROWS) {
                                for (a=0;a<3;a++) {
                                    if (x>x_off+182+(a*129) && x<x_off+307+(a*129) &&
                                        y>y_off+32 && y<y_off+89) {
                                        if (arrowact!=a) {
                                            showarrowborders(a,arrowact);
                                            arrowact=a;
                                            DoCycleGadget(&arrowgadgets[7],Window,arrowtypetxt,arrowact);
                                            fixarrowgads(arrowact);
                                            break;
                                        }
                                    }
                                }
                            }
                            else if (mode==SCREEN_COLOURS && fg && bg) {
                                a=*fg; b=*bg;
                                if (docolourgad(rp,x_off+208,y_off+33,x,y,
                                    (cursel==COLBIT_3DBOXES)?NULL:cfg_string[STR_EXAMPLE],&a,&b,CFG_GADGET)) {
                                    *fg=a; *bg=b;
                                    if (cursel==COLBIT_3DBOXES) {
                                        showfuncob(rp,cfg_string[STR_EXAMPLE],1,0,CFG_GADGET,x_off+302,y_off+23);
                                        showscreencolours(COLOURS_ALL,NULL,NULL,4);
                                    }
                                    else showscreencolours((1<<cursel),NULL,NULL,0);
                                }
                                else {
                                    for (a=0;;a++) {
                                        if (coloursel[a].item==-1) break;
                                        if (x>=x_off+coloursel[a].x1 && x<=x_off+coloursel[a].x2 &&
                                            y>=y_off+coloursel[a].y1 && y<=y_off+coloursel[a].y2) {
                                            if (version2 || (a!=COLBIT_STRINGS && a!=COLBIT_SELSTRINGS)) {
                                                cursel=coloursel[a].item;
                                                showscreencolours((1<<cursel),&fg,&bg,0);
                                                showcolourscycle(*fg,*bg,cursel);
                                                setupcolourbox(rp,x_off+208,y_off+33,*fg,*bg);
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case IDCMP_RAWKEY:
                        if ((code>=0x60 && code<=0x67) || code&0x80) break;
                        buf[0]=0;
                        RawkeyToStr(code,qual,NULL,buf,10);
                        switch (LToUpper(buf[0])) {
                            case 'R':
                                if (mode==SCREEN_PALETTE) ActivateStrGad(&palettegads[3],Window);
                                break;
                            case 'G':
                                if (mode==SCREEN_PALETTE) ActivateStrGad(&palettegads[4],Window);
                                break;
                            case 'B':
                                if (mode==SCREEN_PALETTE) ActivateStrGad(&palettegads[5],Window);
                                break;
                            case 'W':
                                if (mode==SCREEN_SCREENMODE) ActivateStrGad(&screenmodegads[0],Window);
                                break;
                            case 'H':
                                if (mode==SCREEN_SCREENMODE) ActivateStrGad(&screenmodegads[1],Window);
                                break;
                            case 'C':
                                if (mode==SCREEN_SCREENMODE) ActivateStrGad(&screenmodegads[2],Window);
                                break;
                        }
                        break;

                    case IDCMP_GADGETDOWN:
                        if (gadgetid>=PALETTE_SLIDER && gadgetid<PALETTE_SLIDER+3) {
                            updatecolourvals(realpen,0);
                            FOREVER {
                                Wait(1<<Window->UserPort->mp_SigBit);
                                while (IMsg=getintuimsg()) {
                                    class=IMsg->Class;
                                    ReplyMsg((struct Message *)IMsg);
                                    if (class==GADGETUP) break;
                                    if (class==MOUSEMOVE) updatecolourvals(realpen,0);
                                }
                                if (class==GADGETUP) {
                                    updatecolourvals(realpen,1);
                                    break;
                                }
                            }
                        }
                        else if (gadgetid>=ARROWBASE+3 && gadgetid<ARROWBASE+7) {
                            gadgetid-=ARROWBASE+3; a=0;
                            FOREVER {
                                if (IntuitionBase->ActiveWindow!=Window ||
                                    !(gad->Flags&SELECTED)) break;
                                if ((arrowact==0 && gadgetid>1) ||
                                    (arrowact>0 && gadgetid<2)) {
                                    b=config->arrowsize[arrowact];
                                    if ((arrowact==0 && gadgetid==2) ||
                                        (arrowact>0 && gadgetid==0))
                                        ++config->arrowsize[arrowact];
                                    else --config->arrowsize[arrowact];
                                    switch (arrowact) {
                                        case 0:
                                            showupdownslider();
                                            break;
                                        case 1:
                                            showleftrightslider();
                                            break;
                                        case 2:
                                            showstringgadget();
                                            break;
                                    }
                                    if (b==config->arrowsize[arrowact]) a=-1;
                                }
                                else {
                                    switch (arrowact) {
                                        case 0:
                                            b=config->sliderwidth;
                                            if (gadgetid==1) config->sliderwidth-=2;
                                            else config->sliderwidth+=2;
                                            showupdownslider();
                                            if (b==config->sliderwidth) {
                                                a=-1;
                                                break;
                                            }
                                            break;
                                        case 1:
                                            b=config->sliderheight;
                                            if (gadgetid==3) config->sliderheight-=2;
                                            else config->sliderheight+=2;
                                            showleftrightslider();
                                            if (b==config->sliderheight) {
                                                a=-1;
                                                break;
                                            }
                                            break;
                                        case 2:
                                            b=config->stringheight;
                                            if (gadgetid==3) config->stringheight-=2;
                                            else config->stringheight+=2;
                                            showstringgadget();
                                            if (b==config->stringheight) {
                                                a=-1;
                                                break;
                                            }
                                            break;
                                    }
                                }
                                if (a==-1) break;
                                else if (a==0) {
                                    Delay(5);
                                    a=1;
                                }
                                else Delay(1);
                                while (IMsg=getintuimsg()) {
                                    class=IMsg->Class;
                                    ReplyMsg((struct Message *)IMsg);
                                    if (class==GADGETUP) break;
                                }
                                if (class==GADGETUP) break;
                            }
                        }
                        else if (gadgetid>=ARROWBASE && gadgetid<ARROWBASE+3) {
                            gadgetid-=ARROWBASE;
                            if (config->arrowpos[arrowact]!=gadgetid) {
                                config->arrowpos[arrowact]=gadgetid;
                                if (arrowact==0) showupdownslider();
                                else if (arrowact==1) showleftrightslider();
                                else showstringgadget();
                            }
                            fixarrowgads(arrowact);
                        }
                        break;

                    case IDCMP_GADGETUP:
                        if (mode==SCREEN_GENERAL && gadgetid>GAD_BASE) {
                            config->generalscreenflags=processtickgad(scr_generalgadgets,config->generalscreenflags,gadgetid-GAD_BASE,-1);
                            break;
                        }
                        if (gadgetid<SCREEN_OKAY) {
                            if (mode==gadgetid) {
                                removescreenedit(mode);
                                mode=realpen=cursel=-1;
                                makehelpname((char *)-1);
                                doscreentitle(cfg_string[STR_SCREEN_SCREEN]);
                                break;
                            }
                            if (mode>-1) {
                                if (mode==SCREEN_SCREENMODE || mode==SCREEN_FONTS)
                                    select_gadget(&maingad[gadgetid],0);
                                select_gadget(&maingad[mode],0);
                                removescreenedit(mode);
                                if (mode==SCREEN_SCREENMODE || mode==SCREEN_FONTS)
                                    select_gadget(&maingad[gadgetid],1);
                                mode=realpen=cursel=-1;
                                makehelpname((char *)-1);
                            }
                            makehelpname(screengadgets[gadgetid]);
                            doscreentitle(currenthelpname);
                        }
                        if (gadgetid>=PALETTE_STRING && gadgetid<PALETTE_STRING+3) {
                            updatecolourvals(realpen,-1);
                            if (code!=0x9) getnextgadget(gad);
                        }
                        else switch (gadgetid) {
                            case FONT_SIZE:
                                if (!version2) break;
                                RefreshStrGad(&fontsizegadget,Window);
                                a=atoi(fontsize_buf);
                                c=config->fontsizes[fontnum];
                                config->fontsizes[fontnum]=a;
                                for (b=0;b<fontsizelistview.count;b++)
                                    if (atoi(fontsizelistview.items[b])==a) break;
                                if (b<fontsizelistview.count) {
                                    fontsizelistview.itemselected=b;
                                    if (b<fontsizelistview.topitem ||
                                        b>fontsizelistview.topitem+fontsizelistview.lines-1)
                                        fontsizelistview.topitem=b;
                                    RefreshListView(&fontsizelistview,1);
                                    fontsize_buf[0]=0;
                                    RefreshStrGad(&fontsizegadget,Window);
                                }
                                else {
                                    fontsizelistview.itemselected=-1;
                                    RefreshListView(&fontsizelistview,1);
                                }
                                if (c!=a) dofontdemo(config->fontbufs[fontnum],config->fontsizes[fontnum]);
                                break;

                            case ARROWCYCLE:
                                a=arrowact;
                                if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
                                    if ((--arrowact)<0) arrowact=2;
                                }
                                else if ((++arrowact)==3) arrowact=0;
                                showarrowborders(arrowact,a);
                                DoCycleGadget(&arrowgadgets[7],Window,arrowtypetxt,arrowact);
                                fixarrowgads(arrowact);
                                break;

                            case SCREEN_SLIDER_LEFTCYCLE:
                                config->slider_pos^=1;
                                show_slider_setup(182,32,0);
                                break;

                            case SCREEN_SLIDER_RIGHTCYCLE:
                                config->slider_pos^=2;
                                show_slider_setup(373,32,1);
                                break;

                            case SCREEN_PALETTE:
                                realpen=screen_pens[1].pen;
                            case SCREEN_FONTS:
                                fontnum=FONT_CLOCK;
                            case SCREEN_ARROWS:
                                arrowact=0;
                            case SCREEN_COLOURS:
                            case SCREEN_GENERAL:
                            case SCREEN_SCREENMODE:
                            case SCREEN_SLIDERS:
                                mode=gadgetid;
                                makescreenedit(mode);
                                if (gadgetid==SCREEN_COLOURS) {
                                    cursel=0;
                                    fg=&config->statusfg; bg=&config->statusbg;
                                }
                                break;

                            case COLOURS_SELECT:
                                if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
                                    if ((--cursel)<0) cursel=(version2)?COLBIT_SELSTRINGS:COLBIT_3DBOXES;
                                }
                                else {
                                    if (!coloursgadgets[++cursel] ||
                                        (!version2 && cursel==COLBIT_STRINGS)) cursel=0;
                                }
                                showscreencolours((1<<cursel),&fg,&bg,0);
                                showcolourscycle(*fg,*bg,cursel);
                                setupcolourbox(rp,x_off+208,y_off+33,*fg,*bg);
                                break;

                            case SCREENMODE_WIDTH:
                                a=atoi(screenwidth_buf);
                                if (a%2) lsprintf(screenwidth_buf,"%ld",a+1);
                                CheckNumGad(&screenmodegads[SCREENMODE_WIDTH-300],Window,curmode->minw,curmode->maxw);
                                config->scrw=atoi(screenwidth_buf);
                                config->scr_winw=config->scrw;
                                if (code!=0x9) getnextgadget(gad);
                                break;

                            case SCREENMODE_HEIGHT:
                                CheckNumGad(&screenmodegads[SCREENMODE_HEIGHT-300],Window,curmode->minh,curmode->maxh);
                                config->scrh=atoi(screenheight_buf);
                                config->scr_winh=config->scrh;
                                if (code!=0x9) getnextgadget(gad);
                                break;

                            case SCREENMODE_DEPTH:
                                a=atoi(screendepth_buf);
                                for (b=curmode->maxdepth;b>=2;b--) {
                                    if (a>=(1<<b)) {
                                        a=b;
                                        break;
                                    }
                                }
                                if (b<=2) a=2;

                            case SCREENMODE_SLIDER:
                                if (gadgetid==SCREENMODE_SLIDER)
                                    a=GetSliderPos(&screenmodegads[SCREENMODE_SLIDER-300],curmode->maxdepth-1,1)+2;
                                if (a>curmode->maxdepth) a=curmode->maxdepth;
                                else if (a<2) a=2;
                                lsprintf(screendepth_buf,"%ld",(1<<a));
                                RefreshStrGad(&screenmodegads[SCREENMODE_DEPTH-300],Window);
                                config->scrdepth=a;
                                FixSliderPot(Window,&screenmodegads[SCREENMODE_SLIDER-300],config->scrdepth-2,curmode->maxdepth-1,1,2);
                                if (gadgetid==SCREENMODE_DEPTH && code!=0x9) getnextgadget(gad);
                                break;

                            case SCREENMODE_DEFWIDTH:
                                if (screenmodegads[SCREENMODE_DEFWIDTH-300].Flags&SELECTED) {
                                    config->screenflags|=SCRFLAGS_DEFWIDTH;
                                    EnableGadget(&screenmodegads[SCREENMODE_WIDTH-300],rp,0,0);
                                    config->scrw=curmode->defw;
                                    config->scr_winw=config->scrw;
                                    fixmodegads(curmode);
                                }
                                else config->screenflags&=~SCRFLAGS_DEFWIDTH;
                                fixdefaultgads(curmode);
                                fixmodegads(curmode);
                                break;

                            case SCREENMODE_DEFHEIGHT:
                                if (screenmodegads[SCREENMODE_DEFHEIGHT-300].Flags&SELECTED) {
                                    config->screenflags|=SCRFLAGS_DEFHEIGHT;
                                    EnableGadget(&screenmodegads[SCREENMODE_HEIGHT-300],rp,0,0);
                                    config->scrh=curmode->defh;
                                    config->scr_winh=config->scrh;
                                    fixmodegads(curmode);
                                }
                                else config->screenflags&=~SCRFLAGS_DEFHEIGHT;
                                fixdefaultgads(curmode);
                                fixmodegads(curmode);
                                break;

                            case SCREENMODE_HALFHEIGHT:
                                if (screenmodegads[SCREENMODE_HALFHEIGHT-300].Flags&SELECTED)
                                    config->screenflags|=SCRFLAGS_HALFHEIGHT;
                                else config->screenflags&=~SCRFLAGS_HALFHEIGHT;
                                break;

                            case SCREEN_CANCEL:
                                doundo(undo,UNDO_MAIN);
                                if (config->scrdepth!=screen_depth) {
                                    if (mode>-1) {
                                        removescreenedit(mode);
                                        mode=-1;
                                    }
                                    close_screen();
                                }
                                open_screen();
                            case SCREEN_OKAY:
                                if (mode>-1) removescreenedit(mode);
                                doundo(undo,0);
                                return((gadgetid==SCREEN_OKAY));
                        }
                        break;
                }
            }
            else if (view) {
                if (mode==SCREEN_FONTS) {
                    if (view->listid==1) {
                        if (version2) {
                            fontsize_buf[0]=0;
                            RefreshStrGad(&fontsizegadget,Window);
                        }
                        fontnum=fontplacevals[view->itemselected];
                        initfontlist(fontnum,1,fontplaceflags[fontnum]);
                    }
                    else if (fontnum>=0 && fontnum<NUMFONTS) {
                        if (view->listid==2) {
                            strcpy(buf,config->fontbufs[fontnum]);
                            if ((ptr=strstri(buf,".font"))) *ptr=0;
                            if (strcmp(buf,view->items[view->itemselected])) {
                                if (version2) {
                                    fontsize_buf[0]=0;
                                    RefreshStrGad(&fontsizegadget,Window);
                                }
                                strcpy(config->fontbufs[fontnum],view->items[view->itemselected]);
                                config->fontsizes[fontnum]=initfontlist(fontnum,0,fontplaceflags[fontnum]);
                                StrConcat(config->fontbufs[fontnum],".font",40);
                            }
                        }
                        else if (view->listid==3) {
                            if (version2) {
                                fontsize_buf[0]=0;
                                RefreshStrGad(&fontsizegadget,Window);
                            }
                            a=config->fontsizes[fontnum];
                            config->fontsizes[fontnum]=atoi(view->items[view->itemselected]);
                            if (a!=config->fontsizes[fontnum])
                                dofontdemo(config->fontbufs[fontnum],config->fontsizes[fontnum]);
                        }
                    }
                }
                else if (view->listid==1) {
                    curmode=showdisplaydesc();
                    fixdefaultgads(curmode);
                    if (screenmodegads[SCREENMODE_DEFWIDTH-300].Flags&SELECTED) {
                        config->scrw=curmode->defw;
                        config->scr_winw=config->scrw;
                        EnableGadget(&screenmodegads[SCREENMODE_WIDTH-300],rp,0,0);
                    }
                    if (screenmodegads[SCREENMODE_DEFHEIGHT-300].Flags&SELECTED) {
                        config->scrh=curmode->defh;
                        config->scr_winh=config->scrh;
                        EnableGadget(&screenmodegads[SCREENMODE_HEIGHT-300],rp,0,0);
                    }
                    fixmodegads(curmode);
                    if (config->screenflags&SCRFLAGS_DEFWIDTH)
                        DisableGadget(&screenmodegads[SCREENMODE_WIDTH-300],rp,0,0);
                    if (config->screenflags&SCRFLAGS_DEFHEIGHT)
                        DisableGadget(&screenmodegads[SCREENMODE_HEIGHT-300],rp,0,0);
                    config->screenmode=curmode->mode;

                    if (curmode->mode==MODE_PUBLICSCREENUSE /* ||
                        curmode->mode==MODE_PUBLICSCREENCLONE */ ) {
                        for (a=0;a<80;a++) {
                            if (!curmode->name[a]) break;
                            if (a>0 && curmode->name[a-1]==':') {
                                if ((strcmp(&curmode->name[a],cfg_string[STR_SCREEN_MODE_USE]))==0)
                                    break;
/*
                                if ((strcmp(&curmode->name[a],cfg_string[STR_SCREEN_MODE_CLONE]))==0)
                                    break;
*/
                            }
                        }
                        if (a>0 && curmode->name[a]) {
                            strncpy(config->pubscreen_name,curmode->name,a);
                            config->pubscreen_name[a-1]=0;
                        }
                    }
                    else config->pubscreen_name[0]=0;

                    if (version2<OSVER_39) {
                        if (config->screenmode==MODE_WORKBENCHUSE ||
                            curmode->mode==MODE_PUBLICSCREENUSE)
                            DisableGadget(&maingad[SCREEN_PALETTE],rp,2,1);
                        else EnableGadget(&maingad[SCREEN_PALETTE],rp,2,1);
                    }
                }
                else if (view->listid==2) {
                    if (view->itemselected>=0 && view->itemselected<13) {
                        if (view->itemselected==0)
                            load_palette(Screen,palette_backup,1<<((screen_depth > 4) ? 4 : screen_depth));
                        else if (view->itemselected==1)
                            loadrgb4(Screen,def_dopus_palette,1<<((screen_depth > 4) ? 4 : screen_depth));
                        else if (view->itemselected==3) {
                            ULONG *palbuf;
                            int wbdepth,size;

                            GetWBScreen(&scrbuf);
                            wbdepth=1<<scrbuf.RastPort.BitMap->Depth;
                            size=(wbdepth*3)*sizeof(ULONG);
                            if (palbuf=AllocMem(size,MEMF_CLEAR)) {
                                ULONG palette[48];

                                get_palette(&scrbuf,palbuf,wbdepth);
                                for (a=0;a<4;a++) {
                                    palette[(a*3)]=palbuf[(a*3)];
                                    palette[(a*3)+1]=palbuf[(a*3)+1];
                                    palette[(a*3)+2]=palbuf[(a*3)+2];
                                }
                                for (a=4;a<16;a++) {
                                    palette[(a*3)]=config->new_palette[(a*3)];
                                    palette[(a*3)+1]=config->new_palette[(a*3)+1];
                                    palette[(a*3)+2]=config->new_palette[(a*3)+2];
                                }
                                if (wbdepth>4 && screen_depth>2) {
                                    int a,endwb,endme;

                                    endwb=wbdepth-4;
                                    endme=(1<<screen_depth)-4;

                                    for (a=0;a<4;a++) {
                                        palette[((a+endme)*3)]=palbuf[((a+endwb)*3)];
                                        palette[((a+endme)*3)+1]=palbuf[((a+endwb)*3)+1];
                                        palette[((a+endme)*3)+2]=palbuf[((a+endwb)*3)+2];
                                    }
                                }
                                load_palette(Screen,palette,1<<((screen_depth > 4) ? 4 : screen_depth));
                                FreeMem(palbuf,size);
                            }
                        }
                        else loadrgb4(Screen,defpalettes[view->itemselected-2],4);
                        get_palette(Screen,config->new_palette,1<<((screen_depth > 4) ? 4 : screen_depth));
                        showcolourvals(realpen,1);
                    }
                }
                break;
            }
        }
    }
}

void makescreenedit(mode)
int mode;
{
    int a,b,wclone,shortage,size,fnum,fontnum,nopropnum,only8num,num;
    ULONG modeid;
    char *ptr,buf[256];
    DisplayInfoHandle *handle;
    struct DisplayInfo *dispinfo;
    struct AvailFonts *avail;

    borderkey=NULL;

    SetAPen(rp,screen_pens[1].pen);
    switch (mode) {
        case SCREEN_PALETTE:
            bpg=4;
            if (version2>=OSVER_39) {
                modeid=GetVPModeID(vp);
                if ((handle=FindDisplayInfo(config->screenmode)) ||
                    (handle=FindDisplayInfo(modeid))) {
                    GetDisplayInfoData(handle,buf,256,DTAG_DISP,0);
                    dispinfo=(struct DisplayInfo *)buf;
                    bpg=(dispinfo->RedBits+dispinfo->GreenBits+dispinfo->BlueBits)/3;
                }
            }
            for (a=0;a<3;a++) {
                fix_slider(&palettegads[a]);
                FixSliderBody(Window,&palettegads[a],1<<bpg,1,2);
            }
            AddGadgets(Window,
                palettegads,
                palettegadgets,
                6,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
            do3dbox(x_off+296,y_off+33,220,14);
            do3dbox(x_off+250,y_off+33,40,14);
            setuplist(&palettelist,250,93);
            AddListView(&palettelist,1);
            showpalettegad(1);
            showcolourvals(screen_pens[1].pen,1);
            get_palette(Screen,palette_backup,1<<((screen_depth > 4) ? 4 : screen_depth));
            break;

        case SCREEN_COLOURS:
            if (config->stringfgcol==config->stringbgcol) ++config->stringfgcol;
            do3dbox(x_off+142,y_off+61,464,122);
            AddGadgetBorders(&borderkey,
                &coloursgad,
                1,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
            AddGadgets(Window,
                &coloursgad,
                NULL,
                1,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
            setupcolourbox(rp,x_off+208,y_off+33,config->statusfg,config->statusbg);
            showscreencolours(COLOURS_ALL,NULL,NULL,0);
            showcolourscycle(config->statusfg,config->statusbg,0);
            break;

        case SCREEN_SCREENMODE:
            screenkey=NULL; firstmode=NULL;
            screenmodeview.itemselected=-1; wclone=0;
            busy();
            if ((a=initscreenmodes()) &&
                (screenmodelist=LAllocRemember(&screenkey,(a+1)*4,MEMF_CLEAR))) {
                screenmode=firstmode;
                for (b=0;b<a;b++) {
                    if (screenmodelist[b]=LAllocRemember(&screenkey,DISPLAYNAMELEN,MEMF_CLEAR))
                        strcpy(screenmodelist[b],screenmode->name);
                    if (screenmode->mode==MODE_WORKBENCHCLONE) wclone=b;
                    if (screenmode->mode==config->screenmode) {
                        if (screenmode->mode==MODE_PUBLICSCREENUSE) {
                            lsprintf(buf,"%s:%s",config->pubscreen_name,cfg_string[STR_SCREEN_MODE_USE]);
                            if (LStrCmpI(buf,screenmode->name)==0) screenmodeview.itemselected=b;
                        }
/*
                        else if (screenmode->mode==MODE_PUBLICSCREENCLONE) {
                            lsprintf(buf,"%s:%s",config->pubscreen_name,cfg_string[STR_SCREEN_MODE_CLONE]);
                            if (LStrCmpI(buf,screenmode->name)==0) screenmodeview.itemselected=b;
                        }
*/
                        else screenmodeview.itemselected=b;
                    }
                    if (!(screenmode=screenmode->next)) break;
                }
            }
            unbusy();
            if (screenmodeview.itemselected==-1) screenmodeview.itemselected=wclone;
            setuplist(&screenmodeview,238,17);
            screenmodeview.items=screenmodelist;
            screenmodeview.topitem=screenmodeview.itemselected;
            AddListView(&screenmodeview,1);
            screenmodegads[0].Flags&=~GFLG_DISABLED;
            screenmodegads[1].Flags&=~GFLG_DISABLED;
            for (a=SCREENMODE_DEFWIDTH-300;a<SCREENMODE_SLIDER-300;a++)
                screenmodegads[a].Flags&=~(GFLG_SELECTED|GFLG_DISABLED);
            if (config->screenflags&SCRFLAGS_HALFHEIGHT)
                screenmodegads[SCREENMODE_HALFHEIGHT-300].Flags|=GFLG_SELECTED;
            else screenmodegads[SCREENMODE_HALFHEIGHT-300].Flags&=~GFLG_SELECTED;
            fix_slider(&screenmodegads[SCREENMODE_SLIDER-300]);
            AddGadgets(Window,
                screenmodegads,
                screenmodegadgets,
                7,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
            Do3DBox(rp,
                x_off+238,y_off+140,
                272,40,
                screen_pens[config->gadgetbotcol].pen,screen_pens[config->gadgettopcol].pen);
            SetAPen(rp,screen_pens[1].pen);
            UScoreText(rp,
                cfg_string[STR_DISPLAY_MODE_DESCRIPTION],
                x_off+238,y_off+136,
                -1);
            fixmodegads((curmode=showdisplaydesc()));
            fixdefaultgads(curmode);
            break;

        case SCREEN_FONTS:
            if (!fontdatabuf) {
                busy();
                size=(sizeof(struct AvailFonts)*512)+sizeof(struct AvailFontsHeader);
                do {
                    if (!(fontdatabuf=LAllocRemember(&fontkey,size,MEMF_CLEAR)))
                        break;
                    if (shortage=AvailFonts(fontdatabuf,size,AFF_MEMORY|AFF_DISK)) {
                        LFreeRemember(&fontkey);
                        size+=shortage;
                    }
                    else break;
                } while (shortage);
                unbusy();
                if (!fontdatabuf) break;
                num=((struct AvailFontsHeader *)fontdatabuf)->afh_NumEntries;
                if (!num ||
                    !(fontlist=LAllocRemember(&fontkey,(num+1)*4,MEMF_CLEAR)) ||
                    !(fontsizelist=LAllocRemember(&fontkey,(num+1)*4,MEMF_CLEAR)))
                    break;
                if (!(noproplist=LAllocRemember(&fontkey,(num+1)*4,MEMF_CLEAR)) ||
                    !(nopropsizelist=LAllocRemember(&fontkey,(num+1)*4,MEMF_CLEAR))) {
                    noproplist=fontlist;
                    nopropsizelist=fontsizelist;
                }
                if (!(only8list=LAllocRemember(&fontkey,(num+1)*4,MEMF_CLEAR)))
                    only8list=fontlist;
                sortfontlist((struct AvailFonts *)&fontdatabuf[sizeof(UWORD)],num,0);
                sortfontlist((struct AvailFonts *)&fontdatabuf[sizeof(UWORD)],num,1);
                avail=(struct AvailFonts *)&fontdatabuf[sizeof(UWORD)];
                for (fnum=0;fnum<num;fnum++) {
                    if (ptr=strstri(avail[fnum].af_Attr.ta_Name,".font")) *ptr=0;
                    avail[fnum].af_Attr.ta_Style=0;
                    for (a=0;a<num;a++) {
                        if (strcmp((char *)avail[a].af_Attr.ta_Name,(char *)avail[fnum].af_Attr.ta_Name))
                            ++avail[fnum].af_Attr.ta_Style;
                    }
                }
                for (fnum=0,fontnum=0,nopropnum=0,only8num=0;fnum<num;fnum++) {
                    for (a=0;a<fontnum;a++) {
                        if (strcmp(fontlist[a],(char *)avail[fnum].af_Attr.ta_Name)==0) break;
                    }
                    if (a==fontnum) {
                        fontlist[fontnum]=(char *)avail[fnum].af_Attr.ta_Name;
                        fontsizelist[fontnum]=LAllocRemember(&fontkey,(avail[fnum].af_Attr.ta_Style+1)*4,MEMF_CLEAR);
                        if (!(avail[fnum].af_Attr.ta_Flags&FPF_PROPORTIONAL)) {
                            noproplist[nopropnum]=fontlist[fontnum];
                            nopropsizelist[nopropnum]=fontsizelist[fontnum];
                            ++nopropnum;
                            if (avail[fnum].af_Attr.ta_YSize==8) {
                                only8list[only8num]=fontlist[fontnum];
                                ++only8num;
                            }
                        }
                        ++fontnum;
                    }
                    if (fontsizelist[a]) {
                        for (b=0;;b++) {
                            if (!fontsizelist[a][b]) break;
                            if (atoi(fontsizelist[a][b])==avail[fnum].af_Attr.ta_YSize) {
                                b=-1;
                                break;
                            }
                        }
                        if (b>-1 && (fontsizelist[a][b]=LAllocRemember(&fontkey,8,MEMF_CLEAR)))
                            lsprintf(fontsizelist[a][b],"%4ld",avail[fnum].af_Attr.ta_YSize);
                    }
                }
            }
            setuplist(&fontplacelist,146,18);
            setuplist(&fontlistview,360,18);
            setuplist(&fontsizelistview,566,18);
            fontplacelist.itemselected=fontplacelist.topitem=0;
            fontsizelistview.items=fontlistview.items=NULL;
            AddListView(&fontplacelist,3);
            SetAPen(rp,screen_pens[1].pen);
            UScoreText(rp,
                cfg_string[STR_DISPLAY_ITEM],
                x_off+146,y_off+14,
                -1);
            UScoreText(rp,
                cfg_string[STR_FONT],
                x_off+360,y_off+14,
                -1);
            UScoreText(rp,
                cfg_string[STR_FONT_SIZE],
                x_off+566,y_off+14,
                -1);
            if (version2) {
                fontsize_buf[0]=0;
                AddGadgets(Window,
                    &fontsizegadget,
                    NULL,
                    1,
                    screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
            }
            initfontlist(FONT_CLOCK,1,0);
            strcpy(old_general_font,config->fontbufs[0]);
            break;

        case SCREEN_GENERAL:
            inittickgads(scr_generalgadgets,config->generalscreenflags,0);
            break;

        case SCREEN_ARROWS:
            for (a=0;a<3;a++) {
                arrowgadgets[a].GadgetRender=(APTR)buttonoffimage;
                arrowgadgets[a].SelectRender=(APTR)buttononimage;
                do3dbox(x_off+184+(a*129),y_off+33,121,55);
            }

            AddGadgetBorders(&borderkey,
                &arrowgadgets[3],
                2,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
            AddGadgetBorders(&borderkey,
                &arrowgadgets[5],
                2,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
            AddGadgetBorders(&borderkey,
                &arrowgadgets[7],
                1,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);

            AddGadgets(Window,
                arrowgadgets,
                arrowgadtxt,
                8,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
            for (a=0;a<2;a++) {
                DoArrow(rp,x_off+420+(a*34),y_off+144,10,9,screen_pens[1].pen,screen_pens[0].pen,3-a);
                DoArrow(rp,x_off+436,y_off+138+(a*12),12,9,screen_pens[1].pen,screen_pens[0].pen,a);
            }
            showupdownslider();
            showleftrightslider();
            showstringgadget();
            showarrowborders(0,-1);
            fixarrowgads(0);
            SetAPen(rp,screen_pens[1].pen);
            UScoreText(rp,
                cfg_string[STR_MODIFY_SIZE],
                x_off+294,y_off+151,
                -1);
            DoCycleGadget(&arrowgadgets[7],Window,arrowtypetxt,0);
            break;

        case SCREEN_SLIDERS:
            for (a=0;a<2;a++) {
                AddGadgetBorders(&borderkey,
                    &screen_sliders_gadgets[a],
                    2,
                    screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
            }

            AddGadgets(Window,
                screen_sliders_gadgets,
                NULL,
                2,
                screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);

            for (a=0;a<2;a++) show_slider_setup(182+(a*191),32,a);
            break;
    }
}

void removescreenedit(mode)
int mode;
{
    SetAPen(rp,screen_pens[0].pen);
    RectFill(rp,
        x_off+120,y_off+4,
        x_bot,y_bot);
    SetAPen(rp,screen_pens[1].pen);
    switch (mode) {
        case SCREEN_PALETTE:
            RemoveGList(Window,palettegads,6);
            RemoveListView(&palettelist,1);
            break;

        case SCREEN_COLOURS:
            RemoveGList(Window,&coloursgad,1);
            doradiobuttons();
            break;

        case SCREEN_SCREENMODE:
            RemoveListView(&screenmodeview,1);
            RemoveGList(Window,screenmodegads,7);
            LFreeRemember(&screenkey);
            if (config->scrdepth!=screen_depth) {
                close_screen();
                open_screen();
                showconfigscreen(CFG_SCREEN);
            }
            break;

        case SCREEN_FONTS:
            RemoveListView(&fontplacelist,3);
            if (version2) RemoveGList(Window,&fontsizegadget,1);
            if (LStrCmpI(config->fontbufs[0],old_general_font)!=0) {
                close_screen();
                open_screen();
                showconfigscreen(CFG_SCREEN);
            }
            break;

        case SCREEN_ARROWS:
            RemoveGList(Window,arrowgadgets,8);
            break;

        case SCREEN_GENERAL:
            removetickgads();
            break;

        case SCREEN_SLIDERS:
            RemoveGList(Window,screen_sliders_gadgets,2);
            break;
    }
    LFreeRemember(&borderkey);
}
