/*     Startup  Selector        */
/*   by OLIVERES Jean-Marc      */
/*      GUENOT   Raphaël        */
/* (c) 1996-97 Moonchild  Prod. */
/*          17.10.97            */

OPT REG=3
OPT OSVERSION=37
OPT PREPROCESS

#define DATE '17.10.97'
#define VERS '2.1a'

MODULE 'dos/dos','dos/dostags','dos/dosasl','dos/notify'
MODULE 'locale','libraries/locale'
MODULE 'intuition/intuition','intuition/screens'
MODULE 'gadtools','libraries/gadtools'
MODULE 'reqtools','libraries/reqtools'
MODULE 'exec/nodes','exec/lists','exec/ports','amigalib/lists'
MODULE 'utility/hooks','tools/installhook'
MODULE 'devices/inputevent','icon','workbench/workbench'
MODULE 'graphics/text','diskfont','libraries/diskfont',
			 'graphics/gfx','graphics/rastport','graphics/gfxmacros'
MODULE 'raphe/checkqualifier','raphe/asciifp','raphe/freezewindow',
			 'raphe/sfx','raphe/directorylist'

OBJECT lvitem OF mln
	icon:INT
	name:PTR TO CHAR
ENDOBJECT

ENUM ER_NONE,ER_WIN,ER_DIR,ER_NODIR,ER_SCR,ER_MOUSE,ER_EXAM,ER_REQ,ER_GAD,
		 ER_LOC,ER_FONT,ER_ICON,ER_FILE,ER_MEM
ENUM WBS=1,USER,LVID,RMB,WBSP,PREFS
ENUM ALWAYSOPENED=1,DOUBLECLICK,STARTUPSDIR,DEFSTARTUP,QUALIFIER,SCREENMODE,
		 DISABLEUSER,DISABLEWBS,LASTSTARTUP,FONT,FSIZE,EDITOR,LANGUAGE,SOUNDS
ENUM MEN_ABOUT=1,MEN_PREFS,MEN_CLI,MEN_QUIT,MEN_NEWFILE,MEN_EHIGHSCRIPT,
		 MEN_DHIGHSCRIPT
ENUM MSG_PROJECT=1,MSG_ABOUT,MSG_PREFS,MSG_CLI,MSG_QUIT,MSG_EDIT,MSG_DELETE,
		 MSG_NEWFILE,MSG_WBSTART,MSG_COMMANDS,MSG_USER,MSG_WBSTARTUP,MSG_REMEMBER,
		 MSG_ERWIN,MSG_ERDIR,MSG_ERNODIR,MSG_ERSCR,MSG_ERGAD,MSG_ERMEM,MSG_ERMOUSE,
		 MSG_NOFILE,MSG_NORENUSER,MSG_NORNENWBS,MSG_NOEXECUTE,MSG_CLOSEWIN,
		 MSG_ERLOC,MSG_HIGHSCRIPT,MSG_DELSCRIPT,MSG_YESNO,MSG_ERFONT,MSG_ERICON,
		 MSG_LOADSSP,MSG_ERROR

RAISE ER_WIN	IF OpenWindowTagList()=NIL,
			ER_SCR	IF OpenScreenTagList()=NIL,
			ER_MEM	IF New()=NIL

CONST BIGGER=-1,SMALLER=1
CONST	WIDCMP=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_MENUPICK OR LISTVIEWIDCMP
CONST WFLAGS=WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_GIMMEZEROZERO+WFLG_NEWLOOKMENUS+WFLG_DEPTHGADGET

DEF ptrwin=NIL:PTR TO window,glist=NIL
DEF scr=NIL:PTR TO screen,sig=-1,visual,menu
DEF lv_width=NIL,lv_heigth=NIL,lv_gad,fic_nbr=0
DEF dirlock=NIL
DEF result,response,p_anchor:PTR TO anchorpath,olddir
DEF ch[256]:STRING
DEF node=NIL:PTR TO ln
DEF wbsplus,wbsp_path
DEF qual=NIL,rmbchoice=0
DEF afp=NIL:PTR TO asciifp,fw=NIL:PTR TO freezewindows
DEF tattr:PTR TO textattr,tfont:PTR TO textfont
DEF rwidth=0,sound,out,cat
DEF about=NIL,check=NIL,launched=NIL,opencli=NIL,prefer=NIL,exit=NIL,
		welcome=NIL,delete=NIL,edit=NIL,confirm=NIL
DEF audio=NIL:PTR TO audio,dirlist=NIL:PTR TO directorylist
DEF nreq=NIL:PTR TO notifyrequest,notifysig
DEF icons=NIL:PTR TO LONG,lvhook:hook,maxitemh

