OPT PREPROCESS
OPT STACK=32000
OPT LARGE

MODULE 'muimaster','libraries/mui','libraries/muip','*mod',
       'mui/muicustomclass','amigalib/boopsi','libraries/gadtools',
       'intuition/classes','intuition/classusr','mui/betterstring_mcc',
       'intuition/screens','intuition/intuition','icon','mui/icon_mcc',
       'utility/tagitem','utility/hooks',
       'dos/datetime','dos/dos','tools/installhook' ,'workbench/startup',
       'workbench/workbench','libraries/asl',
       'amigaini','amigainibase'  ,'tools/file'

OBJECT ttype;name,next:PTR TO ttype; ENDOBJECT
OBJECT disk;  size, used, free, blksize  ; ENDOBJECT

OBJECT file
  name, doname, iname,pname,
  fp
  comment
  protection
  numblocks, size
  datestamp:datestamp
  infodata:infodata
  tt:ttype , numtt , nt:ttype , nic
  type, noicon
  stack
  deftool
  not , nod , pat
ENDOBJECT

OBJECT lv1; ob;ENDOBJECT
OBJECT lv2; name,text;ENDOBJECT

ENUM ID_HELP=2,ID_ABOUT,ID_ABOUTMUI

  DEF app=0,win=0,abrtw,abrtB,running=TRUE, sigs=0,result,verN, verS,icontypes:PTR TO LONG,
      menu,menuob,str[500]:STRING,deftitle,lv,pages:PTR TO LONG,abrtV,
      protimgdir,protframe,protmainframe,iconED,protG,dtG,dateL,
      sav_G, qit_G, envC, ttS,dtS,cmS,stkG,stkS,braB,nodB,notB,patN,guide,
      imgG,pageG,pageC,file:file,disk:disk,myname,
      sizebox,size1,size2,getdirB,dirsizeL,
      ph,ps,pp,pa,pr,pw,pe,pd,  ttP,dtP,cmP,stkP,
      ah,as,ap,aa,ar,aw,ae,ad,ex_dirs=0,ex_files=0,ex_size=0,
      ai=0:PTR TO amigaini,pause=0,prefsfile,
      ttpb,ttpf, dtpb,dtpf,cmpb,stkpb,ttlv,dtlv,cmlv,stklv,
      ttup,ttdwn,ttadd,ttdel,ttsrt,

      debug=0

DEF disp1Hook:hook,cmp1Hook:hook,disp2Hook:hook,cmp2Hook:hook,appMsgHook:hook,comHook:hook,windowHook:hook




PROC comFunc(l:PTR TO LONG)
DEF a,n,lp:PTR TO lv1,lp2:PTR TO lv2,str[256]:STRING,ca:PTR TO LONG
IF pause>0 THEN RETURN
ca:=["m","t"]

a:=l[]
SELECT a

CASE "icED"
IF myreq(StringF(str,'\ec\eb\el\e1Load Icon Editor ?\e0\en\n\s\n\s',iconED,file.name)) THEN
        loadfile(iconED,file.name)

CASE "getD";
abrtV:=0
set(abrtw,MUIA_Window_Open,1)
 getdir()
set(abrtw,MUIA_Window_Open,0)

CASE "page"
IF file.noicon
  IF myreq('\ecAbort Changes\nand reload file?')
  addnewicon()
  running:=0
  ENDIF
ELSE
get(pageG,MUIA_Group_ActivePage,{n})
set(pageC,MUIA_Text_Contents,imgGadTxt(pages[n]))
set(pageG,MUIA_Group_ActivePage,Abs(n=0))
ENDIF

CASE "lvc";
get(lv,MUIA_List_Entries,{n})
IF n=0 THEN RETURN set(ttS,MUIA_String_Contents,'')
pause++
doMethodA(lv,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{lp}])
set(ttS,MUIA_String_Contents,lp.ob)
set(win,MUIA_Window_ActiveObject,ttS)
pause--


CASE "dcp"   ->"dcp",cmS,cmlv
->pause++
doMethodA(l[3],[MUIM_Popstring_Close,1])
doMethodA(l[2],[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,IF l[3]=stkP THEN {lp} ELSE {lp2}])
IF l[3]=ttP
 lp:=NEW[lp2.text]:lv1
 doMethodA(lv,[MUIM_List_InsertSingle,lp,MUIV_List_Insert_Bottom])
 set(lv,MUIA_List_Active,MUIV_List_Active_Bottom)
ELSEIF l[3]=stkP
set(l[1],MUIA_String_Integer,Val(lp.ob))
ELSE
set(l[1],MUIA_String_Contents,lp2.text)
ENDIF

CASE "braB"
get(lv,MUIA_List_Entries,{n}) ; IF n=0 THEN RETURN
get(lv,MUIA_List_Active,{n}) ; IF n=-1 THEN RETURN
->pause++
doMethodA(lv,[MUIM_List_GetEntry,n,{lp}])
StrCopy(str,lp.ob)
  IF (StrCmp(str,'(',1)) AND (str[StrLen(str)-1]=")")
  StrCopy(str,str,StrLen(str)-1)
  MidStr(str,str,1)
  ELSE
  StringF(str,'(\s)',str)
  ENDIF
SetStr(str,StrLen(str))
  IF instr(str,'SCALOS_NOTEXT')=0;set(notB,MUIA_Selected,1); doMethodA(lv,[MUIM_List_Remove,MUIV_List_Remove_Active])
  ELSEIF instr(str,'SCALOS_NODRAG')=0;set(nodB,MUIA_Selected,1); doMethodA(lv,[MUIM_List_Remove,MUIV_List_Remove_Active])
  ELSE
  set(ttS,MUIA_String_Contents,news(str))
  ENDIF
set(win,MUIA_Window_ActiveObject,ttS)
->pause--

CASE "save"
IF writechanges() THEN running:=0

CASE "ttdl";
get(lv,MUIA_List_Entries,{n}) ; IF n=0 THEN RETURN
pause++
doMethodA(lv,[MUIM_List_Remove,MUIV_List_Remove_Active])
pause--
comFunc(["lvc"])

CASE "ttad";
lp:=NEW['(New)']:lv1
doMethodA(lv,[MUIM_List_InsertSingle,lp,MUIV_List_Insert_Bottom])
set(lv,MUIA_List_Active,MUIV_List_Active_Bottom)
set(win,MUIA_Window_ActiveObject,ttS)

CASE "ttch"
get(lv,MUIA_List_Entries,{n}) ; IF n=0 THEN RETURN
pause++
doMethodA(lv,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{lp}])
lp.ob:=news(l[1])
doMethodA(lv,[MUIM_List_Redraw,MUIV_List_Redraw_Active])
set(win,MUIA_Window_ActiveObject,ttS)
pause--

CASE "ttup";
set(win,MUIA_Window_ActiveObject,ttS)
get(lv,MUIA_List_Entries,{n}) ; IF n<2 THEN RETURN
pause++
doMethodA(lv,[MUIM_List_Exchange,MUIV_List_Exchange_Active,MUIV_List_Exchange_Previous])
set(lv,MUIA_List_Active,MUIV_List_Active_Up)
pause--

CASE "ttdn"
set(win,MUIA_Window_ActiveObject,ttS)
get(lv,MUIA_List_Entries,{n}) ; IF n<2 THEN RETURN
pause++
doMethodA(lv,[MUIM_List_Exchange,MUIV_List_Exchange_Active,MUIV_List_Exchange_Next])
set(lv,MUIA_List_Active,MUIV_List_Active_Down)
pause--
ENDSELECT
ENDPROC


