PROGRAM XTrashEnglish;

{$incl "exec.lib"}
{$incl "intuition.lib","intuition/intuitionbase.h"}
{$incl "wb.lib"}
{$incl "graphics.lib"}
{$incl "diskfont.lib"}
{$incl "gadtools.lib"}
{$incl "dos.lib","dos/dostags.h"}
{$incl "icon.lib"}
{$incl "asl.lib"}

LABEL   BACK;

CONST   LF = chr($A);
        MyTemplate = "CONFIG";

TYPE    p_IconPlane = ^IconPlane;
        IconPlane = Array[1..176] of Word;
        FileString = String[114];
        DirString = String[256];
        DirNameString = String[364];
        p_PathNode = ^PathNode;
        PathNode = RECORD
                pn_Node: Node
                pn_Path: DirString
        END;
        p_StringNode = ^StringNode;
        StringNode = RECORD
                stn_Node: Node
                stn_String: FileString
        end;
        p_AnchorNode = ^AnchorNode;
        AnchorNode = RECORD
                ano_Node: Node
                ano_Anchor: p_AnchorPath
                ano_Lock: BPTR
        END;
        PointerArray = Array [1..36] of word;
        p_XTrashPreferences = ^XTrashPreferences;
        XTrashPreferences = RECORD
                IconFile: DirNameString
                IconName: String[31]
                IconX,IconY: integer
                OpenProcessing,Coloured: boolean
                Trasher: DirString
                MoveFiles,DeleteTrash: boolean
                DiskName: String[31]
                FormatOptions: String[81]
                Formatter: DirString
                FormatStack: long
        end;

VAR     ImageDataNorm,ImageDataSel:             p_IconPlane;
        ImageNorm,ImageSel:                     Image;
        ImagesObject:                           p_DiskObject;
        ApplicationPort:                        p_MsgPort;
        AppBit  :                               long;
        ApplicationMessage:                     p_AppMessage;
        ApplicationIcon:                        p_AppIcon;
        SIGNALS :                               long;
        DidIt   :                               boolean;
        EndExit :                               integer;
        scr     :                               p_screen;
        VI      :                               ptr;
        DI      :                               p_DrawInfo;
        tattr   :                               TextAttr;
        tfont   :                               p_TextFont;
        FileList,DirList,TrashList,DiskList:    p_List;
        FileNum,DirNum,TrashNum,DiskNum:        long;
        TrashNode,TrashNodeBack:                p_PathNode;
        opLayer,i:                              integer;
        VariableString:                         DirNameString;
        VariableStr:                            STR;
        diskIcon:                               boolean;
        dummy   :                               long;
        InsidePointer:                          ^PointerArray;
        CurrentMethodTrash,CurrentMethodFiles:  boolean;
        CurrentDiskName:                        String[31];
        CurrentFormatOptions:                   String[81];
        MyXTP   :                               XTrashPreferences;
        StartXTP:                               XTrashPreferences;
        DB      :                               p_DosLibrary;
        TheConfiguration:                       DirNameString;
        TheDirectory:                           DirString;
        MyLock  :                               BPTR;
        LockBack:                               BPTR;


PROCEDURE PrepareNode(VAR TestNode:ptr,Text:Str);
VAR     TextNode:                               p_PathNode;
BEGIN
        TextNode:=TestNode;
        TextNode^.pn_Node.ln_Succ:=NIL;
        TextNode^.pn_Node.ln_Pred:=NIL;
        TextNode^.pn_Node.ln_Type:=NT_UNKNOWN;
        TextNode^.pn_Path:=Text;
        TextNode^.pn_Node.ln_Name:=TextNode^.pn_Path;
END;

PROCEDURE InitList(TestList:p_List);
BEGIN
        WITH TestList^ DO BEGIN
                lh_tail:=NIL;
                lh_TailPred:=Ptr(TestList);
                lh_head:=Ptr(Long(TestList)+4)
        END
END;

FUNCTION CreatePort(name:Str,pri:Byte):p_MsgPort;
VAR     port    :                               p_MsgPort;
        sigbit  :                               Byte;
BEGIN
        port:=ptr(Alloc_Mem(SizeOf(MsgPort),MEMF_CLEAR or MEMF_PUBLIC));
        sigbit:=AllocSignal(-1);
        with port^, mp_Node do begin
                ln_Name:=name;
                ln_Pri:=pri;
                ln_Type:=NT_MSGPORT;
                mp_Flags:=PA_SIGNAL;
                mp_SigBit:=sigbit;
                mp_SigTask:=FindTask(NIL);
                AddPort(port)
        end;
        CreatePort:=port
END;

PROCEDURE DeletePort(port:p_MsgPort);
BEGIN
        RemPort (port);
        FreeSignal(port^.mp_SigBit);
        Free_Mem (Long(port), SizeOf (port^) )
END;

FUNCTION GiveQuestion(Title,Introducer,Possibilities:DirNameString,win:p_window):Long;
VAR     ES      :                               EasyStruct;
BEGIN
        VariableString:=Introducer;
        ES:=EasyStruct(sizeof(EasyStruct),0,Title,VariableString,Possibilities);
        GiveQuestion:=EasyRequestArgs(win,^es,NIL,NIL)
END;

PROCEDURE GiveError(Title,Introducer:DirNameString,win:p_window);
VAR     ES      :                               EasyStruct;
        Dummy   :                               long;
BEGIN
        VariableString:=Introducer;
        ES:=EasyStruct(sizeof(EasyStruct),0,Title,VariableString,"OK");
        Dummy:=EasyRequestArgs(win,^es,NIL,NIL)
END;

PROCEDURE NormalPointer(win:p_window);
BEGIN
        ClearPointer (win)
END;

PROCEDURE InitWaitPointer;
BEGIN
        InsidePointer:=Ptr(AllocVec(SizeOf(PointerArray),MEMF_CHIP));
        InsidePointer^:=PointerArray(
                $0   ,$0   ,
                $0400,$07C0,
                $0000,$07C0,
                $0100,$0380,
                $0000,$07E0,
                $07C0,$1FF8,
                $1FF0,$3FEC,
                $3FF8,$7FDE,
                $3FF8,$7FBE,
                $7FFC,$FF7F,
                $7EFC,$FFFF,
                $7FFC,$FFFF,
                $3FF8,$7FFE,
                $3FF8,$7FFE,
                $1FF0,$3FFC,
                $07C0,$1FF8,
                $0000,$07E0,
                $0   ,$0
        );
END;

PROCEDURE WaitPointer(win:p_window);
BEGIN
        SetPointer(win,InsidePointer,16,16,-6,0);
END;


PROCEDURE InitAppIcon;
BEGIN
        if MyXTP.IconFile="" then dummy:=-1 else begin
                if length(MyXTP.IconFile)>4 then
                        DidIt:=copy(MyXTP.IconFile,length(MyXTP.IconFile)-4,5)=".info"
                else DidIt:=FALSE;
                if DidIt then begin
                        VariableString:=copy(MyXTP.IconFile,1,length(MyXTP.IconFile)-5);
                        ImagesObject:=GetDiskObjectNew(VariableString)
                end else
                        ImagesObject:=GetDiskObjectNew(MyXTP.IconFile);
                dummy:=IOErr
        end;
        if dummy<>0 then begin
                if dummy>0 then begin
                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                        GiveError ("XTrash 1.01 - ["+MyXTP.IconFile+"]","Error while opening icon."+LF+"("+VariableString+")",NIL);
                end;
                new(ImagesObject);
                ImageDataNorm:=PTR(AllocVec(SizeOf(IconPlane),MEMF_CHIP));
                ImageDataNorm^:=IconPlane(
                        $0000,$0000,$0000,$0400,$0000,$0000,$0800,$0C00,
                        $0000,$0100,$0100,$0C00,$0060,$6162,$0090,$0C00,
                        $01F9,$F830,$F604,$0C00,$07FF,$FE31,$1FE2,$0C00,
                        $07FF,$FE3D,$A0BA,$0C00,$01FF,$FBBD,$3E89,$0C00,
                        $01FF,$FAF3,$FF89,$0C00,$07FF,$FE39,$D9C9,$0C00,
                        $07FF,$FE9F,$FEF5,$2C00,$01F9,$F9FF,$FFF1,$AC00,
                        $0060,$65DF,$FFE1,$2C00,$0000,$074F,$FFF3,$CC00,
                        $0000,$419F,$FFEF,$0C00,$1002,$CB4F,$FFFF,$1C00,
                        $0002,$8A77,$FFFF,$8C00,$0000,$8A25,$FFE6,$CC00,
                        $0000,$C434,$FF3F,$0C00,$0002,$8616,$BFEC,$0C00,
                        $0000,$8007,$1002,$0C00,$7FFF,$FFFF,$FFFF,$FC00,

                        $FFFF,$FFFF,$FFFF,$F800,$D555,$5555,$5555,$5000,
                        $D555,$5455,$5455,$5000,$D575,$7415,$5545,$5000,
                        $D5FD,$FD45,$0151,$5000,$D7FF,$FF44,$4015,$5000,
                        $D1FF,$F940,$5545,$5000,$D47F,$E440,$4154,$5000,
                        $D5FF,$FD04,$0054,$5000,$D7FF,$FF44,$0414,$5000,
                        $D1F9,$F940,$0100,$5000,$D464,$6400,$0004,$5000,
                        $D515,$1000,$0014,$5000,$D555,$5010,$0004,$1000,
                        $D555,$1440,$0010,$5000,$C555,$1410,$0000,$4000,
                        $D555,$5500,$0000,$5000,$D555,$5550,$0011,$1000,
                        $D555,$1141,$0040,$5000,$D555,$5141,$4011,$5000,
                        $D555,$5550,$4555,$5000,$8000,$0000,$0000,$0000
                );
                ImageNorm:=Image(0,0,54,22,2,ImageDataNorm,3,0,NIL);

                ImageDataSel:=PTR(AllocVec(SizeOf(IconPlane),MEMF_CHIP));
                ImageDataSel^:=IconPlane(
                        $0000,$0000,$0000,$0400,$0000,$0000,$0800,$0C00,
                        $0000,$0100,$0100,$0C00,$0040,$4162,$0090,$0C00,
                        $0151,$5030,$F604,$0C00,$0555,$5431,$1FE2,$0C00,
                        $0755,$563D,$A0BA,$0C00,$01D5,$5BBD,$3E89,$0C00,
                        $0155,$52F3,$FF89,$0C00,$0555,$5439,$D9C9,$0C00,
                        $0757,$569F,$FEF5,$2C00,$01D9,$D9FF,$FFF1,$AC00,
                        $0060,$65DF,$FFE1,$2C00,$0000,$074F,$FFF3,$CC00,
                        $0000,$419F,$FFEF,$0C00,$1002,$CBFF,$FFFF,$1C00,
                        $0002,$8AFF,$FFFF,$8C00,$0000,$8A3D,$FFE6,$CC00,
                        $0000,$553C,$FF3F,$0C00,$0002,$9516,$BFEC,$0C00,
                        $0000,$8507,$1002,$0C00,$7FFF,$FDFF,$FFFF,$FC00,

                        $FFFF,$FFFF,$FFFF,$F800,$D555,$5555,$5555,$5000,
                        $D555,$5455,$5455,$5000,$D575,$7415,$5545,$5000,
                        $D5FD,$FD45,$0151,$5000,$D7FF,$FF44,$4015,$5000,
                        $D1FF,$F940,$5545,$5000,$D47F,$E440,$4154,$5000,
                        $D5FF,$FD04,$0054,$5000,$D7FF,$FF44,$0414,$5000,
                        $D1F9,$F940,$0100,$5000,$D464,$6400,$0004,$5000,
                        $D515,$1005,$5014,$5000,$D555,$5011,$5004,$1000,
                        $D555,$1440,$5010,$5000,$C555,$17FC,$1000,$4000,
                        $D555,$55FC,$0000,$5000,$D555,$557C,$0011,$1000,
                        $D555,$FF4D,$0040,$5000,$D555,$7F41,$4011,$5000,
                        $D555,$5F50,$4555,$5000,$8000,$0300,$0000,$0000
                );
                ImageSel:=Image(0,0,54,22,2,ImageDataSel,3,0,NIL);

                ImagesObject^:=DiskObject(0,0,Gadget(NIL,0,0,54,23,GADGIMAGE or
                        GADGHIMAGE,RELVERIFY,BOOLGADGET,^ImageNorm,^ImageSel,
                        NIL,0,NIL,0,NIL),0,NIL,NIL,NO_ICON_POSITION,NO_ICON_POSITION,
                        NIL,NIL,0);
                diskIcon:=FALSE
        end else
                diskIcon:=TRUE;

        if MyXTP.IconX>-1 then ImagesObject^.do_CurrentX:=MyXTP.IconX else ImagesObject^.do_CurrentX:=NO_ICON_POSITION;
        if MyXTP.IconY>-1 then ImagesObject^.do_CurrentY:=MyXTP.IconY else ImagesObject^.do_CurrentY:=NO_ICON_POSITION;

        if MyXTP.IconName<>"" then
                ApplicationIcon:=AddAppIconA(1,0,MyXTP.IconName,ApplicationPort,NIL,ImagesObject,NIL)
        else
                ApplicationIcon:=AddAppIconA(1,0,"XTrash",ApplicationPort,NIL,ImagesObject,NIL);
END;


FUNCTION ReadXTrashPrefs(FileName:DirNameString,VAR RealPrefs:XTrashPreferences):boolean;
VAR     ReadFile:                               Text;
        Dummy   :                               long;
        Identifier:                             string[14];