PROC main() HANDLE
	DEF mes=NIL:PTR TO intuimessage
	DEF id,gad=NIL:PTR TO gadget,i,userdata,idcmp,item
	DEF seconds=0,micros,seconds2,micros2,sel
	DEF chtmp[256]:STRING
	DEF selected
	DEF prefs:PTR TO LONG
	DEF sigwait,sig
	DEF myargs:PTR TO LONG,rdargs

	initprefs()

 	myargs:=[0]
 	rdargs:=ReadArgs('POPUP/S',myargs,NIL)
	IF myargs[]<>0
		afp.setkeyword(ALWAYSOPENED,'YES')
	ENDIF
	IF rdargs THEN FreeArgs(rdargs)

	IF afp.getkeyword(ALWAYSOPENED)=NO
		IF peekqual() AND qual=NIL THEN Raise(ER_MOUSE)
	ENDIF

	init()

	IF FindTask('Workbench')=NIL THEN initmonitor()
	IF afp.getkeyword(SOUNDS)
		loadsound()
	ENDIF
	screen()
	wbsp_path:='SYS:prefs/WBStartup+Prefs'
	wbsplusprefs()
	scanstartupdir()
	addstartgadget()
	createmen()
	window()
	playsound(welcome)
	sigwait:=NIL
	sigwait:=Shl(1,ptrwin.userport.sigbit)
	IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
	REPEAT
		sig:=Wait(sigwait)
		IF sig AND Shl(1,notifysig)
			Gt_ReplyIMsg(mes)
			mes:=NIL
			closewin()
			scanstartupdir()
			addstartgadget()
			window(FALSE)
			sigwait:=NIL
			sigwait:=Shl(1,ptrwin.userport.sigbit)
			IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
		ELSEIF sig AND Shl(1,ptrwin.userport.sigbit)
			IF mes:=Gt_GetIMsg(ptrwin.userport)
				idcmp:=mes.class
				Gt_GetGadgetAttrsA(lv_gad, ptrwin, NIL, [GTLV_SELECTED, {selected}, NIL])
				SELECT idcmp
				CASE IDCMP_MENUPICK
					IF (item:=ItemAddress(menu,mes.code))<>NIL
						id:=Long(item+34)
						SELECT id
						CASE MEN_ABOUT
							playsound(about)
							req('StartupSelector\n\nVersion '+VERS+'\n\nCopyright © 1996-97\n\n'+
									DATE+'\n\nJean-marc ''Moonchild'' OLIVERES\n&\n'+
									'Raphaël ''RaphE'' GUENOT.','OK',gcs(MSG_ABOUT))
						CASE MEN_PREFS
							fw.freezewindow(ptrwin)
							playsound(prefer)
							prefs:=[afp.getkeyword(DISABLEUSER),
											afp.getkeyword(DISABLEWBS)]
							SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
							fw.activatewindow(ptrwin)
							Gt_ReplyIMsg(mes)
							mes:=NIL
							IF reloadprefs()
								sigwait:=NIL
								sigwait:=Shl(1,ptrwin.userport.sigbit)
								IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
							ENDIF
							afp.setkeyword(DISABLEUSER,prefs[0])
							afp.setkeyword(DISABLEWBS,prefs[1])
						CASE MEN_CLI
							playsound(opencli)
							SystemTagList('NewCli',NIL)
						CASE MEN_QUIT
							playsound(exit,TRUE)
							Gt_ReplyIMsg(mes)
							out:=1
							quit()
						CASE MEN_NEWFILE
							playsound(edit)
							makepath(afp.getkeyword(EDITOR),'New_script')
							SystemTagList(ch,NIL)
						CASE MEN_EHIGHSCRIPT
							IF selected<>-1
								playsound(edit)
								makepath(afp.getkeyword(EDITOR),node.name)
								SystemTagList(ch,NIL)
							ENDIF
						CASE MEN_DHIGHSCRIPT
							response:=0
							IF selected<>-1
								playsound(delete)
								response:=req(gcs(MSG_DELSCRIPT),gcs(MSG_YESNO),gcs(MSG_DELETE))
							ENDIF
							IF response=1
								playsound(confirm)
								makepath(NIL,node.name)
								StrCopy(chtmp,ch)
								DeleteFile(ch)
								StrAdd(chtmp,'.info')
								DeleteFile(chtmp)
								Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_LABELS,-1,NIL])
								scanstartupdir()
								Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_LABELS,dirlist.dirlist,NIL])
								Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_SELECTED,-1,NIL])
							ENDIF
						ENDSELECT
					ENDIF
				CASE IDCMP_GADGETUP
					gad:=mes.iaddress
					userdata:=gad.userdata
					SELECT userdata
					CASE USER
						playsound(check)
						afp.setkeyword(DISABLEUSER,Not(afp.getkeyword(DISABLEUSER)))
					CASE WBS
						playsound(check)
						afp.setkeyword(DISABLEWBS,Not(afp.getkeyword(DISABLEWBS)))
					CASE RMB
						playsound(check)
						rmbchoice:=Not(rmbchoice)
					CASE WBSP
						playsound(launched)
						fw.freezewindow(ptrwin)
						SystemTagList(wbsp_path,NIL)
						fw.activatewindow(ptrwin)
					CASE PREFS
						fw.freezewindow(ptrwin)
						playsound(prefer)
						prefs:=[afp.getkeyword(DISABLEUSER),
										afp.getkeyword(DISABLEWBS)]
						SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
						fw.activatewindow(ptrwin)
						Gt_ReplyIMsg(mes)
						mes:=NIL
						IF reloadprefs()
							sigwait:=NIL
							sigwait:=Shl(1,ptrwin.userport.sigbit)
							IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
						ENDIF
						afp.setkeyword(DISABLEUSER,prefs[0])
						afp.setkeyword(DISABLEWBS,prefs[1])
					CASE LVID
						node:=dirlist.dirlist.head
						FOR i:=1 TO mes.code DO node:=node.succ 
						IF afp.getkeyword(DOUBLECLICK)
							CurrentTime({seconds2},{micros2})
							IF seconds=0
								CurrentTime({seconds},{micros})
								sel:=i
							ELSEIF DoubleClick(seconds,micros,seconds2,micros2) AND (sel=i)
								afp.setkeyword(LASTSTARTUP,node.name)
								Gt_ReplyIMsg(mes)
								launchstart(node.name)
							ELSE
								seconds:=0
								CurrentTime({seconds},{micros})
								sel:=i
							ENDIF
						ELSE
							afp.setkeyword(LASTSTARTUP,node.name)
							Gt_ReplyIMsg(mes)
							launchstart(node.name)
						ENDIF
					ENDSELECT
				ENDSELECT
				IF mes<>NIL THEN Gt_ReplyIMsg(mes)
			ENDIF
		ENDIF
	UNTIL idcmp=IDCMP_CLOSEWINDOW
	launchstart(afp.getkeyword(DEFSTARTUP))
