/*

Directory Opus 4
Original GPL release version 4.12
Copyright 1993-2000 Jonathan Potter

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

All users of Directory Opus 4 (including versions distributed
under the GPL) are entitled to upgrade to the latest version of
Directory Opus version 5 at a reduced price. Please see
http://www.gpsoft.com.au for more information.

The release of Directory Opus 4 under the GPL in NO WAY affects
the existing commercial status of Directory Opus 5.

*/

/* Definitions of any data that relates to the Screen display. Includes
   TextAttrs, NewScreen structures and TagItems, and various global data */

#include "dopus.h"

/* TextAttr structures */

struct TextAttr
    main_screen_attr={NULL,0,0,0},          /* Main screen font */
    screen_attr={NULL,8,0,0},               /* General screen font */
    menu_attr={NULL,0,0,0};                 /* Menu font */

/* Screen tag lists */

UWORD scr_drawinfo[NUMDRIPENS+1];         /* Pen lists */
UWORD zoom_data[]={0,0,640,200};          /* Zoom gadget data */

struct TagItem
    mainscreen_tags[]={                     /* Tags for the main screen */
        {SA_DisplayID,0},
        {SA_Pens,(ULONG)scr_drawinfo},
        {SA_PubName,(ULONG)str_arexx_portname},
        {SA_Overscan,OSCAN_TEXT},
        {SA_AutoScroll,TRUE},
        {SA_Interleaved,TRUE},
        {SA_SharePens,TRUE},
        {SA_SysFont,1},
        {TAG_DONE,0}},

    stdscreen_tags[]={                      /* Tags for a standard HIRES screen */
        {SA_DisplayID,HIRES_KEY},
        {SA_Pens,(ULONG)scr_drawinfo},
        {TAG_DONE,0}},

    mainwindow_tags[]={                     /* Tags for the main window */
        {WA_PubScreen,0},
        {WA_AutoAdjust,TRUE},
        {WA_Zoom,(ULONG)zoom_data},
        {TAG_DONE,0}};

/* NewScreen structures */

struct ExtNewScreen
    main_scr={                              /* Main screen */
        0,0,0,0,0,
        0,1,
        0,
        CUSTOMSCREEN|SCREENBEHIND|NS_EXTENDED,
        &main_screen_attr,
        (STRPTR)str_arexx_portname,
        NULL,NULL,
        mainscreen_tags},

    font_scr={
        0,0,640,0,1,0,1,                      /* Font screen */
        HIRES,
        CUSTOMSCREEN|SCREENBEHIND|SCREENQUIET|NS_EXTENDED,
        NULL,NULL,NULL,NULL,stdscreen_tags},
    blank_scr={                             /* Blank screen */
        0,0,320,STDSCREENHEIGHT,1,0,1,
        0,
        CUSTOMSCREEN|SCREENQUIET,
        NULL,NULL,NULL,NULL,NULL};

/* NewWindow structures */

struct ExtNewWindow
    main_win={                              /* Main window */
        0,0,0,0,255,255,
        IDCMP_MOUSEBUTTONS|IDCMP_MENUPICK|IDCMP_GADGETUP|
            IDCMP_GADGETDOWN|IDCMP_RAWKEY|IDCMP_MOUSEMOVE|
            IDCMP_DISKINSERTED|IDCMP_DISKREMOVED|IDCMP_INACTIVEWINDOW|
            IDCMP_ACTIVEWINDOW|IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE,
        0,
        NULL,NULL,NULL,NULL,NULL,640,200,65535,65535,CUSTOMSCREEN,
        mainwindow_tags};

struct NewWindow
    font_win={                              /* Font window */
        0,0,640,200,255,255,
        IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_INACTIVEWINDOW,
        WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_SIMPLE_REFRESH|WFLG_NOCAREREFRESH,
        NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN},

    disk_win={                              /* DiskInfo window */
        0,0,0,0,255,255,
        IDCMP_RAWKEY|IDCMP_DISKINSERTED|IDCMP_DISKREMOVED|IDCMP_GADGETUP|IDCMP_VANILLAKEY,
        WFLG_BORDERLESS|WFLG_RMBTRAP|WFLG_ACTIVATE,
        NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN};

struct AppWindow *dopus_appwindow=NULL;   /* AppWindow when on Workbench screen */


/* Definitions for the custom menus */

struct Menu menu_menus[5];                /* Custom menus */
struct MenuItem  *menu_menuitem;          /* Custom menu items */
struct IntuiText *menu_intuitext;         /* IntuiText for custom menu items */

char *menu_itemnames;                     /* Names of the menu items */
char menu_spaceitemnames[5][80];          /* Space background of menu items */

UBYTE menu_real_number[5];                /* The real ordinal number of each menu */

/* Internal Screen Data */