LABEL   ExitOut;
BEGIN
        ReSet(ReadFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                ReadXTrashPrefs:=FALSE;
                goto ExitOut
        end;
        readln (ReadFile,Identifier);
        if Identifier<>"XTRASH PREFS" then begin ReadXTrashPrefs:=FALSE; close(ReadFile); goto ExitOut end;
        with RealPrefs do begin
                readln(ReadFile,IconFile);
                readln(ReadFile,IconName);
                readln(ReadFile,IconX);
                readln(ReadFile,IconY);
                readln(ReadFile,dummy);
                OpenProcessing:=boolean(dummy);
                readln(ReadFile,dummy);
                Coloured:=boolean(dummy);
                readln(ReadFile,Trasher);
                readln(ReadFile,dummy);
                MoveFiles:=boolean(dummy);
                readln(ReadFile,dummy);
                DeleteTrash:=boolean(dummy);
                readln(ReadFile,DiskName);
                readln(ReadFile,FormatOptions);
                readln(ReadFile,Formatter);
                readln(ReadFile,FormatStack)
        end;
        Dummy:=IOResult;
        Close(ReadFile);
        if Dummy<>0 then begin
                ReadXTrashPrefs:=FALSE;
                goto ExitOut
        end;
        ReadXTrashPrefs:=TRUE;
        ExitOut:
END;

FUNCTION WriteXTrashPrefs(FileName:DirNameString,RealPrefs:XTrashPreferences,win:p_window):boolean;
VAR     WriteFile:                              Text;
        Dummy   :                               integer;
LABEL   ExitOut;
BEGIN
        ReWrite(WriteFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                GiveError("XTrash 1.01  - Save preferences","Error while writing"+LF+"configuration."+LF+"("+VariableString+")",win);
                WriteXTrashPrefs:=FALSE;
                goto ExitOut
        end;
        writeln (WriteFile,"XTRASH PREFS");
        with RealPrefs do begin
                writeln(WriteFile,IconFile);
                writeln(WriteFile,IconName);
                writeln(WriteFile,IconX);
                writeln(WriteFile,IconY);
                writeln(WriteFile,long(OpenProcessing));
                writeln(WriteFile,long(Coloured));
                writeln(WriteFile,Trasher);
                writeln(WriteFile,long(MoveFiles));
                writeln(WriteFile,long(DeleteTrash));
                writeln(WriteFile,DiskName);
                writeln(WriteFile,FormatOptions);
                writeln(WriteFile,Formatter);
                writeln(WriteFile,FormatStack)
        end;
        Close(WriteFile);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                GiveError("XTrash 1.01  - Save preferences","Error while writing"+LF+"configuration."+LF+"("+VariableString+")",win);
                WriteXTrashPrefs:=FALSE;
                goto ExitOut
        end;
        WriteXTrashPrefs:=TRUE;
        ExitOut:
END;


FUNCTION PopUpFiler(Typ:integer,Pattern:boolean,win:p_Window):boolean;
VAR     Filer   :                               p_FileRequester;
        TagsCHANGES:                            array[1..14] of TagItem;
        Dummy   :                               Boolean;
        maestro :                               text;
BEGIN
        TagsCHANGES[1].ti_Tag:=ASL_Hail;
        case Typ of
                1:      TagsCHANGES[1].ti_Data:="XTrash 1.01 - Choose directory"
                2:      TagsCHANGES[1].ti_Data:="XTrash 1.01 - Choose file"
                else
        end;
        TagsCHANGES[2].ti_Tag:=ASL_File;
        TagsCHANGES[3].ti_Tag:=ASL_Dir;
        Reset(maestro,VariableString);
        if IOResult<>0 then begin
                TagsCHANGES[2].ti_Data:=0;
                TagsCHANGES[3].ti_Data:=VariableString
        end else begin
                close(maestro);
                TagsCHANGES[2].ti_Data:=long(FilePart(VariableString));
                TagsCHANGES[3].ti_Data:=copy(VariableString,1,length(VariableString)-length(PathPart(VariableString)));
        end;
        TagsCHANGES[4]:=TagItem(ASL_FuncFlags,FILF_PATGAD);
        TagsCHANGES[5].ti_Tag:=ASL_Pattern;
        if pattern then TagsCHANGES[5].ti_Data:="~(#?.info)" else TagsCHANGES[5].ti_Data:="#?.info";
        TagsCHANGES[6].ti_Tag:=ASL_OKText;
        TagsCHANGES[6].ti_Data:="OK";
        TagsCHANGES[7].ti_Tag:=ASL_CancelText;
        TagsCHANGES[7].ti_Data:="Zurück";
        TagsCHANGES[8].ti_Tag:=ASL_Window;
        TagsCHANGES[8].ti_Data:=long(win);
        TagsCHANGES[9]:=TagItem(ASL_LeftEdge,50);
        TagsCHANGES[10]:=TagItem(ASL_TopEdge,28);
        TagsCHANGES[11]:=TagItem(ASL_Height,210);
        TagsCHANGES[12]:=TagItem(ASL_Width,340);
        if Typ<>1 then TagsCHANGES[13].ti_Tag:=TAG_DONE
        else begin
                TagsCHANGES[13]:=TagItem(ASL_ExtFlags1,FIL1F_NOFILES);
                TagsCHANGES[14].ti_Tag:=TAG_DONE
        end;

        Filer:=AllocAslRequest(ASL_FileRequest,^TagsCHANGES);
        Dummy:=AslRequest(Filer,NIL);
        if Dummy then begin
                VariableString:=Filer^.rf_Dir;
                if Typ<>1 then dummy:=AddPart(VariableString,Filer^.rf_File,255) else dummy:=TRUE;
                PopUpFiler:=dummy
        end else
                PopUpFiler:=FALSE;
        FreeAslRequest(Filer);
END;


PROCEDURE RestoreXTP(ThisXTP:p_XTrashPreferences,GadgetMethodFiles,GadgetMethodTrash,
        GadgetDiskName,GadgetFormatOptions,GadgetFormatWhere,GadgetFormatStack,
        GadgetTrashWhere,GadgetIconWhere,GadgetIconName,GadgetIconX,GadgetIconY,
        GadgetColoured,GadgetPanel:p_gadget,win:p_window);
VAR     TagsCHANGES:                            array[1..2] of TagItem;
BEGIN
        TagsCHANGES[1]:=TagItem(GTMX_Active,long(ThisXTP^.MoveFiles));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTMX_Active,long(ThisXTP^.DeleteTrash));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.DiskName;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetDiskName,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.FormatOptions;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetFormatOptions,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.Formatter;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetFormatWhere,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTIN_Number,ThisXTP^.FormatStack);
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetFormatStack,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.Trasher;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetTrashWhere,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.IconFile;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIconWhere,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP^.IconName;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIconName,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTIN_Number,ThisXTP^.IconX);
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIconX,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTIN_Number,ThisXTP^.IconY);
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIconY,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(ThisXTP^.Coloured));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetColoured,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(ThisXTP^.OpenProcessing));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetPanel,win,NIL,^TagsCHANGES)
END;

PROCEDURE GetRidOfForPreferencesXTrash(VAR win:p_window);
VAR     DidIt   :                               boolean;
BEGIN
        DidIt:=ModifyIDCMP(win,0);
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForPreferencesXTrash(VAR win:p_window,GadgetCycle:p_gadget);
VAR     DidIt   :                               boolean;
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        DidIt:=ModifyIDCMP(win,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or IDCMP_VANILLAKEY or IDCMP_GADGETDOWN);
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
END;

PROCEDURE PreferencesXTrash;
LABEL   BACK;
VAR     win     :                               p_window;
        winBit  :                               long;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetCurrent:                          p_gadget;
        GadgetMethodFiles:                      p_gadget;
        GadgetMethodTrash:                      p_gadget;
        GadgetDiskName:                         p_gadget;
        GadgetFormatOptions:                    p_gadget;
        GadgetFormatWhere:                      p_gadget;
        GadgetFormatFiler:                      p_gadget;
        GadgetFormatStack:                      p_gadget;
        GadgetTrashWhere:                       p_gadget;
        GadgetTrashFiler:                       p_gadget;
        GadgetIconWhere:                        p_gadget;
        GadgetIconFiler:                        p_gadget;
        GadgetIconName:                         p_gadget;
        GadgetIconX:                            p_gadget;
        GadgetIconY:                            p_gadget;
        GadgetColoured:                         p_gadget;
        GadgetPanel:                            p_gadget;
        GadgetCancel:                           p_gadget;
        GadgetUse:                              p_gadget;
        GadgetSave:                             p_gadget;
        MethodTrashContents:                    array[1..3] of str;
        MethodFilesContents:                    array[1..3] of str;
        DidIt   :                               boolean;
        imsg    :                               p_intuimessage;
        SIGNALS :                               long;
        MyEndExit:                              integer;
        ThisXTP :                               XTrashPreferences;
        ChangeASG:                              array [0..1] of Byte;
        SI      :                               p_StringInfo;
        TagsCHANGES:                            array[1..13] of TagItem;
        ZOM     :                               array[1..4] of word;
        NewMenuFields:                          array[1..5] of NewMenu;
        MenuFields:                             p_Menu;
        NItem   :                               p_menuitem;
        ChosenMenu:                             long;
