/*

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"

dooperationconfig()
{
	ULONG class;
	USHORT code,gadgetid,qual;
	char *flag=NULL,*flag2=NULL;
	struct ConfigUndo *undo;
	struct Gadget *gad;
	int lastsel=-1,a,disppos=0,b,formatwin=0,x,y;
	struct DOpusListView *view;
	struct DOpusRemember *borderkey=NULL;

	showconfigscreen(CFG_OPERATION);
	undo=makeundo(UNDO_MAIN);

	FOREVER {
		Wait(1<<Window->UserPort->mp_SigBit);
		while (IMsg=getintuimsg()) {
			if (lastsel!=OP_FORMAT ||
				((view=ListViewIDCMP(listformatlists,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 (lastsel>-1) {
							maingad[lastsel].Flags&=~SELECTED;
							select_gadget(&maingad[lastsel],0);
							if (lastsel==OP_FORMAT) {
								RemoveGList(Window,formatgads,(network)?10:8);
								RemoveListView(listformatlists,2);
							}
							removetickgads();
							lastsel=-1;
						}
						switch ((a=ITEMNUM(code))) {
							case 0:
							case 1:
								doload(CFG_OPERATION,a);
								break;
						}
						break;

					case IDCMP_MOUSEBUTTONS:
						if (code==MENUDOWN && lastsel==OP_FORMAT) {
							fixrmbimage(&formatclearrmb,NULL,0,x,y);
							a=DoRMBGadget(&formatclearrmb,Window);
							fixrmbimage(&formatclearrmb,NULL,1,-1,-1);
							if (a==0) goto clearlast;
						}
						break;

					case IDCMP_GADGETUP:
					case IDCMP_GADGETDOWN:
						if (gadgetid>=GAD_BASE && flag) {
							if (gadgetid<5000)
								*flag=processtickgad(operationgadgets[lastsel],(int)*flag,gadgetid-GAD_BASE,0);
							else *flag2=processtickgad(operationgadgets[lastsel],(int)*flag2,gadgetid-5000,1);
						}
						else switch (gadgetid) {
							case OP_CANCEL:
								doundo(undo,UNDO_MAIN);
							case OP_OKAY:
								doundo(undo,0);
								if (lastsel==OP_FORMAT) {
									RemoveGList(Window,formatgads,(network)?10:8);
									RemoveListView(listformatlists,2);
									LFreeRemember(&borderkey);
								}
								return((gadgetid==OP_OKAY));

							case FORMAT_CLEAR:
								if (qual&(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) {
clearlast:
									for (a=15;a>=0;a--) {
										if (config->displaypos[formatwin][a]!=-1) {
											if (config->sortmethod[formatwin]==config->displaypos[formatwin][a]) {
												config->sortmethod[formatwin]=-1;
												listformatlists[1].itemselected=-1;
											}
											config->displaypos[formatwin][a]=-1;
											break;
										}
									}
									disppos=fixformlist(formatwin);
									break;
								}
							case FORMAT_RESET:
								for (a=0;a<16;a++) config->displaypos[formatwin][a]=-1;
								if (gadgetid==FORMAT_RESET) {
									for (a=0;a<5;a++) config->displaypos[formatwin][a]=a;
									config->sortmethod[formatwin]=0;
								}
								else config->sortmethod[formatwin]=-1;
								listformatlists[1].itemselected=config->sortmethod[formatwin];
								disppos=fixformlist(formatwin);
								break;

							case FORMAT_LENGTH+0:
							case FORMAT_LENGTH+1:
							case FORMAT_LENGTH+2:
							case FORMAT_LENGTH+3:
							case FORMAT_LENGTH+4:
								b=gadgetid-FORMAT_LENGTH;
								a=atoi(formatlen_buf[b]);
								if (a<5) a=5; else if (a>maxlength[b]) a=maxlength[b];
								lsprintf(formatlen_buf[b],"%ld",a);
								RefreshStrGad(gad,Window);
								config->displaylength[formatwin][b]=a;
								if (code!=0x9) getnextgadget(gad);
								break;

							case FORMAT_WINDOW:
								formatwin=1-formatwin;
								DoCycleGadget(&formatgads[0],Window,windownames,formatwin);
								DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
								if (config->sortflags&(1<<formatwin)) formatgads[4].Flags|=GFLG_SELECTED;
								else formatgads[4].Flags&=~GFLG_SELECTED;
								RefreshGList(&formatgads[4],Window,NULL,1);
								listformatlists[1].itemselected=-1;
								for (a=0;a<16;a++) {
									if (config->displaypos[formatwin][a]==-1) break;
									if (config->displaypos[formatwin][a]==config->sortmethod[formatwin]) {
										listformatlists[1].itemselected=a;
										break;
									}
								}
								disppos=fixformlist(formatwin);
								fixdisplaylengths(formatwin);
								break;

							case FORMAT_SEPARATE:
								if (qual&(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) {
									if ((--config->separatemethod[formatwin])<0)
										config->separatemethod[formatwin]=2;
								}
								else if ((++config->separatemethod[formatwin])>2)
									config->separatemethod[formatwin]=0;
								DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
								break;

							case FORMAT_REVERSESORT:
								config->sortflags^=1<<formatwin;
								break;

							default:
								flag=NULL;
								if (lastsel>-1 && lastsel!=gadgetid) {
									maingad[lastsel].Flags&=~SELECTED;
									select_gadget(&maingad[lastsel],0);
									makehelpname((char *)-1);
									doscreentitle(cfg_string[STR_OPERATION_SCREEN]);
								}
								if (lastsel==OP_FORMAT) {
									RemoveGList(Window,formatgads,(network)?10:8);
									RemoveListView(listformatlists,2);
									LFreeRemember(&borderkey);
								}
								if (lastsel==gadgetid) {
									removetickgads();
									lastsel=-1;
									makehelpname((char *)-1);
									doscreentitle(cfg_string[STR_OPERATION_SCREEN]);
									break;
								}
								lastsel=gadgetid;
								flag2=NULL;
								makehelpname(operationgads[gadgetid]);
								doscreentitle(currenthelpname);
								switch (gadgetid) {
									case OP_COPY: flag=&(config->copyflags); flag2=&(config->existflags); break;
									case OP_DATEFORMAT: flag=&(config->dateformat); break;
									case OP_DELETE: flag=&(config->deleteflags); break;
									case OP_ERRORCHECK: flag=&(config->errorflags); break;
									case OP_GENERAL: flag=&(config->generalflags); break;
									case OP_ICONS: flag=&(config->iconflags); break;
									case OP_UPDATE: flag=&(config->dynamicflags); break;
									case OP_FORMAT:
										removetickgads();
										setuplist(&listformatlists[0],181,38);
										setuplist(&listformatlists[1],181,112);
										listformatlists[1].itemselected=-1;
										for (a=0;a<16;a++) {
											if (config->displaypos[formatwin][a]==-1) break;
											if (config->displaypos[formatwin][a]==config->sortmethod[formatwin]) {
												listformatlists[1].itemselected=a;
												break;
											}
										}
										if (!(AddListView(listformatlists,2))) {
											lastsel=-1;
											break;
										}
										if (config->sortflags&(1<<formatwin)) formatgads[4].Flags|=GFLG_SELECTED;
										else formatgads[4].Flags&=~GFLG_SELECTED;
										SetAPen(rp,screen_pens[1].pen);

										AddGadgetBorders(&borderkey,
											&formatgads[0],
											1,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
										AddGadgetBorders(&borderkey,
											&formatgads[1],
											1,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
										AddGadgetBorders(&borderkey,
											&formatgads[3],
											1,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
										AddGadgets(Window,
											formatgads,
											formatgadgets,
											(network)?10:8,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
										fixrmbimage(&formatclearrmb,&formatgads[2],2,-1,-1);

										formatwin=0;
										DoCycleGadget(&formatgads[0],Window,windownames,formatwin);
										DoCycleGadget(&formatgads[3],Window,separatenames,config->separatemethod[formatwin]);
										disppos=fixformlist(formatwin);
										fixdisplaylengths(formatwin);
										UScoreText(rp,
											cfg_string[STR_AVAILABLE_DISPLAY_ITEMS],
											x_off+156,y_off+34,
											-1);
										UScoreText(rp,
											cfg_string[STR_SELECTED_DISPLAY_ITEMS],
											x_off+156,y_off+108,
											-1);
										UScoreText(rp,
											cfg_string[STR_DISPLAYED_LENGTHS],
											x_off+430,y_off+34,
											-1);
										UScoreText(rp,
											cfg_string[STR_CHECK_INDICATES_SORT],
											x_off+161,y_off+179,
											-1);
										UScoreText(rp,
											cfg_string[STR_ENTRY_SEPARATION],
											x_off+416,y_off+152,
											-1);
										BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+169,y_off+173,13,7);
										flag=NULL;
										break;
								}
								if (flag) inittickgads(operationgadgets[gadgetid],(int)*flag,(flag2)?(int)*flag2:0);
								break;
						}
						break;
				}
			}
			else if (view) {
				if (view->listid==1) {
					b=view->itemselected;
					if (disppos<FORMAT_MAXNUM) {
						for (a=0;a<disppos;a++) {
							if (config->displaypos[formatwin][a]==b) break;
						}
						if (a==disppos) {
							config->displaypos[formatwin][disppos]=b;
							disppos=fixformlist(formatwin);
						}
					}
				}
				else if (view->listid==2) {
					a=config->displaypos[formatwin][view->itemselected];
					if (config->sortmethod[formatwin]==a)
						config->sortmethod[formatwin]=-1;
					else config->sortmethod[formatwin]=a;
				}
			}
		}
	}
}

dosystemconfig()
{
	ULONG class;
	USHORT code,gadgetid,qual,hotcode,hotqual;
	char *flag=NULL,*flag2=NULL,buf[80],buf1[80],buf2[80],*ptr;
	struct ConfigUndo *undo;
	struct Gadget *gad;
	struct ConfigGadget *congad;
	int a,lastsel=-1,tick,x,y;
	struct DOpusListView *view;
	struct dopusfiletype *type;
	char module_sel_array[NUM_MODULES];
	struct DOpusRemember *lang_key=NULL;
	char old_language[30];

	showconfigscreen(CFG_SYSTEM);
	undo=makeundo(UNDO_MAIN|UNDO_FILETYPE);
	hotcode=config->hotkeycode; hotqual=config->hotkeyqual;
	strcpy(old_language,config->language);

	FOREVER {
		Wait(1<<Window->UserPort->mp_SigBit);
		while (IMsg=getintuimsg()) {
			if (!(lastsel==SYS_ICONS &&
				(view=ListViewIDCMP(&iconlistview,IMsg))!=(struct DOpusListView *)-1) &&
				!(lastsel==SYS_MODULES &&
				(view=ListViewIDCMP(&modulelist,IMsg))!=(struct DOpusListView *)-1)) {
				class=IMsg->Class; code=IMsg->Code; qual=IMsg->Qualifier;
				x=IMsg->MouseX; y=IMsg->MouseY;
				if (class==IDCMP_GADGETUP || class==IDCMP_GADGETDOWN) {
					gad=(struct Gadget *)IMsg->IAddress;
					gadgetid=gad->GadgetID;
				}
				ReplyMsg((struct Message *)IMsg);
				switch (class) {
					case IDCMP_MOUSEBUTTONS:
						if (code==MENUDOWN && lastsel==SYS_HOTKEYS) {
							if (fixrmbimage(&sampleclearrmb,NULL,0,x,y)) {
								a=DoRMBGadget(&sampleclearrmb,Window);
								fixrmbimage(&sampleclearrmb,NULL,1,-1,-1);
								if (a==0) {
									hotcode=(USHORT)~0;
									hotqual=0;
									showkey(hotcode,hotqual,x_off+138,y_off+71,360,10);
								}
								hotkeygad.Flags&=~SELECTED;
								help_ok=1;
							}
						}
						break;

					case IDCMP_RAWKEY:
						if (lastsel!=SYS_HOTKEYS || code&0x80 || !(hotkeygad.Flags&SELECTED))
							break;
						qual&=IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND|
							IEQUALIFIER_CONTROL|IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|
							IEQUALIFIER_LALT|IEQUALIFIER_RALT;
						if (code>=0x60 && code<=0x67) code=(USHORT)~0;
						showkey((hotcode=code),(hotqual=qual),x_off+138,y_off+71,360,10);
						break;

					case IDCMP_MENUPICK:
						if (code==MENUNULL) break;
						if (lastsel>-1) {
							maingad[lastsel].Flags&=~SELECTED;
							select_gadget(&maingad[lastsel],0);
							if (lastsel==SYS_HOTKEYS) {
								config->hotkeycode=hotcode; config->hotkeyqual=hotqual;
								RemoveGList(Window,&hotkeygad,-1);
							}
							else if (lastsel==SYS_ICONS) {
								RemoveGList(Window,icongads,4);
								RemoveListView(&iconlistview,1);
								system_makeiconlist(0);
							}
							else if (lastsel==SYS_MODULES) {
								RemoveListView(&modulelist,2);
								LFreeRemember(&lang_key);
							}
							removetickgads();
							lastsel=-1;
						}
						switch ((a=ITEMNUM(code))) {
							case 0:
							case 1:
								if (doload(CFG_SYSTEM,a))
									configmsg(CONFIG_NEW_HOTKEY);
								break;
						}
						break;

					case IDCMP_GADGETUP:
					case IDCMP_GADGETDOWN:
						if (gadgetid>=REQ_BASE) {
							congad=(struct ConfigGadget *)gad->UserData;
							ptr=((struct StringInfo *)congad->gad->SpecialInfo)->Buffer;
							if (system_requester(ptr,congad->buffer,congad->gad,congad->bit))
								processtickgad(systemgadgets[lastsel],0,-1,-1);
						}
						else if (gadgetid>=STRING_BASE) {
							processtickgad(systemgadgets[lastsel],0,-1,-1);
							switch (lastsel) {
								case SYS_DIRECTORIES:
									if ((a=atoi(buf))<1) a=1;
									else if (a>255) a=255;
									config->bufcount=a;
									break;
								case SYS_AMIGADOS:
									config->priority=atoi(buf);
									break;
								case SYS_VIEWPLAY:
									config->showdelay=atoi(buf);
									config->fadetime=atoi(buf1);
									config->tabsize=atoi(buf2);
									break;
							}
							if (code!=0x9) getnextgadget(gad);
						}
						else if (gadgetid>=GAD_BASE && flag) {
							if (gadgetid<5000) *flag=processtickgad(systemgadgets[lastsel],(int)*flag,gadgetid-GAD_BASE,0);
							else *flag2=processtickgad(systemgadgets[lastsel],(int)*flag2,gadgetid-5000,1);
						}
						else switch (gadgetid) {
							case SYS_CANCEL:
								doundo(undo,UNDO_MAIN|UNDO_FILETYPE);
							case SYS_OKAY:
								if (gadgetid==SYS_OKAY) {
									LParsePatternI(config->showpat,config->showpatparsed);
									LParsePatternI(config->hidepat,config->hidepatparsed);
									config->hotkeycode=hotcode; config->hotkeyqual=hotqual;
									configmsg(CONFIG_NEW_HOTKEY);
									if (strcmp(config->language,old_language)) {
										busy();
										read_strings();
										readhelp();
										unbusy();
									}
								}
								switch (lastsel) {
									case SYS_HOTKEYS:
										RemoveGList(Window,&hotkeygad,-1);
										help_ok=1;
										break;
									case SYS_ICONS:
										RemoveGList(Window,icongads,4);
										RemoveListView(&iconlistview,1);
										system_makeiconlist(0);
										break;
									case SYS_MODULES:
										RemoveListView(&modulelist,2);
										LFreeRemember(&lang_key);
										break;
								}
								doundo(undo,0);
								help_ok=1;
								return((gadgetid==SYS_OKAY));

							case HOTKEY_SAMPLE:
								if (hotkeygad.Flags&SELECTED) {
									config->hotkeycode=config->hotkeyqual=(USHORT)~0;
									help_ok=0;
								}
								else {
									config->hotkeycode=hotcode;
									config->hotkeyqual=hotqual;
									help_ok=1;
								}
								configmsg(CONFIG_NEW_HOTKEY);
								break;

							case HOTKEY_MMB:
								config->hotkeyflags^=1;
								configmsg(CONFIG_NEW_HOTKEY);
								break;

							case ICON_ICONREQ:
								if (iconlistview.itemselected<0) break;
								if (!system_requester(edit_funcbuf,NULL,&icongads[1],0)) break;

							case ICON_ICONPATH:
								if (iconlistview.itemselected<0) break;
								ptr=NULL;
								switch (iconlistview.itemselected) {
									case 0: ptr=config->drawericon; break;
									case 1: ptr=config->toolicon; break;
									case 2: ptr=config->projecticon; break;
									default:
										for (a=3,type=firsttype;a<iconlistview.itemselected && type;a++,type=type->next);
										if (type) {
											if (edit_funcbuf[0]) {
												if ((type->iconpath=LAllocRemember(&typekey,strlen(edit_funcbuf)+1,0)))
													strcpy(type->iconpath,edit_funcbuf);
											}
											else type->iconpath=NULL;
										}
										break;
								}
								if (ptr) LStrnCpy(ptr,edit_funcbuf,79);
								if (edit_funcbuf[0]) iconlistview.items[iconlistview.itemselected][1]='*';
								else iconlistview.items[iconlistview.itemselected][1]=' ';
								RefreshListView(&iconlistview,1);
								system_showicon(edit_funcbuf,iconlistview.itemselected);
								if (code!=0x9) getnextgadget(gad);
								break;

							case ICON_TOOLREQ:
								if (!system_requester(edit_pathbuf,NULL,&icongads[3],0)) break;
							case ICON_TOOLPATH:
								LStrnCpy(config->defaulttool,edit_pathbuf,79);
								if (code!=0x9) getnextgadget(gad);
								break;

							default:
								flag=NULL;
								if (lastsel>-1 && lastsel!=gadgetid) {
									maingad[lastsel].Flags&=~SELECTED;
									select_gadget(&maingad[lastsel],0);
									makehelpname((char *)-1);
									doscreentitle(cfg_string[STR_SYSTEM_SCREEN]);
								}
								switch (lastsel) {
									case SYS_HOTKEYS:
										config->hotkeycode=hotcode;
										config->hotkeyqual=hotqual;
										RemoveGList(Window,&hotkeygad,-1);
										help_ok=1;
										break;
									case SYS_ICONS:
										RemoveGList(Window,icongads,4);
										RemoveListView(&iconlistview,1);
										system_makeiconlist(0);
										break;
									case SYS_MODULES:
										RemoveListView(&modulelist,2);
										LFreeRemember(&lang_key);
										break;
								}
								if (lastsel==gadgetid) {
									removetickgads();
									lastsel=-1;
									makehelpname((char *)-1);
									doscreentitle(cfg_string[STR_SYSTEM_SCREEN]);
									break;
								}
								lastsel=gadgetid;
								flag2=NULL; tick=1;
								makehelpname(systemgads[gadgetid]);
								doscreentitle(currenthelpname);
								switch (gadgetid) {
									case SYS_CLOCK: flag=&(config->scrclktype); flag2=&(config->icontype); break;
									case SYS_DIRECTORIES: flag=&(config->dirflags); flag2=&(config->showfree); break;
									case SYS_SHOWPATTERN: flag=&(config->hiddenbit); break;
									case SYS_VIEWPLAY: flag=&(config->viewbits); break;
									case SYS_ICONS: tick=0; break;
								}
								if (tick) inittickgads(systemgadgets[gadgetid],(flag)?(int)*flag:0,(flag2)?(int)*flag2:0);
								switch (gadgetid) {
									case SYS_AMIGADOS:
										lsprintf(buf,"%ld",config->priority);
										makestring(config->outputcmd,config->output,config->shellstartup,
											buf,NULL);
										break;
									case SYS_STARTUP:
										makestring(config->autodirs[0],config->autodirs[1],
											config->startupscript,config->uniconscript,config->configreturnscript,NULL);
										break;
									case SYS_DIRECTORIES:
										lsprintf(buf,"%ld",config->bufcount);
										makestring(buf,NULL);
										break;
									case SYS_HOTKEYS:
										SetAPen(rp,screen_pens[1].pen);
										hotkeygad.Flags&=~GFLG_SELECTED;
										if (config->hotkeyflags&1) hotkeymmbgad.Flags|=GFLG_SELECTED;
										else hotkeymmbgad.Flags&=~GFLG_SELECTED;
										UScoreText(rp,
											cfg_string[STR_UNICONIFY_HOTKEY],
											x_off+166,y_off+64,
											-1);
										AddGadgets(Window,
											&hotkeygad,
											hotkeygadgets,
											2,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
										fixrmbimage(&sampleclearrmb,&hotkeygad,2,-1,-1);
										showkey((hotcode=config->hotkeycode),
											(hotqual=config->hotkeyqual),
											x_off+138,y_off+71,
											360,10);
										break;
									case SYS_MODULES:
										busy();
										for (a=0;a<NUM_MODULES;a++) {
											if (config->loadexternal&external_module_map[a])
												module_sel_array[a]=LVARRAY_SELECTED;
											else module_sel_array[a]=0;
											if (!(FindSystemFile(external_module_name[a],buf,80,SYSFILE_MODULE)))
												module_sel_array[a]|=2;
										}
										modulelist.items=external_module_list;
										modulelist.selectarray=module_sel_array;
										get_language_list(&lang_key);
										setuplist(&modulelist,200,18);
										setuplist(&languagelist,200,115);
										unbusy();
										if (!(AddListView(&modulelist,2))) {
											lastsel=-1;
											break;
										}
										SetAPen(rp,screen_pens[1].pen);
										UScoreText(rp,
											cfg_string[STR_MODULE_LIST_CHECK_STRING],
											x_off+200,y_off+83,
											-1);
										BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+208,y_off+77,13,7);
										UScoreText(rp,
											cfg_string[STR_LANGUAGE_LIST_CHECK_STRING],
											x_off+200,y_off+180,
											-1);
										BltTemplate((PLANEPTR)DOpusBase->pdb_check,0,2,rp,x_off+208,y_off+174,13,7);
										break;
									case SYS_VIEWPLAY:
										lsprintf(buf,"%ld",config->showdelay);
										lsprintf(buf1,"%ld",config->fadetime);
										lsprintf(buf2,"%ld",config->tabsize);
										makestring(buf,buf1,buf2,NULL);
										break;
									case SYS_SHOWPATTERN:
										makestring(config->showpat,config->hidepat,NULL);
										break;
									case SYS_ICONS:
										removetickgads();
										setuplist(&iconlistview,140,19);
										system_makeiconlist(1);
										if (!(AddListView(&iconlistview,1))) {
											system_makeiconlist(0);
											lastsel=-1;
											break;
										}
										SetAPen(rp,screen_pens[1].pen);
										UScoreText(rp,
											cfg_string[STR_PROJECTS_DEFAULT_TOOL],
											x_off+172,y_off+150,
											-1);
										strcpy(edit_pathbuf,config->defaulttool);
										edit_funcbuf[0]=0;
										AddGadgets(Window,
											icongads,
											NULL,
											4,
											screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen,1);
										Do3DBox(rp,
											x_off+459,y_off+126,
											149,40,
											screen_pens[config->gadgetbotcol].pen,screen_pens[config->gadgettopcol].pen);
										doglassimage(&icongads[0]);
										doglassimage(&icongads[2]);
										flag=NULL;
										break;
								}
								break;
						}
						break;
				}
			}
			else if (view) {
				switch (view->listid) {
					case 3:
						ptr=NULL;
						switch (view->itemselected) {
							case -1: break;
							case 0: ptr=config->drawericon; break;
							case 1: ptr=config->toolicon; break;
							case 2: ptr=config->projecticon; break;
							default:
								for (a=3,type=firsttype;a<iconlistview.itemselected && type;a++,type=type->next);
								if (type && type->iconpath) ptr=type->iconpath;
								break;
						}
						if (ptr) strcpy(edit_funcbuf,ptr);
						else edit_funcbuf[0]=0;
						RefreshStrGad(&icongads[1],Window);
						ActivateStrGad(&icongads[1],Window);
						system_showicon(edit_funcbuf,view->itemselected);
						break;
					case 5:
						if (config->loadexternal&external_module_map[view->itemselected])
							config->loadexternal&=~external_module_map[view->itemselected];
						else config->loadexternal|=external_module_map[view->itemselected];
						break;
					case 6:
						if (strcmp(view->items[view->itemselected],"English (built-in)")==0)
							config->language[0]=0;
						else strcpy(config->language,view->items[view->itemselected]);
						break;
				}
			}
		}
	}
}

void getnextgadget(fgad)
struct Gadget *fgad;
{
	struct Gadget *gad;

	if (fgad->GadgetType==GTYP_STRGADGET) RefreshStrGad(fgad,Window);
	gad=fgad->NextGadget;
	while (gad) {
		if (gad->GadgetType==GTYP_STRGADGET && !(gad->Flags&GFLG_DISABLED)) {
			ActivateStrGad(gad,Window);
			return;
		}
		gad=gad->NextGadget;
	}
	gad=Window->FirstGadget;
	while (gad && gad!=fgad) {
		if (gad->GadgetType==GTYP_STRGADGET && !(gad->Flags&GFLG_DISABLED)) {
			ActivateStrGad(gad,Window);
			return;
		}
		gad=gad->NextGadget;
	}
}

fixformlist(win)
int win;
{
	int a,b,d;

	for (a=0;a<FORMAT_MAXNUM;a++) {
		for (d=0;d<a;d++) {
			if (config->displaypos[win][a]==config->displaypos[win][d])
				config->displaypos[win][a]=-1;
		}
		if ((b=config->displaypos[win][a])<FORMAT_MAXNUM && b>-1)
			selectedformatnames[a]=formatnames[b];
		else break;
	}
	selectedformatnames[a]=NULL;
	RefreshListView(&listformatlists[1],1);
	return(a);
}

void fixdisplaylengths(win)
int win;
{
	int a,lim;

	lim=(network)?5:3;
	for (a=0;a<lim;a++) {
		if (config->displaylength[win][a]<5) config->displaylength[win][a]=5;
		else if (config->displaylength[win][a]>maxlength[a])
			config->displaylength[win][a]=maxlength[a];
		lsprintf(formatlen_buf[a],"%ld",config->displaylength[win][a]);
	}
	RefreshGList(&formatgads[5],Window,NULL,lim);
}

system_requester(buf,buf2,gad,bit)
char *buf,*buf2;
struct Gadget *gad;
int bit;
{
	if (!buf[0]) {
		if (buf2 && CheckExist(buf2,NULL)) strcpy(dirbuf,buf2);
		else dirbuf[0]=0;
		filebuf[0]=0;
	}
	else makefilebuffer(buf);
	if (bit==0) {
		filereq.flags=0;
		filereq.title=cfg_string[STR_SELECT_DESIRED_FILE];
	}
	else {
		filereq.flags=DFRF_DIRREQ;
		filereq.title=cfg_string[STR_SELECT_DESIRED_DIRECTORY];
	}
	filereq.window=Window;
	if (FileRequest(&filereq)) {
		strcpy(buf,dirbuf);
		if (bit==0) TackOn(buf,filebuf,256);
		RefreshStrGad(gad,Window);
		return(1);
	}
	return(0);
}

void system_makeiconlist(make)
int make;
{
	static struct DOpusRemember *key=NULL;
	struct dopusfiletype *type;
	int a,count;

	LFreeRemember(&key);
	if (make) {
		for (count=3,type=firsttype;type;count++,type=type->next) {
			if (LStrCmpI(type->type,"Default")==0) --count;
		}
		if (iconlistview.items=LAllocRemember(&key,(count+1)*4,MEMF_CLEAR)) {
			for (a=0;a<3;a++) iconlistview.items[a]=icontypes[a];
			if (config->drawericon[0]) icontypes[0][1]='*'; else icontypes[0][1]=' ';
			if (config->toolicon[0]) icontypes[1][1]='*'; else icontypes[1][1]=' ';
			if (config->projecticon[0]) icontypes[2][1]='*'; else icontypes[2][1]=' ';
			for (a=3,type=firsttype;a<count;a++,type=type->next) {
				if (LStrCmpI(type->type,"Default")==0) --a;
				else if (iconlistview.items[a]=LAllocRemember(&key,strlen(type->type)+4,0)) {
					strcpy(iconlistview.items[a],"   ");
					strcat(iconlistview.items[a],type->type);
					if (type->iconpath) iconlistview.items[a][1]='*';
				}
			}
		}
		iconlistview.itemselected=-1; iconlistview.topitem=0;
	}
}

void system_showicon(iconfile,deftype)
char *iconfile;
int deftype;
{
	struct DiskObject *icon;
	char iconbuf[256],*ptr;
	int x,y;
	struct Image *image;
	struct Rectangle cliprec;
	struct Region *reg,*oldreg;

	cliprec.MinX=x_off+459;
	cliprec.MinY=y_off+126;
	cliprec.MaxX=x_off+607;
	cliprec.MaxY=y_off+165;
	SetAPen(rp,screen_pens[0].pen);
	RectFill(rp,y_off+459,y_off+126,x_off+607,y_off+165);
	if (!IconBase) return;
	strcpy(iconbuf,iconfile);
	if ((ptr=strstri(iconbuf,".info"))) *ptr=0;
	if (!iconbuf[0] || !(icon=GetDiskObject(iconbuf))) {
		if (version2<OSVER_37 || deftype>2) return;
		icon=GetDefDiskObject((deftype==0)?WBDRAWER:((deftype==1)?WBTOOL:WBPROJECT));
		if (!icon) return;
	}
	if (reg=NewRegion()) {
		OrRectRegion(reg,&cliprec);
		oldreg=InstallClipRegion(Window->WLayer,reg);
	}
	image=(struct Image *)icon->do_Gadget.GadgetRender;
	if ((x=x_off+459+((149-image->Width)/2))<(x_off+459)) x=x_off+456;
	if ((y=y_off+126+((40-image->Height)/2))<(y_off+126)) y=y_off+126;
	DrawImage(rp,image,x,y);
	FreeDiskObject(icon);
	if (reg) {
		InstallClipRegion(Window->WLayer,oldreg);
		DisposeRegion(reg);
	}
}

char *lock_dirs[]={
	"DOpus:S/",
	"S:"};

void get_language_list(key)
struct DOpusRemember **key;
{
	char *tempbuf;
	BPTR lock;
	struct FileInfoBlock __aligned fib;
	char pattern[30],buf[30];
	APTR wsave;
	int a,num,def;

	languagelist.items=NULL;

	if (!(tempbuf=LAllocRemember(key,2500,MEMF_CLEAR))) return;
	strcpy(tempbuf,"English (built-in)");
	num=1;
	LParsePatternI("DO_#?.STR",pattern);

	wsave=myproc->pr_WindowPtr;
	myproc->pr_WindowPtr=(APTR)-1;

	for (a=0;a<2;a++) {
		if (lock=Lock(lock_dirs[a],ACCESS_READ)) {
			Examine(lock,&fib);
			while (ExNext(lock,&fib)) {
				if (fib.fib_DirEntryType<0 &&
					LMatchPatternI(pattern,fib.fib_FileName)) {
					strcpy(buf,&fib.fib_FileName[3]);
					buf[(strlen(buf)-4)]=0;
					strcpy(&tempbuf[num*25],buf);
					if ((++num)>99) break;
				}
			}
			UnLock(lock);
		}
		if (num>99) break;
	}

	myproc->pr_WindowPtr=wsave;

	if (!(languagelist.items=LAllocRemember(key,(num+1)*sizeof(char *),MEMF_CLEAR)))
		return;

	for (a=0;a<num;a++) languagelist.items[a]=&tempbuf[a*25];
	quicksort(languagelist.items,0,num-1);

	languagelist.itemselected=-1;
	for (a=0;a<num;a++) {
		if (LStrCmpI(config->language,languagelist.items[a])==0)
			languagelist.itemselected=a;
		else if (strcmp(languagelist.items[a],"English (built-in)")==0)
			def=a;
	}
	if (languagelist.itemselected==-1) languagelist.itemselected=def;
}

void quicksort(array,left,right)
char **array;
int left,right;
{
	int i,last;

	if (left>=right) return;
	sortswap(array,left,(left+right)/2);
	last=left;
	for (i=left+1;i<=right;i++)
		if (LStrCmpI(array[i],array[left])<0)
			sortswap(array,++last,i);
	sortswap(array,left,last);
	quicksort(array,left,last-1);
	quicksort(array,last+1,right);
}

void sortswap(array,i,j)
char **array;
int i,j;
{
	char *temp;

	temp=array[i];
	array[i]=array[j];
	array[j]=temp;
}
