/*
 	File:		Lists.h
 
 	Contains:	List Manager Interfaces.
 
 	Version:	Technology:	Mac OS 8
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1985-1999 by Apple Computer, Inc., all rights reserved
 
 	Bugs?:		For bug reports, consult the following page on
 				the World Wide Web:
 
 					http://developer.apple.com/bugreporter/
 
*/
#ifndef __LISTS__
#define __LISTS__

#ifndef __MACTYPES__
	#include <MacTypes.h>
#endif

#ifndef __CONTROLS__
	#include <Controls.h>
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
	#pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
	#pragma pack(2)
#endif

typedef Point 							Cell;
typedef Rect 							ListBounds;
typedef char 							DataArray[32001];
typedef char *							DataPtr;
typedef DataPtr *						DataHandle;
typedef CALLBACK_API( short , ListSearchProcPtr )(Ptr aPtr, Ptr bPtr, short aLen, short bLen);
typedef CALLBACK_API( Boolean , ListClickLoopProcPtr )(void );
/*
	WARNING: ListClickLoopProcPtr uses register based parameters under classic 68k
			 and cannot be written in a high-level language without 
			 the help of mixed mode or assembly glue.
*/
typedef STACK_UPP_TYPE(ListSearchProcPtr) 						ListSearchUPP;
typedef REGISTER_UPP_TYPE(ListClickLoopProcPtr) 				ListClickLoopUPP;
#if !TARGET_OS_MAC
/* QuickTime 3.0 */
typedef long 							ListNotification;
enum {
	listNotifyNothing			= FOUR_CHAR_CODE('nada'),		/* No (null) notification*/
	listNotifyClick				= FOUR_CHAR_CODE('clik'),		/* Control was clicked*/
	listNotifyDoubleClick		= FOUR_CHAR_CODE('dblc'),		/* Control was double-clicked*/
	listNotifyPreClick			= FOUR_CHAR_CODE('pclk')		/* Control about to be clicked*/
};

#endif  /* !TARGET_OS_MAC */


struct ListRec {
	Rect 							rView;
	GrafPtr 						port;
	Point 							indent;
	Point 							cellSize;
	ListBounds 						visible;
	ControlHandle 					vScroll;
	ControlHandle 					hScroll;
	SInt8 							selFlags;
	Boolean 						lActive;
	SInt8 							lReserved;
	SInt8 							listFlags;
	long 							clikTime;
	Point 							clikLoc;
	Point 							mouseLoc;
	ListClickLoopUPP 				lClickLoop;
	Cell 							lastClick;
	long 							refCon;
	Handle 							listDefProc;
	Handle 							userHandle;
	ListBounds 						dataBounds;
	DataHandle 						cells;
	short 							maxIndex;
	short 							cellArray[1];
};
typedef struct ListRec					ListRec;

typedef ListRec *						ListPtr;
typedef ListPtr *						ListHandle;
/* ListRef is obsolete.  Use ListHandle. */
typedef ListHandle 						ListRef;


enum {
																/* ListRec.listFlags bits*/
	lDoVAutoscrollBit			= 1,
	lDoHAutoscrollBit			= 0
};

enum {
																/* ListRec.listFlags masks*/
	lDoVAutoscroll				= 2,
	lDoHAutoscroll				= 1
};


enum {
																/* ListRec.selFlags bits*/
	lOnlyOneBit					= 7,
	lExtendDragBit				= 6,
	lNoDisjointBit				= 5,
	lNoExtendBit				= 4,
	lNoRectBit					= 3,
	lUseSenseBit				= 2,
	lNoNilHiliteBit				= 1
};


enum {
																/* ListRec.selFlags masks*/
	lOnlyOne					= -128,
	lExtendDrag					= 64,
	lNoDisjoint					= 32,
	lNoExtend					= 16,
	lNoRect						= 8,
	lUseSense					= 4,
	lNoNilHilite				= 2
};