BEGIN
        CG:=NIL;
        CG:=CreateContext(^CG);
        ChangeASG[0]:=DI^.dri_Pens^[SHADOWPEN];
        ChangeASG[1]:=DI^.dri_Pens^[SHINEPEN];
        if ChangeASG[0]=ChangeASG[1] then
                ChangeASG[0]:=DI^.dri_Pens^[FILLTEXTPEN];

        ThisXTP:=MyXTP;

        TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(226,7,130,12,"Current _Values",^tattr,1,PLACETEXT_IN,
                VI,NIL);
        GadgetCurrent:=CreateGadgetA(BUTTON_KIND,CG,^NewGadgetFields,^TagsCHANGES);

        MethodFilesContents[1]:="Delete _Files ";
        MethodFilesContents[2]:="_Move Files in Trashcan";
        MethodFilesContents[3]:=NIL;
        TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
        TagsCHANGES[2]:=TagItem(GTMX_Labels,long(^MethodFilesContents));
        TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
        TagsCHANGES[4]:=TagItem(GTMX_Active,long(ThisXTP.MoveFiles));
        TagsCHANGES[5].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(14,8,0,0,NIL,^tattr,2,PLACETEXT_RIGHT,VI,NIL);
        GadgetMethodFiles:=CreateGadgetA(MX_KIND,GadgetCurrent,^NewGadgetFields,
                ^TagsCHANGES);

        MethodTrashContents[1]:="_Empty Trashcan";
        MethodTrashContents[2]:="Delete _Trashcan";
        MethodTrashContents[3]:=NIL;
        TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
        TagsCHANGES[2]:=TagItem(GTMX_Labels,long(^MethodTrashContents));
        TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
        TagsCHANGES[4]:=TagItem(GTMX_Active,long(ThisXTP.DeleteTrash));
        TagsCHANGES[5].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(14,32,0,0,NIL,^tattr,3,PLACETEXT_RIGHT,VI,NIL);
        GadgetMethodTrash:=CreateGadgetA(MX_KIND,GadgetMethodFiles,
                ^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,30);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.DiskName;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,57,260,12,"Fmt. _Name",^tattr,4,PLACETEXT_LEFT,
                VI,NIL);
        GadgetDiskName:=CreateGadgetA(STRING_KIND,GadgetMethodTrash,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,80);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.FormatOptions;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,69,260,12,"_Options",^tattr,5,
                PLACETEXT_LEFT,VI,NIL);
        GadgetFormatOptions:=CreateGadgetA(STRING_KIND,GadgetDiskName,
                ^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,255);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.Formatter;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,81,188,12,"_Program",^tattr,6,
                PLACETEXT_LEFT,VI,NIL);
        GadgetFormatWhere:=CreateGadgetA(STRING_KIND,GadgetFormatOptions,
                ^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(284,81,72,12,"Get...",^tattr,7,
                PLACETEXT_IN,VI,NIL);
        GadgetFormatFiler:=CreateGadgetA(BUTTON_KIND,GadgetFormatWhere,
                ^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTIN_Number,ThisXTP.FormatStack);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,93,100,12,"_Stack",^tattr,8,PLACETEXT_LEFT,
                VI,NIL);
        GadgetFormatStack:=CreateGadgetA(INTEGER_KIND,GadgetFormatFiler,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,255);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.Trasher;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,109,124,12,"Move-T_rashcan",^tattr,9,
                PLACETEXT_LEFT,VI,NIL);
        GadgetTrashWhere:=CreateGadgetA(STRING_KIND,GadgetFormatStack,
                ^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(284,109,72,12,"Get...",^tattr,10,
                PLACETEXT_IN,VI,NIL);
        GadgetTrashFiler:=CreateGadgetA(BUTTON_KIND,GadgetTrashWhere,
                ^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,255);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.IconFile;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,125,188,12,"_Icon File",^tattr,11,
                PLACETEXT_LEFT,VI,NIL);
        GadgetIconWhere:=CreateGadgetA(STRING_KIND,GadgetTrashFiler,
                ^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(284,125,72,12,"Get...",^tattr,12,
                PLACETEXT_IN,VI,NIL);
        GadgetIconFiler:=CreateGadgetA(BUTTON_KIND,GadgetIconWhere,
                ^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,30);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=ThisXTP.IconName;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,137,260,12,"N_ame",^tattr,13,
                PLACETEXT_LEFT,VI,NIL);
        GadgetIconName:=CreateGadgetA(STRING_KIND,GadgetIconFiler,
                ^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTIN_Number,ThisXTP.IconX);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(96,149,52,12,"_X",^tattr,14,PLACETEXT_LEFT,
                VI,NIL);
        GadgetIconX:=CreateGadgetA(INTEGER_KIND,GadgetIconName,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTIN_Number,ThisXTP.IconY);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(172,149,52,12,"_Y",^tattr,15,PLACETEXT_LEFT,
                VI,NIL);
        GadgetIconY:=CreateGadgetA(INTEGER_KIND,GadgetIconX,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(ThisXTP.Coloured));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,165,0,0,"Textgadg. _coloured",^tattr,16,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetColoured:=CreateGadgetA(CHECKBOX_KIND,GadgetIconY,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(ThisXTP.OpenProcessing));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(196,165,0,0,"Processin_g panel",^tattr,17,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetPanel:=CreateGadgetA(CHECKBOX_KIND,GadgetColoured,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(10,185,80,12,"Save",^tattr,18,
                PLACETEXT_IN,VI,NIL);
        GadgetSave:=CreateGadgetA(BUTTON_KIND,GadgetPanel,^NewGadgetFields,
                NIL);

        NewGadgetFields:=NewGadget(143,185,80,12,"Use",^tattr,19,
                PLACETEXT_IN,VI,NIL);
        GadgetUse:=CreateGadgetA(BUTTON_KIND,GadgetSave,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(276,185,80,12,"Cancel",^tattr,20,
                PLACETEXT_IN,VI,NIL);
        GadgetCancel:=CreateGadgetA(BUTTON_KIND,GadgetUse,^NewGadgetFields,NIL);

        if (ChangeASG[0]<>ChangeASG[1]) and (MyXTP.Coloured) then begin
                SI:=GadgetDiskName^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetFormatOptions^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetFormatWhere^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetFormatStack^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetTrashWhere^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetIconWhere^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetIconName^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetIconX^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetIconY^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
        end;

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Edit",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"Reset To Default",NIL,0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Last Saved",NIL,0,0,NIL);
        NewMenuFields[4]:=NewMenu(NM_ITEM,0,"Restore",NIL,0,0,NIL);
        NewMenuFields[5].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        DidIt:=LayoutMenusA(MenuFields,VI,^TagsCHANGES);

        ZOM[1]:=26;
        ZOM[2]:=22;
        ZOM[3]:=320;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,22);
        TagsCHANGES[2]:=TagItem(WA_Left,26);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,202);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,366);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:="XTrash 1.01 - Preferences";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET or WFLG_HASZOOM);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_VANILLAKEY or IDCMP_GADGETDOWN or IDCMP_MENUPICK);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9]:=TagItem(WA_Gadgets,long(CG));
        TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        win:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl win^.userport^.mp_SigBit;

        DidIt:=SetMenuStrip(win,MenuFields);
        GT_RefreshWindow(win,NIL);

        BACK:
        MyEndExit:=-1;

        REPEAT
                imsg:=GT_GetIMsg(win^.userport);
                GT_ReplyIMsg(imsg);
                if imsg=NIL then begin
                        SIGNALS:=_wait(AppBit or winBit);
                        if SIGNALS=winBit then begin
                                imsg:=GT_GetIMsg(win^.userport);
                                GT_ReplyIMsg(imsg)
                        end
                end else
                        SIGNALS:=winBit;
                if SIGNALS=winBit then begin
                        case imsg^.class of
                                IDCMP_CLOSEWINDOW:
                                        MyEndExit:=0
                                IDCMP_VANILLAKEY: begin
                                        if (imsg^.code=80) or (imsg^.code=82) or (imsg^.code=73) then begin
                                                case imsg^.code of
                                                        80:     SI:=GadgetFormatWhere^.SpecialInfo;
                                                        82:     SI:=GadgetTrashWhere^.SpecialInfo;
                                                        73:     SI:=GadgetIconWhere^.SpecialInfo
                                                end;
                                                VariableString:=SI^.Buffer;
                                                if (imsg^.code=80) and (pos(" ",VariableString)<>0) then VariableString:=copy(VariableString,1,pos(" ",VariableString)-1);
                                                WaitPointer(win);
                                                GetRidOfForPreferencesXTrash(win);
                                                if PopUpFiler(1+integer(imsg^.code<>82),imsg^.code<>73,win) then begin
                                                        GetBackForPreferencesXTrash(win,CG);
                                                        NormalPointer(win);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=VariableString; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        case imsg^.code of
                                                                80:     GT_SetGadgetAttrsA(GadgetFormatWhere,win,NIL,^TagsCHANGES)
                                                                82:     GT_SetGadgetAttrsA(GadgetTrashWhere,win,NIL,^TagsCHANGES)
                                                                73:     GT_SetGadgetAttrsA(GadgetIconWhere,win,NIL,^TagsCHANGES)
                                                        end
                                                end else begin GetBackForPreferencesXTrash(win,CG); NormalPointer(win) end;
                                                goto BACK
                                        end;
                                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                        case imsg^.code of
                                                13:     MyEndExit:=1
                                                27:     MyEndExit:=0
                                                32:     MyEndExit:=2
                                                78:     DidIt:=activategadget(GadgetDiskName,win,nil)
                                                79:     DidIt:=activategadget(GadgetFormatOptions,win,nil)
                                                80:     DidIt:=activategadget(GadgetFormatWhere,win,nil)
                                                83:     DidIt:=activategadget(GadgetFormatStack,win,nil)
                                                82:     DidIt:=activategadget(GadgetTrashWhere,win,nil)
                                                73:     DidIt:=activategadget(GadgetIconWhere,win,nil)
                                                65:     DidIt:=activategadget(GadgetIconName,win,nil)
                                                88:     DidIt:=activategadget(GadgetIconX,win,nil)
                                                89:     DidIt:=activategadget(GadgetIconY,win,nil)
                                                67:     begin
                                                        ThisXTP.Coloured:=NOT(ThisXTP.Coloured);
                                                        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(ThisXTP.Coloured)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetColoured,win,NIL,^TagsCHANGES)
                                                end
                                                71:     begin
                                                        ThisXTP.OpenProcessing:=NOT(ThisXTP.OpenProcessing);
                                                        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(ThisXTP.OpenProcessing)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetPanel,win,NIL,^TagsCHANGES)
                                                end
                                                70:     begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,0); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        ThisXTP.MoveFiles:=FALSE;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES)
                                                end
                                                77:     begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,1); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        ThisXTP.MoveFiles:=TRUE;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES)
                                                end
                                                69:     begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,0); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        ThisXTP.DeleteTrash:=FALSE;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES)
                                                end
                                                84:     begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,1); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        ThisXTP.DeleteTrash:=TRUE;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES)
                                                end
                                                86:     begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodFiles)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodTrash)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentDiskName; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetDiskName,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentFormatOptions; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetFormatOptions,win,NIL,^TagsCHANGES)
                                                end
                                                else
                                        end
                                end
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        if (CurrentGadget^.gadgetid=7) or (CurrentGadget^.gadgetid=10) or (CurrentGadget^.gadgetid=12) then begin
                                                case CurrentGadget^.gadgetid of
                                                        7:      SI:=GadgetFormatWhere^.SpecialInfo;
                                                        10:     SI:=GadgetTrashWhere^.SpecialInfo;
                                                        12:     SI:=GadgetIconWhere^.SpecialInfo
                                                end;
                                                VariableString:=SI^.Buffer;
                                                if (CurrentGadget^.gadgetid=7) and (pos(" ",VariableString)<>0) then VariableString:=copy(VariableString,1,pos(" ",VariableString)-1);
                                                WaitPointer(win);
                                                GetRidOfForPreferencesXTrash(win);
                                                if PopUpFiler(1+integer(CurrentGadget^.gadgetid<>10),CurrentGadget^.gadgetid<>12,win) then begin
                                                        GetBackForPreferencesXTrash(win,CG);
                                                        NormalPointer(win);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=VariableString; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        case CurrentGadget^.gadgetid of
                                                                7:      GT_SetGadgetAttrsA(GadgetFormatWhere,win,NIL,^TagsCHANGES)
                                                                10:     GT_SetGadgetAttrsA(GadgetTrashWhere,win,NIL,^TagsCHANGES)
                                                                12:     GT_SetGadgetAttrsA(GadgetIconWhere,win,NIL,^TagsCHANGES)
                                                        end
                                                end else begin GetBackForPreferencesXTrash(win,CG); NormalPointer(win) end;
                                                goto BACK
                                        end;
                                        case CurrentGadget^.gadgetid of
                                                1:      begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodFiles)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodTrash)); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentDiskName; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetDiskName,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentFormatOptions; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetFormatOptions,win,NIL,^TagsCHANGES)
                                                end
                                                9:      begin
                                                        SI:=GadgetTrashWhere^.SpecialInfo;
                                                        ThisXTP.Trasher:=SI^.Buffer;
                                                        if ThisXTP.Trasher="" then begin
                                                                ThisXTP.Trasher:="RAM:";
                                                                TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=ThisXTP.Trasher; TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                GT_SetGadgetAttrsA(GadgetTrashWhere,win,NIL,^TagsCHANGES)
                                                        end
                                                end
                                                16:     ThisXTP.Coloured:=NOT(ThisXTP.Coloured)
                                                17:     ThisXTP.OpenProcessing:=NOT(ThisXTP.OpenProcessing)
                                                18:     MyEndExit:=2
                                                19:     MyEndExit:=1
                                                20:     MyEndExit:=0
                                                else
                                        end
                                end
                                IDCMP_GADGETDOWN: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                2:      ThisXTP.MoveFiles:=boolean(imsg^.code)
                                                3:      ThisXTP.DeleteTrash:=boolean(imsg^.code)
                                                else
                                        end
                                end
                                IDCMP_MENUPICK: begin
                                        ChosenMenu:=imsg^.code;
                                        while NOT ((ChosenMenu=MENUNULL) or (ChosenMenu=$F8)) do begin
                                                case ChosenMenu and $1f of
                                                        0:      begin
                                                                case (ChosenMenu and $7e0) div 32 of
                                                                        0:      begin
                                                                                ThisXTP:=XTrashPreferences("","",-1,-1,TRUE,FALSE,"RAM:",FALSE,FALSE,"Empty","",'SYS:System/Format DRIVE \d NAME "\n" \o',-1);
                                                                                RestoreXTP(^ThisXTP,GadgetMethodFiles,GadgetMethodTrash,GadgetDiskName,GadgetFormatOptions,GadgetFormatWhere,GadgetFormatStack,GadgetTrashWhere,GadgetIconWhere,
                                                                                        GadgetIconName,GadgetIconX,GadgetIconY,GadgetColoured,GadgetPanel,win)
                                                                        end
                                                                        1:      begin
                                                                                ThisXTP:=StartXTP;
                                                                                RestoreXTP(^ThisXTP,GadgetMethodFiles,GadgetMethodTrash,GadgetDiskName,GadgetFormatOptions,GadgetFormatWhere,GadgetFormatStack,GadgetTrashWhere,GadgetIconWhere,
                                                                                        GadgetIconName,GadgetIconX,GadgetIconY,GadgetColoured,GadgetPanel,win)
                                                                        end
                                                                        2:      begin
                                                                                ThisXTP:=MyXTP;
                                                                                RestoreXTP(^ThisXTP,GadgetMethodFiles,GadgetMethodTrash,GadgetDiskName,GadgetFormatOptions,GadgetFormatWhere,GadgetFormatStack,GadgetTrashWhere,GadgetIconWhere,
                                                                                        GadgetIconName,GadgetIconX,GadgetIconY,GadgetColoured,GadgetPanel,win)
                                                                        end
                                                                        else
                                                                end
                                                        end
                                                        else
                                                end;
                                                NItem:=ItemAddress(MenuFields,ChosenMenu);
                                                ChosenMenu:=NItem^.nextselect;
                                        end
                                end
                                else
                        end
                end;
                if SIGNALS=AppBit then begin
                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                        if ApplicationMessage=NIL then goto BACK;
                        ReplyMsg(p_Message(ApplicationMessage));
                        WindowToFront(win)
                end
        UNTIL MyEndExit<>-1;

        WaitPointer(win);

        SI:=GadgetDiskName^.SpecialInfo;
        ThisXTP.DiskName:=SI^.Buffer;
        SI:=GadgetFormatOptions^.SpecialInfo;
        ThisXTP.FormatOptions:=SI^.Buffer;
        SI:=GadgetFormatWhere^.SpecialInfo;
        ThisXTP.Formatter:=SI^.Buffer;
        SI:=GadgetFormatStack^.SpecialInfo;
        ThisXTP.FormatStack:=SI^.LongInt;
        SI:=GadgetTrashWhere^.SpecialInfo;
        ThisXTP.Trasher:=SI^.Buffer;
        SI:=GadgetIconWhere^.SpecialInfo;
        ThisXTP.IconFile:=SI^.Buffer;
        SI:=GadgetIconName^.SpecialInfo;
        ThisXTP.IconName:=SI^.Buffer;
        SI:=GadgetIconX^.SpecialInfo;
        ThisXTP.IconX:=SI^.LongInt;
        SI:=GadgetIconY^.SpecialInfo;
        ThisXTP.IconY:=SI^.LongInt;

        if MyEndExit=2 then begin
                if WriteXTrashPrefs(TheConfiguration,ThisXTP,win)=FALSE then begin NormalPointer(win); goto BACK end;
                StartXTP:=ThisXTP
        end;
        if MyEndExit<>0 then begin
                DidIt:=(MyXTP.IconName<>ThisXTP.IconName) or (MyXTP.IconFile<>ThisXTP.IconFile) or (MyXTP.IconX<>ThisXTP.IconX) or (MyXTP.IconY<>ThisXTP.IconY);
                MyXTP:=ThisXTP;
                if DidIt then begin
                        DidIt:=RemoveAppIcon(ApplicationIcon);
                        if diskIcon=FALSE then begin
                                FreeVec(ImageDataNorm);
                                FreeVec(ImageDataSel);
                                dispose(ImagesObject)
                        end else
                                FreeDiskObject(ImagesObject);
                        InitAppIcon
                end;
        end;

        ClearMenuStrip(win);
        CloseWindow(win);
        FreeGadgets(CG);
        FreeMenus(MenuFields)
END;


FUNCTION SetFormatString(Source,DiskDrive,DiskName,FormatOptions:str):DirNameString;
VAR     i       :                               integer;
        Josh    :                               DirNameString;
BEGIN
        Josh:=" "+Source+" ";

        while pos("\\",Josh)<>0 do begin
                i:=pos("\\",Josh);
                Josh:=copy(Josh,1,i-1)+LF+copy(Josh,i+2,length(Josh)-i-1)
        end;
        while pos("\d",Josh)<>0 do begin
                i:=pos("\d",Josh);
                Josh:=copy(Josh,1,i-1)+DISKDRIVE+copy(Josh,i+2,length(Josh)-i-1)
        end;
        while pos("\n",Josh)<>0 do begin
                i:=pos("\n",Josh);
                Josh:=copy(Josh,1,i-1)+DISKNAME+copy(Josh,i+2,length(Josh)-i-1)
        end;
        while pos("\o",Josh)<>0 do begin
                i:=pos("\o",Josh);
                Josh:=copy(Josh,1,i-1)+FORMATOPTIONS+copy(Josh,i+2,length(Josh)-i-1)
        end;
        while pos(LF,Josh)<>0 do begin
                i:=pos(LF,Josh);
                Josh:=copy(Josh,1,i-1)+"\"+copy(Josh,i+1,length(Josh)-i-1)
        end;

        Josh:=copy(Josh,2,length(Josh)-2);
        SetFormatString:=Josh
