summaryrefslogtreecommitdiff
path: root/sdk_hdrs/DropInPanel.h
blob: edee6e20a301ff635c4b7da0f63a069e1e166434 (plain)
1
/*
 *  DropInPanel.h - Drop-In Preferences Panel Interface for Metrowerks CodeWarrior�
 *
 *  Copyright � 1995 Metrowerks, Inc.  All rights reserved.
 *
 */

#ifndef __DROPINPANEL_H__
#define __DROPINPANEL_H__

#ifdef __MWERKS__
#	pragma once
#endif

#ifndef CW_STRICT_DIALOGS
#	define CW_STRICT_DIALOGS	0
#endif

#if macintosh
#ifndef F_PASCAL
#	define F_PASCAL(x) pascal x
#endif
#elif __sun__ || __linux__
#ifndef F_PASCAL
#	define F_PASCAL(x) x
#endif
#endif

/* system headers */
#ifndef __APPLEEVENTS__
#	include <AppleEvents.h>
#endif
#ifndef __CONTROLS__
#	include <Controls.h>
#endif
#ifndef __DIALOGS__
#	include <Dialogs.h>
#endif
#ifndef __DRAG__
#	include <Drag.h>
#endif

#ifndef __CWPlugins_H__
#	include "CWPlugins.h"
#endif

#ifdef	__MWERKS__
#pragma options align=mac68k
#endif

#ifdef	_MSC_VER
#pragma pack(push,2)
#endif

