#ifndef LIBRARIES_GTDRAG_H
#define LIBRARIES_GTDRAG_H 1
/*
**  $VER: gtdrag.h 3.9 (30.6.99)
**  Includes Release 3.3
**
**  Drag&Drop with GadTools
**
**  Copyright ©1999 pinc Software.
**  All rights Reserved.
*/

#ifndef EXEC_LISTS_H
#include <exec/lists.h>
#endif

#ifndef UTILITY_HOOKS_H
#include <utility/hooks.h>
#endif


#ifndef reg
#define reg(x) register __ ## x
#endif


/********************* ObjectDescription structure *********************/

/* the ObjectDescription structure describes the contents of the object
 * being dragged.
 */

struct ObjectDescription
{
  APTR   od_Object;           /* the pointer to the object */
  ULONG  od_GroupID;          /* DataTypes-GroupID (see datatypes.h) */
  ULONG  od_Type;             /* rough format of the object */
  ULONG  od_InternalType;     /* application related type */
  STRPTR od_Owner;            /* owner name or NULL if you are the owner */
  APTR   od_UserData;
};

/** Values for od_Type **/

#define ODT_UNKNOWN 0    /* should only be used rarely    */
#define ODT_STRING 1     /* simple c-string (STRPTR)      */
#define ODT_NODE 2       /* (struct Node *)               */
#define ODT_IMAGENODE 4  /* (struct ImageNode *)          */
#define ODT_TREENODE 8   /* (struct TreeNode *)           */
#define ODT_IMAGE 16     /* (struct Image *)              */
#define ODT_ICON 32      /* (struct DiskObject *)         */
#define ODT_IFF 64       /* pointer to an IFF-data stream */
#define ODT_LOCK 128     /* a file lock                   */
#define ODT_DATATYPE 256 /* a datatype object             */
#define ODT_BITMAP 512   /* (struct BitMap *)             */


/********************* DropMessage structure *********************/

/* You receive the DropMessage structure if someone has dropped an object
 * on a gadget or in a window of your application. The IAddress field of
 * the IntuiMessage points to this structure.
 * Remember: all fields are read-only!
 */

struct DropMessage
{
  struct MinNode dm_Node;
  struct ObjectDescription dm_Object;  /* dragged object */
  struct Gadget *dm_Gadget;     /* source gadget */
  struct Window *dm_Window;     /* source gadget's window */
  struct Gadget *dm_Target;     /* pointer to the target gadget */
  LONG   dm_SourceEntry;        /* the list position of the entry */
  LONG   dm_TargetEntry;        /* dto. - may be higher than the number of entries */
  ULONG  dm_Flags;
};

#define DMF_DROPOVER 1          /* for treeviews */


/** The flags for the IDCMP-MsgPort of your Window **/

#define DRAGIDCMP (LISTVIEWIDCMP | IDCMP_MOUSEBUTTONS)
#define IDCMP_OBJECTDROP (IDCMP_DISKINSERTED | IDCMP_DISKREMOVED)

/* If you get a message of the IDCMP_OBJECTDROP class, someone dropped
 * an object on a gadget or in a window that supports it.
 * The IAddress-field of the IntuiMessage points to the DragMsg in this
 * case.
 */

/** a drag key qualifier **/

#define IEQUALIFIER_DRAGKEY (IEQUALIFIER_LALT | IEQUALIFIER_RALT)


/** Tags to pass to GTD_AddGadget() (a few also for GTD_AddWindow()) **/

#define GTDA_TagBase    (TAG_USER + 0x90000)

/* describe the object */

#define GTDA_Object            GTDA_TagBase + 1   /* drag node from a non-listview */
#define GTDA_GroupID           GTDA_TagBase + 2   /* Datatypes GroupID (see datatypes/datatypes.h) */
#define GTDA_Type              GTDA_TagBase + 3   /* rough format of object */
#define GTDA_InternalType      GTDA_TagBase + 4   /* internal type flag */
#define GTDA_Mask              GTDA_InternalType  /* for compatibility */
#define GTDA_Image             GTDA_TagBase + 5   /* image for dragging */
#define GTDA_RenderHook        GTDA_TagBase + 6   /* render hook for listview/object */
#define GTDA_ObjectDescription GTDA_TagBase + 7   /* pointer to struct ObjectDescription (contents will be copied) */

/* general use */

#define GTDA_Width         GTDA_TagBase + 8     /* width of icon (only for GTDA_RenderHook & GTDA_Images) */
#define GTDA_Height        GTDA_TagBase + 9     /* height of a icon ("") */
#define GTDA_NoDrag        GTDA_TagBase + 10    /* do not drag from this gadget */
#define GTDA_AcceptTypes   GTDA_TagBase + 11    /* accept mask value for internal drag&drop */
#define GTDA_AcceptMask    GTDA_AcceptTypes     /* for compatibility */
#define GTDA_AcceptFunc    GTDA_TagBase + 12    /* function which checks for acceptance of the drag */
#define GTDA_ObjectFunc    GTDA_TagBase + 13    /* callback function before a drag starts */
#define GTDA_SourceEntry   GTDA_TagBase + 21    /* specifies the dm_SourceEntry field */

/* listview specials */

#define GTDA_ItemHeight    GTDA_TagBase + 14    /* height of a listview entry */
#define GTDA_NoPosition    GTDA_TagBase + 15    /* no position highlighting and scrolling */
#define GTDA_Same          GTDA_TagBase + 16    /* can move items inside its own list */
#define GTDA_Images        GTDA_TagBase + 17    /* drags only images (listview MUST contain ImageNodes/TreeNodes) */
#define GTDA_NoScrolling   GTDA_TagBase + 18    /* disables scrolling */
#define GTDA_DropOverItems GTDA_TagBase + 19    /* objects are dropped over other items */
#define GTDA_TreeView      GTDA_TagBase + 20    /* activate treeview specials */
#define GTDA_DropBetweenItems GTDA_TagBase + 22  /* works only in conjungtion with GTDA_DropOverItems */