END;

FUNCTION GetDevice(Source:str,DoingString:str,win:p_window):FileString;
LABEL   OuterSpace,BackToTheRoots,BackToTheParents;
TYPE    p_Byte = ^Byte;
        p_Char = ^Char;
VAR     RN      :                               p_RootNode;
        Inf     :                               p_DosInfo;
        Lst     :                               p_DevInfo;
        MyString:                               FileString;
        MyProcess:                              p_Process;
        MyPtr   :                               PTR;
        MyLock,OtherLock:                       BPTR;
        Operating:                              boolean;
        dummy   :                               long;
        tac     :                               p_Byte;
        tacker  :                               p_Char;
BEGIN
        BackToTheRoots:
        Operating:=FALSE;
        forbid;
        MyProcess:=p_Process(FindTask(NIL));
        MyPtr:=MyProcess^.pr_WindowPtr;
        MyProcess^.pr_WindowPtr:=ptr(-1);
        RN:=DB^.dl_Root;
        Inf:=p_DosInfo(long(RN^.rn_Info) SHL 2);
        BackToTheParents:
        Lst:=p_DevInfo(long(Inf^.di_DevInfo) SHL 2);
        repeat
                if (Lst^.dvi_Type=0) and (Lst^.dvi_GlobVec=0) then begin
                        tac:=p_Byte(Lst^.dvi_Name SHL 2);
                        for dummy:=1 to tac^ do begin
                                tacker:=p_Char(Lst^.dvi_Name SHL 2+dummy);
                                MyString[dummy]:=tacker^
                        end;
                        MyString[tac^+1]:=":";
                        MyString[tac^+2]:=chr(0);
                        if Operating then begin
                                OtherLock:=Lock(MyString,SHARED_LOCK);
                                if IOErr=0 then begin
                                        if SameDevice(OtherLock,MyLock) then begin UnLock(OtherLock); goto OuterSpace end else UnLock(OtherLock);
                                end
                        end else if MyString=Source then goto OuterSpace;
                end;
                Lst:=p_DevInfo(long(Lst^.dvi_Next) SHL 2)
        until ptr(long(Lst) SHL 2)=NIL;
        if Operating=FALSE then begin MyLock:=Lock(Source,SHARED_LOCK); if IOErr=0 then begin Operating:=TRUE; goto BackToTheParents end end;
        if Operating then UnLock(MyLock);
        MyProcess^.pr_WindowPtr:=MyPtr;
        permit;
        dummy:=GiveQuestion("XTrash 1.01 - "+DoingString,"The device [of the volume]"+LF+Source+LF+"couldn't be identified.","Retry|Leave trashing place",win);
        if dummy=0 then GetDevice:="" else goto BackToTheRoots;
        EXIT;

        OuterSpace:
        if Operating then begin UnLock(MyLock); MyLock:=0 end;
        MyProcess^.pr_WindowPtr:=MyPtr;
        permit;
        GetDevice:=MyString;
END;

FUNCTION CopyEntry(MySource:str,MyDest:DirNameString,DoingString:str,copyIcon:boolean,
        VAR replace:boolean,win:p_window):long;
LABEL   tryAgain;
VAR     OUTOF,INTO:                             file of long;
        MyLong  :                               long;
        MyLock  :                               BPTR;
        MyIcon  :                               p_DiskObject;
BEGIN
        myLong:=long(AddPart(MyDest,FilePart(MySource),364));
        tryAgain:
        if replace=FALSE then begin
                if copyIcon then VariableString:=MyDest+".info" else VariableString:=MyDest;
                MyLock:=Lock(VariableString,SHARED_LOCK);
                if MyLock<>0 then begin
                        UnLock(MyLock);
                        MyLong:=GiveQuestion("XTrash 1.01 - "+DoingString,"The file"+LF+VariableString+LF+"already exists.","Retry|Replace|Consider as Error",win);
                        case MyLong of
                                0:      begin CopyEntry:=203; Exit end
                                1:      goto tryAgain
                                else    replace:=TRUE
                        end
                end else begin UnLock(MyLock); replace:=FALSE end
        end;
        if copyIcon then begin
                MyIcon:=GetDiskObjectNew(MySource);
                if MyIcon=NIL then
                        myLong:=IOErr
                else begin
                        if PutDiskObject(MyDest,MyIcon)=FALSE then myLong:=IOErr else myLong:=0;
                        FreeDiskObject(MyIcon)
                end;
                if myLong<>0 then begin
                        CopyEntry:=myLong;
                        if myLong<>ERROR_OBJECT_NOT_FOUND then begin
                                myLong:=long(Fault(myLong,NIL,VariableString,364));
                                GiveError("XTrash 1.01 - "+DoingString,"The icon"+LF+MySource+LF+"couldn't have been copied."+LF+"("+VariableString+")",win);
                                close(OUTOF);
                        end;
                end;
                CopyEntry:=myLong;
        end else begin
                reSet(OUTOF,MySource);
                myLong:=IOResult;
                if myLong<>0 then begin
                        CopyEntry:=myLong;
                        if myLong<>ERROR_OBJECT_NOT_FOUND then begin
                                myLong:=long(Fault(myLong,NIL,VariableString,364));
                                GiveError("XTrash 1.01 - "+DoingString,"The file"+LF+MySource+LF+"couldn't have been accessed."+LF+"("+VariableString+")",win);
                        end;
                        Exit
                end;
                reWrite(INTO,MyDest);
                myLong:=IOResult;
                if myLong<>0 then begin
                        CopyEntry:=myLong;
                        if myLong<>ERROR_OBJECT_NOT_FOUND then begin
                                myLong:=long(Fault(myLong,NIL,VariableString,364));
                                GiveError("XTrash 1.01 - "+DoingString,"The file"+LF+MySource+LF+"couldn't have been created."+LF+"("+VariableString+")",win);
                                close(OUTOF);
                        end;
                        Exit
                end;
                Buffer(OUTOF,10000);
                Buffer(INTO,10000);
                while EOF(OUTOF)=FALSE do begin
                        read(OUTOF,myLong);
                        write(INTO,myLong);
                        myLong:=IOResult;
                        if myLong<>0 then begin
                                CopyEntry:=myLong;
                                if myLong<>ERROR_OBJECT_NOT_FOUND then begin
                                        myLong:=long(Fault(myLong,NIL,VariableString,364));
                                        GiveError("XTrash 1.01 - "+DoingString,"The file"+LF+MySource+LF+"couldn't have been copied."+LF+"("+VariableString+")",win);
                                        close(OUTOF);
                                        close(INTO)
                                end;
                                Exit
                        end
                end;
                CopyEntry:=0;
                close(OUTOF);
                close(INTO)
        end
END;

FUNCTION TrashEntry(WhichFile:Str,DoingString:str,trashIcon:boolean,
        chopNotFound,chopDir:boolean,win:p_window):long;
VAR     dummy,D2:                               long;
        mine    :                               string[20];
BEGIN
        if chopDir then mine:="The directory" else mine:="The file";
        if trashIcon then dummy:=long(DeleteDiskObject(WhichFile)) else dummy:=long(DeleteFile(WhichFile)=DOSTRUE);
        if dummy=long(FALSE) then begin
                dummy:=IOErr;
                if (dummy<>ERROR_OBJECT_NOT_FOUND) or (chopNotFound) then begin
                        D2:=long(Fault(Dummy,NIL,VariableString,364));
                        if trashIcon then
                                GiveError("XTrash 1.01 - "+DoingString,"The icon"+LF+WhichFile+".info"+LF+"couldn't have been deleted."+LF+"("+VariableString+")",win)
                        else
                                GiveError("XTrash 1.01 - "+DoingString,mine+LF+WhichFile+"couldn't have been deleted."+LF+"("+VariableString+")",win)
                end;
                TrashEntry:=dummy;
        end else TrashEntry:=0
END;


PROCEDURE GetRidOfForXTrash(VAR win:p_window);
VAR     DidIt   :                               boolean;
BEGIN
        DidIt:=ModifyIDCMP(win,0);
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForXTrash(VAR win:p_window,GadgetCycle:p_gadget);
VAR     DidIt   :                               boolean;
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        DidIt:=ModifyIDCMP(win,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or IDCMP_GADGETDOWN or IDCMP_VANILLAKEY or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or IDCMP_INTUITICKS);
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
END;

PROCEDURE XTrash;
LABEL   Overjump,ComeBack1,ComeBack2,ComeBack3,ComeBack4,ComeBack5,FileFailed,
        FileFailed2,Stick,Stick2,FoundAnError,CureAnError,redoFile,
        AlternateFileFailed,LookWhatExitTrash,BACK,ExitTheTrash;
VAR     win     :                               p_window;
        windowDisplaying:                       boolean;
        winBit  :                               long;
        TagsCHANGES:                            array[1..13] of TagItem;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        GadgetDoing:                            p_gadget;
        GadgetPathList:                         p_gadget;
        GadgetPause:                            p_gadget;
        GadgetStop:                             p_gadget;
        NewGadgetFields:                        newgadget;
        imsg    :                               p_intuimessage;
        SIGNALS :                               long;
        MyEndExit:                              integer;
        ExitTrashing:                           integer;
        ComeBack:                               integer;
        DisplayNode,DisplayNodeBack:            p_StringNode;
        DisplayList:                            p_List;
        dispLayer:                              integer;
        MyString:                               DirNameString;
        DoingString:                            String[25];
        dummy   :                               long;
        alreadyNotFound:                        boolean;
        AnchorList:                             p_List;
        AnchorNodeV:                            p_AnchorNode;
        layer   :                               integer;
        MyAnchor:                               p_AnchorPath;
        CurrentLock:                            BPTR;
        OldLock :                               BPTR;
        DidIt   :                               boolean;
        ApplicationMessage:                     p_AppMessage;
        Pause   :                               boolean;
        replace :                               boolean;
        myTail  :                               p_Node;