#ifdef __cplusplus
	extern "C" {
#endif

#if CW_USE_PRAGMA_IMPORT
#pragma import on
#endif

/* this is the current version number of the API documented herein */
#define DROPINPANELAPIVERSION_1	1							/* CW7 API version		*/
#define DROPINPANELAPIVERSION_2	2							/* intermediate version	*/
#define DROPINPANELAPIVERSION_3	3							/* CW8 API version		*/
#define DROPINPANELAPIVERSION_4	4							/* CW9 API version		*/
#define DROPINPANELAPIVERSION_5 5							/* CW10-CW Pro 1 version */
#define DROPINPANELAPIVERSION_6 6							/* CW Pro 2 version		*/
#define DROPINPANELAPIVERSION_7 7							/* CW Pro 3 version		*/
#define DROPINPANELAPIVERSION_8 8							/* CW Pro 4 version		*/
#define DROPINPANELAPIVERSION_9 9							/* CW Pro 5 version		*/
#define DROPINPANELAPIVERSION_10 10							/* CW Pro 6 version		*/
#define DROPINPANELAPIVERSION_11 11							/* CW Pro 7 version (listView Support) */
#define DROPINPANELAPIVERSION	DROPINPANELAPIVERSION_11	/* current API version	*/

/* error codes */
#define kBadPrefVersion			1000
#define kMissingPrefErr			1001
#define kSettingNotFoundErr		1002
#define kSettingTypeMismatchErr	1003
#define kInvalidCallbackErr		1004
#define kSettingOutOfRangeErr	1005

/* requests codes */
enum {
	reqInitPanel = -2,		/* (called when panel is loaded)						*/
	reqTermPanel = -1,		/* (called when panel is unloaded)						*/
	reqInitDialog = 0,		/* initialize panel's dialog state						*/
	reqTermDialog,			/* clean up panel's dialog state						*/
	reqPutData,				/* copy options data to dialog items					*/
	reqGetData,				/* copy dialog items to options data					*/
	reqFilter,				/* filter a dialog event for the panel					*/
	reqItemHit,				/* process an itemHit in the panel						*/
	reqAEGetPref,			/* get preference setting for AppleEvent request		*/
	reqAESetPref,			/* set preference setting from AppleEvent request		*/
	reqValidate,			/* tell if current settings force recompile or relink	*/
	reqGetFactory,			/* retrieve factory settings							*/
	reqUpdatePref,			/* verify and/or modify prefs to fit current version	*/
	reqUpdateProject,		/* (only sent to built-in panels)						*/
	reqSetupDebug,			/* change settings to reflect debugging status			*/
	reqRenameProject,		/* change settings that depend on project name			*/
	reqPrefsLoaded,			/* (only sent to built-in panels)						*/
	reqDrawCustomItem,		/* draw a custom item									*/
	reqActivateItem,		/* activate a custom item								*/
	reqDeactivateItem,		/* deactivate a custom item								*/
	reqHandleClick,			/* handle mouse down in an active custom item			*/
	reqHandleKey,			/* handle key down in an active custom item				*/
	reqFindStatus,			/* enable/disable menu items for a custom item			*/
	reqObeyCommand,			/* execute a menu command for a custom item				*/
	reqDragEnter,			/* the user is dragging into the given item				*/
	reqDragWithin,			/* the user is dragging within the given item			*/
	reqDragExit,			/* the user is dragging out of the given item			*/
	reqDragDrop,			/* the user dropped onto the given item					*/
	reqByteSwapData,		/* byte swap the fields in the prefs data				*/
	reqFirstLoad,			/* panel has been loaded for the first time				*/
	reqReadSettings,		/* read settings from IDE to construct pref data handle	*/
	reqWriteSettings,		/* write the individual settings from pref data handle	*/
	reqItemDoubleClick,		/* process an double clicked in the panel, currently implemented for listviews  */
	reqItemIsCellEditable	/* currently implemented for listviews, tells whether or not the listview is editable  */
};

/* menu command codes */
enum {
	menu_Cut = 1,
	menu_Copy,
	menu_Paste,
	menu_Clear,
	menu_SelectAll
};

/* Layout and bit flags for 'Flag' resource for panels 								*/
/*																					*/
/* For the version 3 of these resource, we renamed the 'apiversion' field to		*/
/* 'earliestCompatibleAPIVersion' and added the 'newestAPIVersion' field.			*/
/* This allows plugins to support more than one API version and therefore run		*/
/* under more than one version of the IDE.											*/

typedef struct PanelFlags {
	unsigned short	rsrcversion;		/*	version number of resource				*/
	CWDataType		dropintype;			/*	dropin type ('Comp', 'Link', 'Panl')	*/
										/*  earliest API support by this plugin		*/
	unsigned short	earliestCompatibleAPIVersion;
	unsigned long	dropinflags;		/*	capability flags (see enum below)		*/
	CWDataType		panelfamily;		/*	family of panel (linker, codegen, etc)	*/
	unsigned short	newestAPIVersion;	/*	newest API version supported			*/
	unsigned short	dataversion;		/*	version number of prefs data			*/
	unsigned short	panelscope;			/*	scope of panel (see enum below)			*/
} PanelFlags;

/* capability flags, as used in member dropinflags of PanelFlags struct				*/
enum {
	usesStrictAPI			= 1 << 31,			/* this panel is built with the	strict API	*/
	supportsByteSwapping	= 1 << 30,			/* this panel support the byte-swapping request */
	supportsTextSettings	= 1 << 29,			/* this panel supports the read & write settings requests */
	usesCrossPlatformAPI	= 1 << 28			/* uses the cross-platform API rather than Mac API */
	/* remaining flags are reserved for future use and should be zero-initialized	*/
};

/* panel scopes, as used in member panelscope of PanelFlags struct					*/
/*																					*/
/* The scope of a panel tells the IDE which settings window to display the panel.	*/
/* Currently, only panels for debugger plug-ins use panelScopeGlobal and only		*/
/* panels for VCS plug-ins use panelScopeProject. A panel for a compiler or linker	*/
/* must use panelScopeTarget.														*/

enum {
	panelScopeGlobal,	/*	this panel is scoped to the global preferences window	*/
	panelScopeProject,	/*	this panel is scoped to the VCS settings window			*/
	panelScopeTarget,	/* 	this panel is scoped to the target settings window		*/
	panelScopeRConn		/*	this panel is scoped to configure remote debugging connections */		
};

/* pre-defined panel families, used in panelfamily field of PanelFlags struct		*/

enum {
	panelFamilyProject		= CWFOURCHAR('p', 'r', 'o', 'j'),
	panelFamilyFrontEnd		= CWFOURCHAR('f', 'e', 'n', 'd'),
	panelFamilyBackEnd		= CWFOURCHAR('b', 'e', 'n', 'd'),
	panelFamilyBrowser		= CWFOURCHAR('b', 'r', 'o', 'w'),
	panelFamilyEditor		= CWFOURCHAR('e', 'd', 'i', 't'),
	panelFamilyDebugger		= CWFOURCHAR('d', 'b', 'u', 'g'),
	panelFamilyLinker		= CWFOURCHAR('l', 'i', 'n', 'k'),
	panelFamilyMisc			= CWFOURCHAR('*', '*', '*', '*')
};

typedef struct MWSetting* CWSettingID;
#define kNoSettingID 0

/* alias types */
#if CW_STRICT_DIALOGS
	typedef struct DummyDialog*	CWDialog;
#else
	typedef DialogPtr			CWDialog;
#endif

/* forward declarations */
typedef struct CWPanelCallbacks	CWPanelCallbacks;

/* parameter block -- this is passed to the dropin at each request */
typedef struct PanelParameterBlock {
	/* common to all dropins */
	long		request;			/* [->]  requested action (see below)		*/
	long		version;			/* [->]  version # of shell's API			*/
	void		*context;			/* [->]  reserved for use by shell			*/
	void		*storage;			/* [<->] reserved for use by the dropin		*/
	FSSpec		targetfile;			/* [->]  FSSpec of current project			*/
	
	/* specific to panels */
	CWDialog	dialog;				/* [->]  pointer to Preferences� dialog		*/
	Handle		originalPrefs;		/* [->]  panel's original options data		*/
	Handle		currentPrefs;		/* [<->] panel's current options data		*/
	Handle		factoryPrefs;		/* [<->] panel's "factory" options data		*/
	EventRecord	*event;				/* [->]  dialog event (for reqFilterEvent)	*/
	short		baseItems;			/* [->]  # of items in dialog shell			*/
	short		itemHit;			/* [<->] for reqFilterEvent and reqItemHit	*/
	Boolean		canRevert;			/* [<-]  enable Revert button				*/
	Boolean		canFactory;			/* [<-]  enable Factory button				*/
	Boolean		reset;				/* [<-]  access paths must be reset			*/
	Boolean		recompile;			/* [<-]  files must be recompiled			*/
	Boolean		relink;				/* [<-]  project must be relinked			*/
	AEKeyword	prefsKeyword;		/* [->]  for reqAEGetPref and reqAESetPref	*/
	AEDesc		prefsDesc;			/* [->]  for reqAESetPref					*/
	Boolean		debugOn;			/* [->]  turning on debugging?				*/
	FSSpec		oldtargfile;		/* [->]  previous project file FSSpec		*/
	
	/* version 2 API */
	CWPanelCallbacks*	callbacks;
	
	/* version 3 API */
	Boolean		reparse;			/* [<-]  project must be reparsed			*/
	
	/* version 4 API */
	DragReference	dragref;		/* [->]  for drag-related requests			*/
	Rect			dragrect;		/* [<-]  rect to track mouse in				*/
	Point			dragmouse;		/* [->]  mouse location during drag			*/
	
	/* version 5 API */
	unsigned char	toEndian;		/* [->]  for reqByteSwapData, the endian we are swapping to */
	
	/* CWPro 3 temporary placeholders for opaque references to prefs data. 
		These will be removed in Pro 4.
	*/
	CWMemHandle		originalPrefsMemHandle;
	CWMemHandle		currentPrefsMemHandle;
	CWMemHandle		factoryPrefsMemHandle;
	CWMemHandle		panelPrefsMemHandle;

	/* version 11 api */
	long 			listViewCellRow;			/* [->]  the cell row of the listView */
	long 			listViewCellCol;			/* [->]  the cell row of the listView */
	
} PanelParameterBlock, *PanelParameterBlockPtr;

typedef PanelParameterBlock		PanelParamBlk;
typedef PanelParameterBlockPtr	PanelParamBlkPtr;


/* callbacks to the IDE */
extern F_PASCAL(OSErr)	CWPanlAppendItems(PanelParamBlkPtr ppb, short ditlID);
extern F_PASCAL(OSErr)	CWPanlDrawPanelBox(PanelParamBlkPtr ppb, long whichItem, ConstStr255Param title);
extern F_PASCAL(OSErr)	CWPanlShowItem(PanelParamBlkPtr ppb, long whichItem, Boolean showIt);
extern F_PASCAL(OSErr)	CWPanlEnableItem(PanelParamBlkPtr ppb, long whichItem, Boolean enableIt);
extern F_PASCAL(OSErr)	CWPanlActivateItem(PanelParamBlkPtr ppb, long whichItem);
extern F_PASCAL(OSErr)	CWPanlGetItemValue(PanelParamBlkPtr ppb, long whichItem, long* value);
extern F_PASCAL(OSErr)	CWPanlSetItemValue(PanelParamBlkPtr ppb, long whichItem, long value);
extern F_PASCAL(OSErr)	CWPanlGetItemText(PanelParamBlkPtr ppb, long whichItem, StringPtr str, short maxLen);
extern F_PASCAL(OSErr)	CWPanlSetItemText(PanelParamBlkPtr ppb, long whichItem, ConstStr255Param str);
extern F_PASCAL(OSErr)	CWPanlGetPanelPrefs(PanelParamBlkPtr ppb, StringPtr inPanelName, Handle *prefs, Boolean* requiresByteSwap);
extern F_PASCAL(OSErr)	CWPanlGetItemRect(PanelParamBlkPtr ppb, long whichItem, Rect* rect);
extern F_PASCAL(OSErr)	CWPanlGetItemControl(PanelParamBlkPtr ppb, long whichItem, ControlRef* control);
extern F_PASCAL(OSErr)	CWPanlInvalItem(PanelParamBlkPtr ppb, long whichItem);
extern F_PASCAL(OSErr)	CWPanlValidItem(PanelParamBlkPtr ppb, long whichItem);
extern F_PASCAL(OSErr)	CWPanlGetMacPort(PanelParamBlkPtr ppb, GrafPtr* port);
extern F_PASCAL(OSErr)	CWPanlGetItemTextHandle(PanelParamBlkPtr ppb, long whichItem, Handle *text);
extern F_PASCAL(OSErr)	CWPanlSetItemTextHandle(PanelParamBlkPtr ppb, long whichItem, Handle text);
extern F_PASCAL(OSErr)	CWPanlGetItemData(PanelParamBlkPtr ppb, long whichItem, void *outData, long *outDataLength);
extern F_PASCAL(OSErr)	CWPanlSetItemData(PanelParamBlkPtr ppb, long whichItem, void *inData, long inDataLength);
extern F_PASCAL(OSErr)	CWPanlGetItemMaxLength(PanelParamBlkPtr ppb, long whichItem, short *outLength);
extern F_PASCAL(OSErr)	CWPanlSetItemMaxLength(PanelParamBlkPtr ppb, long whichItem, short inLength);
extern F_PASCAL(OSErr)	CWPanlChooseRelativePath(PanelParamBlkPtr ppb, CWRelativePath* path, Boolean isFolder, short filterCount, void* filterList, char* prompt);
extern F_PASCAL(OSErr)	CWPanlGetRelativePathString(PanelParamBlkPtr ppb, CWRelativePath* path, char* pathString, long* maxLength);

#if macintosh
extern F_PASCAL(OSErr)	CWPanlReadRelativePathAEDesc(PanelParamBlkPtr ppb, CWRelativePath* path, const AEDesc* desc);
extern F_PASCAL(OSErr)	CWPanlWriteRelativePathAEDesc(PanelParamBlkPtr ppb, const CWRelativePath* path, AEDesc* desc);
#endif

/* utility routines */
extern F_PASCAL(OSErr)	CWPanlDrawUserItemBox(DialogPtr dialog, short whichItem, ConstStr255Param title);
extern F_PASCAL(OSErr)	CWPanlInstallUserItem(PanelParamBlkPtr ppb, short whichItem, UserItemProcPtr proc);
extern F_PASCAL(OSErr)	CWPanlRemoveUserItem(PanelParamBlkPtr ppb, short whichItem);

/* reading and writing scalar settings */
extern F_PASCAL(OSErr)	CWPanlReadBooleanSetting(PanelParamBlkPtr ppb, const char* name, Boolean* value);
extern F_PASCAL(OSErr)	CWPanlReadIntegerSetting(PanelParamBlkPtr ppb, const char* name, long* value);
extern F_PASCAL(OSErr)	CWPanlReadFloatingPointSetting(PanelParamBlkPtr ppb, const char* name, double* value);
extern F_PASCAL(OSErr)	CWPanlReadStringSetting(PanelParamBlkPtr ppb, const char* name, const char** value);
extern F_PASCAL(OSErr)	CWPanlReadRelativePathSetting(PanelParamBlkPtr ppb, const char* name, CWRelativePath* value);

extern F_PASCAL(OSErr)	CWPanlWriteBooleanSetting(PanelParamBlkPtr ppb, const char* name, Boolean value);
extern F_PASCAL(OSErr)	CWPanlWriteIntegerSetting(PanelParamBlkPtr ppb, const char* name, long value);
extern F_PASCAL(OSErr)	CWPanlWriteFloatingPointSetting(PanelParamBlkPtr ppb, const char* name, double value);
extern F_PASCAL(OSErr)	CWPanlWriteStringSetting(PanelParamBlkPtr ppb, const char* name, const char* value);
extern F_PASCAL(OSErr)	CWPanlWriteRelativePathSetting(PanelParamBlkPtr ppb, const char* name, const CWRelativePath* value);

/* reading and writing array and structure settings */
extern F_PASCAL(OSErr)	CWPanlGetNamedSetting(PanelParamBlkPtr ppb, const char* name, CWSettingID* settingID);
extern F_PASCAL(OSErr)	CWPanlGetStructureSettingField(PanelParamBlkPtr ppb, CWSettingID settingID, const char* name, CWSettingID* fieldSettingID);
extern F_PASCAL(OSErr)	CWPanlGetArraySettingSize(PanelParamBlkPtr ppb, CWSettingID settingID, long* size);
extern F_PASCAL(OSErr)	CWPanlGetArraySettingElement(PanelParamBlkPtr ppb, CWSettingID settingID, long index, CWSettingID* elementSettingID);

extern F_PASCAL(OSErr)	CWPanlGetBooleanValue(PanelParamBlkPtr ppb, CWSettingID settingID, Boolean* value);
extern F_PASCAL(OSErr)	CWPanlGetIntegerValue(PanelParamBlkPtr ppb, CWSettingID settingID, long* value);
extern F_PASCAL(OSErr)	CWPanlGetFloatingPointValue(PanelParamBlkPtr ppb, CWSettingID settingID, double* value);
extern F_PASCAL(OSErr)	CWPanlGetStringValue(PanelParamBlkPtr ppb, CWSettingID settingID, const char** value);
extern F_PASCAL(OSErr)	CWPanlGetRelativePathValue(PanelParamBlkPtr ppb, CWSettingID settingID, CWRelativePath* value);

extern F_PASCAL(OSErr)	CWPanlSetBooleanValue(PanelParamBlkPtr ppb, CWSettingID settingID, Boolean value);
extern F_PASCAL(OSErr)	CWPanlSetIntegerValue(PanelParamBlkPtr ppb, CWSettingID settingID, long value);
extern F_PASCAL(OSErr)	CWPanlSetFloatingPointValue(PanelParamBlkPtr ppb, CWSettingID settingID, double value);
extern F_PASCAL(OSErr)	CWPanlSetStringValue(PanelParamBlkPtr ppb, CWSettingID settingID, const char* value);
extern F_PASCAL(OSErr)	CWPanlSetRelativePathValue(PanelParamBlkPtr ppb, CWSettingID settingID, const CWRelativePath* value);

#if CW_USE_PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
	}
#endif

#ifdef	__MWERKS__
#pragma options align=reset
#endif

#ifdef	_MSC_VER
#pragma pack(pop)
#endif

#endif	/* __DROPINPANEL_H__ */