/** Tags to pass to GTD_AddApp() **/

#define GTDA_InternalOnly  GTDA_TagBase + 42   /* only internal drag&drop */
#define GTDA_NewStyle      GTDA_TagBase + 43   /* v3 is supported */


/** Constants for passing to GTD_GetHook() **/

#define GTDH_IMAGE 1
#define GTDH_TREE 2
#define GTDH_IFFSTREAM 3

/** data for GTDH_IFFSTREAM, set Hook's h_data to this structure **/

struct IFFStreamHookData
{
  APTR  is_Pool;        /* a memory pool, buffer will be AllocMem()ed if NULL */
  UBYTE *is_Buffer;     /* pointer to the buffer */
  ULONG is_Size;        /* size of the buffer */
  ULONG is_Position;    /* current stream position */
};


/********************* BOOPSI gadgets *********************/

#define BOOPSI_KIND 1000            /* GTD_AddGadget() - Type */

#define GMR_HANDLEYOURSELF (~0L)    /* GTD_HandleInput() return value */

#define GM_OBJECTDRAG   (GTDA_TagBase + 1000)    /* see structures below */
#define GM_OBJECTDROP   (GTDA_TagBase + 1001)
#define GM_RENDERDRAG   (GTDA_TagBase + 1002)

struct gpObjectDrag
{
  ULONG  MethodID;
  struct ObjectDescription *gpod_Object;
  struct Gadget *gpod_Source;      /* pointer to the source gadget */
  struct
  {
    WORD X,Y;                      /* mouse coordinates */
  }      gpod_Mouse;
};

/* if GM_OBJECTDRAG is invoked you should return one of these values
 * to report gtdrag that you could make use of it (to speed up things)
 */

#define GMR_REJECTOBJECT 1
#define GMR_ACCEPTOBJECT 2
#define GMR_UPDATE 4               /* please update me (GM_RENDERDRAG will be invoked) */
#define GMR_FINAL 8                /* store the result and do not ask again */


struct gpObjectDrop
{
  ULONG  MethodID;
  struct DropMessage *gpod_Message;
  ULONG  gpod_Qualifier;
};


struct gpRenderDrag
{
  ULONG  MethodID;
  struct GadgetInfo *gprd_GInfo;   /* gadget context */
  struct RastPort *gprd_RPort;     /* already for use */
  ULONG  gprd_Mode;                /* one of the GRENDER_xxx */
  struct
  {
    WORD X,Y;                      /* mouse coordinates */
  }      gprd_Mouse;
};

#define GRENDER_HIGHLIGHT 0        /* highlight yourself */
#define GRENDER_DELETE 1           /* delete all highlights */
#define GRENDER_INTERIM 2          /* refreshing between two GRENDER_HIGHLIGHT */

/* You have to return TRUE if you processed the rendering yourself,
 * otherwise gtdrag renders the standard highlighting.
 * Returning FALSE will also let gtdrag stop sending you GM_OBJECTDRAG
 * messages for the current drag.
 */



                     /*************************/
/********************* additional structures **********************\
**                  **************************                    **
**                                                                **
** The additional structures provide special rendering options in **
** listviews which are supported by gtdrag. The CallBack-Hooks    **
** necessary to display these are reachable via the API.          **
** See GTD_GetHook().                                             **
**                                                                **
\******************************************************************/


/********************* ImageNode *********************/

/* The ImageNode structure is used to have both text and images in a listview.
 * A render hook for this type is provided. It is not a must!
 */

struct ImageNode
{
  struct ImageNode *in_Succ;
  struct ImageNode *in_Pred;
  UBYTE  in_Type;
  BYTE   in_Pri;
  STRPTR in_Name;
  struct Image *in_Image;
};


/********************* Tree Structures *********************/

/* The TreeNode structure provides the possibility of displaying trees
 * and images within a listview. A special tree hook is included.
 */

struct TreeList
{
  struct MinList tl_View;
  struct MinList tl_Tree;
};

struct TreeNode
{
  struct ImageNode tn_Node;
  struct MinNode tn_ViewNode;
  struct MinList tn_Nodes;
  ULONG  tn_DepthLines;
  UBYTE  tn_Depth;
  UWORD  tn_Flags;
  WORD   tn_X,tn_Y;
  APTR   tn_Special;
};

#define TNF_NONE 0
#define TNF_CONTAINER 1
#define TNF_OPEN 2
#define TNF_ADD 4
#define TNF_REPLACE 8
#define TNF_LAST 16          /* last node in group */
#define TNF_STATIC 32        /* can't move node */
#define TNF_NOSUBDIRS 64     /* can't create sub-directory (this flag is for you only) */
#define TNF_SORT 256         /* sort by name (AddTreeNode() only) */
#define TNF_HIGHLIGHTED 512  /* highlight name */


/* from the ViewNode to the TreeNode */
#define TREENODE(ln) ((struct TreeNode *)((UBYTE *)ln - sizeof(struct ImageNode)))

/* size of the knobs */
#define TREEKNOBSIZE 6

/* is the mouse pointer over the tree-knob? */
#define MouseOverTreeKnob(tn,h,msg) ((tn)->tn_X != -1 && (msg)->MouseX >= (tn)->tn_X && (msg)->MouseY >= (tn)->tn_Y+h && (msg)->MouseX <= (tn)->tn_X+TREEKNOBSIZE && (msg)->MouseY <= (tn)->tn_Y+TREEKNOBSIZE+h)


#endif  /* LIBRARIES_GTDRAG_H */