PROC main() HANDLE
  DEF tt:PTR TO ttype,l1:lv1

  IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN))=NIL THEN
    Raise('Failed to open muimaster.library')

  IF (iconbase:=OpenLibrary('icon.library',33))=NIL THEN
    Raise('Failed to open icon.library')

  IF (amigainibase:=OpenLibrary(AMIGAINI_NAME,AMIGAINI_VMIN))=NIL THEN
    Raise('Failed to open amigaini.library')

deftitle:='Scalos Information 3.1b'
verN:='3.1b'
verS:='$VER: Scalos_Information 3.1b (19.10.2001)'
pages:=['Main Info','ToolTypes','Add Icon']:LONG

getargs()

examine()

  installhook(appMsgHook,{appMsgFunc})
  installhook(disp1Hook,{disp1Func})
  installhook(cmp1Hook,{cmp1Func})
  installhook(disp2Hook,{disp2Func})
  installhook(cmp2Hook,{cmp2Func})
  installhook(comHook,{comFunc})
  installhook(windowHook,{windowFunc})

icontypes:=['Disk','Drawer','Tool','Project','Trashcan',0]:LONG

  menu := [ NM_TITLE,0, 'Main'    , 0 ,0,0,0,
            NM_ITEM ,0, 'Settings','S',0,0,"pref",
            NM_ITEM ,0, 'Help'	 ,'H',0,0,ID_HELP,
            NM_ITEM ,0, 'Quit'	 ,'Q',0,0,MUIV_Application_ReturnID_Quit,
            NM_TITLE,0, 'About'	 , 0 ,0,0,0,
            NM_ITEM ,0, deftitle	 ,'?',0,0,ID_ABOUT,
            NM_ITEM ,0, 'MUI'		 ,'M',0,0,ID_ABOUTMUI,
            NM_END  ,0, NIL	 	 , 0 ,0,0,0]:newmenu

getguide()

  app:=ApplicationObject,
    MUIA_Application_Title      , deftitle,
    MUIA_Application_Version    , verS,
    MUIA_Application_Copyright  , '©2000/2002, Bruce Steers',
    MUIA_Application_Author     , 'Bruce Steers',
    MUIA_Application_Description, 'New breed Icon Information',
    MUIA_Application_Base       , 'INFORMATION',
    MUIA_Application_Menustrip  , menuob := Mui_MakeObjectA(MUIO_MenustripNM,[menu,0]),
    MUIA_Application_HelpFile  ,  guide,

/*
PROC mainWindow() -> JumpED Pointer*/

    SubWindow, abrtw:= WindowObject,
      MUIA_Window_Title    , 'Dir Read..' ,
      MUIA_Window_ScreenTitle    , deftitle,
      MUIA_Window_ID       , "ABRT",
      WindowContents, VGroup,
      Child, abrtB:=SimpleButton('_Abort'),
      End,
    End,

    SubWindow, win:= WindowObject,
      MUIA_Window_Title    , file.name ,
      MUIA_Window_ScreenTitle    , deftitle,
      MUIA_Window_ID       , "MAIN",
      MUIA_Window_AppWindow, MUI_TRUE,
      WindowContents, VGroup,
        Child, HGroup,
        Child, Label('Name:'),
          Child, BetterStringObject,
          TextFrame,
          MUIA_String_Contents,file.fp,
          MUIA_CycleChain,1,
          MUIA_String_Accept,'',
          End,
        Child, envC := Cycle(icontypes),
        End,

/*
PROC PageGroup() -> JumpED Pointer*/

			Child, pageG := PageGroup,

           Child, VGroup,
           MUIA_Weight,100,
           GroupFrame,
             Child, HGroup,
               Child, sizebox := sizegroup(),
               Child, VGroup,
             Child, protG := HGroup,
                 MUIA_Frame,protmainframe,
                 MUIA_FrameTitle,IF protmainframe THEN 'File Protecion' ELSE 0,
                 MUIA_Group_VertSpacing,5,
                 MUIA_Group_HorizSpacing,3,
                 Child, RectangleObject, End,
                 ->Child, Label2('\e1Flags:'),
                 Child, ph := findFlagIcon("H",ah),
                 Child, ps := findFlagIcon("S",as),
                 Child, pp := findFlagIcon("P",ap),
                 Child, pa := findFlagIcon("A",aa),
                 Child, pr := findFlagIcon("R",ar),
                 Child, pw := findFlagIcon("W",aw),
                 Child, pe := findFlagIcon("E",ae),
                 Child, pd := findFlagIcon("D",ad),
                 Child, RectangleObject, End,
                 End,
               Child, RectangleObject, End,
                 Child, imgG:=HGroup,
                 MUIA_FrameTitle,'Icon Image',
                 Child, RectangleObject, End,
                 Child, iconobject(),
                 Child, RectangleObject, End,
                 End,
               Child, RectangleObject, End,
               End,
             End,
           Child, RectangleObject, End,
             Child, HGroup,
             TextFrame,
             MUIA_FrameTitle,'Last Changed Date',
             Child, RectangleObject, End,
             Child, dateL:=Label2(datetime('\e1')),
             Child, RectangleObject, End,
             End,

           Child, cmpopup(),
           Child, dtpopup(),
           End,




           Child, VGroup,
             Child, VGroup,
             MUIA_FrameTitle,'Standard ToolTypes',
             GroupFrame,
             Child, lv:=makeLV(),
               Child, HGroup,
               Child, ttup :=imageobject(MUII_ArrowUp),
               Child, ttdwn:=imageobject(MUII_ArrowDown),
               Child, ttadd:=SimpleButton(imgGadTxt('Add New')),
               Child, ttdel:=SimpleButton(imgGadTxt('Delete')),
               Child, ttsrt:=SimpleButton(imgGadTxt('Sort')),
               End,
             Child, ttpopup(),
             End,

             Child, HGroup,
             GroupFrame,
             MUIA_FrameTitle,'Scalos ToolTypes',
             Child, RectangleObject, End,
             Child, Label(imgGadTxt('NoText',0,':')),
             Child, notB:=CheckMark(0),
             Child, RectangleObject, End,
             Child, Label(imgGadTxt('NoDrag',0,':')),
             Child, nodB:=CheckMark(0),
             Child, RectangleObject, End,
             Child, Label(imgGadTxt('PatternNo',0,':')),
             Child, patN:=Mui_MakeObjectA(MUIO_NumericButton,[NIL,0,300,'%3ld']),
             Child, RectangleObject, End,
             End,
           End,
         End,

        Child, HGroup,
        Child, pageC:=SimpleButton(imgGadTxt(pages[IF file.noicon THEN 2 ELSE 1])),
        Child, sav_G:=SimpleButton(imgGadTxt('Save','_')),
        Child, qit_G:=SimpleButton(imgGadTxt('Cancel','_')),
        End,
      End,
    End,
  End

  IF (app=NIL) THEN Raise('Failed to create Application.')