enum {
																/* LDEF messages*/
	lInitMsg					= 0,
	lDrawMsg					= 1,
	lHiliteMsg					= 2,
	lCloseMsg					= 3
};




typedef CALLBACK_API( void , ListDefProcPtr )(short lMessage, Boolean lSelect, Rect *lRect, Cell lCell, short lDataOffset, short lDataLen, ListHandle lHandle);
typedef STACK_UPP_TYPE(ListDefProcPtr) 							ListDefUPP;
#if OPAQUE_UPP_TYPES
	EXTERN_API(ListSearchUPP)
	NewListSearchUPP			   (ListSearchProcPtr		userRoutine);

	EXTERN_API(ListClickLoopUPP)
	NewListClickLoopUPP			   (ListClickLoopProcPtr	userRoutine);

	EXTERN_API(ListDefUPP)
	NewListDefUPP				   (ListDefProcPtr			userRoutine);

	EXTERN_API(void)
	DisposeListSearchUPP		   (ListSearchUPP			userUPP);

	EXTERN_API(void)
	DisposeListClickLoopUPP		   (ListClickLoopUPP		userUPP);

	EXTERN_API(void)
	DisposeListDefUPP			   (ListDefUPP				userUPP);

	EXTERN_API(short)
	InvokeListSearchUPP			   (Ptr						aPtr,
									Ptr						bPtr,
									short					aLen,
									short					bLen,
									ListSearchUPP			userUPP);

	EXTERN_API(Boolean)
	InvokeListClickLoopUPP		   (ListClickLoopUPP		userUPP);

	EXTERN_API(void)
	InvokeListDefUPP			   (short					lMessage,
									Boolean					lSelect,
									Rect *					lRect,
									Cell					lCell,
									short					lDataOffset,
									short					lDataLen,
									ListHandle				lHandle,
									ListDefUPP				userUPP);

#else
	enum { uppListSearchProcInfo = 0x00002BE0 }; 					/* pascal 2_bytes Func(4_bytes, 4_bytes, 2_bytes, 2_bytes) */
	enum { uppListClickLoopProcInfo = 0x00000012 }; 				/* register 1_byte:D0 Func() */
	enum { uppListDefProcInfo = 0x000EBD80 }; 						/* pascal no_return_value Func(2_bytes, 1_byte, 4_bytes, 4_bytes, 2_bytes, 2_bytes, 4_bytes) */
	#define NewListSearchUPP(userRoutine) 							(ListSearchUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppListSearchProcInfo, GetCurrentArchitecture())
	#define NewListClickLoopUPP(userRoutine) 						(ListClickLoopUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppListClickLoopProcInfo, GetCurrentArchitecture())
	#define NewListDefUPP(userRoutine) 								(ListDefUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppListDefProcInfo, GetCurrentArchitecture())
	#define DisposeListSearchUPP(userUPP) 							DisposeRoutineDescriptor(userUPP)
	#define DisposeListClickLoopUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define DisposeListDefUPP(userUPP) 								DisposeRoutineDescriptor(userUPP)
	#define InvokeListSearchUPP(aPtr, bPtr, aLen, bLen, userUPP) 	(short)CALL_FOUR_PARAMETER_UPP((userUPP), uppListSearchProcInfo, (aPtr), (bPtr), (aLen), (bLen))
	#if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
	#pragma parameter __D0 InvokeListClickLoopUPP(__A0)
	Boolean InvokeListClickLoopUPP(ListClickLoopUPP userUPP) = 0x4E90;
	#else
		#define InvokeListClickLoopUPP(userUPP) 						(Boolean)CALL_ZERO_PARAMETER_UPP((userUPP), uppListClickLoopProcInfo)
	#endif
	#define InvokeListDefUPP(lMessage, lSelect, lRect, lCell, lDataOffset, lDataLen, lHandle, userUPP)  CALL_SEVEN_PARAMETER_UPP((userUPP), uppListDefProcInfo, (lMessage), (lSelect), (lRect), (lCell), (lDataOffset), (lDataLen), (lHandle))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewListSearchProc(userRoutine) 							NewListSearchUPP(userRoutine)