EXCEPT
	SELECT exception
		CASE ER_WIN		;	req(gcs(MSG_ERWIN),'OK',gcs(MSG_ERROR))
		CASE ER_DIR		;	req(gcs(MSG_ERDIR),'OK',gcs(MSG_ERROR))
		CASE ER_NODIR	;	req(gcs(MSG_ERNODIR),'OK',gcs(MSG_ERROR))
		CASE ER_SCR		;	req(gcs(MSG_ERSCR),'OK',gcs(MSG_ERROR))
		CASE ER_GAD		; req(gcs(MSG_ERGAD),'OK',gcs(MSG_ERROR))
		CASE ER_LOC		; req(gcs(MSG_ERLOC),'OK',gcs(MSG_ERROR))
		CASE ER_FONT	; req(gcs(MSG_ERFONT),'OK',gcs(MSG_ERROR))
		CASE ER_ICON	; req(gcs(MSG_ERICON),'OK',gcs(MSG_ERROR))
		CASE ER_MEM		; req(gcs(MSG_ERMEM),'OK',gcs(MSG_ERROR))
		CASE ER_MOUSE
			sound:=1
			IF rmbchoice
				launchstart(afp.getkeyword(DEFSTARTUP))
			ELSE
				StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
				AddPart(ch,afp.getkeyword(DEFSTARTUP),70)
				IF (dirlock:=Lock(ch,ACCESS_READ))=NIL
					req(gcs(MSG_ERMOUSE),'OK',gcs(MSG_ERROR))
					SystemTagList({lwb},NIL)	
					quit()
				ENDIF
			ENDIF
			launchstart(afp.getkeyword(DEFSTARTUP,TRUE))
	ENDSELECT
	quit()
ENDPROC

/*****************************************************************************
****  INIT  ******************************************************************
******************************************************************************/

PROC init()
	DEF task,coul:PTR TO LONG,j
	AssignPath('LOCALE','SYS:LOCALE/')
	IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise(ER_GAD)
	IF (localebase:=OpenLibrary('locale.library',38))=NIL THEN Raise(ER_LOC)
	IF (iconbase:=OpenLibrary('icon.library',37))=NIL THEN Raise(NIL)
	NEW audio.new([RIGHT_1+LEFT_1,RIGHT_2+LEFT_2]:CHAR)
	NEW fw.init()
	NEW dirlist.new()
	NEW nreq
	notifysig:=AllocSignal(-1)
	IF notifysig<>-1
		task:=FindTask(0)
		nreq.name:=afp.getkeyword(STARTUPSDIR)
		nreq.flags:=NRF_SEND_SIGNAL
		nreq.port:=task
		nreq.signalnum:=notifysig
	ENDIF
	StartNotify(nreq)
	cat:=OpenCatalogA(NIL,'StartupSelector.catalog',
									  [OC_LANGUAGE,afp.getkeyword(LANGUAGE),
										NIL])
	installhook(lvhook, {lvrender})
	coul:={rgb}
	FOR j:=1 TO 24
		coul[]:=Shl(coul[],24)
		coul[]++
	ENDFOR
