home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************/
- /* FileWindow2 A.Bjerin/B.Schied (FF336) */
- /* */
- /**********************************************************************/
-
- /*
- operation = FileWindow2(title, ext, x, y, my_screen, file);
- operation: USHORT operation;
- title : UBYTE title[ANY_LENGTH];
- ext : UBYTE ext[7];
- x, y : SHORT x, y;
- my_screen: struct Screen *my_screen;
- file : UBYTE file[TOTAL_LENGTH];
- */
-
- #include <proto/all.h>
- #include <string.h>
- #include <exec/types.h>
- #include <exec/nodes.h>
- #include <exec/lists.h>
- #include <exec/libraries.h>
- #include <exec/ports.h>
- #include <exec/interrupts.h>
- #include <exec/io.h>
- #include <exec/memory.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
-
- #define CLEAR 0
- #define TAKE 500 /* FileWindow2() return value */
- #define RENAME 600
- #define DELETE 700
- #define ABORT 900 /* FileWindow2() return value */
- #define PANIC 1000 /* FileWindow2() return value */
- /* The minimum size of the strings: */
- #define DRAWER_LENGTH 100 /* 100 characters including NULL */
- #define FILE_LENGTH 30 /* 30 characters including NULL */
- #define TOTAL_LENGTH 130 /* 130 characters including NULL */
-
- struct Window *file_window;
- struct IntuiMessage *my_gadget_message;
- struct FileInfoBlock *file_info;
- BPTR lock;
-
- USHORT FileWindow2(STRPTR,STRPTR,int,int,struct Screen *,STRPTR);
- USHORT clear_gadgets(STRPTR);
- STRPTR right_pos(STRPTR, char);
- APTR save_file_info(struct FileInfoBlock *);
- BOOL file_comp(struct file_info *, struct file_info *);
- BOOL directory(struct FileInfoBlock *);
- BOOL pick_file(int), new_drawer(void), last_check(STRPTR);
- void put_in(struct file_info *, struct file_info *);
- void change_device(STRPTR), parent(void);
- void request_ok(STRPTR), request_ask(STRPTR);
- void display_list(int), adjust_string_gadgets(void);
- void connect_dir_file(STRPTR), delete_file_dir(STRPTR);
- void rename_file_dir(STRPTR), deallocate_file_info(void);
- STRPTR right_pos(STRPTR, char);
- BPTR Lock(char *, long);
-
-
- BOOL file_lock, first_file, more_files;
- USHORT ren=0; /* Rename-Flag = 0,1,2,3 */
- USHORT gadget_flag=CLEAR; /* Gadget selected ? */
- STRPTR total_file_name1;
- UBYTE total_file[TOTAL_LENGTH], display_text[8][34];
- UBYTE file_name[FILE_LENGTH], extension_name[7];
- UBYTE name_backup[DRAWER_LENGTH]; /* UndoBuffer for string gadgets: */
- UBYTE drawer_name[DRAWER_LENGTH];
- UBYTE *errors[]=
- {
- " OKAY = delete dir ABORT = abort ", /* 0 */
- " OKAY = delete file ABORT = abort ", /* 1 */
- " 1.type new dir name 2.OKAY/ABORT ", /* 2 */
- " 1.type new file name 2.OKAY/ABORT ", /* 3 */
- "NOT enough memory available !", /* 4 */
- "File name is too long!", /* 5 */
- "Device NOT found!", /* 6 */
- "Directory NOT found!", /* 7 */
- "NO item has been selected!", /* 8 */
- "You can NOT delete a device!", /* 9 */
- "You can NOT rename a device!", /* 10 */
- "Could NOT delete this file!", /* 11 */
- "Could NOT delete this directory!", /* 12 */
- "Could NOT rename this file!", /* 13 */
- "Could NOT rename this directory!", /* 14 */
- "NOT a valid directory name!", /* 15 */
- "Drawer string is too long", /* 16 */
- "Directory name is too long!", /* 17 */
- "ERROR reading file/directory!", /* 18 */
- };
-
- /* We will allocate memory, using this structure, for every file/ */
- /* directory we find. They will be linked to each otherer, in such a */
- /* way that all directories will come first (sorted alphabetically), */
- /* and after them will the files come (also sorted alphabetically). */
- struct file_info
- {
- BYTE name[28]; /* Name of the file/directory, 27 chars */
- BOOL directory; /* If it is a directory. */
- struct file_info *next; /* Pointer to the next file_info structur */
- };
- struct file_info *first_pointer;
-
-
- /* The program will use a ROM-font, 80 characters wide (40 LOWRES). */
- /* This is to make sure that all the text will fit in nicely in the */
- /* window, even if the calling program is using another font. */
- struct TextAttr my_font=
- {
- "topaz.font", /* Font Name */
- TOPAZ_EIGHTY, /* Font Height */
- FS_NORMAL, /* Style */
- FPF_ROMFONT /* Preferences */
- };
-
- /*
- extern struct GfxBase *GfxBase=NULL;
- extern struct IntuitionBase *IntuitionBase;
- */
- /**/
- /* IntuiText structures for the requesters */
- /**/
- struct IntuiText text_request=
- {
- 3, 2, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- 15, 15, /* LewftEdge, TopEdge */
- &my_font, /* *ITextFont */
- NULL, /* *IText */
- NULL /* *NextText */
- };
-
- struct IntuiText ok_request=
- {
- 3, 2,
- JAM2,
- 6, 3,
- &my_font,
- " C O N T I N U E ",
- NULL
- };
-
- /**/
- SHORT points4[]= /* Values for a 4-letter box: */
- {
- 0, 0,
- 44, 0,
- 44, 14,
- 0, 14,
- 0, 0
- };
- SHORT points6[]= /* Values for a 6-letter box: */
- {
- 0, 0,
- 52, 0,
- 52,10,
- 0,10,
- 0, 0
- };
- SHORT points9b []= /* Values for a 9-letter box: */
- {
- 0, 0,
- 76, 0,
- 76, 11,
- 0, 11,
- 0, 0
- };
- SHORT points9[]= /* Values for a 9-letter box: */
- {
- 0, 0,
- 80, 0,
- 80, 15,
- 0, 15,
- 0, 0
- };
- struct Border border_text4= /* A border for a 4-letter box: */
- {
- 0, 0, /* LeftEdge, TopEdge */
- 1, 2, JAM1, /* FrontPen, BackPen, DrawMode */
- 5, /* Count */
- points4, /* *XY */
- NULL /* *NextBorder */
- };
- struct Border border_text6= /* A border for a 6-letter box: */
- {
- -2,-2,
- 1, 0, JAM2,
- 5,
- points6,
- NULL
- };
- struct Border border_text9b= /* An inner border for 9-letter box: */
- {
- 0, 0,
- 3, 0, JAM1,
- 5,
- points9b,
- NULL
- };
- struct Border border_text9= /* A outer border for a 9-letter box: */
- {
- -2, -2,
- 3, 0, JAM1,
- 5,
- points9,
- &border_text9b
- };
-
- /**/
- /* Information for the proportional gadget */
- /**/
- /*
- Since we are using the auto-knob we set GadgetRender to point to an
- Image. In this case we do not need to initialize the Image structure:
- */
- struct Image image_prop;
- struct PropInfo prop_info=
- {
- AUTOKNOB| /* We want to use the auto-knob. */
- FREEVERT, /* The knob should move vertically. */
- 0,0, /* HorizPot, VertPot: will be initialized later. */
- 0, /* HorizBody -"- */
- 0xFFFF, /* VertBody: No data to show, maximum. */
- 0,0,0,0,0,0 /* Intuition sets and maintains these variables. */
- };
-
- struct Gadget gadget_proportional=
- {
- NULL, /* *NextGadget */
- 290, 68, 21, 72, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY, /* Activation */
- PROPGADGET, /* GadgetType */
- (APTR) &image_prop, /* GadgetRender */
- NULL, /* SelectRender */
- NULL, /* *GadgetText */
- NULL, /* MutualExclude */
- (APTR) &prop_info, /* SpecialInfo */
- NULL, /* GadgetID */
- NULL /* UserData */
- };
-
- /**/
- /* Information for the string gadget "Drawer:" */
- /**/
- SHORT points28s[]= /* Values for a 28-letter string box: */
- {
- -7, -3,
- 200, -3,
- 200, 10,
- -7, 10,
- -7, -3,
- };
- struct Border border_text28s= /* Border for 28-letter string box: */
- {
- 0, 0, /* LeftEdge, TopEdge */
- 1, 2, JAM1, /* FrontPen, BackPen, DrawMode */
- 5, /* Count */
- points28s, /* *XY */
- NULL /* *NextBorder */
- };
-
-
- struct IntuiText text_drawer=
- {
- 1, 2, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- -67, 0, /* LewftEdge, TopEdge */
- &my_font, /* *ITextFont */
- "Drawer:", /* *IText */
- NULL /* *NextText */
- };
-
- struct StringInfo string_drawer=
- {
- drawer_name, /* *Buffer */
- name_backup, /* *UndoBuffer */
- 0, /* BufferPos */
- 70, /* MaxChars (Including NULL) */
- 0, /* DispPos */
- 0, /* UndoPos */
- 0, 0, /* CLeft, CTop */
- NULL, /* *LayerPtr */
- NULL, /* LongInt */
- NULL, /* *AltKeyMap */
- };
-
- struct Gadget gadget_drawer =
- {
- &gadget_proportional, /* *NextGadget */
- 83, 53, 198, 8, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- STRGADGET, /* GadgetType */
- (APTR) &border_text28s, /* GadgetRender */
- NULL, /* SelectRender */
- &text_drawer, /* *GadgetText */
- NULL, /* MutualExclude */
- (APTR) &string_drawer, /* SpecialInfo */
- NULL, /* GadgetID */
- NULL /* UserData */
- };
-
- /**/
- /* Information for the string gadget "File:" */
- /**/
- SHORT points30s[]= /* Values for 30-letter string box: */
- {
- -7, -3,
- 244, -3,
- 244, 10,
- -7, 10,
- -7, -3
- };
- struct Border border_text30s= /* Border for 30-letter string box: */
- {
- 0, 0, /* LeftEdge, TopEdge */
- 1, 0, JAM1, /* FrontPen, BackPen, DrawMode */
- 5, /* Count */
- points30s, /* *XY */
- NULL /* *NextBorder */
- };
- struct IntuiText text_file=
- {
- 1, 0, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- -53, 0, /* LewftEdge, TopEdge */
- &my_font, /* *ITextFont */
- "File:", /* *IText */
- NULL /* *NextText */
- };
- struct StringInfo string_file=
- {
- file_name, /* *Buffer */
- name_backup, /* *UndoBuffer */
- 0, /* BufferPos */
- 40, /* MaxChars (Including NULL) */
- 0, /* DispPos */
- 0, /* UndoPos */
- 0, 0, /* CLeft, CTop */
- NULL, /* *LayerPtr */
- NULL, /* LongInt */
- NULL, /* *AltKeyMap */
- };
- struct Gadget gadget_file=
- {
- &gadget_drawer, /* *NextGadget */
- 66, 147, 240, 7, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- STRGADGET, /* GadgetType */
- (APTR) &border_text30s, /* GadgetRender */
- NULL, /* SelectRender */
- &text_file, /* *GadgetText */
- NULL, /* MutualExclude */
- (APTR) &string_file, /* SpecialInfo */
- NULL, /* GadgetID */
- NULL /* UserData */
- };
-
- /**/
- /* * Information for the string gadget "Extension" * */
- /**/
- SHORT points6s[]= /* Values for a 6-letter string box: */
- {
- -7, -3,
- 57, -3,
- 57, 10,
- -7, 10,
- -7, -3
- };
- struct Border border_text6s= /* Border for 6-letter string box: */
- {
- 0, 0, /* LeftEdge, TopEdge */
- 1, 2, JAM1, /* FrontPen, BackPen, DrawMode */
- 5, /* Count */
- points6s, /* *XY */
- NULL /* *NextBorder */
- };
- struct IntuiText text_extension=
- {
- 1, 2, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- -43, 0, /* LewftEdge, TopEdge */
- &my_font, /* *ITextFont */
- "Ext:", /* *IText */
- NULL /* *NextText */
- };
- struct StringInfo string_extension=
- {
- extension_name, /* *Buffer */
- name_backup, /* *UndoBuffer */
- 0, /* BufferPos */
- 7, /* MaxChars (Including NULL) */
- 0,0, /* DispPos, UndoPos */
- 0, 0, /* CLeft, CTop */
- NULL,NULL,NULL, /* *LayerPtr, LongInt, *AltKeyMap */
- };
- struct Gadget gadget_extension=
- {
- &gadget_file, /* *NextGadget */
- 253, 35, 59, 8, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- STRGADGET, /* GadgetType */
- (APTR) &border_text6s, /* GadgetRender */
- NULL, /* SelectRender */
- &text_extension, /* *GadgetText */
- NULL, /* MutualExclude */
- (APTR) &string_extension, /* SpecialInfo */
- NULL, /* GadgetID */
- NULL /* UserData */
- };
-
- /**/
- /* Information for the boolean gadget parent "<" */
- /**/
- SHORT points1[]= /* Values for a 1-letter box: */
- {
- 0, 0,
- 20, 0,
- 20, 15,
- 0, 15,
- 0, 0
- };
- struct Border border_text1= /* A border for a 1-letter box: */
- {
- 0, 0, /* LeftEdge, TopEdge */
- 1, 2, JAM1, /* FrontPen, BackPen, DrawMode */
- 5, /* Count */
- points1, /* *XY */
- NULL /* *NextBorder */
- };
- struct IntuiText text_parent=
- {
- 1, 2, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- 7,4, /* LeftEdge, TopEdge */
- &my_font, /* *ITextFont, (Topaz, 80) */
- "<", /* *IText */
- NULL /* *NextText */
- };
- struct Gadget gadget_parent=
- {
- &gadget_extension, /* *NextGadget */
- 290, 49, 21, 16, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- BOOLGADGET, /* GadgetType */
- (APTR) &border_text1, /* GadgetRender */
- NULL, /* SelectRender */
- &text_parent, /* *GadgetText */
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "df1:" */
- /**/
- struct IntuiText text_df1=
- {
- 1, 2,
- JAM1,
- 7,4,
- &my_font,
- "df1:",
- NULL
- };
- struct Gadget gadget_df1=
- {
- &gadget_parent,
- 110, 13, 45, 15,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text4,
- NULL,
- &text_df1,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "df0:" */
- /**/
- struct IntuiText text_df0=
- {
- 1, 2, /* FrontPen, BackPen */
- JAM1, /* DrawMode */
- 7,4, /* LeftEdge, TopEdge */
- &my_font, /* *ITextFont, (Topaz, 80) */
- "df0:", /* *IText */
- NULL /* *NextText */
- };
- struct Gadget gadget_df0=
- {
- &gadget_df1, /* *NextGadget */
- 59, 13, 45, 15, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- BOOLGADGET, /* GadgetType */
- (APTR) &border_text4, /* GadgetRender */
- NULL, /* SelectRender */
- &text_df0, /* *GadgetText */
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "ram:" */
- /**/
- struct IntuiText text_ram=
- {
- 1, 2,
- JAM1,
- 7,4,
- &my_font,
- "ram:",
- NULL
- };
- struct Gadget gadget_ram=
- {
- &gadget_df0,
- 8, 13, 45, 15,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text4,
- NULL,
- &text_ram,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "dh2:" */
- /**/
- struct IntuiText text_dh2=
- {
- 1, 2,
- JAM1,
- 7,4,
- &my_font,
- "dh2:",
- NULL
- };
- struct Gadget gadget_dh2=
- {
- &gadget_ram,
- 110, 31, 45, 15,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text4,
- NULL,
- &text_dh2,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "dh1:" */
- /**/
- struct IntuiText text_dh1=
- {
- 1, 2,
- JAM1,
- 7,4,
- &my_font,
- "dh1:",
- NULL
- };
- struct Gadget gadget_dh1=
- {
- &gadget_dh2,
- 59, 31, 45, 15,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text4,
- NULL,
- &text_dh1,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "dh0:" */
- /**/
- struct IntuiText text_dh0=
- {
- 1, 2,
- JAM1,
- 7,4,
- &my_font,
- "dh0:",
- NULL
- };
- struct Gadget gadget_dh0=
- {
- &gadget_dh1,
- 8, 31, 45, 15,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text4,
- NULL,
- &text_dh0,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "ABORT" */
- /**/
- struct IntuiText text_abort=
- {
- 1, 2,
- INVERSVID,
- 3,2,
- &my_font,
- "- ABORT -",
- NULL
- };
- struct Gadget gadget_abort=
- {
- &gadget_dh0,
- 95, 162, 77, 12,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text9b,
- NULL,
- &text_abort,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "DELETE" */
- /**/
- struct IntuiText text_delete=
- {
- 1, 0,
- JAM2,
- 0,0,
- &my_font,
- "DELETE",
- NULL
- };
- struct Gadget gadget_delete=
- {
- &gadget_abort,
- 196, 168, 49, 8,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text6,
- NULL,
- &text_delete,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "RENAME" */
- /**/
- struct IntuiText text_rename=
- {
- 1, 0,
- JAM2,
- 0,0,
- &my_font,
- "RENAME",
- NULL
- };
- struct Gadget gadget_rename=
- {
- &gadget_delete,
- 259, 168, 48, 8,
- GADGHCOMP,
- RELVERIFY,
- BOOLGADGET,
- (APTR) &border_text6,
- NULL,
- &text_rename,
- NULL, NULL, NULL, NULL
- };
-
- /**/
- /* Information for the boolean gadget "TAKE" */
- /**/
- struct IntuiText text_take=
- {
- 1, 2,
- INVERSVID,
- 3,2,
- &my_font,
- " O K A Y ",
- NULL
- };
- struct Gadget gadget_take=
- {
- &gadget_rename,
- 8, 162, 77, 12, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY, /* Activation */
- BOOLGADGET, /* GadgetType */
- (APTR) &border_text9, /* GadgetRender */
- NULL, /* SelectRender */
- &text_take, /* *GadgetText */
- NULL, NULL, NULL, NULL
- };
- /**/
- /* Information for the boolean gadgets "gadget_display" */
- /**/
- struct IntuiText text_list[8]=
- {
- {
- 1, 0, /* FrontPen, BackPen */
- JAM2, /* DrawMode */
- 0,18, /* LeftEdge, TopEdge */
- &my_font, /* *ITextFont */
- display_text[0], /* IText */
- &text_list[1] /* *NextText */
- },
- {
- 1, 0,
- JAM2,
- 0,26,
- &my_font,
- display_text[1],
- &text_list[2]
- },
- {
- 1, 0,
- JAM2,
- 0,34,
- &my_font,
- display_text[2],
- &text_list[3]
- },
- {
- 1, 0,
- JAM2,
- 0,42,
- &my_font,
- display_text[3],
- &text_list[4]
- },
- {
- 1, 0,
- JAM2,
- 0,50,
- &my_font,
- display_text[4],
- &text_list[5]
- },
- {
- 1, 0,
- JAM2,
- 0,58,
- &my_font,
- display_text[5],
- &text_list[6]
- },
- {
- 1, 0,
- JAM2,
- 0,66,
- &my_font,
- display_text[6],
- &text_list[7]
- },
- {
- 1, 0,
- JAM2,
- 0,74,
- &my_font,
- display_text[7],
- NULL
- }
- };
-
- struct Gadget gadget_display[8]=
- {
- {
- &gadget_display[1], /* *NextGadget */
- 8, 68, 276, 12, /* LeftEdge, TopEdge, Width, Height */
- GADGHCOMP, /* Flags */
- RELVERIFY|GADGIMMEDIATE, /* Activation */
- BOOLGADGET, /* GadgetType */
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[2],
- 8, 80, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[3],
- 8, 88, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[4],
- 8, 96, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[5],
- 8, 104, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[6],
- 8, 112, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_display[7],
- 8, 120, 276, 8,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- },
- {
- &gadget_take,
- 8, 128, 276, 12,
- GADGHCOMP,
- RELVERIFY|GADGIMMEDIATE,
- BOOLGADGET,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL
- }
- };
-
- /**/
- /* BIG BOX */
- /**/
- SHORT points_big_box[]=
- {
- 8, 68,
- 283, 68,
- 283,139,
- 8,139,
- 8, 68
- };
- struct Border border_big_box= /* Border for 1-letter box: */
- {
- 0, 0,
- 1, 2, JAM1,
- 5,
- points_big_box,
- NULL
- };
-
- /**/
- /* Information for the window */
- /**/
- struct NewWindow new_file_window=
- {
- 0,0, /* LeftEdge, TopEdge */
- 320, 180, /* Width, Height */
- 0,1, /* DetailPen, BlockPen */
- GADGETUP|VANILLAKEY| /* IDCMPFlags */
- GADGETDOWN|MOUSEMOVE,
- ACTIVATE|SMART_REFRESH| /* Flags */
- WINDOWDRAG,
- &gadget_display[0], /* *FirstGadget */
- NULL, NULL, /* *CheckMark, *Title */
- NULL, NULL, /* *Screen, *BitMap */
- 40,20,640,256, /* MinWidth, MinHeight, MaxWidth, MaxHeight */
- WBENCHSCREEN /* Type */
- };
-
- /**/
- USHORT FileWindow2(STRPTR title,STRPTR extension,int x,int y,struct Screen *screen,STRPTR total_file_name)
- {
- int temp1; /* Variable used for loops etc. */
- int file_count; /* Number of files/directories */
- ULONG class; /* Saved IntuiMessage: IDCMP flags. */
- USHORT code; /* key flags. */
- APTR address; /* Object-Address */
- int position; /* Number of first file in display */
- BOOL working; /* Wants the user to abort? */
- BOOL fix_display; /* Should we update the file-display? */
- STRPTR string_pointer; /* Pointer to a string. */
- struct file_info *pointer; /* Pointer to a file_info structure */
- struct RastPort *rp; /* Pointer to FileWindow2-rastport */
- USHORT operation=0; /* user action returned by FileWindow2 */
- file_lock =FALSE; /* No file/directory has been locked */
- more_files=FALSE; /* Do not list any files yet */
- prop_info.VertBody =0xFFFF; /* Make sure the proportional gadget */
- prop_info.HorizBody=0; /* is at the top, showing 100% */
- prop_info.VertPot =0;
- prop_info.HorizPot =0;
- new_file_window.LeftEdge=x;
- new_file_window.TopEdge =y;
- new_file_window.Title =title;
- strcpy(extension_name, extension);
- if(*extension_name != '\0') text_extension.FrontPen=3;
- else text_extension.FrontPen=1;
-
- if(screen) /* Does user want to use an own screen? */
- {
- new_file_window.Screen=screen;
- new_file_window.Type=CUSTOMSCREEN;
- }
-
- /* Library-Initialisierung */
- if(!GfxBase)
- {
- GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
- if(!GfxBase) return(PANIC);
- }
- if(!IntuitionBase)
- {
- IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
- if(!IntuitionBase) return(PANIC);
- }
- file_window=(struct Window *)OpenWindow(&new_file_window);
- if(file_window==NULL) return(PANIC);
- rp=file_window->RPort;
- /**/
- DrawBorder(rp, &border_big_box, 0, 0);
- if((file_info=(struct FileInfoBlock *)
- AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR))==NULL)
- { request_ok(errors[4]); return(PANIC); }
- if(*total_file_name != '\0')
- {
- if((lock=Lock(total_file_name, ACCESS_READ))==NULL)
- { /* PROBLEMS! File/directory/device did NOT exist! */ }
- else
- {
- file_lock=TRUE; /* Could lock the file/directory! */
- if((Examine(lock, file_info))==NULL) request_ok(errors[18]);
- else
- {
- if(directory(file_info)) /* It is a directory! */
- {
- *file_name='\0'; /* Clear file_name string. */
- strcpy(drawer_name, total_file_name);
- more_files=TRUE;
- }
- else /* It is a file! */
- {
- /* Separate the file name from the path: */
- if(string_pointer=right_pos(total_file_name, '/'))
- {
- /* Copy the file name into file_name string: */
- strcpy(file_name, string_pointer+1);
- *string_pointer='\0';
- }
- else
- {
- if(string_pointer=right_pos(total_file_name, ':'))
- {
- /* Copy the file name into file_name string: */
- strcpy(file_name, string_pointer+1);
- *(string_pointer+1)='\0';
- }
- else
- {
- strcpy(file_name, total_file_name);
- *drawer_name='\0';
- *total_file_name='\0';
- }
- }
- strcpy(drawer_name, total_file_name);
- /* Since it is a file, we will NOT look for more files: */
- /* However, more_files is already FALSE. */
- } /* Is it a directory? */
- } /* Could we examine the object? */
- } /* Could we "lock" the file/directory? */
- } /* Anything in the total_file_name string? */
-
- /* Since we have messed around with the string gadgets it is best */
- /* to adjust them so the user can see them clearly: */
- adjust_string_gadgets();
- new_drawer(); /* Start to show us the files */
- position=0; /* The display will show the first file. */
- fix_display=FALSE; /* We do not need to fix the display */
- first_file=TRUE; /* No files saved. */
- file_count=0; /* No files saved. */
- working=TRUE;
- do
- {
- /* If we have shown all files in the directory, we put our task */
- /* to sleep. That will speed up other programs, and we will not */
- /* use unnecessary processing time: */
- if(more_files==FALSE) Wait(1<<file_window->UserPort->mp_SigBit);
- /* Has something happened with the gadgets in the file_window? */
- while(my_gadget_message = (struct IntuiMessage *)
- GetMsg(file_window->UserPort))
- {
- /* As long as something is happening with the gadgets we will */
- /* stay in the while loop. This is very handy since we can */
- /* recieve hundereds of messages if the mouse is moving, and */
- /* we only want to update the display when the mouse has stopped: */
- class = my_gadget_message->Class;
- code = my_gadget_message->Code;
- address = my_gadget_message->IAddress;
-
- /* We have now saved some important values, and can now reply: */
- ReplyMsg((struct Message *)my_gadget_message);
- if(code==13||code==27) class=GADGETUP;
- /* RETURN key used instead of TAKE */
- /* ESC key used instead of ABORT */
- switch(class)
- {
- case MOUSEMOVE:
- /* The proportional gadget is selected, and the mouse is */
- /* moving; we must update the file_display when the mouse */
- /* has stopped: */
- fix_display=TRUE; break;
-
- case GADGETDOWN:
- /* A gadget has been pressed down. Which one? */
- /* DISPLAY */
- /* Is the user clicking inside the file display? */
- for(temp1=0; temp1<8; temp1++)
- {
- if(address == (APTR)&gadget_display[temp1])
- { pick_file(temp1+position); } /* File/dir selected */
- }
- break;
-
- case GADGETUP: /* Which gadget has been selected ? */
- /* TAKE */
- if(address == (APTR)&gadget_take || code==13)
- {
- if(operation==DELETE||operation==RENAME) gadget_flag=TAKE;
- else
- {
- if(last_check(total_file_name))
- { working=FALSE; operation=TAKE; break; }
- }
- }
-
- /* ABORT */
- if(address==(APTR)&gadget_abort||operation==ABORT||code==27)
- {
- if(operation==DELETE||operation==RENAME) gadget_flag=ABORT;
- else
- {
- connect_dir_file(total_file_name);
- clear_gadgets(title); operation=ABORT;
- working=FALSE; break;
- }
- }
-
- /* DELETE */
- if(address==(APTR)&gadget_delete || operation==DELETE)
- {
- if(!(gadget_flag==ABORT||gadget_flag==TAKE))
- {
- delete_file_dir(total_file_name);
- operation=DELETE;
- }
- if(gadget_flag==TAKE)
- {
- delete_file_dir(total_file_name);
- operation=clear_gadgets(title); break;
- }
- if(gadget_flag==ABORT)
- { operation=clear_gadgets(title); break; }
- }
-
- /* RENAME */
- if(address==(APTR)&gadget_rename||operation==RENAME)
- {
- if(ren==1)
- {
- if(gadget_flag==ABORT)
- { operation=clear_gadgets(title); break; }
-
- else ren=2;
- }
- if(ren==0) { operation=RENAME; ren=1; }
- rename_file_dir(total_file_name);
-
- if(ren==2) { operation=clear_gadgets(title); break; }
- }
-
- if(address == (APTR)&gadget_ram) /* ram: */
- { change_device("ram:"); break; }
- if(address == (APTR)&gadget_df0) /* df0: */
- { change_device("df0:"); break; }
- if(address == (APTR)&gadget_df1) /* df1: */
- { change_device("df1:"); break; }
- if(address == (APTR)&gadget_dh0) /* dh0: */
- { change_device("dh0:"); break; }
- if(address == (APTR)&gadget_dh1) /* dh1: */
- { change_device("dh1:"); break; }
- if(address == (APTR)&gadget_dh2) /* dh2: */
- { change_device("dh2:"); break; }
-
- /* DRAWER: */
- if(address == (APTR)&gadget_drawer)
- {
- /* The user has entered something new in the drawer: */
- new_drawer(); break;
- }
-
- /* EXTENSION: */
- if(address == (APTR)&gadget_extension)
- {
- new_drawer(); break;
- }
-
- /* PARENT: "<" */
- if(address == (APTR)&gadget_parent) { parent(); break; }
-
- /* PROPORTIONAL */
- if(address == (APTR)&gadget_proportional)
- {
- /* User has released the prop-gadget, update display: */
- fix_display=TRUE; break;
- }
- }
- }
- if(fix_display) /* Do we need to update the file display? */
- {
- fix_display=FALSE;
- if(file_count>8) /* Which file should be shown */
- position=(int) prop_info.VertPot/(float)0xFFFF*(file_count-8);
- else position=0;
- display_list(position); /* List files: (Starts with position) */
- }
- if(more_files) /* Are there more files/dirs? */
- {
- if(ExNext(lock, file_info))
- {
- /* List the file/directory if it is: */
- /* 1. A file which has the right extension. */
- /* 2. A directory. */
- if(stricmp(extension_name, (file_info->fib_FileName+
- strlen(file_info->fib_FileName)-strlen(extension_name)))==0 ||
- directory(file_info) )
- {
- if(first_file) /* Is this the first file/directory? */
- {
- /* first_pointer will point at the first file in our list: */
- first_pointer=(struct file_info *) save_file_info(file_info);
- if(first_pointer != NULL)
- {
- /* No more elements (for the moment) in the list: */
- first_pointer->next=NULL;
- first_file=FALSE;
- }
- file_count=1; position=1;
- }
- else
- {
- /* save_file_info will return a pointer to the allocated */
- /* structure: */
- pointer=(struct file_info *) save_file_info(file_info);
-
- /* If we have been able to allocate space for the file we */
- /* put it into our list: */
- if(pointer!=NULL) /* Put new structure into list: */
- {
- put_in(first_pointer, pointer);
- file_count++;
- }
- }
- /* If there are more than eight files/directories we modify */
- /* the proportional gadget: */
- if(file_count > 8)
- {
- ModifyProp
- (
- &gadget_proportional, /* PropGadget */
- file_window, /* Pointer */
- NULL, /* Requester */
- prop_info.Flags, /* Flags */
- 0, /* HorizPot */
- prop_info.VertPot, /* VertPot */
- 0, /* HorizBody */
- (ULONG) 0xFFFF*8/file_count /* VerBody */
- );
- position=(int) prop_info.VertPot/(float) 0xFFFF*(file_count-8);
- }
- else
- position=0;
- display_list(position); /* List all the files: */
- }
- }
- else /* ExNext() failed: */
- {
- more_files=FALSE; /* Don't list any more files */
- /* Check what went wrong: */
- /* If error message is NOT "ERROR_NO_MORE_ENTRIES" something */
- /* went terrible wrong while reading: */
- if(IoErr() != ERROR_NO_MORE_ENTRIES) request_ok(errors[18]);
- }
- }
- } while(working); /* Clean up and leave: */
- /* This will clear the IDCMP port: */
- while( (my_gadget_message = (struct IntuiMessage *)
- GetMsg(file_window->UserPort)) )
- {
- ReplyMsg((struct Message *)my_gadget_message);
- }
- /* Deallocate the memory we have dynamically allocated: */
- deallocate_file_info();
- if(file_lock) /* If we have "locked" a file/dir, "unlock" it: */
- {
- UnLock(lock); file_lock=FALSE;
- }
- if(file_info) FreeMem(file_info, sizeof(struct FileInfoBlock));
- /* If we have successfully opened the file_window, we close it: */
- if(file_window)
- {
- if(GfxBase) CloseLibrary((struct Library *) GfxBase);
- if(IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
- CloseWindow(file_window);
- }
- return(operation);
- }
-
- /**/
- void deallocate_file_info(void)
- {
- struct file_info *pointer, *temp_pointer;
-
- /* Does the first pointer point to an allocated structure? */
- if(first_pointer)
- {
- /* Save the address of the next structure: */
- pointer=first_pointer->next;
-
- /* Deallocate the first structure: */
- FreeMem( first_pointer, sizeof(struct file_info));
-
- /* As long as pointer points to an allocated structure: */
- while(pointer)
- {
- /* Save the address of the next structure: */
- temp_pointer=pointer->next;
-
- FreeMem( pointer, sizeof(struct file_info));
- pointer=temp_pointer;
- }
- }
- first_pointer=NULL; /* Clear first_pointer: */
-
- /* Next time we try to list the files, we start with the first_file: */
- first_file=TRUE;
- }
-
- /**/
- /* Allocate memory for the new file/directory, and fills the structure */
- /* with information. (name of the object, and if it is a directory.) */
- /* Returns a memory pointer to the allocated structure, or NULL. */
- APTR save_file_info(struct FileInfoBlock *info)
- {
- struct file_info *pointer;
-
- if((pointer=(struct file_info *)
- AllocMem(sizeof(struct file_info), MEMF_PUBLIC|MEMF_CLEAR))==NULL)
- {
- request_ok(errors[4]);
- more_files=FALSE; /* Do not list any more files/dirs */
- return(NULL);
- }
- else
- {
- /* If file/dirname is not too long, we copy it into new stucture: */
- if(strlen(info->fib_FileName) < 28)
- strcpy(pointer->name, info->fib_FileName);
- else
- {
- /* The file/directory name is too long! */
- if( directory(info)) request_ok(errors[17]); /* It's a dir */
- else request_ok(errors[5]); /* It's a file */
- FreeMem( pointer, sizeof(struct file_info));
- return(NULL);
- }
- if( directory(info)) /* Is it a file or a directory? */
- pointer->directory=TRUE; /* It is a directory. */
- else
- pointer->directory=FALSE; /* It is a file. */
- }
- return( (APTR) pointer);
- }
-
- /**/
- /* Will check a FileInfoBlock if it is a file or a directory. */
- /* Return TRUE if it is a directory, FALSE if it is a file. */
- BOOL directory(struct FileInfoBlock *info)
- {
- if(info->fib_DirEntryType<0) return(FALSE);
- else return(TRUE);
- }
-
- /**/
- /* Put the new structure into the dynamically allocated list at the */
- /* right place (sorted alphabetically, directories first): */
- void put_in(struct file_info *a_pointer, struct file_info *pointer)
- {
- struct file_info *old_pointer=NULL;
-
- /* Move slowly down the list and try to fit in the structure: */
- while(a_pointer && file_comp(a_pointer, pointer)) /* ->name */
- {
- old_pointer=a_pointer; a_pointer=a_pointer->next;
- }
- if(a_pointer)
- {
- if(old_pointer)
- {
- /* Put the structure into the list: */
- pointer->next=old_pointer->next; old_pointer->next=pointer;
- }
- else
- {
- pointer->next=first_pointer; first_pointer=pointer;
- }
- }
- else
- {
- /* Last int the list: */
- old_pointer->next=pointer; pointer->next=NULL;
- }
- }
-
- /**/
- /* This function will return TRUE if the first pointer (a_pointer) */
- /* points to a file structure which should come before the second */
- /* pointers file structure. */
- /* ORDER: 1. DIRECTORIES sorted alphabetically. */
- /* 2. FILES sorted alphabetically. */
-
- BOOL file_comp(struct file_info *a_pointer, struct file_info *pointer)
- {
- if(a_pointer->directory == FALSE && pointer->directory)
- return(FALSE);
-
- if(a_pointer->directory == pointer->directory)
- {
- if(stricmp(a_pointer->name, pointer->name) <= 0 ) return(TRUE);
- else return(FALSE);
- }
- return(TRUE);
- }
-
- /**/
- /* Give this function a string and a character, and it will return a */
- /* pointer to the right most occurance character in you string which */
- /* match your character. */
- STRPTR right_pos(STRPTR string, char sign)
- {
- STRPTR start_pos;
-
- start_pos=string;
- while(*string != '\0') string++;
- /* Start to go backwards and check teh string: */
- while(*string != sign && string > start_pos) string--;
- if(*string==sign)
- return(string); /* We have found a matching character. */
- return(NULL); /* We could not find a matching character. */
- }
-
- /**/
- /* This function will change to a new device, for example df0:. */
- /* Does not return anything. */
- void change_device(STRPTR device)
- {
- strcpy(drawer_name, device); /* Change the drawer string. */
- adjust_string_gadgets(); /* Adjust the string gadgets. */
- new_drawer(); /* Showing the new files/directories */
- }
-
- /**/
- /* When the user or the program has changet the drawer string, this */
- /* function is called, and will do what is necessary to start to collect */
- /* the new files/directories from the disk. */
- /* Returns TRUE if everything is OK, and FALSE if something went wrong */
- BOOL new_drawer(void)
- {
- STRPTR string_pointer;
-
- if(file_lock) { UnLock(lock); file_lock=FALSE; }
- deallocate_file_info();
-
- ModifyProp
- (
- &gadget_proportional, /* PropGadget */
- file_window, /* Pointer */
- NULL, /* Requester */
- prop_info.Flags, /* Flags */
- 0, /* HorizPot */
- 0, /* VertPot */
- 0, /* HorizBody */
- (ULONG) 0xFFFF /* VerBody */
- );
- display_list(0); /* Clear the display: */
- more_files=FALSE;
- if((lock=Lock(drawer_name, ACCESS_READ))==NULL)
- {
- /* We could NOT lock the file/dir/device! Inform the user: */
- string_pointer=drawer_name+strlen(drawer_name)-1;
- if(*string_pointer==':') request_ok(errors[6]);
- else request_ok(errors[7]);
- return(FALSE); /* ERROR */
- }
- else
- {
- file_lock=TRUE; /* We "locked" the file/directory! */
- }
-
- /* Now try to get some information from the file/directory: */
- if((Examine(lock, file_info))==NULL)
- { request_ok(errors[18]); return(FALSE); }
-
- if(directory(file_info)) /* Is it a directory or a file? */
- {
- /* It is a directory: We will look for more files: */
- more_files=TRUE;
- }
- else { request_ok(errors[15]); return(FALSE); } /* It's a file! */
- return(TRUE);
- }
- /**/
- /* The function parent() will try to go backwards one step in the */
- /* directory path. Does not return anything. */
- void parent(void)
- {
- STRPTR string_pointer;
-
- /* Separate the last directory from the path: */
- if(string_pointer=right_pos(drawer_name, '/'))
- {
- *string_pointer='\0'; /* Take away the last directory: */
- }
- else
- {
- if(string_pointer=right_pos(drawer_name, ':'))
- {
- /* Take away the last directory: */
- /* Only the device ("df0:" for example) left: */
- *(string_pointer+1)='\0';
- }
- else
- {
- *drawer_name='\0';
- }
- }
-
- adjust_string_gadgets();
- new_drawer(); /* Show user files etc in the new dir: */
- }
-
- /**/
- /* You give this function a pointer to an error string and it'll open */
- /* a simple requester displaying the message. Requester will go away */
- /* first when user has selected the button "OK". */
- void request_ok(STRPTR message)
- {
- text_request.IText=message;
- AutoRequest
- (
- file_window, /* Window */
- &text_request, /* BodyText */
- NULL, /* PositiveText nothing */
- &ok_request, /* NegativeText OK */
- NULL, NULL, /* PositiveFlags, NegativeFlags */
- 320, 65 /* Width, Height*/
- );
- gadget_flag=ABORT;
- }
-
- /**/
- /* This function will give user advices on the drag bar how to go on */
- void request_ask(STRPTR message)
- {
- SetAPen(file_window->RPort,2); SetBPen(file_window->RPort,3);
- SetDrMd(file_window->RPort,JAM2); Move(file_window->RPort,6,7);
- Text(file_window->RPort, message, strlen(message));
- OffGadget(&gadget_rename, file_window, NULL);
- OffGadget(&gadget_delete, file_window, NULL);
- }
- /**/
- /* This function displays files etc which are inside the dir, starting */
- /* with the file number start_pos. Does not return anything. */
- void display_list(int start_pos)
- {
- struct file_info *pointer;
- int pos, temp1;
- /* 123456789012345678901234567890123 */
- char empty_name[]=" ";
- STRPTR string_pointer;
- BOOL clear;
-
- pos=0;
- if(first_pointer) /* Does it exist any files at all? */
- {
- pointer=first_pointer;
-
- /* Go through the list until you have found the file/directory */
- /* which should be shown first: */
- while(pointer && pos < start_pos)
- {
- pos++;
- pointer=pointer->next;
- }
- pos=0;
- while(pointer && pos<8) /* Try to show the eight files: */
- {
- strcpy(display_text[pos], pointer->name);
- clear=FALSE; temp1=0;
- string_pointer=display_text[pos];
- if(pointer->directory) /* It is a directory: */
- {
- text_list[pos].FrontPen=3; /* Highlight it. */
-
- /* Clear everything after the name, and add string "(Dir)" */
- while(temp1 < 28)
- {
- if(*string_pointer=='\0') clear=TRUE;
- if(clear) *string_pointer=' ';
- string_pointer++; temp1++;
- }
- *string_pointer='\0'; strcat(display_text[pos], "(Dir)");
- }
- else text_list[pos].FrontPen=1; /* It is a file: */
- {
-
- /* Clear everything after the name: */
- while(temp1 < 33)
- {
- if(*string_pointer=='\0') clear=TRUE;
- if(clear) *string_pointer=' ';
- string_pointer++; temp1++;
- }
- *string_pointer='\0';
- }
- pos++; pointer=pointer->next; /* Next. */
- }
- }
-
- /* If there are less than 8 files, show clear rest of the display: */
- while(pos < 8)
- {
- strcpy(display_text[pos], empty_name); pos++;
- }
-
- /* Show the user the new display: */
- PrintIText(file_window->RPort, text_list, 16, 54);
- }
-
- /**/
- /* User has selected a file or a directory. If it is a file put it */
- /* into the file string, otherwise put it into the drawer string. */
- /* Returns TRUE if everything went OK, FALSE if there was a problem. */
- BOOL pick_file(int file_pos)
- {
- struct file_info *pointer=NULL;
- STRPTR string_pointer;
- int pos=0;
-
- /* Go through the allocated list untill we find the file/directory: */
- if(first_pointer)
- {
- pointer=first_pointer;
-
- while(pointer && pos < file_pos)
- {
- pos++; pointer=pointer->next;
- }
- }
- if(pointer) /* Have we found the file/directory? */
- {
- if(pointer->directory) /* It's a directory! */
- {
- /* Is the drawer_name string long enough? */
- /* (+2: 1 for the NULL ('\0') character, 1 for the '\' char) */
- if((strlen(pointer->name)+strlen(drawer_name)+2) <= DRAWER_LENGTH)
- {
- /* YES!, there is enough room for it. */
- string_pointer=drawer_name+strlen(drawer_name)-1;
- if(*string_pointer==':' || *string_pointer=='\0' )
- strcat(drawer_name, pointer->name);
- else
- {
- /* We need to add a '/' before we can add the directory. */
- strcat(drawer_name, "/");
- strcat(drawer_name, pointer->name);
- }
- adjust_string_gadgets();
- }
- else { request_ok(errors[16]); return(FALSE); }
- new_drawer();
- return(TRUE); /* OK */
- }
- else
- {
- /* It is a File! */
- /* Is the file_name string long enough? */
- /* (+1 for the NULL ('\0') character.) */
- if((strlen(pointer->name)+1) <= FILE_LENGTH)
- {
- strcpy(file_name, pointer->name);
- adjust_string_gadgets();
- }
- else /* The file_name is NOT big enough! */
- {
- request_ok(errors[5]); return(FALSE);
- }
- return(TRUE);
- }
- }
- }
-
- /**/
- /* Adjust the string gadgets, so user can at least see the last */
- /* 28/22 characters. Does not return anything. */
- void adjust_string_gadgets(void)
- {
- int length;
-
- length=strlen(file_name);
- if(length>28) string_file.DispPos=length-28;
- else string_file.DispPos=0;
- string_file.BufferPos=string_file.DispPos;
- length=strlen(drawer_name);
-
- if(length>22) string_drawer.DispPos=length-22;
- else string_drawer.DispPos=0;
- string_drawer.BufferPos=string_drawer.DispPos;
- RefreshGadgets(&gadget_file, file_window, NULL);
- }
-
- /**/
- /* Returns TRUE if there exist a file name, otherwise FALSE. */
- BOOL last_check(STRPTR name)
- {
- if(*file_name=='\0')
- {
- request_ok(errors[8]); return(FALSE); /* No file name! */
- }
- else
- {
- connect_dir_file(name); /* Change total_file_name. Drawer + File */
- }
- return(TRUE);
- }
-
- /**/
- /* This function will connect the drawer string with the file string. */
- /* Does not return anything. */
- void connect_dir_file(STRPTR name)
- {
- STRPTR string_pointer;
-
- strcpy(name, drawer_name);
- if(*file_name!='\0') /* Does it exist a file name? */
- {
- string_pointer=drawer_name+strlen(drawer_name)-1;
- if(*string_pointer==':'||*string_pointer=='\0' )
- {
- strcat(name, file_name);
- }
- else { strcat(name, "/"); strcat(name, file_name); }
- }
- }
-
- /**/
- void delete_file_dir(STRPTR total_file_name)
- {
-
- if(*file_name=='\0' && *drawer_name!='\0')
- {
- /* There is no filename string, but there is something in */
- /* the drawer string. The user wants to delete a directory */
-
- /* Is it a device or a directory? */
- if( *(drawer_name+strlen(drawer_name)-1) ==':')
- {
- /* The user wants to delete a device: */
- /* Not a very good idea! */
- request_ok(errors[9]);
- }
- else /* The user wants to delete a dir: */
- {
- /* However, it is important to check that the user */
- /* realy wants to delete it: */
- request_ask(errors[0]);
- if(gadget_flag==TAKE)
- {
- /* YES! The user wanted to delete the directory. */
- /* Before we try to delete it we must "unlock" it */
- if(file_lock)
- {
- UnLock(lock); file_lock=FALSE;
- }
- }
- }
- }
- else
- {
- if(*file_name!='\0')
- {
- /* There is something in the file_name string. */
- /* The user wants to delete a file: */
-
- /* We will here again give the user a last */
- /* chance to make up his mind: */
- request_ask(errors[1]);
- }
- else
- {
- /* Nothing in the drawer string, nor in the file string. */
- /* The user wants to delete something, but has NOT */
- /* declared which file/directory he/she wants to delete: */
- request_ok(errors[8]);
- }
- }
- if(gadget_flag==TAKE) /* Should we delete the file/dir? */
- {
- /* Put the drawer name together with the file name: */
- connect_dir_file(total_file_name);
- if(DeleteFile(total_file_name))
- {
- if(*file_name!='\0') /* A file was deleted sucessfully: */
- {
- *file_name='\0'; /* Take away the file name */
- adjust_string_gadgets();
- new_drawer(); /* Show remaining files to user */
- }
- else /* A directory was deleted: */
- {
- parent(); /* Go back one directory */
- }
- }
- else /* Something went wrong: */
- {
- if(*file_name != '\0') request_ok(errors[11]);
- else request_ok(errors[12]);
-
- /* Since we have unlocked the directory/file we have */
- /* to lock it again, and clean up the display: */
- new_drawer();
- }
- }
- }
- /**/
- void rename_file_dir(STRPTR total_file_name)
- {
- /* Presume the user do not want to rename file/dir: */
- if(ren==1)
- {
- if(*file_name=='\0' && *drawer_name!='\0')
- {
- /* There is no filename string, but there is something in */
- /* the drawer string. The user wants to rename a directory */
-
- /* Is it a device or a directory? */
- if( *(drawer_name+strlen(drawer_name)-1) ==':')
- {
- /* The user wants to rename a device: */
- /* Not a very good idea! */
- request_ok(errors[10]);
- }
- else /* The user wants to rename a directory: */
- {
- request_ask(errors[2]);
- strcpy(total_file, drawer_name);
- total_file_name1=(STRPTR)(&total_file);
- /* YES! The user wanted to rename the directory. */
- /* Before we try to rename it we must "unlock" it */
- if(file_lock) { UnLock(lock); file_lock=FALSE; }
- }
- }
- else
- {
- if(*file_name!='\0') /*File selected */
- {
- /* There is something in the file_name string. */
- /* The user wants to rename a file: */
-
- request_ask(errors[3]);
- connect_dir_file(total_file_name);
- strcpy(total_file,total_file_name);
- total_file_name1=(STRPTR)(&total_file);
- }
- else /* Nothing in drawer string, nor in file string */
- {
- request_ok(errors[8]);
- }
- }
- }
- /***************************/
- if(ren==2)
- {
- connect_dir_file(total_file_name);
- if(Rename(total_file_name1, total_file_name))
- {
- if(*file_name!='\0') /* File was renamed succecfully: */
- {
- adjust_string_gadgets();
- new_drawer(); /* Show user the remaining files. */
- }
- else /* A directory was renamed: */
- {
- parent(); /* Go back one directory. */
- }
- }
- else /* Something went wrong: */
- {
- if(*file_name!='\0') request_ok(errors[13]);
- else request_ok(errors[14]);
-
- /* Since we have unlocked the directory/file we have */
- /* to lock it again, and clean up the display: */
- new_drawer();
- }
- }
- }
- /**/
- USHORT clear_gadgets(STRPTR title)
- {
- OnGadget(&gadget_rename, file_window, NULL);
- OnGadget(&gadget_delete, file_window, NULL);
- SetWindowTitles(file_window, title, (char *)(-1));
- ren=0; gadget_flag=CLEAR; return(CLEAR);
- }
- /**/
- /**/
-
-
-
-
-