#define NewListClickLoopProc(userRoutine) 						NewListClickLoopUPP(userRoutine)
#define NewListDefProc(userRoutine) 							NewListDefUPP(userRoutine)
#define CallListSearchProc(userRoutine, aPtr, bPtr, aLen, bLen)	InvokeListSearchUPP(aPtr, bPtr, aLen, bLen, userRoutine)
#define CallListClickLoopProc(userRoutine)						InvokeListClickLoopUPP(userRoutine)
#define CallListDefProc(userRoutine, lMessage, lSelect, lRect, lCell, lDataOffset, lDataLen, lHandle) InvokeListDefUPP(lMessage, lSelect, lRect, lCell, lDataOffset, lDataLen, lHandle, userRoutine)
enum {
	kListDefUserProcType		= 0,
	kListDefStandardTextType	= 1,
	kListDefStandardIconType	= 2
};

typedef UInt32 							ListDefType;

struct ListDefSpec {
	ListDefType 					defType;
	union {
		ListDefUPP 						userProc;
	} 								u;
};
typedef struct ListDefSpec				ListDefSpec;
EXTERN_API( OSStatus )
CreateCustomList				(const Rect *			rView,
								 const ListBounds *		dataBounds,
								 Point 					cellSize,
								 const ListDefSpec *	theSpec,
								 WindowPtr 				theWindow,
								 Boolean 				drawIt,
								 Boolean 				hasGrow,
								 Boolean 				scrollHoriz,
								 Boolean 				scrollVert,
								 ListHandle *			outList);


#if !TARGET_OS_MAC
/* QuickTime 3.0 */
typedef CALLBACK_API( void , ListNotificationProcPtr )(ListHandle theList, ListNotification notification, long param);