ENDPROC

PROC initprefs()
	DEF ls:PTR TO LONG,quals:PTR TO LONG
	Rename({wbsold},{wbs})
	Rename({wbsoldinfo},{wbsinfo})
	Rename({userold},{user})
	AssignPath('ENV','ENVARC:')
	reqtoolsbase:=OpenLibrary('reqtools.library',37)
	ls:= ['LEFTBUTTON','RIGHTBUTTON','MIDDLEBUTTON',
				'LEFTALT','RIGHTALT','LEFTSHIFT','RIGHTSHIFT',
				'LEFTCOMMAND','RIGHTCOMMAND','CONTROL']
	NEW afp.new([
							 ['Double click ?',					DOUBLECLICK,VAL_YESNO,YES],
							 ['Window always opened ?',	ALWAYSOPENED,VAL_YESNO,NO],
							 ['Sounds ?',								SOUNDS,VAL_YESNO,YES],
							 ['Path to editor:',				EDITOR,VAL_STR,'C:ed'],
							 ['Startups directory:',		STARTUPSDIR,VAL_STR,'S:Start/'],
							 ['Default startup:',				DEFSTARTUP,VAL_STR,{startseq}],
							 ['Language:',							LANGUAGE,VAL_STR,'français'],
							 ['Qualifier:',							QUALIFIER,ls,0],
							 ['Screen mode:',						SCREENMODE,VAL_HEX,$29000],
							 ['Font:',									FONT,VAL_STR,'topaz.font'],
							 ['Font size:',							FSIZE,VAL_DEC,8],
							 ['Disable User-Startup ?',	DISABLEUSER,VAL_YESNO,NO],
							 ['Disable WBStartup ?',		DISABLEWBS,VAL_YESNO,NO]
							])
	IF afp.load({usename}) THEN afp.load({prefsname})
	quals:=[IEQUALIFIER_LEFTBUTTON,IEQUALIFIER_RBUTTON,IEQUALIFIER_MIDBUTTON,
					IEQUALIFIER_LALT,IEQUALIFIER_RALT,IEQUALIFIER_LCOMMAND,
					IEQUALIFIER_RCOMMAND,IEQUALIFIER_LSHIFT,IEQUALIFIER_RSHIFT,
					IEQUALIFIER_CONTROL]
	qual:=quals[afp.getkeyword(QUALIFIER)]
ENDPROC

PROC initmonitor()
	DEF info:fileinfoblock
	p_anchor:=New(SIZEOF anchorpath)
	IF (dirlock:=Lock('DEVS:monitors/',ACCESS_READ))=NIL THEN Raise(ER_NODIR)
	olddir:=CurrentDir(dirlock)
	result:=MatchFirst('~(#?.info)',p_anchor)
	WHILE result=0
		info:=p_anchor.info
		SystemTagList(info.filename,NIL)
		result:=MatchNext(p_anchor)
	ENDWHILE
	MatchEnd(p_anchor)
	CurrentDir(olddir)
	UnLock(dirlock)
	dirlock:=NIL
ENDPROC

PROC req(msg,choice,title)
	DEF s
	IF ptrwin THEN fw.freezewindow(ptrwin)
	IF reqtoolsbase
		s:=RtEZRequestA(msg,choice,0,0,[RTEZ_FLAGS,EZREQF_CENTERTEXT,
																	 RT_REQPOS,REQPOS_CENTERSCR,
																	 RTEZ_REQTITLE,title,
  																 NIL])
	ELSE
		s:=EasyRequestArgs(NIL,[20,0,title,msg,choice],0,NIL)
	ENDIF
	IF ptrwin THEN fw.activatewindow(ptrwin)
ENDPROC s

PROC scanstartupdir()
	DEF err,lenstr
	DEF ln:PTR TO lvitem,j,icon:PTR TO diskobject,img:PTR TO image
	REPEAT
		err:=dirlist.dirlist(afp.getkeyword(STARTUPSDIR),DLF_NODIRS,'~(#?.info|#?.bak)')
		IF err
			StringF(ch,'\s\n\s',gcs(MSG_ERDIR),gcs(MSG_LOADSSP))
			req(ch,'OK',gcs(MSG_ERROR))
			SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
			afp.load({usename})
		ENDIF
		IF Not(err)
			IF (fic_nbr:=dirlist.total())=NIL
				nofile()
			ENDIF
		ENDIF
	UNTIL (fic_nbr<>NIL) AND (err=NIL)
	freeicons() -> test dans la PROC pour savoir si icons<>NIL
	icons:=List(fic_nbr)
	SetList(icons,fic_nbr)
	ln:=dirlist.gotofirst()
	maxitemh:=NIL
	lv_width:=NIL
	FOR j:=0 TO fic_nbr-1
		StrCopy(ch,afp.getkeyword(STARTUPSDIR))
		AddPart(ch,ln.name,256)
		lenstr:=textlength(ln.name)+28
		IF icon:=GetDiskObject(ch)
			img:=icon.gadget.gadgetrender
			icons[j]:=icon
			IF (lenstr+img.width+2)>lv_width THEN lv_width:=lenstr+img.width+2
			IF img.height>maxitemh THEN maxitemh:=img.height
		ELSE
			IF lenstr>lv_width THEN lv_width:=lenstr
		ENDIF
		ln.icon:=j
		ln:=dirlist.getnext()
	ENDFOR
	lv_width:=lv_width+2