/*
PROC DoMethods() -> JumpED Pointer */

  doMethodA(app,[MUIM_MultiSet,MUIA_Weight,0,braB,envC,0])
  doMethodA(app,[MUIM_MultiSet,MUIA_Image_FreeVert,1,pageC,sav_G,qit_G,0])
  doMethodA(app,[MUIM_MultiSet,MUIA_Image_FontMatchHeight,1,pageC,sav_G,qit_G,0])
  ->doMethodA(app,[MUIM_MultiSet,MUIA_Image_FreeHoriz,1,pageC,sav_G,qit_G,0])

  doMethodA(win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
    app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])

  doMethodA(braB,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"braB"])

  doMethodA(lv,[MUIM_Notify,MUIA_Listview_DoubleClick,1,
    app,3,MUIM_CallHook,comHook,"braB"])


  doMethodA(qit_G,[MUIM_Notify,MUIA_Pressed,0,
    app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])

  doMethodA(pageC,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"page"])

  doMethodA(lv,[MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,
    app,3,MUIM_CallHook,comHook,"lvc"])

  doMethodA(ttlv,[MUIM_Notify,MUIA_Listview_DoubleClick,1,
    app,6,MUIM_CallHook,comHook,"dcp",ttS,ttlv,ttP])
  doMethodA(dtlv,[MUIM_Notify,MUIA_Listview_DoubleClick,1,
    app,6,MUIM_CallHook,comHook,"dcp",dtS,dtlv,dtP])
  doMethodA(cmlv,[MUIM_Notify,MUIA_Listview_DoubleClick,1,
    app,6,MUIM_CallHook,comHook,"dcp",cmS,cmlv,cmP])
  doMethodA(stklv,[MUIM_Notify,MUIA_Listview_DoubleClick,1,
    app,6,MUIM_CallHook,comHook,"dcp",stkS,stklv,stkP])

doMethodA(abrtB,[MUIM_Notify,MUIA_Pressed,0,
 app,3,MUIM_WriteLong,1,{abrtV}])
doMethodA(abrtw,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
 app,3,MUIM_WriteLong,1,{abrtV}])

doMethodA(ttup,[MUIM_Notify,MUIA_Pressed,0,
    lv,3,MUIM_CallHook,comHook,"ttup"])
doMethodA(ttdwn,[MUIM_Notify,MUIA_Pressed,0,
    lv,3,MUIM_CallHook,comHook,"ttdn"])
doMethodA(ttadd,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"ttad"])
doMethodA(ttdel,[MUIM_Notify,MUIA_Pressed,0,
    lv,3,MUIM_CallHook,comHook,"ttdl"])
doMethodA(ttsrt,[MUIM_Notify,MUIA_Pressed,0,
    lv,1,MUIM_List_Sort])

doMethodA(sav_G,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"save"])

doMethodA(getdirB,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"getD"])

doMethodA(imgG,[MUIM_Notify,MUIA_Pressed,0,
    app,3,MUIM_CallHook,comHook,"icED"])

doMethodA(ttS,[MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,
    app,4,MUIM_CallHook,comHook,"ttch",MUIV_TriggerValue])


  doMethodA(win,[MUIM_Notify,MUIA_AppMessage,MUIV_EveryTime,
    app,3,MUIM_CallHook,appMsgHook,MUIV_TriggerValue])

initfiletype(file.type)

tt:=file.tt
WHILE tt.next
    l1:=NEW[tt.name]:lv1
    doMethodA(lv,[MUIM_List_InsertSingle,l1,MUIV_List_Insert_Bottom])
tt:=tt.next
ENDWHILE

->set(dateL,MUIA_Text_Contents,datetime('\e1'))