typedef ListNotificationProcPtr 		ListNotificationUPP;
EXTERN_API_C( void )
LSetNotificationCallback		(ListNotificationProcPtr  callBack,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
GetListVisibleBounds			(ListHandle 			theList,
								 Rect *					visibleBounds);

#endif  /* !TARGET_OS_MAC */

EXTERN_API( ListHandle )
LNew							(const Rect *			rView,
								 const ListBounds *		dataBounds,
								 Point 					cSize,
								 short 					theProc,
								 WindowPtr 				theWindow,
								 Boolean 				drawIt,
								 Boolean 				hasGrow,
								 Boolean 				scrollHoriz,
								 Boolean 				scrollVert)							THREEWORDINLINE(0x3F3C, 0x0044, 0xA9E7);

EXTERN_API( void )
LDispose						(ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0028, 0xA9E7);

EXTERN_API( short )
LAddColumn						(short 					count,
								 short 					colNum,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0004, 0xA9E7);

EXTERN_API( short )
LAddRow							(short 					count,
								 short 					rowNum,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0008, 0xA9E7);

EXTERN_API( void )
LDelColumn						(short 					count,
								 short 					colNum,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0020, 0xA9E7);

EXTERN_API( void )
LDelRow							(short 					count,
								 short 					rowNum,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0024, 0xA9E7);

EXTERN_API( Boolean )
LGetSelect						(Boolean 				next,
								 Cell *					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x003C, 0xA9E7);

EXTERN_API( Cell )
LLastClick						(ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0040, 0xA9E7);

EXTERN_API( Boolean )
LNextCell						(Boolean 				hNext,
								 Boolean 				vNext,
								 Cell *					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0048, 0xA9E7);

EXTERN_API( Boolean )
LSearch							(const void *			dataPtr,
								 short 					dataLen,
								 ListSearchUPP 			searchProc,
								 Cell *					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0054, 0xA9E7);

EXTERN_API( void )
LSize							(short 					listWidth,
								 short 					listHeight,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0060, 0xA9E7);

EXTERN_API( void )
LSetDrawingMode					(Boolean 				drawIt,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x002C, 0xA9E7);

EXTERN_API( void )
LScroll							(short 					dCols,
								 short 					dRows,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0050, 0xA9E7);

EXTERN_API( void )
LAutoScroll						(ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0010, 0xA9E7);

EXTERN_API( void )
LUpdate							(RgnHandle 				theRgn,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0064, 0xA9E7);

EXTERN_API( void )
LActivate						(Boolean 				act,
								 ListHandle 			lHandle)							TWOWORDINLINE(0x4267, 0xA9E7);

EXTERN_API( void )
LCellSize						(Point 					cSize,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0014, 0xA9E7);

EXTERN_API( Boolean )
LClick							(Point 					pt,
								 short 					modifiers,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0018, 0xA9E7);

EXTERN_API( void )
LAddToCell						(const void *			dataPtr,
								 short 					dataLen,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x000C, 0xA9E7);

EXTERN_API( void )
LClrCell						(Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x001C, 0xA9E7);

EXTERN_API( void )
LGetCell						(void *					dataPtr,
								 short *				dataLen,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0038, 0xA9E7);

EXTERN_API( void )
LRect							(Rect *					cellRect,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x004C, 0xA9E7);

EXTERN_API( void )
LSetCell						(const void *			dataPtr,
								 short 					dataLen,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0058, 0xA9E7);

EXTERN_API( void )
LSetSelect						(Boolean 				setIt,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x005C, 0xA9E7);

EXTERN_API( void )
LDraw							(Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0030, 0xA9E7);

EXTERN_API( void )
LGetCellDataLocation			(short *				offset,
								 short *				len,
								 Cell 					theCell,
								 ListHandle 			lHandle)							THREEWORDINLINE(0x3F3C, 0x0034, 0xA9E7);

#if CALL_NOT_IN_CARBON
EXTERN_API( OSErr )
SetListDefinitionProc			(SInt16 				resID,
								 ListDefUPP 			defProc);

#endif  /* CALL_NOT_IN_CARBON */

#if !TARGET_OS_MAC
/* QuickTime 3.0 */
EXTERN_API_C( void )
LSetLDEF						(ListDefProcPtr 		proc,
								 ListRef 				lHandle);

#endif  /* !TARGET_OS_MAC */

EXTERN_API_C( void )
laddtocell						(const void *			dataPtr,
								 short 					dataLen,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lclrcell						(const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lgetcelldatalocation			(short *				offset,
								 short *				len,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lgetcell						(void *					dataPtr,
								 short *				dataLen,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( ListHandle )
lnew							(const Rect *			rView,
								 const ListBounds *		dataBounds,
								 Point *				cSize,
								 short 					theProc,
								 WindowPtr 				theWindow,
								 Boolean 				drawIt,
								 Boolean 				hasGrow,
								 Boolean 				scrollHoriz,
								 Boolean 				scrollVert);

EXTERN_API_C( void )
lrect							(Rect *					cellRect,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lsetcell						(const void *			dataPtr,
								 short 					dataLen,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lsetselect						(Boolean 				setIt,
								 const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
ldraw							(const Cell *			theCell,
								 ListHandle 			lHandle);

EXTERN_API_C( Boolean )
lclick							(Point *				pt,
								 short 					modifiers,
								 ListHandle 			lHandle);

EXTERN_API_C( void )
lcellsize						(Point *				cSize,
								 ListHandle 			lHandle);

#if OLDROUTINENAMES
#define LDoDraw(drawIt, lHandle) LSetDrawingMode(drawIt, lHandle)
#define LFind(offset, len, theCell, lHandle) LGetCellDataLocation(offset, len, theCell, lHandle)
#if CGLUESUPPORTED
#define lfind(offset, len, theCell, lHandle) lgetcelldatalocation(offset, len, theCell, lHandle)
#endif
#endif  /* OLDROUTINENAMES */

#if ACCESSOR_CALLS_ARE_FUNCTIONS
/* Getters */
EXTERN_API( Rect *)
GetListViewBounds				(ListRef 				list,
								 Rect *					view);

EXTERN_API( CGrafPtr )
GetListPort						(ListRef 				list);

EXTERN_API( Point *)
GetListCellIndent				(ListRef 				list,
								 Point *				indent);

EXTERN_API( Point *)
GetListCellSize					(ListRef 				list,
								 Point *				size);

EXTERN_API( ListBounds *)
GetListVisibleCells				(ListRef 				list,
								 ListBounds *			visible);

EXTERN_API( ControlHandle )
GetListVerticalScrollBar		(ListRef 				list);

EXTERN_API( ControlHandle )
GetListHorizontalScrollBar		(ListRef 				list);

EXTERN_API( Boolean )
GetListActive					(ListRef 				list);

EXTERN_API( SInt32 )
GetListClickTime				(ListRef 				list);

EXTERN_API( Point *)
GetListClickLocation			(ListRef 				list,
								 Point *				click);

EXTERN_API( Point *)
GetListMouseLocation			(ListRef 				list,
								 Point *				mouse);

EXTERN_API( ListClickLoopUPP )
GetListClickLoop				(ListRef 				list);

EXTERN_API( SInt32 )
GetListRefCon					(ListRef 				list);

EXTERN_API( Handle )
GetListDefinition				(ListRef 				list);

EXTERN_API( Handle )
GetListUserHandle				(ListRef 				list);

EXTERN_API( ListBounds *)
GetListDataBounds				(ListRef 				list,
								 ListBounds *			bounds);

EXTERN_API( DataHandle )
GetListDataHandle				(ListRef 				list);

EXTERN_API( OptionBits )
GetListFlags					(ListRef 				list);

EXTERN_API( OptionBits )
GetListSelectionFlags			(ListRef 				list);

/* Setters */
EXTERN_API( void )
SetListViewBounds				(ListRef 				list,
								 const Rect *			view);

EXTERN_API( void )
SetListPort						(ListRef 				list,
								 CGrafPtr 				port);

EXTERN_API( void )
SetListCellIndent				(ListRef 				list,
								 Point *				indent);

EXTERN_API( void )
SetListClickTime				(ListRef 				list,
								 SInt32 				time);

EXTERN_API( void )
SetListClickLoop				(ListRef 				list,
								 ListClickLoopUPP 		clickLoop);

EXTERN_API( void )
SetListLastClick				(ListRef 				list,
								 Cell *					lastClick);

EXTERN_API( void )
SetListRefCon					(ListRef 				list,
								 SInt32 				refCon);

EXTERN_API( void )
SetListUserHandle				(ListRef 				list,
								 Handle 				userHandle);

EXTERN_API( void )
SetListFlags					(ListRef 				list,
								 OptionBits 			listFlags);

EXTERN_API( void )
SetListSelectionFlags			(ListRef 				list,
								 OptionBits 			selectionFlags);

/* WARNING: These may go away in a future build.  Beware! */
EXTERN_API( void )
SetListDefinition				(ListRef 				list,
								 Handle 				listDefProc);

EXTERN_API( void )
SetListCellSize					(ListRef 				list,
								 Point *				size);

EXTERN_API( void )
SetListHorizontalScrollBar		(ListRef 				list,
								 ControlHandle 			hScroll);

EXTERN_API( void )
SetListVerticalScrollBar		(ListRef 				list,
								 ControlHandle 			vScroll);

EXTERN_API( void )
SetListVisibleCells				(ListRef 				list,
								 ListBounds *			visible);

#endif  /* ACCESSOR_CALLS_ARE_FUNCTIONS */


#if PRAGMA_STRUCT_ALIGN
	#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
	#pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __LISTS__ */

