//	============================================================================
//	¥¥¥	QAP_Assist.h
//	============================================================================
//		QA Partner/Macintosh Driver Assistance Hook Header 
//		
//		Copyright © 1993-1997 Segue Software, Inc.
//		All Rights Reserved.
//		
//		QA PARTNER RELEASE VERSION 4.0 BETA 1
//		THIS IS A BETA RELEASE.  THIS SOFTWARE MAY HAVE BUGS.  THIS SOFTWARE MAY CHANGE BEFORE FINAL RELEASE.




#ifndef _MAC	//¥NETSCAPE: added these lines
#define _MAC
#include <LTableView.h>
#endif

#ifndef __QAP_ASSIST_H__
#define __QAP_ASSIST_H__

#if !defined (WIN32) || defined (_MAC)
#if defined (WIN32)
#  include "windows.h"
#  include "MacStubs.h"
#  include "types.h"

#  include <macname1.h>
#  include <controls.h>
#  include <devices.h>
#  include <files.h>
#  include <mixedMode.h>
#  include <processe.h>
#  include <textEdit.h>
#  include <macname2.h>
#endif

//¥NETSCAPE: added this definition
#define QAP_BUILD			0

// The internal name of the QA Partner 4.0 driver
#define QAP_DRIVER_NAME     "\p.QAP40"

// The PBControl code to send the driver to set the assist hook
#define QAP_SET_ASSIST_HOOK 200

// The return value you can use if you're not ready to assist the driver
#define QAP_CALL_ME_BACK    -1

// Special "index" values for kQAPGetListContents
#define QAP_INDEX_ALL       -1
#define QAP_INDEX_SELECTED  -2

// 	Prototype for the assist hook function which you must supply
#ifdef __cplusplus
extern "C" {
#endif
	pascal short QAP_AssistHook (short selector, long handle, void *buffer, short val, long l_appA5);
#ifdef __cplusplus
}
#endif

typedef pascal short (*QAPAssistHookPtr)(short, long, void *, short, long);

// Mixed-Mode junk for QAP_AssistHook
#if GENERATINGPOWERPC || defined(powerc) || defined(__powerc) || defined (_MPPC_)
	enum
	{
		uppQAPAssistHookInfo = kPascalStackBased
		| RESULT_SIZE(SIZE_CODE(sizeof(short)))
		| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
		| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
		| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(void *)))
		| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(short)))
		| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(long)))			
	};

	typedef UniversalProcPtr QAPAssistHookUPP;
	#define CallQAPAssistHook(userRoutine, selector, handle, buffer, val, appA5)		\
		CallUniversalProc((UniversalProcPtr)(userRoutine), uppQAPAssistHookInfo, (short)(selector), (long)(handle), (void *)(buffer), (short)(val), (long)(appA5))
	#define NewQAPAssistHook(userRoutine)		\
		(QAPAssistHookUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppQAPAssistHookInfo, GetCurrentISA())
#else
	typedef QAPAssistHookPtr QAPAssistHookUPP;
	#define CallQAPAssistHook(userRoutine, selector, handle, buffer, val, appA5)		\
		(*(userRoutine))((short)(selector), (long)(handle), (void *)(buffer), (short)(val), (long)(appA5)) 
	#define NewQAPAssistHook(userRoutine)		\
		(QAPAssistHookUPP)(userRoutine)
#endif

// The selectors for the assist hook callback function
enum	
{
// 	selector                        handle          buffer                      val                     return
// 	--------                        ------          ---                         ---                     ------
	kQAPGetWindowContents,       // WindowPtr       wcinfo array ptr            max array elements      number of items returned
	kQAPGetTextInfo,             // from wcinfo     textinfo struct ptr         1                       0 if no error
	kQAPGetStaticText,           // from wcinfo     buffer ptr (Str255)         buffer size             0 if no erro
	kQAPGetListInfo,             // from wcinfo     listinfo struct ptr         1                       0 if no erro
	kQAPGetListContents,         // from wcinfo     buffer ptr                  index                   0 if no error
	kQAPGetCustomItemName,       // from wcinfo		buffer ptr (Str255)         0                       0 if no error
	kQAPGetCustomItemValue,		 // from wcinfo		buffer ptr (long *) 		0
	kQAPAppToForeground,         // NULL            NULL                        0                       0 if no error
	kQAPAppToBackground,         // NULL            NULL                        0                       0 if no error
	kQAPGetScrollbarInfo,
	kQAPWin32Service			 // HWND			ptr to paramblock			win32 Service Selector
 };
 
 // Selectors for win32 services
 
enum
{
	kQAP_CB_GetContents,
	kQAP_CB_GetAttr,
	kQAP_CB_GetInfo,
	kQAP_CB_GetItemText,
	kQAP_CB_GetText,
	kQAP_CB_IsSelected,
	kQAP_CB_SelectText,
	
	kQAP_LB_GetContents,
	kQAP_LB_GetAtPoint,
	kQAP_LB_GetAttr,
	kQAP_LB_GetInfo,
	kQAP_LB_GetItemInfo,
	kQAP_LB_GetItemText,
	kQAP_LB_IsSelected,

	kQAP_LV_GetContents,
	kQAP_LV_GetAttr,
	kQAP_LV_GetInfo,
	kQAP_LV_GetItemInfo,
	kQAP_LV_GetItemText,
	kQAP_LV_IsSelected,
	kQAP_LV_MakeVisible,
	