BEGIN
        New(DisplayList);
        InitList(DisplayList);
        new(AnchorList);
        InitList(AnchorList);

        Pause:=FALSE;
        opLayer:=0;
        dispLayer:=0;
        DoingString:="";

        if MyXTP.OpenProcessing then begin ComeBack:=1; MyEndExit:=35; goto Overjump end else begin win:=NIL; windowDisplaying:=FALSE end;
        ComeBack1:

        opLayer:=opLayer+1;

        CASE opLayer of
                1:      begin TrashNode:=p_PathNode(FileList^.lh_Head); if CurrentMethodFiles then DoingString:="Moving file(s)" else DoingString:="Deleting file(s)" end
                2:      begin TrashNode:=p_PathNode(DirList^.lh_Head); DoingString:="Deleting dir(s)" end
                3:      begin TrashNode:=p_PathNode(TrashList^.lh_Head); if CurrentMethodTrash then DoingString:="Deleting trash(s)" else DoingString:="Emptying trash(s)" end
                4:      begin TrashNode:=p_PathNode(DiskList^.lh_Head); DoingString:="Formatting device(s)" end
        end;
        if (p_PathNode(TrashNode^.pn_Node.ln_Succ)<>NIL) and (windowDisplaying) then begin
                TagsCHANGES[1].ti_Tag:=GTTX_Text;
                TagsCHANGES[1].ti_Data:=DoingString;
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetDoing,win,NIL,^TagsCHANGES)
        end;
        WHILE p_PathNode(TrashNode^.pn_Node.ln_Succ)<>NIL DO BEGIN
                dispLayer:=1;
                ExitTrashing:=0;
                VariableString:=TrashNode^.pn_Path;
                while VariableString[length(VariableString)]<>":" do begin
                        New(DisplayNode);
                        MyString:=FilePart(VariableString);
                        DisplayNode^.stn_Node.ln_pri:=0;
                        PrepareNode(DisplayNode,MyString);
                        AddHead(DisplayList,p_Node(DisplayNode));
                        VariableString:=copy(VariableString,1,length(VariableString)-length(PathPart(VariableString)));
                        dispLayer:=dispLayer+1
                end;
                New(DisplayNode);
                DisplayNode^.stn_Node.ln_pri:=0;
                PrepareNode(DisplayNode,VariableString);
                AddHead(DisplayList,p_Node(DisplayNode));
                if windowDisplaying then begin
                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                        TagsCHANGES[1].ti_Data:=long(DisplayList);
                        if dispLayer<10 then TagsCHANGES[2].ti_Tag:=TAG_END else begin TagsCHANGES[2].ti_Tag:=GTLV_Top; TagsCHANGES[2].ti_Data:=dispLayer-8; TagsCHANGES[3].ti_Tag:=TAG_END end;
                        GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES);
                end;
                ComeBack2:
                ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                if ApplicationMessage<>NIL then begin
                        ReplyMsg(p_Message(ApplicationMessage));
                        if windowDisplaying then WindowToFront(win) else begin ComeBack:=2; MyEndExit:=35; goto Overjump end;
                end;
                if windowDisplaying then begin
                        imsg:=GT_GetIMsg(win^.userport); GT_ReplyIMsg(imsg);
                        if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin ComeBack:=2; goto BACK end;
                        if ExitTrashing>0 then goto LookWhatExitTrash;
                end;
                if Pause then begin SIGNALS:=_Wait(winBit or AppBit); goto ComeBack2 end;
                if (opLayer=2) or (opLayer=3) then begin
                        layer:=0;
                        Stick:
                        layer:=layer+1;
                        CurrentLock:=Lock(TrashNode^.pn_Path,SHARED_LOCK);
                        dummy:=IOErr;
                        if dummy=0 then begin
                                new(MyAnchor);
                                OldLock:=CurrentDir(CurrentLock);
                                dummy:=MatchFirst("#?",MyAnchor);
                                if dummy<>0 then goto FoundAnError;
                                repeat
                                        ComeBack3:
                                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                                        if ApplicationMessage<>NIL then begin
                                                ReplyMsg(p_Message(ApplicationMessage));
                                                if windowDisplaying then WindowToFront(win) else begin ComeBack:=3; MyEndExit:=35; goto Overjump end;
                                        end;
                                        if windowDisplaying then begin
                                                imsg:=GT_GetIMsg(win^.userport); GT_ReplyIMsg(imsg);
                                                if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin ComeBack:=3; goto BACK end;
                                                if ExitTrashing>0 then goto CureAnError;
                                        end;
                                        if Pause then begin SIGNALS:=_Wait(winBit or AppBit); goto ComeBack3 end;
                                        if MyAnchor^.ap_Info.fib_DirEntryType<0 then begin
                                                redoFile:
                                                replace:=FALSE;
                                                alreadyNotFound:=FALSE;
                                                MyString:=TrashNode^.pn_Path;
                                                dummy:=long(AddPart(MyString,MyAnchor^.ap_Info.fib_FileName,364));
                                                if (CurrentMethodFiles) and (opLayer=2) then if CopyEntry(MyString,MyXTP.Trasher,DoingString,FALSE,replace,win)<>0 then begin alreadyNotFound:=TRUE; goto AlternateFileFailed end;
                                                if TrashEntry(MyString,DoingString,FALSE,TRUE,FALSE,win)<>0 then alreadyNotFound:=TRUE;
                                                AlternateFileFailed:
                                                if alreadyNotFound then begin
                                                        dummy:=GiveQuestion("XTrash 1.01 - "+DoingString,"How should I react on the"+LF+"error occured?","Retry|Leave trashing place",win);
                                                        if dummy=0 then begin ExitTrashing:=1; goto CureAnError end;
                                                        if dummy=1 then goto redoFile;
                                                end
                                        end else begin
                                                dummy:=long(AddPart(TrashNode^.pn_Path,MyAnchor^.ap_Info.fib_FileName,256));
                                                if Dummy=0 then begin
                                                        dummy:=GiveQuestion("XTrash 1.01 - "+DoingString,"The path of"+LF+MyAnchor^.ap_Info.fib_FileName+LF+"is too long.","Leave trashing place",win);
                                                        ExitTrashing:=1; goto CureAnError
                                                end;
                                                New(AnchorNodeV);
                                                AnchorNodeV^.ano_Node.ln_Type:=NT_UNKNOWN;
                                                AnchorNodeV^.ano_Node.ln_Pri:=0;
                                                AnchorNodeV^.ano_Node.ln_Name:=NIL;
                                                AnchorNodeV^.ano_Anchor:=MyAnchor;
                                                AnchorNodeV^.ano_Lock:=CurrentLock;
                                                AddTail(AnchorList,p_Node(AnchorNodeV));
                                                New(DisplayNode);
                                                if TrashNode^.pn_Path[length(TrashNode^.pn_Path)]=":" then MyString:=TrashNode^.pn_Path else MyString:=FilePart(TrashNode^.pn_Path);
                                                DisplayNode^.stn_Node.ln_pri:=0;
                                                PrepareNode(DisplayNode,MyString);
                                                AddTail(DisplayList,p_Node(DisplayNode));
                                                if windowDisplaying then begin
                                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                        TagsCHANGES[1].ti_Data:=long(DisplayList);
                                                        if dispLayer<10 then
                                                                TagsCHANGES[2].ti_Tag:=TAG_END
                                                        else begin
                                                                TagsCHANGES[2].ti_Tag:=GTLV_Top;
                                                                TagsCHANGES[2].ti_Data:=dispLayer-8;
                                                                TagsCHANGES[3].ti_Tag:=TAG_END
                                                        end;
                                                        dispLayer:=dispLayer+1;
                                                        GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES)
                                                end;
                                                goto Stick
                                        end;
                                        Stick2:
                                        dummy:=MatchNext(MyAnchor);
                                        if dummy<>0 then begin
                                                if dummy=ERROR_NO_MORE_ENTRIES then goto CureAnError else ExitTrashing:=999;
                                                FoundAnError:
                                                if ExitTrashing<>999 then begin MyAnchor:=NIL; ExitTrashing:=0 end;
                                                if dummy<>ERROR_NO_MORE_ENTRIES then begin
                                                        if TrashNode^.pn_Path[length(TrashNode^.pn_Path)]=":" then MyString:=TrashNode^.pn_Path else MyString:=FilePart(TrashNode^.pn_Path);
                                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                        dummy:=GiveQuestion("XTrash 1.01 - "+DoingString,"Error while reading"+LF+MyString+"."+LF+"("+VariableString+")","Leave trashing place",win);
                                                        ExitTrashing:=1
                                                end;
                                                CureAnError:
                                                layer:=layer-1;
                                                dispLayer:=dispLayer-1;
                                                if MyAnchor<>NIL then begin
                                                        MatchEnd(MyAnchor);
                                                        dispose(MyAnchor);
                                                end;
                                                UnLock(CurrentLock);
                                                if layer<>0 then begin
                                                        AnchorNodeV:=p_AnchorNode(AnchorList^.lh_TailPred);
                                                        MyAnchor:=AnchorNodeV^.ano_Anchor;
                                                        CurrentLock:=AnchorNodeV^.ano_Lock;
                                                        myTail:=RemTail(AnchorList);
                                                        dispose(AnchorNodeV);
                                                        if ExitTrashing=0 then if TrashEntry(TrashNode^.pn_Path,DoingString,FALSE,TRUE,TRUE,win)<>0 then ExitTrashing:=1;
                                                        TrashNode^.pn_Path:=copy(TrashNode^.pn_Path,1,length(TrashNode^.pn_Path)-length(PathPart(TrashNode^.pn_Path)));
                                                        DisplayNode:=p_StringNode(DisplayList^.lh_TailPred);
                                                        dispose(DisplayNode);
                                                        myTail:=RemTail(DisplayList);
                                                        if windowDisplaying then begin
                                                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                                TagsCHANGES[1].ti_Data:=long(DisplayList);
                                                                if dispLayer<10 then
                                                                        TagsCHANGES[2].ti_Tag:=TAG_END
                                                                else begin
                                                                        TagsCHANGES[2].ti_Tag:=GTLV_Top;
                                                                        TagsCHANGES[2].ti_Data:=dispLayer-9;
                                                                        TagsCHANGES[3].ti_Tag:=TAG_END
                                                                end;
                                                                GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES)
                                                        end;
                                                        if ExitTrashing>0 then goto CureAnError;
                                                        goto Stick2
                                                end;
                                                if ExitTrashing>0 then goto LookWhatExitTrash
                                        end;
                                until layer=0
                        end else begin
                                ComeBack4:
                                ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                                if ApplicationMessage<>NIL then begin
                                        ReplyMsg(p_Message(ApplicationMessage));
                                        if windowDisplaying then WindowToFront(win) else begin ComeBack:=4; MyEndExit:=35; goto Overjump end;
                                end;
                                if windowDisplaying then begin
                                        imsg:=GT_GetIMsg(win^.userport); GT_ReplyIMsg(imsg);
                                        if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin ComeBack:=4; goto BACK end;
                                        if ExitTrashing>0 then goto CureAnError;
                                end;
                                if Pause then begin SIGNALS:=_Wait(winBit or AppBit); goto ComeBack4 end;
                                goto FoundAnError
                        end
                end;
                if (opLayer=1) or (((opLayer=2) or ((opLayer=3) and (CurrentMethodTrash))) and (ExitTrashing=0)) then begin
                        if opLayer=1 then DidIt:=FALSE else DidIt:=TRUE;
                        replace:=FALSE;
                        alreadyNotFound:=FALSE;
                        if (CurrentMethodFiles) and (opLayer=1) then case (CopyEntry(TrashNode^.pn_Path,MyXTP.Trasher,DoingString,FALSE,replace,win)) of
                                (ERROR_OBJECT_NOT_FOUND): begin
                                        alreadyNotFound:=TRUE;
                                        goto FileFailed
                                end
                                0:      begin end
                                else    goto FileFailed2
                        end;
                        case (TrashEntry(TrashNode^.pn_Path,DoingString,FALSE,FALSE,DidIt,win)) of
                                (ERROR_OBJECT_NOT_FOUND):
                                        alreadyNotFound:=TRUE
                                0:      begin end
                                else    goto FileFailed2
                        end;
                        FileFailed:
                        if (CurrentMethodFiles) and (opLayer=1) then case (CopyEntry(TrashNode^.pn_Path,MyXTP.Trasher,DoingString,TRUE,replace,win)) of
                                (ERROR_OBJECT_NOT_FOUND): begin
                                        if alreadyNotFound then begin
                                                Dummy:=long(Fault(ERROR_OBJECT_NOT_FOUND,NIL,VariableString,364));
                                                if CurrentMethodFiles then
                                                        GiveError("XTrash 1.01 - "+DoingString,"No access on"+LF+TrashNode^.pn_Path+","+LF+"on its icon or on"+LF+"the trashcan possible."+LF+"("+VariableString+")",win)
                                                else
                                                        GiveError("XTrash 1.01 - "+DoingString,"No access on"+LF+TrashNode^.pn_Path+LF+"or on its icon possible."+LF+"("+VariableString+")",win)
                                        end;
                                        goto FileFailed2
                                end
                                0:      begin end
                                else    goto FileFailed2
                        end;
                        if (TrashEntry(TrashNode^.pn_Path,DoingString,TRUE,FALSE,DidIt,win)=ERROR_OBJECT_NOT_FOUND) and (alreadyNotFound) then begin
                                Dummy:=long(Fault(ERROR_OBJECT_NOT_FOUND,NIL,VariableString,364));
                                if CurrentMethodFiles then
                                        GiveError("XTrash 1.01 - "+DoingString,"No access on"+LF+TrashNode^.pn_Path+","+LF+"on its icon or on"+LF+"the trashcan possible."+LF+"("+VariableString+")",win)
                                else
                                        GiveError("XTrash 1.01 - "+DoingString,"No access on"+LF+TrashNode^.pn_Path+LF+"or on its icon possible."+LF+"("+VariableString+")",win)
                        end;
                        FileFailed2:
                end;
                if opLayer=4 then begin
                        OldLock:=Open("CON:0/80/640/100/XTrash 1.01 - Formatiere Datenträger/CLOSE/AUTO/WAIT",MODE_NEWFILE);
                        if IOErr<>0 then begin
                                GiveError("XTrash 1.01 - "+DoingString,"The volume [in drive]"+LF+TrashNode^.pn_Path+LF+"couldn't be formatted."+LF+"(not able to open output console)",win);
                                goto LookWhatExitTrash
                        end;
                        VariableString:=GetDevice(TrashNode^.pn_Path,DoingString,win);
                        if VariableString<>"" then begin
                                TagsCHANGES[1]:=TagItem(SYS_Input,OldLock);
                                TagsCHANGES[2]:=TagItem(SYS_Output,long(NIL));
                                TagsCHANGES[3].ti_Tag:=NP_Name; TagsCHANGES[3].ti_Data:="Formatter";
                                TagsCHANGES[4]:=TagItem(NP_Priority,0);
                                if MyXTP.FormatStack<0 then TagsCHANGES[5].ti_Tag:=TAG_END else begin TagsCHANGES[5]:=TagItem(NP_StackSize,MyXTP.FormatStack); TagsCHANGES[6].ti_Tag:=TAG_END end;
                                MyString:=SetFormatString(MyXTP.Formatter,VariableString,CurrentDiskName,CurrentFormatOptions);
                                if windowDisplaying then begin
                                        WaitPointer(win);
                                        GetRidOfForXTrash(win)
                                end;
                                dummy:=SystemTagList(MyString,^TagsCHANGES);
                                if windowDisplaying then begin
                                        GetBackForXTrash(win,CG);
                                        NormalPointer(win)
                                end;
                                dummy:=IOErr;
                                if dummy<>0 then begin
                                        Dummy:=long(Fault(dummy,NIL,MyString,364));
                                        GiveError("XTrash 1.01 - "+DoingString,"The volume [in drive]"+LF+VariableString+LF+"couldn't be formatted."+LF+"("+MyString+")",win);
                                        goto LookWhatExitTrash
                                end
                        end;
                        dummy:=_Close(OldLock)
                end;
                LookWhatExitTrash:
                DisplayNode:=p_StringNode(DisplayList^.lh_Head);
                WHILE p_StringNode(DisplayNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                        DisplayNodeBack:=p_StringNode(DisplayNode^.stn_Node.ln_Succ);
                        Remove(p_Node(^DisplayNode^.stn_Node));
                        dispose(DisplayNode);
                        DisplayNode:=DisplayNodeBack;
                END;
                case ExitTrashing of
                        2:      goto ExitTheTrash
                        else    TrashNode:=p_PathNode(TrashNode^.pn_Node.ln_Succ);
                end;
        END;

        if opLayer<4 then goto ComeBack1;

        ExitTheTrash:

        if windowDisplaying then begin ComeBack:=5; MyEndExit:=-35; goto Overjump end;
        ComeBack5:

        dispose(AnchorList);
        dispose(DisplayList);

        EXIT;

        BACK:

        case imsg^.class of
                IDCMP_CLOSEWINDOW:
                        MyEndExit:=-35
                IDCMP_GADGETUP: begin
                        CurrentGadget:=imsg^.iaddress;
                        case CurrentGadget^.gadgetid of
                                1:      Pause:=NOT(Pause)
                                2:      ExitTrashing:=2
                                else
                        end
                end
                IDCMP_VANILLAKEY: begin
                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                        case imsg^.code of
                                27:     ExitTrashing:=2
                                13:     MyEndExit:=-35
                                32:     begin
                                        Pause:=NOT(Pause);
                                        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(Pause));
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetPause,win,NIL,^TagsCHANGES)
                                end
                        end
                end
                else
        end;

        Overjump:

        if MyEndExit=35 then begin
                scr:=LockPubScreen(NIL);
                VI:=GetVisualInfoA(scr,NIL);
                DI:=GetScreenDrawInfo(scr);
                CG:=NIL;
                CG:=CreateContext(^CG);

                TagsCHANGES[1].ti_Tag:=GTTX_Text;
                TagsCHANGES[1].ti_Data:=DoingString;
                TagsCHANGES[2]:=TagItem(GTTX_Border,long(TRUE));
                TagsCHANGES[3].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(10,5,190,12,NIL,^tattr,0,0,VI,NIL);
                GadgetDoing:=CreateGadgetA(TEXT_KIND,CG,^NewGadgetFields,^TagsCHANGES);

                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                TagsCHANGES[1].ti_Data:=long(DisplayList);
                TagsCHANGES[2]:=TagItem(GTLV_ScrollWidth,16);
                TagsCHANGES[3]:=TagItem(GTLV_ReadOnly,long(TRUE));
                if dispLayer<10 then TagsCHANGES[4].ti_Tag:=TAG_END else begin TagsCHANGES[4]:=TagItem(GTLV_Top,dispLayer-8); TagsCHANGES[5].ti_Tag:=TAG_END end;
                NewGadgetFields:=NewGadget(10,17,190,86,NIL,^tattr,0,0,VI,NIL);
                GadgetPathList:=CreateGadgetA(LISTVIEW_KIND,GadgetDoing,^NewGadgetFields,
                        ^TagsCHANGES);

                TagsCHANGES[1]:=TagItem(GTCB_Checked,long(Pause));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(50,107,0,0,"Pause",^tattr,1,PLACETEXT_RIGHT,
                        VI,NIL);
                GadgetPause:=CreateGadgetA(CHECKBOX_KIND,GadgetPathList,
                        ^NewGadgetFields,^TagsCHANGES);

                NewGadgetFields:=NewGadget(140,107,60,12,"Stop",^tattr,2,PLACETEXT_IN,
                        VI,NIL);
                GadgetStop:=CreateGadgetA(BUTTON_KIND,GadgetPause,^NewGadgetFields,NIL);

                TagsCHANGES[1]:=TagItem(WA_Top,10);
                TagsCHANGES[2]:=TagItem(WA_Left,20);
                TagsCHANGES[3]:=TagItem(WA_InnerHeight,125);
                TagsCHANGES[4]:=TagItem(WA_InnerWidth,210);
                TagsCHANGES[5].ti_Tag:=WA_Title;
                TagsCHANGES[5].ti_Data:="XTrash 1.01";
                TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET or WFLG_GIMMEZEROZERO or
                        WFLG_ACTIVATE or WFLG_DRAGBAR or WFLG_SMART_REFRESH or
                        WFLG_DEPTHGADGET or WFLG_RMBTRAP);
                TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                        IDCMP_GADGETDOWN or IDCMP_VANILLAKEY or IDCMP_MOUSEMOVE or
                        IDCMP_MOUSEBUTTONS or IDCMP_INTUITICKS);
                TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
                TagsCHANGES[9]:=TagItem(WA_Gadgets,long(CG));
                TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
                TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
                TagsCHANGES[12].ti_Tag:=TAG_END;
                win:=OpenWindowTagList(NIL,^TagsCHANGES);
                winBit:=long(1) shl win^.userport^.mp_sigbit;
                GT_RefreshWindow(win,NIL);
                windowDisplaying:=TRUE
        end;

        if MyEndExit=-35 then begin
                CloseWindow(win);
                FreeGadgets(CG);
                FreeScreenDrawInfo(scr,DI);
                FreeVisualInfo(VI);
                UnLockPubScreen(NIL,scr);
                windowDisplaying:=FALSE;
                win:=NIL
        end;

        MyEndExit:=-1;

        case ComeBack of
                1:      begin ComeBack:=0; goto ComeBack1 end
                2:      begin ComeBack:=0; goto ComeBack2 end
                3:      begin ComeBack:=0; goto ComeBack3 end
                4:      begin ComeBack:=0; goto ComeBack4 end
                5:      begin ComeBack:=0; goto ComeBack5 end
        end;