set(notB,MUIA_Selected,file.not)
set(nodB,MUIA_Selected,file.nod)
set(patN,MUIA_Numeric_Value,file.pat)
IF FileLength(file.doname)<1
StrCopy(str,'No Icon Exists')
ELSEIF file.nic
StrCopy(str,'''NewIcon'' Image')
ELSE
StrCopy(str,'''WBIcon'' Image')
ENDIF
set(imgG,MUIA_FrameTitle,str)

set(envC,MUIA_Cycle_Active,file.type - 1)
set(envC,MUIA_Disabled,1)

set(dirsizeL,MUIA_ShowMe,0)

setpopuplist(ttlv,'ToolType Popups')
setpopuplist(dtlv,'DefTool Popups')
setpopuplist(cmlv,'Comment Popups')
IF (file.type=WBTOOL) OR (file.type=WBPROJECT) THEN setstkpopup()

sethelp()

  set(win,MUIA_Window_Open,MUI_TRUE)

  WHILE running
  result:=doMethodA(app,[MUIM_Application_NewInput,{sigs}])
  SELECT result
  CASE MUIV_Application_ReturnID_Quit; running:=0
  CASE ID_ABOUT; myreq(StringF(str,'\ec\e1\s\e0\nBy Bruce steers <bsteers@ukonline.co.uk>',verS),'_OK')
  CASE ID_ABOUTMUI;doMethodA(app,[MUIM_Application_AboutMUI,win])
  CASE ID_HELP;	doMethodA(app,[MUIM_Application_ShowHelp,win,0,0,0]);
  CASE "pref";
  loadfile(prefsfile)
  ENDSELECT

    IF (running AND sigs) THEN sigs:=Wait(sigs)

  ENDWHILE


EXCEPT DO
    IF exception
    IF app=NIL THEN WriteF('\e[32mException Caused\e[31m ! ...\n\s\n' , exception ) ELSE myreq(StringF(str,'\e1\eu\ebException Caused\en\e0 ! ..\n\ec\s',exception),'_OK')
    ENDIF
  IF app THEN Mui_DisposeObject(app)
  IF muimasterbase THEN CloseLibrary(muimasterbase)
  IF iconbase THEN CloseLibrary(iconbase)
  IF ai THEN END ai
  IF amigainibase THEN CloseLibrary(amigainibase)
ENDPROC


PROC makeLV() IS
  ListviewObject,
    MUIA_Listview_List , ListObject,
      InputListFrame,
      MUIA_List_Title,0,
      MUIA_List_DisplayHook,disp1Hook,
      MUIA_List_CompareHook,cmp1Hook,
    End,
  End



PROC disp1Func(arr:PTR TO LONG,l1=0:PTR TO lv1)
  IF l1 THEN arr[] := l1.ob
ENDPROC

PROC disp2Func(arr:PTR TO LONG,lp=0:PTR TO lv2)
  IF lp
  arr[]++ := lp.name
  arr[] := lp.text
  ENDIF
ENDPROC

PROC cmp1Func(s1:PTR TO lv1,s2:PTR TO lv1) IS OstrCmp(s1.ob,s2.ob)
PROC cmp2Func(s1:PTR TO lv2,s2:PTR TO lv2) IS OstrCmp(s1.name,s2.name)

PROC appMsgFunc(obj,x:PTR TO LONG)
  DEF ap:PTR TO wbarg, amsg:PTR TO appmessage,
      i, buf[256]:STRING,b,app
  app:=obj
  amsg:=x[]
  b:=buf;i:=0
  ap:=amsg.arglist
  WHILE (i<amsg.numargs)
    NameFromLock(ap.lock,buf,StrMax(buf))
    AddPart(buf,ap.name,StrMax(buf))
    loadfile(myname,buf)
    ap++
    i++
  ENDWHILE
ENDPROC 0

PROC examine(); DEF lock=0,fib:fileinfoblock
IF debug THEN WriteF('')
/*
  IF Not(lock)
  file.pname:=file.doname
  lock:=Lock(file.pname,-2)
  ENDIF
*/

file.pname:=file.name
 IF lock:=Lock(file.name,-2)
 Examine(lock,fib)
 file.protection:=fib.protection
 CopyMem(fib.datestamp,file.datestamp,SIZEOF datestamp)
 ah := IF file.protection AND FIBF_HIDDEN THEN 1 ELSE 0
 as := IF file.protection AND FIBF_SCRIPT THEN 1 ELSE 0
 ap := IF file.protection AND FIBF_PURE THEN 1 ELSE 0
 aa := IF file.protection AND FIBF_ARCHIVE THEN 1 ELSE 0
 ar := IF file.protection AND FIBF_READ THEN 0 ELSE 1
 aw := IF file.protection AND FIBF_WRITE THEN 0 ELSE 1
 ae := IF file.protection AND FIBF_EXECUTE THEN 0 ELSE 1
 ad := IF file.protection AND FIBF_DELETE THEN 0 ELSE 1

   IF fib.direntrytype<0
   file.numblocks:=fib.numblocks
   file.size:=fib.size
   ENDIF
 file.comment:=news(fib.comment)
 UnLock(lock)
 ELSE
 file.pname:=0
 ENDIF
diskobjects()
ENDPROC

PROC v2s(v,pref=0,post=0); DEF s:PTR TO LONG,l=0
IF pref THEN l:=StrLen(pref)
IF post THEN l:=l+StrLen(post)
l:=l+20
s:=String(l)
StringF(s,'\d',v)

checkcom(s)

IF pref THEN StringF(s,'\s\s',pref,s)
IF post THEN StringF(s,'\s\s',s,post)
ENDPROC s

PROC datetime(pre=0); DEF s,dt:datetime,day[50]:ARRAY,date[50]:ARRAY,time[50]:ARRAY

CopyMem(file.datestamp,dt.stamp,SIZEOF datestamp)

  dt.format:=FORMAT_DOS
  dt.flags:=DTF_FUTURE
  dt.strday:=day
  dt.strdate:=date
  dt.strtime:=time

  IF DateToStr(dt)
  s:=String(256)
  StringF(s,'\s \s \s',day,date,time)
  IF pre THEN StringF(s,'\s\s',pre,s)
  SetStr(s,StrLen(s))
  RETURN s
  ENDIF
ENDPROC ''


PROC ttpopup() IS
  HGroup,
  MUIA_Group_VertSpacing,1,
  MUIA_Group_HorizSpacing,1,
  Child, PopaslObject,
      MUIA_Popstring_String, ttS := BetterStringObject,
      StringFrame,
      MUIA_String_Contents,'',
      MUIA_String_AttachedList,lv,
      MUIA_String_MaxLen,256,
      End,
    MUIA_Popstring_Button, ttpf := PopButton(MUII_PopFile),
    ASLFR_TITLETEXT, 'Select a file...',
    End,
    Child, ttP := PopobjectObject,
	 MUIA_Popstring_Button, ttpb := PopButton(MUII_PopUp),
	 MUIA_Popobject_WindowHook, windowHook,
	   MUIA_Popobject_Object, ttlv := ListviewObject,
	     MUIA_Listview_List, ListObject,
	     InputListFrame,
	     MUIA_List_AdjustWidth,1,
	     MUIA_List_AdjustHeight,1,
        MUIA_List_Title,0,
        MUIA_List_CompareHook,cmp2Hook,
	     MUIA_List_DisplayHook,disp2Hook,
	     MUIA_List_Format,'COL=0',
	     MUIA_List_Active,-1,
	     End,
	   End,
	 End,
  Child, braB :=SimpleButton('()'),
  End

PROC dtpopup() IS
  dtG:= HGroup,
  MUIA_Group_VertSpacing,1,
  MUIA_Group_HorizSpacing,1,
  Child, Label2('\e1DefTool:'),
  Child, PopaslObject,
      MUIA_Popstring_String, dtS := BetterStringObject,
      StringFrame,
      MUIA_String_Contents,'',
      MUIA_String_MaxLen,256,
      End,
    MUIA_Popstring_Button, dtpf := PopButton(MUII_PopFile),
    ASLFR_TITLETEXT, 'Select a file...',
    End,
    Child, dtP := PopobjectObject,
	 MUIA_Popstring_Button, dtpb := PopButton(MUII_PopUp),
	 MUIA_Popobject_WindowHook, windowHook,
	   MUIA_Popobject_Object, dtlv := ListviewObject,
	     MUIA_Listview_List, ListObject,
	     InputListFrame,
	     MUIA_List_AdjustWidth,1,
	     MUIA_List_AdjustHeight,1,
        MUIA_List_Title,0,
        MUIA_List_CompareHook,cmp2Hook,
	     MUIA_List_DisplayHook,disp2Hook,
	     MUIA_List_Format,'COL=0',
	     MUIA_List_Active,-1,
	     End,
	   End,
	 End,
  End

PROC cmpopup() IS
  HGroup,
  MUIA_Group_VertSpacing,1,
  MUIA_Group_HorizSpacing,1,
  Child, Label2('\e1Comment:'),
    Child, cmS := BetterStringObject,
    StringFrame,
    MUIA_String_Contents,file.comment,
    MUIA_String_MaxLen,256,
    End,
    Child, cmP := PopobjectObject,
	 MUIA_Popstring_Button, cmpb := PopButton(MUII_PopUp),
	 MUIA_Popobject_WindowHook, windowHook,
	   MUIA_Popobject_Object, cmlv := ListviewObject,
	     MUIA_Listview_List, ListObject,
	     InputListFrame,
	     MUIA_List_AdjustWidth,1,
	     MUIA_List_AdjustHeight,1,
        MUIA_List_Title,0,
        MUIA_List_CompareHook,cmp2Hook,
	     MUIA_List_DisplayHook,disp2Hook,
	     MUIA_List_Format,'COL=0',
	     MUIA_List_Active,-1,
	     End,
	   End,
	 End,
  End

PROC stkpopup() IS
  stkG:= HGroup,
  MUIA_Group_VertSpacing,1,
  MUIA_Group_HorizSpacing,1,
    Child, stkS := BetterStringObject,
    TextFrame,
    MUIA_FixWidthTxt,'000000',
    MUIA_String_MaxLen,10,
    MUIA_String_Accept,0123456789,
    MUIA_String_Integer,0,
    MUIA_String_Format,MUIV_String_Format_Left,
    End,
    Child, stkP := PopobjectObject,
	 MUIA_Popstring_Button, stkpb := PopButton(MUII_PopUp),
	 MUIA_Popobject_WindowHook, windowHook,
	   MUIA_Popobject_Object, stklv := ListviewObject,
	     MUIA_Listview_List, ListObject,
	     InputListFrame,
	     MUIA_List_AdjustWidth,1,
	     MUIA_List_AdjustHeight,1,
        MUIA_List_Title,0,
        MUIA_List_CompareHook,cmp1Hook,
	     MUIA_List_DisplayHook,disp1Hook,
	     MUIA_List_Active,-1,
	     End,
	   End,
	 End,
  End

PROC windowFunc(pop,win)
	set(win,MUIA_Window_DefaultObject,pop);
ENDPROC

PROC getprogname(); DEF l,d,f[56]:STRING
IF l:=GetProgramDir()
d:=String(256)
NameFromLock(l,d,256)
GetProgramName(f,56)
AddPart(d,f,256)
SetStr(d,StrLen(d))
ENDIF
ENDPROC d

PROC getargs()
DEF wb:PTR TO wbstartup, args:PTR TO wbarg, rdargs,
    myargs:PTR TO LONG, marg0:PTR TO LONG,c=0

getINI()

  IF wbmessage=NIL
  myname:=getprogname()
  myargs:=[0]
    IF rdargs:=ReadArgs('Files/A/M',myargs,NIL)
    marg0:=myargs[0]

      WHILE marg0[]
      StrCopy(str,marg0[])
        IF str[StrLen(str)-1]="/"
        str[StrLen(str)-1]:=0
        ENDIF
      IF c=0 THEN file.name:=news(str) ELSE loadfile(myname,str)
      marg0[]++
      c++
      ENDWHILE

    FreeArgs(rdargs)
    ELSE
    file.name:=muiasl(deftitle,10,'','#?')
    IF StrLen(file.name)=0 THEN Raise(0)
    ENDIF
  ELSE						/* from wb */
    wb:=wbmessage
   args:=wb.arglist
    NameFromLock(args[0].lock,str,256)
    IF StrLen(args[0].name)>0 THEN AddPart(str, args[0].name,256)
    myname:=news(str)
    IF wb.numargs>=2
      IF wb.numargs>2
        FOR rdargs:=2 TO wb.numargs-1
        NameFromLock(args[rdargs].lock,str,256)
        IF StrLen(args[rdargs].name)>0 THEN AddPart(str, args[rdargs].name,256)
        loadfile(myname,str)
        ENDFOR
      ENDIF
    NameFromLock(args[1].lock,str,256)
    IF StrLen(args[1].name)>0 THEN AddPart(str, args[1].name,256)
    file.name:=news(str)
    ELSE
    file.name:=muiasl(deftitle,10,'ProgDir:','#?')
    IF StrLen(file.name)=0 THEN Raise(0)
    ENDIF
  ENDIF
file.type:=-10
StringF(str,'\s',file.name)

 IF (rdargs:=instr(file.name,'DISK.INFO'))=(StrLen(file.name)-9)
 file.type:=WBDISK
   file.iname:=String(StrLen(file.name)-5)
   StrCopy(file.iname,file.name,StrLen(file.name)-5)
 StrCopy(file.name,file.name,rdargs)
 SetStr(file.name,rdargs)

 ELSEIF str[StrLen(str)-1]=":"
 file.type:=WBDISK
 StringF(str,'\sdisk',file.name)
 file.iname:=news(str)

 ELSEIF (rdargs:=instr(file.name,'.INFO'))=(StrLen(file.name)-5)
 StrCopy(file.name,file.name,rdargs)
 SetStr(file.name,rdargs)
 file.iname:=file.name
 ELSE
 file.iname:=file.name
 ENDIF

StringF(str,IF file.type=WBDISK THEN '\sdisk.info' ELSE '\s.info',file.name)
file.doname:=news(str)

StringF(str,'\s',file.name)
file.fp:=IF str[StrLen(str)-1]=":" THEN file.name ELSE FilePart(file.name)

IF file.type=WBDISK THEN doInfo()

ENDPROC

PROC myreq(bod=0,gads=0,ag=0) HANDLE
DEF body:PTR TO CHAR,gadgets:PTR TO CHAR,args:PTR TO CHAR,answer

body:=IF bod=0 THEN 'Are You Sure ?' ELSE bod
args:=IF ag=0 THEN 0 ELSE ag
gadgets:=IF gads=0 THEN '_Yes|_No' ELSE gads

answer:=Mui_RequestA(app,
                     win,
                     0,deftitle,gadgets,body,args)

EXCEPT DO
  IF exception THEN WriteF('\s\n',exception)
ENDPROC answer

PROC initfiletype(type)

 set(patN,MUIA_Disabled,Abs((type=WBTOOL) OR (type=WBPROJECT)))
 ->set(sizebox,MUIA_ShowMe,Abs((type=WBTOOL) OR (type=WBPROJECT)))
 set(protG,MUIA_ShowMe, Abs(type<>WBDISK) )
 set(dtG,MUIA_ShowMe, Abs(((type=WBDISK) OR (type=WBPROJECT)) AND (file.noicon=0)))
 doMethodA(app,[MUIM_MultiSet,MUIA_Disabled, Abs(((type=WBTOOL) OR (type=WBPROJECT)) AND (file.noicon)), stkG,0])

  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  lv,ttup,ttdwn,ttadd,ttdel,ttsrt,
  ttS,ttpf,ttpb,braB,
  notB,nodB,patN,
  pageC,sav_G, qit_G,
  0])

