#ifndef MUI_Grab_MCC_H
#define MUI_Grab_MCC_H

#ifndef LIBRARIES_MUI_H
#include <libraries/mui.h>
#endif

#include <datatypes/pictureclass.h>

// User Data
#define UDB_GRAB        0
#define UDB_STOPGRAB    1
#define UDB_UPDATE      2
#define UDB_STRDROP     3

/// "Inline functions"
//inline LONG xget (Object * obj, ULONG attribute);
//inline ULONG DoSuperNew (struct IClass * cl, Object * obj, ULONG tag1,...);
///

/// "MUI Object Macros"
#define KeyStringDrop(contents,maxlen,controlchar)\
        StrDropObject,\
                StringFrame,\
                MUIA_ControlChar    , controlchar,\
                MUIA_String_MaxLen  , maxlen,\
                MUIA_String_Contents, contents,\
                End

#define CheckMarkObject  ImageObject,\
                ImageButtonFrame,\
                MUIA_InputMode        , MUIV_InputMode_Toggle,\
                MUIA_Image_Spec       , MUII_CheckMark,\
                MUIA_Image_FreeVert   , TRUE,\
                MUIA_Background       , MUII_ButtonBack,\
                MUIA_ShowSelState     , FALSE

///

/// "Classes vars"

#ifdef MAIN_C

     struct MUI_CustomClass *MainWin_Class = NULL;
     extern SAVEDS(ULONG) MainWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *ProjWin_Class = NULL;
     extern SAVEDS(ULONG) ProjWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *WinGrab_Class = NULL;
     extern SAVEDS(ULONG) WinGrab_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *UrlEditWin_Class = NULL;
     extern SAVEDS(ULONG) UrlEditWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *Grab_Class = NULL;
     extern SAVEDS(ULONG) Grab_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *NLI_Class = NULL;
     extern SAVEDS(ULONG) NLI_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *ButtonDrop_Class = NULL;
     extern SAVEDS(ULONG) ButtonDrop_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *StrDrop_Class = NULL;
     extern SAVEDS(ULONG) StrDrop_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *ImageIFF_Class = NULL;
     extern SAVEDS(ULONG) ImageIFF_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *PrefsWin_Class = NULL;
     extern SAVEDS(ULONG) PrefsWin_Dispatcher (REG (a0, struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *AboutWin_Class = NULL;
     extern SAVEDS(ULONG) AboutWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *EditWin_Class = NULL;
     extern SAVEDS(ULONG) EditWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *ReqWin_Class = NULL;
     extern SAVEDS(ULONG) ReqWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *LPrefsWin_Class = NULL;
     extern SAVEDS(ULONG) LPrefsWin_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

     struct MUI_CustomClass *SelListGad_Class = NULL;
     extern SAVEDS(ULONG) SelListGad_Dispatcher (REG (a0,
                          struct IClass *), REG (a2, Object *), REG (a1, Msg));

#else

extern struct MUI_CustomClass *MainWin_Class;
extern struct MUI_CustomClass *ProjWin_Class;
extern struct MUI_CustomClass *WinGrab_Class;
extern struct MUI_CustomClass *UrlEditWin_Class;
extern struct MUI_CustomClass *Grab_Class;
extern struct MUI_CustomClass *NLI_Class;
extern struct MUI_CustomClass *ButtonDrop_Class;
extern struct MUI_CustomClass *StrDrop_Class;
extern struct MUI_CustomClass *ImageIFF_Class;
extern struct MUI_CustomClass *PrefsWin_Class;
extern struct MUI_CustomClass *AboutWin_Class;
extern struct MUI_CustomClass *EditWin_Class;
extern struct MUI_CustomClass *ReqWin_Class;
extern struct MUI_CustomClass *LPrefsWin_Class;
extern struct MUI_CustomClass *SelList_Class;

#endif

///

/// "ObjectMacros"

#define MainWinObject    NewObject(MainWin_Class->mcc_Class, NULL
#define PrefsWinObject   NewObject(PrefsWin_Class->mcc_Class, NULL
#define AboutWinObject   NewObject(AboutWin_Class->mcc_Class, NULL
#define ProjectWinObject NewObject(ProjWin_Class->mcc_Class, NULL
#define WinGrabObject    NewObject(WinGrab_Class->mcc_Class, NULL
#define UrlEditWinObject NewObject(UrlEditWin_Class->mcc_Class, NULL
#define GrabObject       NewObject(Grab_Class->mcc_Class, NULL
#define ButtonDropObject NewObject(ButtonDrop_Class->mcc_Class, NULL
#define StrDropObject    NewObject(StrDrop_Class->mcc_Class, NULL
#define ImageIFFObject   NewObject(ImageIFF_Class->mcc_Class, NULL
#define NImageObject     NewObject(NLI_Class->mcc_Class,NULL,MUIA_FillArea,FALSE,NoFrame,End
#define ReqWinObject     NewObject(ReqWin_Class->mcc_Class, NULL
#define LPrefsWinObject  NewObject(LPrefsWin_Class->mcc_Class, NULL
#define SelListObject    NewObject(SelList_Class->mcc_Class, NULL
///

/// "WindowNode"
struct WindowNode
  {
    struct MinNode wnd_node;
    APTR wnd_win;

    STRPTR title;
    STRPTR dir;

    ULONG status;
  };
///

/// "MainWinData"

struct MainWinData
  {
    APTR self;
    APTR parent;

    APTR bt_new, bt_open, bt_save;
    APTR bt_grab, bt_stopgrab, bt_update;

    struct List WindowList;     // Project windows list

    struct WindowNode *cnd;     // Node in use

    struct MsgPort *scanport;
    struct MUI_InputHandlerNode ihn;
  };

///

/// "PrefsWinData"
struct PrefsWinData
  {
    APTR LV_Prefs;
    APTR GR_Prefs;

    APTR CYC_ButtonType;
    APTR CHK_CloseReq;

    APTR STR_Proxy;
    APTR NUM_ProxyPort;
    APTR STR_ProxyAuth;

    APTR NUM_CDelay;
    APTR NUM_Retries;
    APTR NUM_Buffer;

    APTR STR_Email;
    APTR STR_Languages;
    APTR STR_Charsets;

    APTR BT_Use;
    APTR BT_Save;
    APTR BT_Reset;
    APTR BT_Cancel;
  };
///

/// "LPrefsWinData"
struct LPrefsWinData
  {
    APTR parent;
    struct proj_prefs *pprefs;

    APTR POP_Downdir;
    APTR STR_Downdir;
    APTR STR_Indexname;
    APTR NUM_Maxcon;

    APTR BT_Use;
    APTR BT_Save;
    APTR BT_Reset;
    APTR BT_Cancel;
  };
///

/// "AboutWinData"
struct AboutWinData
  {
    APTR self;
    char *userinfo;
  };
///

/// "ProjWin Data"

struct UrlList
  {
    struct MinList mlist;
    APTR projwin;
    ULONG status;
  };

struct ProjWinData
  {
    APTR self;

    struct WindowNode *wnd;

    APTR all;
    APTR inuse;
    APTR listview;
    APTR grabwin;

    struct UrlList list;
    struct List subwinlist;

    STRPTR title;
    STRPTR dir;

    struct proj_prefs pprefs;
  };

/* Status flags */
#define PWST_CLEAR      (1L<<0)
#define PWST_CHANGED    (1L<<1)
#define PWST_GRABBING   (1L<<2)
#define PWST_REQ        (1L<<3)

///

/// "EditWin Data"

struct EditWinData
  {
    struct List gadlist;
    APTR userdata;
  };


///

/// "NLIData"
struct NLIData
  {
    LONG special;
    LONG EntryCurrent;
    LONG EntryHeight;
  };
///

/// "GrabData"
struct GrabData
  {
    struct HttpData hd;
    struct SignalSemaphore sema;        /* data item protection      */
    Object *app;                /* pointer to application    */
    Object *proj;               /* pointer to proj window    */
    BPTR   httpfunc;

    struct URLNode *nd;
    APTR gauge;
    STRPTR url;
    BYTE status;

  };
///

/// "WinGrabData"
struct WinGrabData
  {
    APTR self;
    APTR parent;

    STRPTR title;

    APTR group;
    APTR *urls;
    struct UrlList *list;
    struct proj_prefs *pprefs;
  };
///

/// "UrlEditWinData"
struct EditWinNode
  {
    struct MinNode wnd_node;
    APTR wnd_win;
  };

struct UrlEditWinData
  {
    APTR self;                  //windows
    APTR parent;

    struct EditWinNode *wnd;
    struct URLNode *nd;         // Data

    // URL

    APTR STR_Url;
    APTR STR_Title;
    APTR STR_Name;
    APTR STR_Password;

    // Links

    APTR CYC_Server;
    APTR NUM_Levels;
    APTR CYC_Direction;
    APTR STR_Extension;
    APTR STR_Types;

    // HTML

    APTR CYC_HTML;
    APTR CHK_IE;
    APTR CHK_NS;
    APTR CHK_Other;
    APTR CHK_Inimg;
    APTR CHK_Inback;
    APTR CHK_Inappl;
    APTR CHK_Inobj;
    
    // Download

    APTR CHK_MaxSize;
    APTR NUM_MaxSize;

    // Update

    APTR CYC_Update;


    // interface objs

    APTR BT_Use;
    APTR BT_Reset;
    APTR BT_Cancel;
  };
///

/// "Drag&Drop data"
struct ButtonDrop_Data
  {
    LONG dummy;
  };

struct StrDrop_Data
  {
    LONG dummy;
  };

struct ImageIFF_Data
  {
    ULONG *cols;
    UBYTE *body;
  };
///

/* Attributes */



/// "Main_Win"
#define MUIM_Main_New             0x80420000
#define MUIM_Main_Open            0x80420001
struct MUIP_Main_Open
  {
    ULONG id;
    ULONG req;
    STRPTR filename;
    STRPTR dirname;
  };
#define MUIM_Main_Save            0x80420002
#define MUIM_Main_Close           0x80420003
#define MUIM_Main_Grab            0x80420004
#define MUIM_Main_StopGrab        0x80420005
#define MUIM_Main_Update          0x80420006
#define MUIM_Main_ShutDown        0x80420007

#define MUIA_Main_CurrentProj     0x80420008
#define MUIA_Main_CloseProj       0x80420009
#define MUIM_Main_Closereq        0x8042000A
#define MUIM_Main_Closereq2       0x8042000B

struct MUIP_Main_Closereq
  {
    ULONG id;
    struct AslMessage *aslmsg;
  };

/// End Main Win

/// "Proj Win"

#define MUIM_ProjWin_Insert       0x80420100
#define MUIM_ProjWin_Open         0x80420101
struct MUIP_ProjWin_Open
  {
    ULONG id;
    STRPTR filename;
    STRPTR dirname;
  };
#define MUIM_ProjWin_Save         0x80420102
#define MUIM_ProjWin_Close        0x80420103
#define MUIM_ProjWin_Grab         0x80420104
#define MUIM_ProjWin_StopGrab     0x80420105
#define MUIM_ProjWin_Update       0x80420106
#define MUIM_ProjWin_AddNode      0x80420107
struct MUIP_ProjWin_AddNode
  {
    ULONG id;
    struct URLNode *nd;
  };
#define MUIM_ProjWin_SetUrl       0x80420108
#define MUIM_ProjWin_DClick       0x80420109
#define MUIM_ProjWin_ChangeNode   0x8042010A
struct MUIP_ProjWin_ChangeNode
  {
    ULONG id;
    struct URLNode *oldnd;
    struct URLNode *newnd;
  };
#define MUIM_ProjWin_RemNode      0x8042010B
#define MUIA_ProjWin_WinNode      0x8042010C
#define MUIA_ProjWin_Dir          0x8042010D
#define MUIM_ProjWin_AddListNode  0x8042010E
struct MUIP_ProjWin_AddListNode
  {
    ULONG id;
    struct List *linklist;
    struct SignalSemaphore *sema;       /* data item protection      */

  };

#define MUIM_ProjWin_Inserthtml   0x8042010F
#define MUIM_ProjWin_Savehtml     0x80420110

struct MUIP_ProjWin_umsg
  {
    ULONG id;
    struct URLNode *nd;
    struct URLNode *nd2;
    APTR parent;
  };

#define MUIA_ProjWin_Grabwin      0x80420111
#define MUIM_ProjWin_GrabbedNode  0x80420112
struct MUIP_ProjWin_GrabbedNode
  {
    ULONG id;
    struct URLNode *nd;
    APTR data;
  };

#define MUIA_ProjWin_ProjPrefs    0x80420113
#define MUIM_ProjWin_ShutDown     0x80420114
#define MUIM_ProjWin_CopyNode     0x80420115
#define MUIA_ProjWin_Sleep        0x80420116

/// End Proj Win

/// "Grab obj"

#define MUIA_Grab_Percent         0x80420201    /* GM  isg STRPTR             */
#define MUIA_Grab_Finish          0x80420202    /* GM  isg BYTE               */
#define MUIA_Grab_Stop            0x80420203    /* GM  isg Object *           */
#define MUIA_Grab_Error           0x80420204    /* GM */

#define MUIM_Grab_Grab            0x80420205    /* GM */
struct MUIP_Grab_Grab
  {
    ULONG id;
    struct URLNode *entry;
  };
#define MUIM_Grab_Update          0x80420206    /* GM */
struct MUIP_Grab_Update
  {
    ULONG id;
    LONG percent;
    STRPTR message;
  };
#define MUIM_Grab_Finish          0x80420207    /* GM */
struct MUIP_Grab_Finish
  {
    ULONG id;
    struct URLNode *newentry;
  };

#define MUIM_Grab_Error           0x80420208    /* GM */
struct MUIP_Grab_Error
  {
    ULONG id;
    STRPTR message;
  };

#define MUIM_Grab_SetUrl          0x80420209    /* GM */
struct MUIP_Grab_SetUrl
{
    ULONG id;
    STRPTR type;
    STRPTR etag;
    struct DateStamp *date;
    ULONG size;
    ULONG status;
};

/// End Grab obj

/// "Grab Win"

#define MUIM_WGrab_StartGrab      0x80420301    /* GM */
struct MUIP_WGrab_StartGrab
  {
    ULONG id;
    struct UrlList *ulist;
  };
#define MUIM_WGrab_AddUrl         0x80420302    /* GM */
struct MUIP_WGrab_AddUrl
  {
    ULONG id;
    struct URLNode *entry;
  };
#define MUIM_WGrab_RemUrl         0x80420303    /* GM */
struct MUIP_WGrab_RemUrl
  {
    ULONG id;
    APTR entry;
  };

/// End GrabWin

/// UrlEditWin

#define MUIA_UrlEditWin_URLNode   0x80420401    /* GM  isg struct URLNode *   */
#define MUIA_UrlEditWin_WinNode   0x80420402    /* GM */
#define MUIA_UrlEditWin_ProjWin   0x80420403    /* GM */
#define MUIM_UrlEditWin_Use       0x80420404    /* GM */
#define MUIM_UrlEditWin_Save      0x80420405    /* GM */
#define MUIM_UrlEditWin_Reset     0x80420406    /* GM */
#define MUIM_UrlEditWin_Change    0x80420407    /* GM */

/// End UrlEditWin

/// "ImageIFF"

#define MUIA_ImageIFF_Filename      0x80420501    /* GM */
#define MUIA_ImageIFF_Body          0x80420502    /* GM */
#define MUIA_ImageIFF_SourceColors  0x80420503    /* GM */
#define MUIA_ImageIFF_BitMapHeader  0x80420504    /* GM */


///

/// "LocalPrefsWin"

#define MUIM_LPrefsWin_Use             0x80420601    /* GM */
#define MUIM_LPrefsWin_SaveAs          0x80420602    /* GM */
#define MUIM_LPrefsWin_Reset           0x80420603    /* GM */
#define MUIM_LPrefsWin_Load            0x80420604    /* GM */
#define MUIA_LPrefsWin_ProjWin         0x80420605    /* GM */

///

#endif /* MUI_Grab_MCC_H */