ENDPROC fic_nbr

PROC nofile()
	StringF(ch,'\s\n\s',gcs(MSG_NOFILE),gcs(MSG_LOADSSP))
	req(ch,'OK',gcs(MSG_ERROR))
	SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
	afp.load({usename})
ENDPROC

PROC reloadprefs()
	DEF sdir,sm,font,tfont,reopengui=FALSE
	sdir:=afp.getkeyword(STARTUPSDIR)
	sm:=afp.getkeyword(SCREENMODE)
	font:=afp.getkeyword(FONT)
	tfont:=afp.getkeyword(FSIZE)
	afp.load({usename})
	IF (sm<>afp.getkeyword(SCREENMODE)) OR (StrCmp(afp.getkeyword(FONT),font)=NIL) OR (afp.getkeyword(FSIZE)<>tfont)
		closegui()
		screen()
		reopengui:=-1
	ENDIF
	IF (StrCmp(sdir,afp.getkeyword(STARTUPSDIR))=NIL)
		closewin()
		reopengui:=-1
	ENDIF
	IF reopengui
		scanstartupdir()
		addstartgadget()
		window()
	ENDIF
ENDPROC reopengui

/*****************************************************************************
****  GUI  *******************************************************************
******************************************************************************/

PROC addstartgadget()
	DEF gadget,wbsplen,prefslen
	DEF strs:PTR TO LONG,lenstr
	rwidth:=0
	strs:=[gcs(MSG_USER),
				gcs(MSG_WBSTARTUP),
				gcs(MSG_REMEMBER),
				gcs(MSG_WBSTART),NIL]
	WHILE strs[]<>NIL DO IF (lenstr:=textlength(strs[]++))>rwidth THEN rwidth:=lenstr
	rwidth:=rwidth+35
	visual:=GetVisualInfoA(scr,NIL)
	gadget:=CreateContext({glist})
	wbsplen:=textlength(gcs(MSG_WBSTART))+8
	prefslen:=textlength(gcs(MSG_PREFS))+8
	IF tattr.ysize>maxitemh THEN maxitemh:=tattr.ysize
	INC maxitemh
	IF maxitemh AND 1 THEN INC maxitemh
	IF fic_nbr<6
		lv_heigth:=6*maxitemh+4
	ELSEIF (fic_nbr*maxitemh+4)>(scr.height-(2*maxitemh))
		lv_heigth:=Div(scr.height,maxitemh)*maxitemh+4-(2*maxitemh)
	ELSE
		lv_heigth:=fic_nbr*maxitemh+4
	ENDIF
	gadget:=CreateGadgetA(LISTVIEW_KIND,gadget,
					[0,0,lv_width,lv_heigth,0,tattr,0,0,visual,LVID]:newgadget,
					[	GTLV_LABELS,			dirlist.dirlist,
						GTLV_SELECTED,		dirlist.getpos(afp.getkeyword(DEFSTARTUP)),
						GTLV_ITEMHEIGHT,	maxitemh,
						GTLV_CALLBACK,		lvhook,
						GTLV_MAXPEN,			$FF,
						GTLV_SHOWSELECTED,NIL,NIL])
	lv_gad:=gadget
	gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
					[lv_width+2,0,12,tattr.ysize+4,
					gcs(MSG_USER),tattr,
					0,PLACETEXT_RIGHT,visual,USER]:newgadget,
					[GTCB_CHECKED,afp.getkeyword(DISABLEUSER),NIL])
	gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
          [lv_width+2,tattr.ysize+4,12,tattr.ysize+4,
					gcs(MSG_WBSTARTUP),tattr,
					0,PLACETEXT_RIGHT,visual,WBS]:newgadget,
					[GTCB_CHECKED,afp.getkeyword(DISABLEWBS),NIL])
	gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
          [lv_width+2,tattr.ysize*2+8,12,tattr.ysize+4,
					gcs(MSG_REMEMBER),tattr,
					0,PLACETEXT_RIGHT,visual,RMB]:newgadget,
					[GTCB_CHECKED,rmbchoice,NIL])
	gadget:=CreateGadgetA(BUTTON_KIND,gadget,
					[((rwidth-prefslen)/2)+lv_width,tattr.ysize*4+8,prefslen,
					tattr.ysize+4,gcs(MSG_PREFS),tattr,0,0,visual,PREFS]:newgadget,NIL)
	IF wbsplus
		gadget:=CreateGadgetA(BUTTON_KIND,gadget,
						[((rwidth-wbsplen)/2)+lv_width,lv_heigth-tattr.ysize-5,wbsplen,
						tattr.ysize+4,gcs(MSG_WBSTART),tattr,0,0,visual,WBSP]:newgadget,NIL)
	ENDIF