SELECT type

CASE WBDISK
IF file.noicon=0 THEN set(dtS,MUIA_String_Contents,file.deftool )
  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  cmS,cmpb,
  dtS,dtpf,dtpb,
  pageC,sav_G, qit_G,
  0])

CASE WBDRAWER
IF file.noicon=0 THEN set(dtS,MUIA_String_Contents,file.deftool )
  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  getdirB,
  ph,ps,pp,pa,pr,pw,pe,pd,
  cmS,cmpb,
  pageC,sav_G, qit_G,
  0])


CASE WBTOOL
IF file.noicon=0
 set(stkS,MUIA_String_Integer,file.stack )
ENDIF
  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  stkS,stkpb,
  ph,ps,pp,pa,pr,pw,pe,pd,
  cmS,cmpb,
  pageC,sav_G, qit_G,
  0])

CASE WBPROJECT
IF file.noicon=0
 set(dtS,MUIA_String_Contents,file.deftool )
 set(stkS,MUIA_String_Integer,file.stack )
ENDIF
  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  stkS,stkpb,
  ph,ps,pp,pa,pr,pw,pe,pd,
  cmS,cmpb,
  dtS,dtpf,dtpb,
  pageC,sav_G, qit_G,
  0])


CASE WBGARBAGE
  doMethodA(app,[MUIM_MultiSet,MUIA_CycleChain,1,
  getdirB,
  ph,ps,pp,pa,pr,pw,pe,pd,
  cmS,cmpb,
  pageC,sav_G, qit_G,
  0])

ENDSELECT
ENDPROC

PROC diskobjects(); DEF do:diskobject,type
file.noicon:=0

  IF do:=GetDiskObjectNew(file.iname)
  type:=do.type
  file.type:=type

    IF FileLength(file.doname)<1
      IF myreq(StringF(str,'No Icon Exists\n\s',file.doname),'Create Icon|Use Without')
      IF PutDiskObject(file.iname,do)=0 THEN file.noicon:=1
      ELSE
      FreeDiskObject(do)
      file.noicon:=1
      RETURN
      ENDIF
    ENDIF

  tooltypes(do.tooltypes)

    SELECT type
    CASE WBPROJECT
    file.stack:=do.stacksize
    file.deftool:=news(do.defaulttool)

    CASE WBTOOL
    file.stack:=do.stacksize

    CASE WBDISK
    file.deftool:= IF do.defaulttool THEN news(do.defaulttool) ELSE ''

    ENDSELECT

  FreeDiskObject(do)
  ENDIF
ENDPROC