struct ColourTable screen_pens[16];       /* Colour pen table */

USHORT scrdata_norm_width;                /* Normal width of the display */
USHORT scrdata_norm_height;               /* Normal height of the display */
USHORT scrdata_scr_height;                /* Main screen/window height */

USHORT scrdata_dispwin_lines;             /* Number of lines in each window */
USHORT scrdata_dispwin_width[2];          /* Displayed width in each window */
USHORT scrdata_dispwin_height;            /* Height of directory windows */
USHORT scrdata_dispwin_nchars[2];         /* Width of each window in characters */
USHORT scrdata_dispwin_ypos;              /* Y-Position of directory windows */
USHORT scrdata_dispwin_left[2];           /* Left edge of directory windows */
USHORT scrdata_dispwin_xpos[2];           /* Left edge of text in windows */
USHORT scrdata_dispwin_center;            /* Center of the two windows */

USHORT scrdata_dirwin_xpos[2];            /* Rendered X-Position of each window */
USHORT scrdata_dirwin_ypos[2];            /* Rendered Y-Position of each window */
USHORT scrdata_dirwin_width[2];           /* Rendered width of each window */
USHORT scrdata_dirwin_height;             /* Rendered height of directory windows */
USHORT scrdata_dirwin_bottom;             /* Rendered bottom of each window */
USHORT scrdata_dirwin_center;             /* Rendered center of the two windows */

USHORT scrdata_drive_width;               /* Width of the drive gadgets */
USHORT scrdata_gadget_offset;             /* X-Offset of entire gadget display */
USHORT scrdata_gadget_xpos;               /* X-Position of the custom gadgets */
USHORT scrdata_gadget_ypos;               /* Y-Position of the custom gadgets */
USHORT scrdata_gadget_width;              /* Width of the custom gadgets */
USHORT scrdata_gadget_height;             /* Height of the custom gadgets */

USHORT scrdata_clock_width;               /* Width of the clock bar */
USHORT scrdata_clock_height;              /* Height of the clock bar */
USHORT scrdata_clock_xpos;                /* x-pos of the clock bar */
USHORT scrdata_clock_ypos;                /* y-pos of the clock bar */
USHORT scrdata_status_xpos;               /* X-Position of the status bar */
USHORT scrdata_status_ypos;               /* Y-Position of the status bar */
USHORT scrdata_status_width;              /* Width of the status bar */
USHORT scrdata_status_height;             /* Height of the status bar */
USHORT scrdata_diskname_width[2];         /* Width of each diskname display */
USHORT scrdata_diskname_height;           /* Height of the diskname displays */
USHORT scrdata_diskname_ypos;             /* Y-Position of the diskname displays */
USHORT scrdata_diskname_xpos[2];          /* X-Position of each diskname display */
USHORT scrdata_prop_height;               /* Height of the vertical sliders */
USHORT scrdata_string_height;             /* Height of the path string gadgets */
USHORT scrdata_closegad_width;            /* Width of the screen close gadget */

USHORT scrdata_font_xsize;                /* X-Size of the dir window font */
USHORT scrdata_font_ysize;                /* Y-Size of the dir window font */
USHORT scrdata_font_baseline;             /* Baseline of the dir window font */

UBYTE scrdata_is_pal;                     /* Indicates PAL or NTSC system */
UBYTE scrdata_statustext_pos=0;           /* Status text positioning */
LONG scrdata_old_offset_store=-1;         /* Stored offset in directory window */

USHORT scrdata_xoffset;                   /* General x-offset */
USHORT scrdata_yoffset;                   /* General y-offset */
USHORT scrdata_width;                     /* Display width */
USHORT scrdata_height;                    /* Display height */

/* Definitions of screen objects */

struct PropInfo
    vert_propinfo[2]={                      /* Vertical slider PropInfo */
        {FREEVERT|PROPBORDERLESS,0,0,0,0xffff},
        {FREEVERT|PROPBORDERLESS,0,0,0,0xffff}},

    horiz_propinfo[2]={                     /* Horizontal slider PropInfo */
        {FREEHORIZ|PROPBORDERLESS,0,0,0x4152,0},
        {FREEHORIZ|PROPBORDERLESS,0,0,0x4152,0}},

    drive_propinfo={                        /* Drive banks slider PropInfo */
        FREEVERT|PROPBORDERLESS,0,0,0,0xffff},

    gadget_propinfo={                       /* Gadget banks slider PropInfo */
        FREEVERT|PROPBORDERLESS,0,0,0,0xffff};

struct Image
    vert_propimage[2],                      /* Vertical slider Image */
    horiz_propimage[2],                     /* Horizontal slider Image */
    drive_propimage={                       /* Drive banks slider Image */
        0,0,8,0,1,NULL,0,0,NULL},
    gadget_propimage={                      /* Gadget banks slider Image */
        0,0,8,0,1,NULL,0,0,NULL};