ENDPROC

PROC screen()
	tattr:=[afp.getkeyword(FONT),afp.getkeyword(FSIZE),0,0]:textattr
	IF (tfont:=OpenFont(tattr))=NIL
		IF (diskfontbase:=OpenLibrary('diskfont.library',37))=NIL
			req(gcs(MSG_ERFONT),'OK',gcs(MSG_ERROR))
		ELSE
			tfont:=OpenDiskFont(tattr)
		ENDIF
	ENDIF
	IF tfont=NIL THEN tattr:=['topaz.font',8,0,0]:textattr
	scr:=OpenScreenTagList(NIL,[SA_TITLE,			{ssscrntitle},
															SA_DEPTH,			3,
															SA_TYPE,			PUBLICSCREEN,
															SA_PUBNAME,		{pubname},
															SA_PUBSIG,		sig:=AllocSignal(-1),
															SA_PUBTASK,		FindTask(NIL),
															SA_PENS,			[-1],
															SA_FONT,			tattr,
															SA_DISPLAYID,	afp.getkeyword(SCREENMODE),
															SA_AUTOSCROLL,TRUE,
															SA_COLORS32,	{palette},
															NIL])
	PubScreenStatus(scr,0)
	SetDefaultPubScreen({pubname})
	SetPubScreenModes(SHANGHAI)
ENDPROC

PROC window(activate=TRUE)
	DEF beveltags
	DEF w_width,w_left,w_top
	w_width:=lv_width+rwidth+8
	w_left:=(scr.width-w_width)/2
	w_top:=(scr.height-lv_heigth)/2
	beveltags:=[GT_VISUALINFO,visual,GTBB_FRAMETYPE,BBFT_BUTTON,NIL]
  LayoutMenusA(menu,visual,NIL)
	ptrwin:=OpenWindowTagList(NIL,[WA_TITLE        ,{sstitle},
                                 WA_GADGETS      ,glist,
                                 WA_LEFT         ,w_left,
                                 WA_TOP          ,w_top,
                                 WA_INNERWIDTH   ,w_width,
                                 WA_INNERHEIGHT  ,lv_heigth,
                                 WA_IDCMP        ,WIDCMP,
                                 WA_FLAGS        ,WFLAGS,
                                 WA_CUSTOMSCREEN ,scr,
																 WA_AUTOADJUST   ,TRUE,
                                 WA_ACTIVATE     ,activate,
                                 NIL])
  SetMenuStrip(ptrwin,menu)
	Gt_RefreshWindow(ptrwin,NIL)
ENDPROC

PROC createmen()
	DEF fp
	IF KickVersion(39) THEN fp:=1 ELSE fp:=0
  menu:=CreateMenusA([1,0,gcs(MSG_PROJECT),0,0,0,0,
											2,0,gcs(MSG_ABOUT),'?',0,0,MEN_ABOUT,
											2,0,NM_BARLABEL,0,0,0,0,
                      2,0,gcs(MSG_PREFS),'P',0,0,MEN_PREFS,
											2,0,NM_BARLABEL,0,0,0,0,
											2,0,gcs(MSG_CLI),'C',0,0,MEN_CLI,
											2,0,NM_BARLABEL,0,0,0,0,
											2,0,gcs(MSG_QUIT),'Q',0,0,MEN_QUIT,
											1,0,gcs(MSG_COMMANDS),0,0,0,0,
											2,0,gcs(MSG_EDIT),0,0,0,0,
											3,0,gcs(MSG_NEWFILE),'E',0,0,MEN_NEWFILE,
											3,0,NM_BARLABEL,0,0,0,0,
											3,0,gcs(MSG_HIGHSCRIPT),'S',0,0,MEN_EHIGHSCRIPT,
											2,0,NM_BARLABEL,0,0,0,0,
											2,0,gcs(MSG_DELETE),'D',0,0,MEN_DHIGHSCRIPT,
                      0,0,0,0,0,0,0]:newmenu,[GTMN_NEWLOOKMENUS,TRUE,
                      												GTMN_FRONTPEN,		fp,
																							NIL])
ENDPROC