PROC tooltypes(t:PTR TO LONG); DEF v,tt:PTR TO ttype,str[512]:STRING
  IF t
  /* get a copy of the tooltypes (as a linked list) */
  tt:=file.tt

  file.not:=0
  file.nod:=0
  file.pat:=0
  file.nic:=0

    WHILE (t[]) AND (CtrlC()=0)
    StrCopy(str,t[])

          IF (v:=instr(str,'SCALOS_NOTEXT'))>=0; IF v=0 THEN file.not:=1

      ELSEIF (v:=instr(str,'SCALOS_NODRAG'))>=0; IF v=0 THEN file.nod:=1

      ELSEIF (v:=instr(str,'SCALOS_PATTERNNO'))>=0;
        IF v=0
        MidStr(str,str,InStr(str,'=')+1);
        file.pat:=Val(str)
        ENDIF

      ELSEIF instr(str,'*** DON''T EDIT THE FOLLOWING LINES!! ***')=0;
      tt:=file.nt
      file.nic:=1
      tt.name:=news(str)
      tt:=NEW tt.next

      ELSE
      tt.name:=news(str)
      tt:=NEW tt.next
      ENDIF
    t[]++
    ENDWHILE

    IF file.nic
    tt:=file.tt
    WHILE tt.next.next DO tt:=tt.next
    tt.next:=0
    ENDIF

  ENDIF -> if tooltypes=0
ENDPROC



PROC getINI()
NEW ai
Ini_Init(ai,'ENV:Scalos/Information.ini')
Ini_Read(ai)

  IF ai.error<>INIE_Ok
  Ini_NewGroup(ai,'General')
  Ini_NewItem(ai,'IconEdit',INIV_Type_Str,'SYS:Tools/IconEdit')
  Ini_NewItem(ai,'StackList',INIV_Type_Str,'0,1024,4096,8192,16384,32768.65536')

  Ini_NewGroup(ai,'Protection Images')
  Ini_NewItem(ai,'IconDir',INIV_Type_Str,'env:Scalos/Modules/Information.module')
  Ini_NewItem(ai,'PrefsEditor',INIV_Type_Str,'Scalos:Prefs/Modules/Information.prefs')
  Ini_NewItem(ai,'ShowIconFrames',INIV_Type_Int,1)
  Ini_NewItem(ai,'ShowMainFrame',INIV_Type_Int,0)

  Ini_NewGroup(ai,'ToolType Popups')
  Ini_NewItem(ai,' None',INIV_Type_Str,'')
  Ini_NewItem(ai,'DoNotWait',INIV_Type_Str,'DONOTWAIT')
  Ini_NewItem(ai,'Shell Console',INIV_Type_Str,'Window=CON:////Output/close/wait')
  Ini_NewItem(ai,'ARexx Console',INIV_Type_Str,'CON=CON:////Output/close/wait')

  Ini_NewGroup(ai,'Comment Popups')
  Ini_NewItem(ai,' None',INIV_Type_Str,'')
  Ini_NewItem(ai,'My Email',INIV_Type_Str,'bsteers@ukonline.co.uk')
  Ini_NewItem(ai,'Made By Me',INIV_Type_Str,'Written by Bruce Steers')

  Ini_NewGroup(ai,'DefTool Popups')
  Ini_NewItem(ai,' None',INIV_Type_Str,'')
  Ini_NewItem(ai,'Multiview',INIV_Type_Str,'SYS:Utilities/Multiview')
  Ini_NewItem(ai,'IconX',INIV_Type_Str,'C:IconX')
  Ini_NewItem(ai,'RX',INIV_Type_Str,'SYS:Rexxc/rx')
  Ini_NewItem(ai,'DiskCopy',INIV_Type_Str,'SYS:System/DiskCopy')

  Ini_Write(ai)
  ai.filename:='ENVARC:Scalos/Information.ini'
  Ini_Write(ai)
  ai.filename:='ENV:Scalos/Information.ini'
  ENDIF


  Ini_FindGroup(ai,'General')
  iconED:=news(Ini_GetStr(ai,'IconEdit','SYS:Tools/IconEdit'))
  prefsfile:=news(Ini_GetStr(ai,'PrefsEditor','Scalos:Prefs/Modules/Information.prefs'))
  Ini_FindGroup(ai,'Protection Images')
  protimgdir:=news(Ini_GetStr(ai,'IconDir','ENV:Scalos/Modules/Information.module'))
  protframe:=IF Ini_GetInt(ai,'ShowIconFrames',1)=0 THEN MUIV_Frame_None ELSE MUIV_Frame_Button
  protmainframe:=IF Ini_GetInt(ai,'ShowMainFrame',1)=0 THEN MUIV_Frame_None ELSE MUIV_Frame_Group

IF StrLen(protimgdir)>0 THEN
    IF protimgdir[StrLen(protimgdir)-1]="/" THEN
        SetStr(protimgdir,StrLen(protimgdir)-1)
ENDPROC

PROC checkcom(s); DEF ts,l,p,len
 FOR len:=15 TO 3 STEP -3
 l:=StrLen(s)
 p:=l-len
   IF p>0
   ts:=String(l); StrCopy(ts,s)
   StrCopy(s,ts,p)
   StrAdd(s,',')
   MidStr(ts,ts,p)
   StringF(s,'\s\s',s,ts)
   ENDIF
 ENDFOR
ENDPROC

PROC setpopuplist(obj,name)
DEF lp:PTR TO lv2 , c, s1[256]:STRING,s2[512]:STRING
doMethodA(obj,[MUIM_List_Clear])
set(obj,MUIA_List_Quiet,1)
Ini_FindGroup(ai,name)
IF ai.error=0
c:=ai.groupstart+1
  WHILE c<=ai.groupend
    IF InStr(ai.list[c],'=')<>-1
    Ini_SplitItem(ai,c,s1,s2)
    lp:=NEW[news(s1),news(s2)]:lv2
    doMethodA(obj,[MUIM_List_InsertSingle,lp,MUIV_List_Insert_Sorted])
    ENDIF
  c++
  ENDWHILE
ENDIF
set(obj,MUIA_List_Quiet,0)
ENDPROC

PROC setstkpopup()
DEF lp:PTR TO lv1 , c,split:PTR TO LONG,str[50]:STRING
doMethodA(stklv,[MUIM_List_Clear])
set(stklv,MUIA_List_Quiet,1)
Ini_FindGroup(ai,'General')
ai.arraytype:=INIV_Type_Int
ai.arraystr:=','
split:=Ini_GetArray(ai,'StackList',[0,1024,4096,8192,16384,32768,65536])
IF ai.error=0
FOR c:=0 TO ListLen(split)-1
StringF(str,'\d',split[c])
    lp:=NEW[news(str)]:lv1
    doMethodA(stklv,[MUIM_List_InsertSingle,lp,MUIV_List_Insert_Bottom])
ENDFOR
ENDIF
set(stklv,MUIA_List_Quiet,0)
ENDPROC

PROC sizegroup(); DEF t=0:PTR TO LONG,v=0:PTR TO LONG,tg
IF file.type=WBDISK
t:=['\e1Size:','\e1Used:','\e1Free:']
v:=[byteconv(disk.size), byteconvper(disk.used)]
tg:=TextObject,
    NoFrame,
    MUIA_Text_Contents,byteconvper(disk.free),
    End
ELSEIF file.type=WBDRAWER
t:=['\e1Files:','\e1Dirs:','\e1Sizes:']
v:=['\el-----------', '\el-----------']
tg:=dirgroup()
ELSE
t:=['\e1Blocks:' , '\e1Bytes:' , '\e1Stack:']
v:=[v2s(file.numblocks,'\el\eb'), v2s(file.size,'\el\eb')]
tg:=stkpopup()
ENDIF