END;


PROCEDURE AddInList(MyLock:BPTR,GeneralName:STR,win:p_window);
LABEL   SimplyOut;
VAR     dummy   :                               long;
        MyDOB   :                               p_DiskObject;
        MyFIB   :                               p_FileInfoBlock;
BEGIN
        if (MyLock=0) and (copy(GeneralName,length(GeneralName),1)<>":") then begin GiveError("IconDrop - ["+GeneralName+"]","The icon can't be read.",NIL); goto SimplyOut end;
        if (MyLock=0) and (copy(GeneralName,length(GeneralName),1)=":") then begin VariableString:=GeneralName; GeneralName:=""; dummy:=1 end else dummy:=NameFromLock(MyLock,VariableString,256);
        if dummy=0 then begin GiveError ("IconDrop - ["+GeneralName+"]","Icon couldn't be identified.",win); goto SimplyOut end;
        if GeneralName<>"" then dummy:=long(AddPart(VariableString,GeneralName,256)) else dummy:=-1;
        if dummy=0 then begin
                if VariableString[length(VariableString)]=":" then GeneralName:=VariableString else GeneralName:=FilePart(VariableString);
                GiveError ("IconDrop - ["+GeneralName+"]","Name of the icon is too long.",win);
                goto SimplyOut
        end;
        if VariableString[length(VariableString)]=":" then opLayer:=4 else begin
                if GeneralName<>"" then opLayer:=1 else begin
                        MyDOB:=GetDiskObjectNew(VariableString);
                        if MyDOB=NIL then opLayer:=2 else begin
                                if MyDOB^.do_Type=WBGARBAGE then opLayer:=3 else opLayer:=2;
                                FreeDiskObject(MyDOB)
                        end
                end
        end;
        if opLayer=2 then begin
                new(MyFIB);
                if Examine(MyLock,MyFIB)=DOSTRUE then
                        if (MyFIB^.fib_DirEntryType=ST_SOFTLINK) or (MyFIB^.fib_DirEntryType=ST_LINKDIR) then opLayer:=1;
                dispose(MyFIB)
        end;
        CASE opLayer of
                1:      TrashNode:=p_PathNode(FileList^.lh_Head);
                2:      TrashNode:=p_PathNode(DirList^.lh_Head);
                3:      TrashNode:=p_PathNode(TrashList^.lh_Head);
                4:      TrashNode:=p_PathNode(DiskList^.lh_Head);
        end;
        WHILE p_PathNode(TrashNode^.pn_Node.ln_Succ)<>NIL DO BEGIN
                if VariableString=TrashNode^.pn_Path then goto SimplyOut;
                TrashNode:=p_PathNode(TrashNode^.pn_Node.ln_Succ)
        END;
        new(TrashNode);
        TrashNode^.pn_Node.ln_Pri:=opLayer;
        PrepareNode(TrashNode,VariableString);
        CASE opLayer of
                1:      begin AddTail(FileList,p_Node(TrashNode)); FileNum:=FileNum+1 end
                2:      begin AddTail(DirList,p_Node(TrashNode)); DirNum:=DirNum+1 end
                3:      begin AddTail(TrashList,p_Node(TrashNode)); TrashNum:=TrashNum+1 end
                4:      begin AddTail(DiskList,p_Node(TrashNode)); DiskNum:=DiskNum+1 end
        end;
        SimplyOut:
END;

FUNCTION FindInnerThing(Source,Searcher:str):Boolean;
VAR     i       :                               integer;
        Josh    :                               DirNameString;
BEGIN
        Josh:=" "+Source+" ";

        while pos("\\",Josh)<>0 do begin
                i:=pos("\\",Josh);
                Josh:=copy(Josh,1,i-1)+LF+copy(Josh,i+2,length(Josh)-i-1)
        end;
        FindInnerThing:=pos(Searcher,Josh)<>0;
END;


PROCEDURE GetRidOfForBeforeXTrash(VAR win:p_window);
VAR     DidIt   :                               boolean;
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        DidIt:=ModifyIDCMP(win,0);
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForBeforeXTrash(VAR win:p_window,GadgetCycle:p_gadget);
VAR     DidIt   :                               boolean;
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        DidIt:=ModifyIDCMP(win,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or IDCMP_VANILLAKEY or IDCMP_NEWSIZE or IDCMP_GADGETDOWN or IDCMP_MENUPICK);
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
END;

PROCEDURE BeforeXTrash;
LABEL   BACK,ReDisplay,ReBuild,Values;
VAR     win     :                               p_window;
        winBit  :                               long;
        winOffset:                              long;
        lastGadget:                             p_gadget;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetMethodTrash:                      p_gadget;
        GadgetMethodFiles:                      p_gadget;
        GadgetDiskName:                         p_gadget;
        GadgetFormatOptions:                    p_gadget;
        GadgetOK:                               p_gadget;
        GadgetStd:                              p_gadget;
        GadgetCancel:                           p_gadget;
        MethodTrashContents:                    array[1..3] of str;
        MethodFilesContents:                    array[1..3] of str;
        NewMenuFields:                          array[1..4] of NewMenu;
        MenuFields:                             p_Menu;
        NItem   :                               p_menuitem;
        ChosenMenu:                             long;
        DidIt   :                               boolean;
        imsg    :                               p_intuimessage;
        MyEndexit:                              integer;
        TagsCHANGES:                            array[1..13] of TagItem;
        ZOM     :                               array[1..4] of word;
        ApplicationWindow:                      p_AppWindow;
        ApplicationMessage:                     p_AppMessage;
        OldFile,OldDir,OldTrash,OldDisk:        long;
        ChangeASG,BackASG:                      array [0..1] of Byte;
        SI      :                               p_StringInfo;
        DisplayName:                            Boolean;
        DisplayOptions:                         Boolean;