	kQAP_PGL_GetContents,
	kQAP_PGL_GetInfo,
	kQAP_PGL_GetItemRect,
	kQAP_PGL_GetItemText,
	kQAP_PGL_IsSelected,

	kQAP_SCL_GetLayout,
	kQAP_SCL_GetValues,
	
	kQAP_TV_GetContents,
	kQAP_TV_GetAtPoint,
	kQAP_TV_GetAttr,
	kQAP_TV_GetInfo,
	kQAP_TV_GetItemInfo,
	kQAP_TV_GetItemText,
	kQAP_TV_IsSelected,
	
	kQAP_UD_GetLayout,
	kQAP_UD_GetValues
};
 
enum	
{
	// Window type codes for the WCINFO 'type' field
	WT_COMPLETE = 0,	// marker for end of window item list (QAP will not add other items)
	WT_INCOMPLETE,		// marker for end of assist item list (QAP will add other items too)
	WT_CONTROL,			// Apple Control Manager control
	WT_TEXT_FIELD,		// Apple TextEdit Manager Text Field
	WT_LIST_BOX,		// Apple List Manager List Box
	WT_ASSIST_ITEM,		// Custom control (type indicated in 'cls' field)
	WT_IGNORE,			// Internal use
	
	// Window class codes for the WCINFO 'cls' field (only used for WT_ASSIST_ITEM items)
	
	WC_STATIC_TEXT = 256,
	WC_TEXT_FIELD,
	WC_LIST_BOX,
	WC_POPUP_LIST,
	WC_OWNER_DRAW,
	WC_ICON,
	WC_PICTURE,
	WC_CUSTOM,
	WC_PUSH_BUTTON,
	WC_CHECK_BOX,
	WC_RADIO_BUTTON,
	WC_COMBO_BOX,
	WC_LIST_VIEW,
	WC_NULL,
	WC_PAGE_LIST,
	WC_TRACK_BAR,
	WC_TREE_VIEW,
	WC_UP_DOWN,
	WC_SCROLL_BAR,
	WC_WINDOW			// Internal use
};
 
// Values for the 'flags' field of wcinfo 
#define WCF_DISABLED	0x01
#define WCF_NOCONTROL	0x02

 
#if PRAGMA_ALIGN_SUPPORTED
#   pragma options align = power
#endif
 
// The structure to be filled in for each control when the assist hook
// is called with the kQAPGetWindowContents selector

#define MAC_NAME_SIZE	32

typedef struct wcinfo
{
	Handle handle;
	Rect rect;
	short type;
	short cls;
	short flags;
	short pad;		
	char str[MAC_NAME_SIZE];
} WCINFO, *PWCINFO, **PPWCINFO;

// The structure to be filled for the given item when the assist hook
// is called with the kQAPGetTextInfo selector

typedef struct textinfo
{
	Handle handle;        // handle to the text if you want me to unlock it
	TEHandle hTE;         // handle to the TE associated with the text (for dialog items)
	Ptr ptr;              // pointer to the actual text (locked if a handle, please)
	short len;            // length of the actual text
	Boolean hasFocus;     // TRUE if typing right now would go to the text field
	char state;           // value for HSetState if <handle> is not NULL
	char buf[256];  	  // buffer to copy text into if you need a fixed place
} TEXTINFO, *PTEXTINFO, **PPTEXTINFO;

// The structure to be filled for the given item when the assist hook
// is called with the kQAPGetListInfo selector

typedef struct listinfo
{
	short itemCount;       // total number of items in the listbox
	short topIndex;        // 1-based index of top visible item in list
	short itemHeight;      // height of each list item, in pixels
	short visibleCount;    // count of visible list items
	ControlHandle vScroll; // ListBox's vertical scrollbar, or NULL
	Boolean isMultiSel;    // TRUE if cmd-click selects multiple items
	Boolean isExtendSel;   // TRUE if shift-click extends the selection range
	Boolean hasText;       // TRUE if the list items are textual
	Boolean reserved;       
} QAPLISTINFO, *PQAPLISTINFO, **PPQAPLISTINFO;

typedef struct scrollbarinfo
{
    long lPos;
    long lMin;
    long lMax;
    long lPageSize;
    long lIncrement;
    long lVertical;
    long lHasThumb;
    Point ptIncrArrow;
    Point ptDecrArrow;
    Point ptIncrPage;
    Point ptDecrPage;
    Point ptMinThumb;
    Point ptMaxThumb;	
} QAPSCROLLBARINFO, *PQAPSCROLLBARINFO, **PPQAPSCROLLBARINFO;

#if PRAGMA_ALIGN_SUPPORTED
#   pragma options align = reset
#endif

//¥NETSCAPE --- begin
class CQAPartnerTableMixin
{
public:
					CQAPartnerTableMixin(LTableView *);
			virtual	~CQAPartnerTableMixin();

	virtual void	QapGetListInfo (PQAPLISTINFO pInfo) = 0;
	virtual Ptr		QapAddCellToBuf(Ptr pBuf, Ptr pLimit, const STableCell& sTblCell) = 0;
	virtual short	QapGetListContents(Ptr pBuf, short index);

protected:
	LTableView *	mTableView;
};
//¥NETSCAPE --- end

#endif // !defined (_VC) || defined (_MAC)
#endif // __QAP_ASSIST_H__