ENDPROC ColGroup(2),
	     GroupFrame,
        Child, Label2(t[0]), Child, size1 := Label2(v[0]),
        Child, Label2(t[1]), Child, size2 := Label2(v[1]),
        Child, Label2(t[2]), Child, tg,
        End

PROC findFlagIcon(mode,sel)
DEF filename[256]:STRING

IF StrLen(protimgdir)>0
StringF(filename,'\s/\cFlag.info',protimgdir,mode)
IF FileLength(filename)>0 THEN JUMP foundimgicon
ENDIF
StringF(filename,'ENV:Scalos/Modules/Information.module/\cFlag.info',mode)
IF FileLength(filename)>0 THEN JUMP foundimgicon

SELECT mode
CASE "H"; RETURN proTxtObject('H',sel,protframe)
CASE "S"; RETURN proTxtObject('S',sel,protframe)
CASE "P"; RETURN proTxtObject('P',sel,protframe)
CASE "A"; RETURN proTxtObject('A',sel,protframe)
CASE "R"; RETURN proTxtObject('R',sel,protframe)
CASE "W"; RETURN proTxtObject('W',sel,protframe)
CASE "E"; RETURN proTxtObject('E',sel,protframe)
CASE "D"; RETURN proTxtObject('D',sel,protframe)
ENDSELECT
foundimgicon:
StrCopy(filename,filename,StrLen(filename)-5)
RETURN  iconbutton(filename,sel,protframe)
ENDPROC

PROC writechanges(); DEF do:diskobject,tdo:diskobject,
nh,ns,np,na,nr,nw,ne,nd,nprot=0,changed=0

/*IF FileLength(file.doname)<1 THEN
  IF myreq(StringF(str,'No Icon Exists\n\s',file.doname),'Create new|Abort')=0 THEN
    RETURN 0
*/

  IF file.pname<>0
  get(ph,MUIA_Selected,{nh})
  get(ps,MUIA_Selected,{ns})
  get(pp,MUIA_Selected,{np})
  get(pa,MUIA_Selected,{na})
  get(pr,MUIA_Selected,{nr})
  get(pw,MUIA_Selected,{nw})
  get(pe,MUIA_Selected,{ne})
  get(pd,MUIA_Selected,{nd})

    IF (nh<>ah) OR (ns<>as) OR (np<>ap) OR (na<>aa) OR (nr<>ar) OR (nw<>aw) OR (ne<>ae) OR (nd<>ad)
    IF nh THEN nprot:=nprot+FIBF_HIDDEN
    IF ns THEN nprot:=nprot+FIBF_SCRIPT
    IF np THEN nprot:=nprot+FIBF_PURE
    IF na THEN nprot:=nprot+FIBF_ARCHIVE
    IF nr =0 THEN nprot:=nprot+FIBF_READ
    IF nw =0 THEN nprot:=nprot+FIBF_WRITE
    IF ne =0 THEN nprot:=nprot+FIBF_EXECUTE
    IF nd =0 THEN nprot:=nprot+FIBF_DELETE
    IF SetProtection(file.pname,nprot)=0 THEN myreq('Unable to set file protection !','_OK')
    ENDIF

  get(cmS,MUIA_String_Contents,{nh})
  IF StrCmp(nh,file.comment)=0 THEN SetComment(file.name,nh)
  IF file.noicon THEN RETURN 1
  ENDIF

  IF (file.type=WBTOOL) OR (file.type=WBPROJECT)
  get(stkS,MUIA_String_Integer,{ns})
  IF ns<>(file.stack) THEN changed:=1
  ENDIF

  IF (file.type=WBDISK) OR (file.type=WBPROJECT)
  get(dtS,MUIA_String_Contents,{nd})
  IF StrCmp(nd,file.deftool)=0 THEN changed:=1
  ENDIF

na:=buildtoolarray()

  IF do:=GetDiskObjectNew(file.iname)
  tdo.stacksize  := do.stacksize
  tdo.defaulttool:= do.defaulttool
  tdo.tooltypes  := do.tooltypes
  IF (file.type=WBTOOL) OR (file.type=WBPROJECT) THEN do.stacksize:=ns
  IF (file.type=WBDISK) OR (file.type=WBPROJECT) THEN do.defaulttool:=nd
  do.tooltypes:=na
  PutDiskObject(file.iname,do)
  do.stacksize  := tdo.stacksize
  do.defaulttool:= tdo.defaulttool
  do.tooltypes  := tdo.tooltypes
  FreeDiskObject(do)
  ENDIF

ENDPROC 1

PROC buildtoolarray()
DEF l=0:PTR TO LONG,c,n=0,ln,tp:PTR TO ttype,lp:PTR TO lv1,nnt,nnd,npt
tp:=file.tt
get(lv,MUIA_List_Entries,{ln})
get(notB,MUIA_Selected,{nnt})
get(nodB,MUIA_Selected,{nnd})
get(patN,MUIA_Numeric_Value,{npt})

n:=(ln+nnt+nnd+(IF npt>0 THEN 1 ELSE 0))

  IF file.nic
  n++
  tp:=file.nt
  WHILE tp.next DO (tp:=tp.next) AND (n++)
  ENDIF

  IF n>0
  l:=List(n+1)
    IF ln>0
      FOR c:=0 TO ln-1
      doMethodA(lv,[MUIM_List_GetEntry,c,{lp}])
      ListAdd(l,[news(lp.ob)])
      ENDFOR
    ENDIF
  IF nnt THEN ListAdd(l,['SCALOS_NOTEXT'])
  IF nnd THEN ListAdd(l,['SCALOS_NODRAG'])
    IF npt>0
    StringF(str,'SCALOS_PATTERNNO=\d',npt)
    ListAdd(l,[news(str)])
    ENDIF

    IF file.nic
    tp:=file.nt
    ListAdd(l,[' '])
      WHILE tp.next
      IF StrLen(tp.name)>0 THEN ListAdd(l,[tp.name])
      tp:=tp.next
      ENDWHILE
    ENDIF
  ListAdd(l,[0])
  ELSE
  RETURN 0
  ENDIF
ENDPROC l




PROC doInfo(); DEF l
  IF l:=Lock(file.name,-2)
    IF Info(l,file.infodata)
    disk.blksize := (file.infodata.bytesperblock)
    disk.size := Mul(file.infodata.numblocks,file.infodata.bytesperblock)
    disk.used := Mul(file.infodata.numblocksused,file.infodata.bytesperblock)
    disk.free := disk.size - disk.used
    ENDIF
  UnLock(l)
  ELSE
  WriteF('unable to lock \s\n',file.name)
  ENDIF
ENDPROC

PROC byteconv(bytes); DEF ret
IF bytes >= 1048576
    ret := v2s(Div(Div(bytes,1024),1024),'\el\eb',' \enMb')
ELSEIF bytes >= 1024
    ret := v2s(Div(bytes,1024),'\el\eb', ' \enKb')
ELSEIF bytes < 1024
    ret := v2s(bytes,'\el\eb',' \enBytes')
ENDIF
ENDPROC ret