struct StringExtend                       /* Path fields StringExtension */
    string_extend={
        NULL,{0,0},{0,0},SGM_EXITHELP,NULL,NULL,{0,0,0,0}},

    requester_stringex={                    /* Requester StringExtension */
        NULL,{0,0},{0,0},0,NULL,NULL,{0,0,0,0}};

char str_pathbuffer[2][256];              /* Path fields buffers */
char str_undobuffer[256];                 /* General undo buffer for string gads */

struct StringInfo                         /* Path fields StringInfos */
    path_stringinfo[2]={
        {(STRPTR)str_pathbuffer[0],(STRPTR)str_undobuffer,0,256,0},
        {(STRPTR)str_pathbuffer[1],(STRPTR)str_undobuffer,0,256,0}};

struct Gadget
    *main_gadgets,                          /* Custom gadgets */
    *drive_gadgets,                         /* Drive gadgets */

    path_strgadget[2]={                     /* Path field gadgets */
        {&path_strgadget[1],2,0,0,0,
            GFLG_GADGHCOMP|GFLG_STRINGEXTEND|GFLG_TABCYCLE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_TOGGLESELECT,
            GTYP_STRGADGET,NULL,NULL,NULL,NULL,
            (APTR)&path_stringinfo[0],SCRGAD_LEFTSTRING,NULL},
        {NULL,0,0,0,0,
            GFLG_GADGHCOMP|GFLG_STRINGEXTEND|GFLG_TABCYCLE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_TOGGLESELECT,
            GTYP_STRGADGET,NULL,NULL,NULL,NULL,
            (APTR)&path_stringinfo[1],SCRGAD_RIGHTSTRING,NULL}},

    vert_propgad[2]={                       /* Vertical slider gadgets */
        {&vert_propgad[1],0,0,8,0,
            GFLG_GADGHNONE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
            GTYP_PROPGADGET,(APTR)&vert_propimage[0],NULL,NULL,NULL,
            (APTR)&vert_propinfo[0],SCRGAD_LEFTPROP,NULL},
        {NULL,0,0,8,0,
            GFLG_GADGHNONE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
            GTYP_PROPGADGET,(APTR)&vert_propimage[1],NULL,NULL,NULL,
            (APTR)&vert_propinfo[1],SCRGAD_RIGHTPROP,NULL}},

    horiz_propgad[2]={                      /* Horizontal slider gadgets */
        {&horiz_propgad[1],0,0,0,5,
            GFLG_GADGHNONE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
            GTYP_PROPGADGET,(APTR)&horiz_propimage[0],NULL,NULL,NULL,
            (APTR)&horiz_propinfo[0],SCRGAD_LEFTHPROP,NULL},
        {NULL,0,0,0,5,
            GFLG_GADGHNONE,
            GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
            GTYP_PROPGADGET,(APTR)&horiz_propimage[1],NULL,NULL,NULL,
            (APTR)&horiz_propinfo[1],SCRGAD_RIGHTHPROP,NULL}},

    drive_propgad={                         /* Drive banks slider gadget */
        NULL,0,0,8,0,
        GFLG_GADGHNONE,
        GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
        GTYP_PROPGADGET,(APTR)&drive_propimage,NULL,NULL,NULL,
        (APTR)&drive_propinfo,SCRGAD_DRIVEPROP,NULL},

    gadget_propgad={                        /* Gadget banks slider gadget */
        NULL,0,0,8,0,
        GFLG_GADGHNONE,
        GACT_IMMEDIATE|GACT_RELVERIFY|GACT_FOLLOWMOUSE,
        GTYP_PROPGADGET,(APTR)&gadget_propimage,NULL,NULL,NULL,
        (APTR)&gadget_propinfo,SCRGAD_GADGETPROP,NULL},

    screen_gadgets[24]={                    /* General screen gadgets */
        {&screen_gadgets[1],0,0,2,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_PARENT1,NULL},
        {&screen_gadgets[2],0,0,2,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_PARENT2,NULL},
        {&screen_gadgets[3],0,0,0,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_BUFFERLIST,NULL},
        {&screen_gadgets[4],0,0,0,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_RESELECT,NULL},
        {&screen_gadgets[5],0,0,0,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_SELECT,NULL},
        {&screen_gadgets[6],0,0,0,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_AREXX,NULL},
        {&screen_gadgets[7],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY|GACT_TOGGLESELECT,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_HELP,NULL},
        {&screen_gadgets[8],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_ERRORHELP,NULL},
        {&screen_gadgets[9],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY|GACT_TOGGLESELECT,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_TINYFILTER,NULL},
        {&screen_gadgets[10],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_CONFIGURE,NULL},
        {&screen_gadgets[11],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_ICONIFY,NULL},
        {&screen_gadgets[12],0,0,19,0,
            GFLG_GADGHCOMP,
            GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,FUNC_QUIT,NULL},
        {&screen_gadgets[13],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVELEFT1,NULL},
        {&screen_gadgets[14],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVELEFT2,NULL},
        {&screen_gadgets[15],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVERIGHT1,NULL},
        {&screen_gadgets[16],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVERIGHT2,NULL},
        {&screen_gadgets[17],0,0,0,9,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVEUP1,NULL},
        {&screen_gadgets[18],0,0,0,9,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVEUP2,NULL},
        {&screen_gadgets[19],0,0,0,9,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVEDOWN1,NULL},
        {&screen_gadgets[20],0,0,0,9,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_MOVEDOWN2,NULL},
        {&screen_gadgets[21],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_BUFFERLEFT1,NULL},
        {&screen_gadgets[22],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_BUFFERLEFT2,NULL},
        {&screen_gadgets[23],0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_BUFFERRIGHT1,NULL},
        {NULL,0,0,16,0,
            GFLG_GADGHCOMP,
            GACT_IMMEDIATE|GACT_RELVERIFY,
            GTYP_BOOLGADGET,NULL,NULL,NULL,NULL,
            NULL,SCRGAD_BUFFERRIGHT2,NULL}},

    size_gadgets[]={
        {&size_gadgets[1],0,0,0,0,
        GFLG_GADGHNONE,
        GACT_IMMEDIATE|GACT_RELVERIFY,
        GTYP_SIZING,NULL,NULL,NULL,NULL,
        NULL,65000,NULL},
        {NULL,0,0,0,0,
        GFLG_GADGHNONE,
        GACT_IMMEDIATE|GACT_RELVERIFY,
        GTYP_SIZING,NULL,NULL,NULL,NULL,
        NULL,65000,NULL}};