PROC lvrender(/*h:PTR TO hook*/y,o:PTR TO lvitem,m:PTR TO lvdrawmsg)
	DEF icon:PTR TO diskobject,img:PTR TO image,x,/*y,*/back=0
->	DEF afpt, afptsz,drmd
	DEF r:PTR TO rastport
	IF m.methodid=LV_DRAW
		r:=m.rastport
		SetStdRast(r)
		icon:=icons[o.icon]
		IF (m.state AND LVR_SELECTED) OR (m.state AND LVR_SELECTEDDISABLED)
			back:=3
			IF icon THEN img:=icon.gadget.selectrender
		ELSE
			IF icon
				IF (img:=icon.gadget.gadgetrender)=NIL THEN img:=icon.gadget.selectrender
			ENDIF
		ENDIF
		Box(m.bounds.minx,m.bounds.miny,m.bounds.maxx,m.bounds.maxy,back)
		Colour(1,back)
		IF icon
			x:=2
			y:=Shr(maxitemh-img.height,1)+m.bounds.miny
			DrawImage(m.rastport,img,x,y)
			x:=img.width+4
		ELSE
			x:=4
		ENDIF
			y:=Shr(maxitemh-m.drawinfo.font.ysize,1)+m.bounds.miny+m.drawinfo.font.ysize-1
			TextF(x,y,o.name)
/*		IF (m.state=LVR_NORMALDISABLED) OR (m.state=LVR_SELECTEDDISABLED)
			SetAPen(r,1)
			afpt:=r.areaptrn;  afptsz:=r.areaptsz
			SetAfPt(r,[$1111,$4444]:INT,1)
			drmd:=r.drawmode
			SetDrMd(r,RP_JAM1)
			RectFill(r,m.bounds.minx,m.bounds.miny,m.bounds.maxx,m.bounds.maxy)
			SetAfPt(r,afpt,afptsz)
			SetDrMd(r,drmd)
		ENDIF*/
	ELSE
		RETURN LVCB_UNKNOWN
	ENDIF
ENDPROC LVCB_OK

/*****************************************************************************
****  ENDGUI  ****************************************************************
******************************************************************************/

PROC launchstart(file)
	DEF launch
	IF sound=1
		END audio
	ELSE
		playsound(launched,TRUE)
	ENDIF
	IF afp.getkeyword(DISABLEUSER)
		IF (Rename({user},{userold}))=NIL
			req(gcs(MSG_NORENUSER),'OK',gcs(MSG_ERROR))
			RETURN
		ENDIF
	ENDIF
	IF afp.getkeyword(DISABLEWBS)
		IF (Rename({wbs},{wbsold}))=NIL OR (Rename({wbsinfo},{wbsoldinfo}))=NIL
			req(gcs(MSG_NORNENWBS),'OK',gcs(MSG_ERROR))
		ENDIF
	ENDIF
	makepath('C:EXECUTE ',file)	
	closegui()
	IF (launch:=SystemTagList(ch,NIL))=TRUE
		req(gcs(MSG_NOEXECUTE),'OK',gcs(MSG_ERROR))
	ENDIF
	quit()
ENDPROC

PROC wbsplusprefs()
	IF dirlock:=Lock(wbsp_path,ACCESS_READ)
		wbsplus:=TRUE
		UnLock(dirlock)
		dirlock:=NIL
	ENDIF	
ENDPROC

PROC quit()
	closegui()
	IF cat THEN CloseCatalog(cat)
	IF menu THEN FreeMenus(menu)
	IF dirlock THEN UnLock(dirlock)
	IF localebase THEN CloseLibrary(localebase)
	IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
	IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
	IF iconbase THEN CloseLibrary(iconbase)
	IF out<>1
		IF rmbchoice
			afp.setkeyword(DEFSTARTUP,node.name)
			afp.save()
		ENDIF
	ENDIF
	IF afp THEN END afp
	IF fw THEN END fw
	END audio
	IF nreq
		EndNotify(nreq)
		FreeSignal(notifysig)
		END nreq
	ENDIF
	DeleteFile({usename})
	freesample(about)
	freesample(check)
	freesample(launched)
	freesample(opencli)
	freesample(prefer)
	freesample(exit)
	freesample(welcome)
	freesample(delete)
	freesample(edit)
	freesample(confirm)
	CleanUp(0)
ENDPROC

PROC freeicons()
	DEF j
	IF icons
		FOR j:=0 TO ListLen(icons)-1
			IF icons[j] THEN FreeDiskObject(icons[j])
		ENDFOR
		DisposeLink(icons)
	ENDIF
ENDPROC