PROC byteconvper(bytes); DEF ret,c,t,str[512]:STRING
t:='t:info_temp'
ret:=String(256)
StringF(ret,'\s',byteconv(bytes))

  IF FindPort('AREXX')
  StringF(str,'sys:rexxc/rx "per = 100*(\d/\d); dotp = index(per,''.''); if dotp~=0 then per=left(per,dotp+2); address command; ''echo >\s ''per',bytes,disk.size,t)
  Execute(str,0,0)
    IF c:=Open(t,OLDFILE)
    ReadStr(c,str)
    StringF(ret,'\s (\eb\s\en%)',ret,str)
    Close(c)
    DeleteFile(t)
    ENDIF
  ENDIF
SetStr(ret,StrLen(ret))
ENDPROC ret


PROC loadfile(prog,file=0); DEF str[600]:STRING
StringF(str,'STACK 32000\nrun <>nil: "\s"',prog)
IF file THEN StringF(str,'\s "\s"',str,file)
IF debug THEN WriteF('\s\n',str)
Execute(str,0,stdout)
ENDPROC

PROC imgGadTxt(name,pre=0,post=0); DEF r,fn,nam
fn:=String(500)
nam:=String(50)
StringF(fn,'\s/\s',protimgdir,name)
StringF(nam,'\s',name)
IF pre THEN StringF(nam,'\s\s',pre,nam)
IF post THEN StringF(nam,'\s\s',nam,post)
r:=FileLength(fn)
IF r>0 THEN StringF(fn,'\eI[5:\s] \s',fn,nam) ELSE StringF(fn,'\s',nam)
SetStr(fn,StrLen(fn))
ENDPROC fn

PROC iconobject()
DEF in
IF FileLength(file.doname)<1
in:=deficonname()
  IF FileLength(in)<1 THEN
  RETURN TextObject,
       ImageButtonFrame,
       MUIA_CycleChain,1,
		 MUIA_Text_Contents,'\ec\ei No Image \n Found \n',
       End ELSE in[StrLen(in)-5]:=0

ELSE
in:=file.iname
ENDIF
->WriteF('\s\n',in)
ENDPROC IconObject,
        MUIA_CycleChain,1,
        MUIA_InputMode, MUIV_InputMode_RelVerify,
        MUIA_Icon_Name,in,
        End

PROC deficonname(); DEF t,s
t:=icontypes[file.type -1 ]
s:=String(StrLen(t)+20)
StringF(s,'ENV:Sys/def_\s.info',t)
ENDPROC s

PROC getdir(); DEF str[256]:STRING
set(win,MUIA_Window_Sleep,1)
doMethodA(sizebox,[MUIM_Group_InitChange])
set(getdirB,MUIA_ShowMe,0)
set(dirsizeL,MUIA_ShowMe,1)
doMethodA(sizebox,[MUIM_Group_ExitChange])
set(size1,MUIA_Text_Contents,v2s(0,'\el\eb'))
set(size2,MUIA_Text_Contents,v2s(0,'\el\eb'))
exdir(file.name)
 doMethodA(sizebox,[MUIM_Group_InitChange])

 IF abrtV
 set(dirsizeL,MUIA_ShowMe,0)
 set(getdirB,MUIA_ShowMe,1)
 ->doMethodA(sizebox,[MUIM_Group_ExitChange])
 doMethodA(sizebox,[MUIM_Group_ExitChange])
 set(size1,MUIA_Text_Contents,'\el--Aborted--')
 set(size2,MUIA_Text_Contents,'\el-----------')
 doMethodA(app,[MUIM_Application_CheckRefresh])
 ELSE
 doMethodA(sizebox,[MUIM_Group_InitChange])
 StrCopy(str,v2s(ex_size,'\el\eb',' \enB'))
 IF ex_size >= 1024 THEN StringF(str,'\s\n\s',str,v2s(Div(ex_size,1024),'\el\eb', ' \enKb'))
 IF ex_size >= 1048576 THEN StringF(str,'\s\n\s',str,v2s(Div(Div(ex_size,1024),1024),'\el\eb',' \enMb (ish)'))
 set(dirsizeL,MUIA_Text_Contents,str)
 doMethodA(dirsizeL,[MUIM_AskMinMax])
 doMethodA(app,[MUIM_Application_CheckRefresh])
 doMethodA(sizebox,[MUIM_Group_ExitChange])
 ENDIF

 set(win,MUIA_Window_Sleep,0)
ENDPROC

PROC exdir(dir)
DEF info:fileinfoblock,lock,path[256]:STRING
  result:=doMethodA(app,[MUIM_Application_NewInput,{sigs}])
  IF lock:=Lock(dir,-2)
    IF Examine(lock,info)
      WHILE (ExNext(lock,info)) AND (abrtV=0)
        IF info.direntrytype>0  ->  Directory
        ex_dirs++
        set(size2,MUIA_Text_Contents,v2s(ex_dirs,'\el\eb'))
        StrCopy(path,dir)
        AddPart(path,info.filename,256)
        set(dirsizeL,MUIA_Text_Contents,lastchars(path,12))
        exdir(path)
        set(dirsizeL,MUIA_Text_Contents,lastchars(file.name,12))
        ELSE                    ->  File
        ex_files++
        ex_size:=ex_size+info.size
        set(size1,MUIA_Text_Contents,v2s(ex_files,'\el\eb'))
        ENDIF
      ENDWHILE
    ENDIF
  UnLock(lock)
  ELSE
  WriteF('No Lock on \s\n',dir)
  ENDIF
ENDPROC

PROC dirgroup() IS
  HGroup,
  Child, getdirB := SimpleButton('Examine Si_ze'),
  Child, dirsizeL:=TextObject,
                   TextFrame,
                   MUIA_Text_Contents,lastchars(file.name,12),
                   End,
  End

PROC lastchars(is,l); DEF s,ln,p
ln:=StrLen(is)
p:=Max(ln-l,0)
s:=String(ln-p)
MidStr(s,is,p,-1)
ENDPROC s

PROC sethelp()
set(imgG,MUIA_ShortHelp,'\ec\eb\euIcon Image\enPress to launch your\nIcon Editor tool')
set(sav_G,MUIA_ShortHelp,'Press to \e1Save\e0 changes\nAnd Quit')
set(qit_G,MUIA_ShortHelp,'Press to \e1Ignore\e0 changes\nAnd Quit')
set(pageC,MUIA_ShortHelp,'Press to toggle\nTooltypes/Main Info page')
doMethodA(app,[MUIM_MultiSet,MUIA_ShortHelp,'Protection bit\nPress to toggle on/off',ph,ps,pp,pa,0])
ENDPROC

PROC getguide()
guide:=IF volExists('Scalos:',"A") THEN 'Scalos:Docs/Scalos_Information.guide' ELSE 'Sys:Scalos/Docs/Scalos_Information.guide'
IF FileLength(guide)<1 THEN guide:='Sys:Expansion/Scalos/Docs/Scalos_Information.guide' ELSE RETURN
IF FileLength(guide)<1 THEN guide:='Sys:Expansion/Docs/Scalos_Information.guide' ELSE RETURN
IF FileLength(guide)<1 THEN guide:='help:Scalos_Information.guide' ELSE RETURN
IF FileLength(guide)>1 THEN RETURN
guide:=0
ENDPROC


PROC addnewicon();DEF do
  IF do:=GetDiskObjectNew(file.iname)
  PutDiskObject(file.iname,do)
  FreeDiskObject(do)
  loadfile(myname,file.name)
  ENDIF
ENDPROC