BEGIN
        scr:=LockPubScreen(NIL);
        VI:=GetVisualInfoA(scr,NIL);
        DI:=GetScreenDrawInfo(scr);

        ReBuild:
        CG:=NIL;
        CG:=CreateContext(^CG);
        ChangeASG[0]:=DI^.dri_Pens^[SHADOWPEN];
        ChangeASG[1]:=DI^.dri_Pens^[SHINEPEN];
        if ChangeASG[0]=ChangeASG[1] then
                ChangeASG[0]:=DI^.dri_Pens^[FILLTEXTPEN];

        lastgadget:=CG;
        winOffset:=0;

        if (FileNum<>0) or (DirNum<>0) then begin
                MethodFilesContents[1]:="Delete _Files";
                MethodFilesContents[2]:="_Move Files in Trashcan";
                MethodFilesContents[3]:=NIL;
                TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
                TagsCHANGES[2]:=TagItem(GTMX_Labels,long(^MethodFilesContents));
                TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
                TagsCHANGES[4]:=TagItem(GTMX_Active,long(CurrentMethodFiles));
                TagsCHANGES[5].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(16,95,0,0,NIL,^tattr,1,PLACETEXT_RIGHT,VI,NIL);
                GadgetMethodFiles:=CreateGadgetA(MX_KIND,lastGadget,
                        ^NewGadgetFields,^TagsCHANGES);
                winOffset:=winOffset+25;
                lastGadget:=GadgetMethodFiles
        end;

        if TrashNum<>0 then begin
                MethodTrashContents[1]:="_Empty Trashcan";
                MethodTrashContents[2]:="Delete _Trashcan";
                MethodTrashContents[3]:=NIL;
                TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
                TagsCHANGES[2]:=TagItem(GTMX_Labels,long(^MethodTrashContents));
                TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
                TagsCHANGES[4]:=TagItem(GTMX_Active,long(CurrentMethodTrash));
                TagsCHANGES[5].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(16,95+winOffset,0,0,NIL,^tattr,2,PLACETEXT_RIGHT,VI,NIL);
                GadgetMethodTrash:=CreateGadgetA(MX_KIND,lastGadget,
                        ^NewGadgetFields,^TagsCHANGES);
                lastGadget:=GadgetMethodTrash;
                winOffset:=winOffset+25
        end;

        if DiskNum<>0 then begin
                DisplayName:=FindInnerThing(MyXTP.Formatter,"\n");
                DisplayOptions:=FindInnerThing(MyXTP.Formatter,"\o");

                if DisplayName then begin
                        TagsCHANGES[1]:=TagItem(GTST_MaxChars,30);
                        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=CurrentDiskName;
                        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
                        TagsCHANGES[4].ti_Tag:=TAG_END;
                        NewGadgetFields:=NewGadget(96,95+winOffset,204,12,"Fmt. _Name",^tattr,3,PLACETEXT_LEFT,VI,NIL);
                        GadgetDiskName:=CreateGadgetA(STRING_KIND,lastGadget,^NewGadgetFields,^TagsCHANGES);
                        lastGadget:=GadgetDiskName;
                        winOffset:=winOffset+12
                end;

                if DisplayOptions then begin
                        TagsCHANGES[1]:=TagItem(GTST_MaxChars,80);
                        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=CurrentFormatOptions;
                        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
                        TagsCHANGES[4].ti_Tag:=TAG_END;
                        NewGadgetFields:=NewGadget(96,95+winOffset+integer(DisplayName),204,12,"_Optionen",^tattr,4,PLACETEXT_LEFT,VI,NIL);
                        GadgetFormatOptions:=CreateGadgetA(STRING_KIND,lastGadget,^NewGadgetFields,^TagsCHANGES);
                        lastGadget:=GadgetFormatOptions;
                        winOffset:=winOffset+12+integer(DisplayName)
                end;

                winOffset:=winOffset+5*integer(DisplayOptions or DisplayName);

                if (ChangeASG[0]<>ChangeASG[1]) and (MyXTP.Coloured) then begin
                        if DisplayName then begin
                                SI:=GadgetDiskName^.SpecialInfo;
                                SI^.Extension^.ActivePens:=ChangeASG
                        end;
                        if DisplayOptions then begin
                                SI:=GadgetFormatOptions^.SpecialInfo;
                                SI^.Extension^.ActivePens:=ChangeASG
                        end
                end
        end;

        NewGadgetFields:=NewGadget(10,100+winOffset,90,12,"Trash...",^tattr,5,
                PLACETEXT_IN,VI,NIL);
        GadgetOK:=CreateGadgetA(BUTTON_KIND,lastGadget,^NewGadgetFields,
                NIL);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(110,100+winOffset,110,12,"Std. _Values",^tattr,6,
                PLACETEXT_IN,VI,NIL);
        GadgetStd:=CreateGadgetA(BUTTON_KIND,GadgetOK,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(230,100+winOffset,70,12,"Cancel",^tattr,7,
                PLACETEXT_IN,VI,NIL);
        GadgetCancel:=CreateGadgetA(BUTTON_KIND,GadgetStd,^NewGadgetFields,NIL);

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Project",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"Preferences...",NIL,0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Quit","Q",0,0,NIL);
        NewMenuFields[4].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        DidIt:=LayoutMenusA(MenuFields,VI,^TagsCHANGES);

        ZOM[1]:=20;
        ZOM[2]:=10;
        ZOM[3]:=200;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,10);
        TagsCHANGES[2]:=TagItem(WA_Left,20);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,117+winOffset);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,310);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:="XTrash 1.01";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET or WFLG_HASZOOM);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_VANILLAKEY or IDCMP_NEWSIZE or IDCMP_GADGETDOWN or IDCMP_MENUPICK);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9]:=TagItem(WA_Gadgets,long(CG));
        TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        win:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl win^.userport^.mp_SigBit;
        dummy:=SetFont(win^.RPort,tfont);

        DidIt:=SetMenuStrip(win,MenuFields);
        GT_RefreshWindow(win,NIL);
        TagsCHANGES[1]:=TagItem(GT_VisualInfo,long(VI));
        TagsCHANGES[2]:=TagItem(GTBB_Recessed,long(TRUE));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        DrawBevelBoxA(win^.RPort,10,5,290,85,^TagsCHANGES);

        ApplicationWindow:=AddAppWindowA(1,0,win,ApplicationPort,NIL);

        ReDisplay:
        SetAPen(win^.rport,DI^.dri_Pens^[TEXTPEN]);
        Move(win^.rport,16,14); dummy:=_Text(win^.rport,"Warning: Deleted files, direc-",30);
        Move(win^.rport,16,23); dummy:=_Text(win^.rport,"tories and volumes are unrecover-",33);
        Move(win^.rport,16,32); dummy:=_Text(win^.rport,"ably lost!",10);
        Move(win^.rport,16,84); dummy:=_Text(win^.rport,"is/are chosen to trash.",23);
        VariableString:=intstr(FileNum)+" File(s)"; VariableStr:=VariableString;
        Move(win^.rport,16,48); dummy:=_Text(win^.rport,VariableString,length(intstr(FileNum))+8);
        VariableString:=intstr(DirNum)+" Directory(ies)"; VariableStr:=VariableString;
        Move(win^.rport,16,57); dummy:=_Text(win^.rport,VariableString,length(intstr(DirNum))+15);
        VariableString:=intstr(TrashNum)+" Trashcan(s)"; VariableStr:=VariableString;
        Move(win^.rport,16,66); dummy:=_Text(win^.rport,VariableString,length(intstr(TrashNum))+12);
        VariableString:=intstr(DiskNum)+" Volume(s)"; VariableStr:=VariableString;
        Move(win^.rport,16,75); dummy:=_Text(win^.rport,VariableString,length(intstr(DiskNum))+10);

        BACK:
        MyEndExit:=-1;

        REPEAT
                imsg:=GT_GetIMsg(win^.userport);
                GT_ReplyIMsg(imsg);
                if imsg=NIL then begin
                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                        if ApplicationMessage<>NIL then
                                SIGNALS:=AppBit
                        else begin
                                SIGNALS:=_wait(AppBit or winBit);
                                if SIGNALS=winBit then begin
                                        imsg:=GT_GetIMsg(win^.userport);
                                        GT_ReplyIMsg(imsg)
                                end else begin
                                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                                        if ApplicationMessage=NIL then SIGNALS:=0
                                end
                        end
                end else
                        SIGNALS:=winBit;
                if SIGNALS=winBit then begin
                        case imsg^.class of
                                IDCMP_NEWSIZE: begin
                                        TagsCHANGES[1]:=TagItem(GT_VisualInfo,long(VI));
                                        TagsCHANGES[2]:=TagItem(GTBB_Recessed,long(TRUE));
                                        TagsCHANGES[3].ti_Tag:=TAG_END;
                                        DrawBevelBoxA(win^.RPort,10,5,290,85,^TagsCHANGES);
                                        goto ReDisplay
                                end
                                IDCMP_CLOSEWINDOW: MyEndExit:=0
                                IDCMP_VANILLAKEY: begin
                                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                        case imsg^.code of
                                                13:     MyEndExit:=1
                                                27:     MyEndExit:=0
                                                78:     if (DiskNum<>0) and (DisplayName) then DidIt:=activategadget(GadgetDiskName,win,nil)
                                                79:     if (DiskNum<>0) and (DisplayOptions) then DidIt:=activategadget(GadgetFormatOptions,win,nil)
                                                70:     if (FileNum<>0) or (DirNum<>0) then begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,0);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        CurrentMethodFiles:=FALSE;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES)
                                                end
                                                77:     if (FileNum<>0) or (DirNum<>0) then begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,1);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        CurrentMethodFiles:=TRUE;
                                                        GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES)
                                                end
                                                69:     if TrashNum<>0 then begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,0);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        CurrentMethodTrash:=FALSE;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES)
                                                end
                                                84:     if TrashNum<>0 then begin
                                                        TagsCHANGES[1]:=TagItem(GTMX_Active,1);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        CurrentMethodTrash:=TRUE;
                                                        GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES)
                                                end
                                                86:     goto Values
                                                else
                                        end
                                end
                                IDCMP_GADGETDOWN: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                1:      CurrentMethodFiles:=NOT(CurrentMethodFiles)
                                                2:      CurrentMethodTrash:=NOT(CurrentMethodTrash)
                                                else
                                        end
                                end
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                5:      MyEndExit:=1
                                                6:      begin
                                                        Values:
                                                        CurrentMethodFiles:=MyXTP.MoveFiles;
                                                        CurrentMethodTrash:=MyXTP.DeleteTrash;
                                                        CurrentDiskName:=MyXTP.DiskName;
                                                        CurrentFormatOptions:=MyXTP.FormatOptions;
                                                        if (FileNum<>0) or (DirNum<>0) then begin
                                                                TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodFiles));
                                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                GT_SetGadgetAttrsA(GadgetMethodFiles,win,NIL,^TagsCHANGES)
                                                        end;
                                                        if TrashNum<>0 then begin
                                                                TagsCHANGES[1]:=TagItem(GTMX_Active,long(CurrentMethodTrash));
                                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                GT_SetGadgetAttrsA(GadgetMethodTrash,win,NIL,^TagsCHANGES)
                                                        end;
                                                        if DiskNum<>0 then begin
                                                                if DisplayName then begin
                                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentDiskName;
                                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                        GT_SetGadgetAttrsA(GadgetDiskName,win,NIL,^TagsCHANGES)
                                                                end;
                                                                if DisplayOptions then begin
                                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentFormatOptions;
                                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                        GT_SetGadgetAttrsA(GadgetFormatOptions,win,NIL,^TagsCHANGES)
                                                                end
                                                        end;
                                                        goto BACK
                                                end
                                                7:      MyEndExit:=0
                                                else
                                        end
                                end
                                IDCMP_MENUPICK: begin
                                        ChosenMenu:=imsg^.code;
                                        while NOT ((ChosenMenu=MENUNULL) or (ChosenMenu=$F8)) do begin
                                                case ChosenMenu and $1f of
                                                        0:      begin
                                                                case (ChosenMenu and $7e0) div 32 of
                                                                        0:      begin
                                                                                WaitPointer(win);
                                                                                GetRidOfForBeforeXTrash(win);
                                                                                PreferencesXTrash;
                                                                                GetBackForBeforeXTrash(win,CG);
                                                                                if DiskNum<>0 then begin
                                                                                        if (DisplayOptions<>FindInnerThing(MyXTP.Formatter,"\o")) or (DisplayName<>FindInnerThing(MyXTP.Formatter,"\n")) then begin
                                                                                                ClearMenuStrip(win);
                                                                                                CloseWindow(win);
                                                                                                FreeGadgets(CG);
                                                                                                FreeMenus(MenuFields);
                                                                                                DidIt:=RemoveAppWindow(ApplicationWindow);
                                                                                                goto ReBuild
                                                                                        end;
                                                                                        if (ChangeASG[0]<>ChangeASG[1]) and (MyXTP.Coloured) then BackASG:=ChangeASG else begin SI:=GadgetDiskName^.SpecialInfo; BackASG:=SI^.Extension^.Pens end;
                                                                                        if DisplayName then begin
                                                                                                SI:=GadgetDiskName^.SpecialInfo;
                                                                                                SI^.Extension^.ActivePens:=BackASG
                                                                                        end;
                                                                                        if DisplayOptions then begin
                                                                                                SI:=GadgetFormatOptions^.SpecialInfo;
                                                                                                SI^.Extension^.ActivePens:=BackASG
                                                                                        end;
                                                                                end;
                                                                                NormalPointer(win);
                                                                        end
                                                                        1:      begin
                                                                                MyEndExit:=0;
                                                                                EndExit:=0
                                                                        end
                                                                        else
                                                                end
                                                        end
                                                        else
                                                end;
                                                NItem:=ItemAddress(MenuFields,ChosenMenu);
                                                ChosenMenu:=NItem^.nextselect;
                                        end
                                end
                                else
                        end
                end;
                if SIGNALS=AppBit then begin
                        if ApplicationMessage=NIL then goto BACK;
                        if (ApplicationMessage^.am_Type=MTYPE_APPICON) or (ApplicationMessage^.am_Type=MTYPE_APPWINDOW) then begin
                                if ApplicationMessage^.am_NumArgs=0 then
                                        WindowToFront(win)
                                else begin
                                        OldFile:=FileNum; OldDir:=DirNum; OldTrash:=TrashNum; OldDisk:=DiskNum;
                                        for i:=0 to ApplicationMessage^.am_NumArgs-1 do
                                                AddInList(ApplicationMessage^.am_ArgList^[i].wa_Lock,ApplicationMessage^.am_ArgList^[i].wa_Name,NIL);
                                        if ((OldFile=0) and (FileNum<>0) and (OldDir=0)) or ((OldDir=0) and (DirNum<>0) and (OldFile=0)) or ((OldTrash=0) and (TrashNum<>0)) or ((OldDisk=0) and (DiskNum<>0)) then begin
                                                ReplyMsg(p_Message(ApplicationMessage));
                                                ClearMenuStrip(win);
                                                CloseWindow(win);
                                                FreeGadgets(CG);
                                                FreeMenus(MenuFields);
                                                DidIt:=RemoveAppWindow(ApplicationWindow);
                                                goto ReBuild
                                        end else begin
                                                ReplyMsg(p_Message(ApplicationMessage));
                                                goto ReDisplay
                                        end
                                end
                        end;
                        ReplyMsg(p_Message(ApplicationMessage));
                end
        UNTIL MyEndExit<>-1;

        ClearMenuStrip(win);
        CloseWindow(win);
        FreeGadgets(CG);
        FreeMenus(MenuFields);
        DidIt:=RemoveAppWindow(ApplicationWindow);
        FreeScreenDrawInfo(scr,DI);
        FreeVisualInfo(VI);
        UnLockPubScreen(NIL,scr);

        if DiskNum<>0 then begin
                SI:=GadgetDiskName^.SpecialInfo;
                CurrentDiskName:=SI^.Buffer;
                SI:=GadgetFormatOptions^.SpecialInfo;
                CurrentFormatOptions:=SI^.Buffer;
        end;

        if MyEndExit=1 then XTrash;

        for opLayer:=1 to 4 do begin
                CASE opLayer of
                        1:      TrashNode:=p_PathNode(FileList^.lh_Head);
                        2:      TrashNode:=p_PathNode(DirList^.lh_Head);
                        3:      TrashNode:=p_PathNode(TrashList^.lh_Head);
                        4:      TrashNode:=p_PathNode(DiskList^.lh_Head);
                end;
                WHILE p_PathNode(TrashNode^.pn_Node.ln_Succ)<>NIL DO BEGIN
                        TrashNodeBack:=p_PathNode(TrashNode^.pn_Node.ln_Succ);
                        Remove(p_Node(^TrashNode^.pn_Node));
                        dispose(TrashNode);
                        TrashNode:=TrashNodeBack
                END
        END;
        FileNum:=0; DirNum:=0; TrashNum:=0; DiskNum:=0;
END;


PROCEDURE GetRidOfForAboutXTrash(VAR win:p_window);
VAR     DidIt   :                               boolean;
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        DidIt:=ModifyIDCMP(win,0);
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForAboutXTrash(VAR win:p_window,GadgetCycle:p_gadget);
VAR     DidIt   :                               boolean;
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        DidIt:=ModifyIDCMP(win,IDCMP_CLOSEWINDOW or IDCMP_VANILLAKEY or IDCMP_MENUPICK or IDCMP_GADGETUP);
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
END;

PROCEDURE AboutXTrash;
LABEL   BACK;
VAR     winAbout:                               p_window;
        CG      :                               p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetPrefs:                            p_gadget;
        GadgetCancel:                           p_gadget;
        GadgetEnd:                              p_gadget;
        Preferences:                            p_gadget;
        TagsCHANGES:                            array [1..10] of TagItem;
        dummy   :                               long;
        amsg    :                               p_intuimessage;
        MyEndExit:                              integer;
        CurrentGadget:                          p_Gadget;
        winBit  :                               long;
        NewMenuFields:                          array[1..4] of NewMenu;
        MenuFields:                             p_Menu;
        NItem   :                               p_menuitem;
        DidIt   :                               boolean;
        SIGNALS :                               long;
        ChosenMenu:                             long;
        ApplicationWindow:                      p_AppWindow;
        ApplicationMessage:                     p_AppMessage;