struct RMBGadget
    mainrmbgads[7]={                        /* Screen right mouse button gadgets */
        {&mainrmbgads[1],
            0,0,0,0,0,FUNC_NEXTDRIVES},         /* Drive banks (NextDrives) */
        {&mainrmbgads[2],
            0,0,0,0,0,FUNC_CLEARBUFFERS},       /* B tiny gadget (clear buffers) */
        {&mainrmbgads[3],
            0,0,0,0,0,FUNC_RESCAN},             /* R tiny gadget (rescan) */
        {&mainrmbgads[4],
            0,0,0,0,0,FUNC_DEVICELIST},         /* S tiny gadget (device list) */
        {&mainrmbgads[5],
            0,0,0,0,0,FUNC_DIRTREE},            /* A tiny gadget (dir tree) */
        {&mainrmbgads[6],
            0,0,0,0,0,FUNC_ROOT},               /* Left parent gadget (root) */
        {NULL,
            0,0,0,0,0,FUNC_ROOT}};              /* Right parent gadget (root) */

/* Click-M-Click dragging data */

struct VSprite drag_sprite={              /* VSprite used for dragging */
    NULL,NULL,NULL,NULL,0,0,
    SAVEBACK,0,0,0,0,0,0,0,
    NULL,NULL,NULL,NULL,&drag_bob,0,0};

struct Bob drag_bob={                     /* BOB used for dragging */
    0,NULL,NULL,NULL,NULL,
    &drag_sprite,NULL,NULL};

struct BitMap drag_bob_bitmap;            /* Bitmap used to render BOB */
struct RastPort drag_bob_rastport;        /* Rastport used to render BOB */

PLANEPTR drag_bob_buffer=NULL;            /* BOB buffer */
PLANEPTR drag_bob_savebuffer=NULL;        /* BOB background save buffer */

struct GelsInfo drag_gelsinfo={0};        /* GelsInfo structure for BOB */
struct VSprite drag_dummy_sprite1={0};    /* Dummy sprite 1 for GELs list */
struct VSprite drag_dummy_sprite2={0};    /* Dummy sprite 2 for GELs list */

/* General screen data */

struct Rectangle scr_scroll_borders[2];   /* Scroll borders for dir windows */

/* Borders for gadget highlighting */

struct DOpusRemember *border_key=NULL;    /* Memory key for border data */

struct Border *gadget_sel_border;         /* Borders for main gadgets */
struct Border *gadget_unsel_border;

struct Border *gadget_dog_sel_border;     /* Main gadgets with dog-ears*/
struct Border *gadget_dog_unsel_border;

struct Border *drive_sel_border;          /* Borders for drive gadgets */
struct Border *drive_unsel_border;

struct Border *drive_bank_sel_border;     /* Borders for the drive bank */
struct Border *drive_bank_unsel_border;