PROC closegui()
	closewin()
	IF scr
		IF countvisitorwindows({pubname})>0
			req(gcs(MSG_CLOSEWIN),'OK',gcs(MSG_QUIT))
			REPEAT			
				Wait(Shl(1,sig))
			UNTIL countvisitorwindows({pubname})=0
		ENDIF
		SetDefaultPubScreen(NIL)
		CloseS(scr)
		scr:=NIL
	ENDIF
	IF tfont
		IF diskfontbase
			CloseFont(tfont)
			CloseLibrary(diskfontbase)
		ELSE
			CloseFont(tfont)
		ENDIF
	ENDIF
	IF sig>=0
		FreeSignal(sig)
		sig:=0
	ENDIF
ENDPROC

PROC closewin()
	IF ptrwin
		ClearMenuStrip(ptrwin)
		CloseW(ptrwin)
		ptrwin:=NIL
		IF glist THEN FreeGadgets(glist)
		IF visual THEN FreeVisualInfo(visual)
		visual:=NIL
		glist:=NIL
	ENDIF
ENDPROC

PROC countvisitorwindows(scrname:PTR TO CHAR)
	DEF list:PTR TO lh,node:PTR TO pubscreennode,count
	list:=LockPubScreenList()
	node:=FindName(list,scrname)
	IF scr=NIL
		count:=-1
	ELSE
		count:=node.visitorcount
	ENDIF
	UnlockPubScreenList()
ENDPROC count

PROC textlength(text)
ENDPROC IntuiTextLength([0,0,0,0,0,tattr,text,NIL]:intuitext)

PROC loadsound()
 	about:=load8svx('PROGDIR:sounds/about')
 	check:=load8svx('PROGDIR:sounds/check')
	exit:=load8svx('PROGDIR:sounds/quit')
 	launched:=load8svx('PROGDIR:sounds/launched')
 	opencli:=load8svx('PROGDIR:sounds/opencli')
 	prefer:=load8svx('PROGDIR:sounds/preferences')
 	welcome:=load8svx('PROGDIR:sounds/welcome')
	edit:=load8svx('PROGDIR:sounds/edit')
	delete:=load8svx('PROGDIR:sounds/delete')
	confirm:=load8svx('PROGDIR:sounds/confirm')
ENDPROC

PROC playsound(sample,wait=FALSE)
	IF (sample)
		audio.play(sample)
		IF wait THEN audio.waitendsample()
	ENDIF
ENDPROC

PROC makepath(begin,end)
	DEF ch2[108]:STRING
	IF begin<>NIL
		StrCopy(ch2,begin,ALL)
		StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
		AddPart(ch,end,70)
		StringF(ch,'"\s"',ch)
		StrAdd(ch2,' ',ALL)
		StrAdd(ch2,ch,ALL)
		StrCopy(ch,ch2,ALL)
	ELSE
		StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
		AddPart(ch,end,70)
	ENDIF
ENDPROC ch

PROC gcs(msg)
ENDPROC GetCatalogStr(cat,msg,
						ListItem(['Project','About','Preferences','NewShell','Quit',
											'Edit','Delete','New file','Call WBStartup+',
											'Commands','Disable User-Startup','Disable WBStartup',
											'Remember choices','Unable to open window !',
											'Can''t find your directory !','Not a directory !',
											'Unable to lock Workbench screen !',
											'Can''t open Gadtools.library !',
											'Not enough memory !',
											'No Startup-Sequence !',
											'No script in the directory !',
											'Can''t rename User-Startup !',
											'Can''t rename WBStartup or WBStartup.info !',
											'Can''t execute this script !',
											'Please close the\nwindows to continue',
											'Can''t open Locale.library !',
											'Selected script',
											'Do you really want to delete\nthe selected script ?',
											'YES|NO','Can''t open Diskfont.library !',
											'Can''t open Icon.library !',
											'Loading StartupSelectorPrefs',
											'Error !'],msg-1))

palette:
INT	8,0	-> 8 couleurs à charger en commançant par la couleur 0
rgb:
LONG	149,149,149,	0,0,0,	255,255,255,	59,103,162,	123,123,123,
			175,175,175,	170,144,124,	255,169,151
LONG 0	-> fin de la liste

wbs:					CHAR 'SYS:WBStartup',0
wbsinfo:			CHAR 'SYS:WBStartup.info',0
wbsold:				CHAR 'SYS:WBStartupOld',0
wbsoldinfo:		CHAR 'SYS:WBStartupOld.info',0
user:					CHAR 'S:User-Startup',0
userold:			CHAR 'S:User-StartupOld',0
lwb:					CHAR 'C:LoadWB',0
sstitle:			CHAR 'StartupSelector ',VERS,0
ssscrntitle:	CHAR 'StartupSelector ',VERS,' Copyright © 1996-97 Moonchild Prod.',0
startseq:			CHAR 'Startup-Sequence',0
pubname:			CHAR 'StartupSelector',0
prefsname:		CHAR 'S:startupselector.prefs',0
usename:			CHAR 'RAM:startupselector.prefs',0

CHAR '$VER: StartupSelector ',VERS,' (',DATE,') Moonchild Prod.',0