BEGIN
        scr:=LockPubScreen(NIL);
        VI:=GetVisualInfoA(scr,NIL);
        DI:=GetScreenDrawInfo(scr);

        CG:=NIL;
        CG:=CreateContext(^CG);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,113,160,12,"_Preferences",^tattr,1,
                PLACETEXT_IN,VI,NIL);
        GadgetPrefs:=CreateGadgetA(BUTTON_KIND,CG,^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(226,113,80,12,"Cancel",^tattr,2,
                PLACETEXT_IN,VI,NIL);
        GadgetCancel:=CreateGadgetA(BUTTON_KIND,GadgetPrefs,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(316,113,70,12,"Quit",^tattr,3,
                PLACETEXT_IN,VI,NIL);
        GadgetEnd:=CreateGadgetA(BUTTON_KIND,GadgetCancel,^NewGadgetFields,NIL);

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Project",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"Preferences...",NIL,0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Quit","Q",0,0,NIL);
        NewMenuFields[4].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        DidIt:=LayoutMenusA(MenuFields,VI,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(WA_Top,10);
        TagsCHANGES[2]:=TagItem(WA_Left,20);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,130);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,400);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:="XTrash 1.01";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or
                IDCMP_GADGETUP or IDCMP_VANILLAKEY or IDCMP_MENUPICK);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9]:=TagItem(WA_Gadgets,long(CG));
        TagsCHANGES[10].ti_Tag:=TAG_END;
        winAbout:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl winAbout^.userport^.mp_SigBit;
        dummy:=SetFont(winAbout^.RPort,tfont);

        DidIt:=SetMenuStrip(winAbout,MenuFields);
        GT_RefreshWindow(winAbout,NIL);

        SetAPen(winAbout^.rport,DI^.dri_Pens^[SHADOWPEN]);
        RectFill(winAbout^.rport,0,2,63,12);
        SetAPen(winAbout^.rport,DI^.dri_Pens^[HIGHLIGHTTEXTPEN]);
        SetDrMd(winAbout^.rport,JAM1);
        Move(winAbout^.rport,52,10); dummy:=_Text(winAbout^.rport,"X",1);
        SetAPen(winAbout^.rport,DI^.dri_Pens^[TEXTPEN]);
        Move(winAbout^.rport,67,10); dummy:=_Text(winAbout^.rport,"Trash 1.01",10);
        Move(winAbout^.rport,67,22); dummy:=_Text(winAbout^.rport,"©/Program 1992 SP/PeekerBits",28);
        Move(winAbout^.rport,67,34); dummy:=_Text(winAbout^.rport,"Author:",7);
        Move(winAbout^.rport,67,43); dummy:=_Text(winAbout^.rport,"Stefan Plöchinger",17);
        Move(winAbout^.rport,67,52); dummy:=_Text(winAbout^.rport,"Kleiststraße 27",15);
        Move(winAbout^.rport,35,61); dummy:=_Text(winAbout^.rport,"DW- 8012 Ottobrunn",18);
        Move(winAbout^.rport,67,73); dummy:=_Text(winAbout^.rport,"programmed in KICKPascal (MAXON GmbH)",37);
        Move(winAbout^.rport,67,78); Draw(winAbout^.rport,167,78);
        Move(winAbout^.rport,67,88); dummy:=_Text(winAbout^.rport,"XTrash 1.01 is FreeWare. All rights",35);
        Move(winAbout^.rport,67,97); dummy:=_Text(winAbout^.rport,"reserved. XSearch may only be distri-",37);
        Move(winAbout^.rport,67,106); dummy:=_Text(winAbout^.rport,"buted for non-commercial purposes.",34);

        ApplicationWindow:=AddAppWindowA(1,0,winAbout,ApplicationPort,NIL);

        BACK:
        MyEndExit:=-1;

        repeat
                amsg:=GT_GetIMsg(winAbout^.userport);
                GT_ReplyIMsg(amsg);
                if amsg=NIL then begin
                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                        if ApplicationMessage<>NIL then
                                SIGNALS:=AppBit
                        else begin
                                SIGNALS:=_wait(AppBit or winBit);
                                if SIGNALS=winBit then begin
                                        amsg:=GT_GetIMsg(winAbout^.userport);
                                        GT_ReplyIMsg(amsg)
                                end else begin
                                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                                        if ApplicationMessage=NIL then SIGNALS:=0
                                end
                        end
                end else
                        SIGNALS:=winBit;
                if SIGNALS=winBit then begin
                        case amsg^.class of
                                IDCMP_CLOSEWINDOW: MyEndExit:=0
                                IDCMP_VANILLAKEY: begin
                                        if amsg^.code>96 then amsg^.code:=amsg^.code-32;
                                        case amsg^.code of
                                                13:     MyEndExit:=0
                                                27:     MyEndExit:=0
                                                69:     begin
                                                        WaitPointer(winAbout);
                                                        GetRidOfForAboutXTrash(winAbout);
                                                        PreferencesXTrash;
                                                        GetBackForAboutXTrash(winAbout,CG);
                                                        NormalPointer(winAbout);
                                                end
                                                else
                                        end
                                end
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=amsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                1:      begin
                                                        WaitPointer(winAbout);
                                                        GetRidOfForAboutXTrash(winAbout);
                                                        PreferencesXTrash;
                                                        GetBackForAboutXTrash(winAbout,CG);
                                                        NormalPointer(winAbout);
                                                end
                                                2:      MyEndExit:=0
                                                3:      begin
                                                        MyEndExit:=0;
                                                        EndExit:=0
                                                end
                                                else
                                        end
                                end
                                IDCMP_MENUPICK: begin
                                        ChosenMenu:=amsg^.code;
                                        while NOT ((ChosenMenu=MENUNULL) or (ChosenMenu=$F8)) do begin
                                                case ChosenMenu and $1f of
                                                        0:      begin
                                                                case (ChosenMenu and $7e0) div 32 of
                                                                        0:      begin
                                                                                WaitPointer(winAbout);
                                                                                GetRidOfForAboutXTrash(winAbout);
                                                                                PreferencesXTrash;
                                                                                GetBackForAboutXTrash(winAbout,CG);
                                                                                NormalPointer(winAbout);
                                                                        end
                                                                        1:      begin
                                                                                MyEndExit:=0;
                                                                                EndExit:=0
                                                                        end
                                                                        else
                                                                end
                                                        end
                                                        else
                                                end;
                                                NItem:=ItemAddress(MenuFields,ChosenMenu);
                                                ChosenMenu:=NItem^.nextselect;
                                        end
                                end
                                else
                        end
                end;
                if SIGNALS=AppBit then begin
                        if ApplicationMessage=NIL then goto BACK;
                        if (ApplicationMessage^.am_Type=MTYPE_APPICON) or (ApplicationMessage^.am_Type=MTYPE_APPWINDOW) then begin
                                if ApplicationMessage^.am_NumArgs=0 then
                                        WindowToFront(winAbout)
                                else for i:=0 to ApplicationMessage^.am_NumArgs-1 do
                                        AddInList(ApplicationMessage^.am_ArgList^[i].wa_Lock,ApplicationMessage^.am_ArgList^[i].wa_Name,NIL);
                                if (FileNum<>0) or (DirNum<>0) or (TrashNum<>0) or (DiskNum<>0) then begin MyEndExit:=0; EndExit:=1 end
                        end;
                        ReplyMsg(p_Message(ApplicationMessage));
                end
        until MyEndExit<>-1;

        ClearMenuStrip(winAbout);
        CloseWindow(winAbout);
        FreeMenus(MenuFields);
        FreeGadgets(CG);
        DidIt:=RemoveAppWindow(ApplicationWindow);
        FreeScreenDrawInfo(scr,DI);
        FreeVisualInfo(VI);
        UnLockPubScreen(NIL,scr);
END;


FUNCTION UpperString(upstr:str):DirNameString;
VAR     i       :                               integer;
        VariableString:                         FileString;
BEGIN
        VariableString:=upstr;
        for i:=1 to length(VariableString) do
                VariableString[i]:=upcase(VariableString[i]);
        UpperString:=VariableString
END;

FUNCTION GetOptions:Boolean;
LABEL   RealTschuess,Tschuessle;
VAR     MyArguments:                            str;
        TopArgs :                               p_RDArgs;
        DidIt   :                               Boolean;
        Chop    :                               FileString;
        ProgramDOB:                             p_DiskObject;
        MyStartup:                              p_WBStartup;
BEGIN
        TheDirectory:="";
        TheConfiguration:="";
        GetOptions:=TRUE;

        if FromWB then begin
                MyStartup:=StartupMessage;
                if MyStartup^.sm_NumArgs>0 then begin
                        if NameFromLock(MyStartup^.sm_ArgList^[0].wa_Lock,VariableString,256)=0 then goto Tschuessle;
                        TheDirectory:=VariableString;
                        if AddPart(VariableString,MyStartup^.sm_ArgList^[0].wa_Name,364)=FALSE then goto Tschuessle;
                        ProgramDOB:=GetDiskObjectNew(VariableString);
                        if IOErr=ERROR_OBJECT_NOT_FOUND then goto RealTschuess;
                        if ProgramDOB=NIL then goto Tschuessle;
                        TheConfiguration:=FindToolType(ProgramDOB^.do_ToolTypes,"CONFIG");
                        FreeDiskObject(ProgramDOB)
                end
        end else begin
                if GetCurrentDirName(TheDirectory,256)=FALSE then TheDirectory:="";
                MyArguments:="";
                TopArgs:=ReadArgs(MyTemplate,^MyArguments,NIL);
                if TopArgs=NIL then begin
                        DidIt:=PrintFault(ERROR_BAD_TEMPLATE,"XTrash 1.01");
                        GetOptions:=FALSE;
                        goto RealTschuess
                end;
                TheConfiguration:=MyArguments;
                FreeArgs(TopArgs);
                if TheConfiguration="" then begin
                        if GetProgramName(VariableString,364)=FALSE then goto RealTschuess;
                        ProgramDOB:=GetDiskObjectNew(VariableString);
                        if IOErr=ERROR_OBJECT_NOT_FOUND then goto RealTschuess;
                        if ProgramDOB=NIL then goto Tschuessle;
                        TheConfiguration:=FindToolType(ProgramDOB^.do_ToolTypes,"CONFIG");
                        FreeDiskObject(ProgramDOB)
                end
        end;
        goto RealTschuess;

        Tschuessle:
        GiveError("XTrash 1.01 - Read parameters","Error while parsing.",NIL);

        RealTschuess:
        If TheDirectory="" then GiveError("XTrash 1.01 - Initialisation","The current directory couldn't"+LF+"be identified.",NIL);
        VariableString:=UpperString(TheConfiguration);
        if (TheConfiguration="") or (VariableString="STD") then TheConfiguration:="ENVARC:XTrash.Config"
END;


BEGIN
        OpenLib(IntuitionBase,"intuition.library",36);
        OpenLib(SysBase,"exec.library",36);
        OpenLib(WorkbenchBase,"workbench.library",36);
        OpenLib(GfxBase,"graphics.library",36);
        OpenLib(DiskfontBase,"diskfont.library",36);
        OpenLib(GadtoolsBase,"gadtools.library",36);
        OpenLib(DosBase,"dos.library",36);
        OpenLib(IconBase,"icon.library",36);
        OpenLib(AslBase,"asl.library",36);
        DB:=DosBase;

        if ParameterStr="?" then begin
                write("CONFIG: ");
                readln(VariableString);
                if SetArgStr(VariableString)=FALSE then begin writeln("XTrash 1.01: Error while parsing."); EXIT end
        end;
        if GetOptions=FALSE then EXIT;

        InitWaitPointer;
        tattr:=TextAttr("topaz.font",8,0,0);
        tfont:=OpenFont(^tattr);

        VariableString:=UpperString(TheConfiguration);
        if ReadXTrashPrefs(TheConfiguration,StartXTP)=FALSE then begin
                GiveError("XTrash 1.01 - Load preferences","Error while loading the configuartion.",NIL);
                StartXTP:=XTrashPreferences("","",-1,-1,TRUE,FALSE,"RAM:",FALSE,FALSE,"Empty","",'SYS:System/Format DRIVE \d NAME "\n" \o',-1)
        end;
        MyXTP:=StartXTP;

        if MyXTP.Trasher="" then MyXTP.Trasher:="RAM:";

        CurrentMethodTrash:=MyXTP.DeleteTrash; CurrentMethodFiles:=MyXTP.MoveFiles;
        CurrentDiskName:=MyXTP.DiskName; CurrentFormatOptions:=MyXTP.FormatOptions;

        new(FileList); new(DirList); new(TrashList); new(DiskList);
        InitList(FileList); InitList(DirList);
        InitList(TrashList); InitList(DiskList);
        FileNum:=0; DirNum:=0; TrashNum:=0; DiskNum:=0;

        ApplicationPort:=CreatePort("XTrash AppPort",0);
        AppBit:=long(1) shl ApplicationPort^.mp_SigBit;
        InitAppIcon;

        BACK:
        EndExit:=-1;

        repeat
                ApplicationMessage:=p_AppMessage(WaitPort(ApplicationPort));
                ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                if ApplicationMessage=NIL then goto BACK;
                if ApplicationMessage^.am_Type<>MTYPE_APPICON then begin ReplyMsg(p_Message(ApplicationMessage)); goto BACK end;
                if ApplicationMessage^.am_NumArgs=0 then begin
                        ReplyMsg(p_Message(ApplicationMessage));
                        AboutXTrash;
                end else begin
                        for i:=0 to ApplicationMessage^.am_NumArgs-1 do
                                AddInList(ApplicationMessage^.am_ArgList^[i].wa_Lock,ApplicationMessage^.am_ArgList^[i].wa_Name,NIL);
                        ReplyMsg(p_Message(ApplicationMessage));
                end;
                if (FileNum<>0) or (DirNum<>0) or (TrashNum<>0) or (DiskNum<>0) then EndExit:=1
        until EndExit<>-1;

        if EndExit=1 then begin BeforeXTrash; if EndExit<>0 then goto BACK end;

        DidIt:=RemoveAppIcon(ApplicationIcon);
        if diskIcon=FALSE then begin
                FreeVec(ImageDataNorm);
                FreeVec(ImageDataSel);
                dispose(ImagesObject)
        end else
                FreeDiskObject(ImagesObject);
        DeletePort(ApplicationPort);
        for opLayer:=1 to 4 do begin
                CASE opLayer of
                        1:      TrashNode:=p_PathNode(FileList^.lh_Head);
                        2:      TrashNode:=p_PathNode(DirList^.lh_Head);
                        3:      TrashNode:=p_PathNode(TrashList^.lh_Head);
                        4:      TrashNode:=p_PathNode(DiskList^.lh_Head);
                end;
                WHILE p_PathNode(TrashNode^.pn_Node.ln_Succ)<>NIL DO BEGIN
                        TrashNodeBack:=p_PathNode(TrashNode^.pn_Node.ln_Succ);
                        Remove(p_Node(^TrashNode^.pn_Node));
                        dispose(TrashNode);
                        TrashNode:=TrashNodeBack
                END
        END;
        dispose(FileList); dispose(DirList);
        dispose(TrashList); dispose(DiskList);
        FreeVec(InsidePointer);

        if (TheDirectory<>"") and (FromWB=FALSE) then begin
                MyLock:=Lock(TheDirectory,SHARED_LOCK);
                if MyLock<>0 then begin
                        LockBack:=CurrentDir(MyLock);
                        UnLock(MyLock)
                end
        end;
END.





