AIErr addFilters( SPInterfaceMessage *message )
{
	AIErr error = kNoErr;
	unsigned char categoryStr[MAX_FILTER_NAME]; /* pascal string */
	unsigned char nameStr[MAX_FILTER_NAME];     /* pascal string */

	PlatformAddFilterData filterData;
	// AIMenuItemHandle menuItem; // include this when appropriate
	short	nIndex;
	short	filterIndex = 0;

	for (nIndex = 1; nIndex < kMaxFilters * 2 ; nIndex += FILTER_STRING_INC, filterIndex++) {
 		sADMBasic->GetIndexString( message->d.self, kFilterStrings, nIndex, (char*)categoryStr, MAX_FILTER_NAME );

		if (!categoryStr[0]) // first null category means no more filters
			break;

		sADMBasic->GetIndexString( message->d.self, kFilterStrings, (nIndex+1), (char*)nameStr, MAX_FILTER_NAME );

		SUctopstr( (char*)categoryStr );
		SUctopstr( (char*)nameStr );
		filterData.category = categoryStr;
		filterData.title = nameStr;

		error = sFilter->AddFilter( message->d.self, "Twirl Filter", &filterData, 
					0, &g->filters[filterIndex] );
		if ( error ) 
			goto errorTag;

/*		// include this when appropriate
		error = sFilter->GetFilterMenuItem(g->filters[filterIndex], &menuItem);
		if ( error ) 
			goto errorTag;
		
		error = sMenu->UpdateMenuItemAutomatically(menuItem, kAutoEnableMenuItemAction, 0, 0,
			kIfPath, 0, 0, 0);
		if ( error ) 
			goto errorTag;
*/
		}

	g->numFilters = filterIndex;
errorTag:

	return error;
}
AIErr addFileFormat( SPInterfaceMessage *message ) {
	AIErr error;
	PlatformAddFileFormatData affd;
	AIFileFormatHandle fileFormat;
	char fftitleStr[] = "Selection As Raster PICT";

	affd.type = 'PICT';
	affd.title = SUctopstr( fftitleStr );
	affd.titleOrder = 0;

	error = sFileFormat->AddFileFormat( message->d.self, "raster pict format",
				&affd, kFileFormatWrite | kFileFormatRead, &fileFormat );

	if (error)
		goto error;
	
error:
	return error;
}
extern AIErr addMenu( SPInterfaceMessage *message ) {

	AIErr error = kNoErr;

	// Add a menu item to the About SDK Plug-ins menu group.
	SDKAboutPluginsHelper aboutPluginsHelper;
	aboutPluginsHelper.AddAboutPluginsMenuItem(message, 
				kSDKDefAboutSDKCompanyPluginsGroupName, 
				ai::UnicodeString(kSDKDefAboutSDKCompanyPluginsGroupNameString), 
				"MenuPlay...", 
				&g->aboutPluginMenu);

	// Add other menus.
	AIMenuItemHandle		throwAwayAIMenu;
	AIPlatformAddMenuItemData throwAwayMenuData;
	AIMenuGroup				throwAwayMenuGroup;
	char strBuffer[255];
	
	#define kMenuPlayMenuGroup	"Menu Play Group"
	#define kSDKMenuGroup	"SDK Group"
	
	// First we create a normal plug-in menu to use a hierarchical root							
	throwAwayMenuData.groupName = "Window Utilities";
	
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 1, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );
  
	error = sMenu->AddMenuItem( message->d.self, kSDKMenuGroup, &throwAwayMenuData, 
								0, &throwAwayAIMenu );
	if ( error )
		goto error;

	// Now we declare the menu item a menu group
	sMenu->AddMenuGroupAsSubMenu( kSDKMenuGroup, 0, throwAwayAIMenu, &throwAwayMenuGroup );
	
	// Now we can add menu items to it.
	throwAwayMenuData.groupName = kSDKMenuGroup;
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 8, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );	

	error = sMenu->AddMenuItem( message->d.self, "Auto Update 1", &throwAwayMenuData, 0,
								&throwAwayAIMenu );
	if ( error )
		goto error;		

	// enabled for paths and no masks in the selection
	error = sMenu->UpdateMenuItemAutomatically( throwAwayAIMenu, kAutoEnableMenuItemAction,
				kIfPath | kIfGuide, kIfMask,
				0, 0,
				0, 0 );	 // don't care about other update options
		
	if ( error )
		goto error;	

	sMenu->AddMenuGroupAsSubMenu( kMenuPlayMenuGroup, 0, throwAwayAIMenu, &throwAwayMenuGroup );

	throwAwayMenuData.groupName = kMenuPlayMenuGroup;
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 2, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );	

	error = sMenu->AddMenuItem( message->d.self, "Menu Play", &throwAwayMenuData, 0,
								&throwAwayAIMenu );
	if ( error )
		goto error;		

	error = sMenu->UpdateMenuItemAutomatically( throwAwayAIMenu, kAutoEnableMenuItemAction,
				0, 0,	 // don't care about what's in artwork
				kIfGroup, // is selected and
				kIfTextPath,	 // are not selected
				0, 0 );	 // don't care about other update options
		
	if ( error )
		goto error;		
	


	// The second item just auto dims if the layer is locked or has locked objects.
	throwAwayMenuData.groupName = kMenuPlayMenuGroup;	
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 3, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );	
	error = sMenu->AddMenuItem( message->d.self, "Auto Update 2", &throwAwayMenuData, 0,
								&throwAwayAIMenu );
	if ( error )
		goto error;		
	error = sMenu->UpdateMenuItemAutomatically( throwAwayAIMenu, kAutoEnableMenuItemAction,
				0, 0,	 // don't care about what's in artwork
				0, // is selected and
				0,	 // are not selected
				kIfCurrentLayerIsEditable, // is true
				kIfAnyLockedObjects );	 // is false
						
	if ( error )
		goto error;		

	// The third item doesn't auto dim, but requests the update selector.
	// The automatic update option is the best way to handle menu updates.
	throwAwayMenuData.groupName = kMenuPlayMenuGroup;
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 4, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );

	error = sMenu->AddMenuItem( message->d.self, "Manual Update 1", &throwAwayMenuData, 
								kMenuItemWantsUpdateOption, &g->manualUpdateAIMenu );
	if ( error )
		goto error;		


	// Seperators work just like std. mac menus
	throwAwayMenuData.groupName = kMenuPlayMenuGroup;	
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 5, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );
	error = sMenu->AddMenuItem( message->d.self, "seperator", &throwAwayMenuData, 
								kMenuItemWantsUpdateOption, &throwAwayAIMenu );
	if ( error )
		goto error;		



	// These menus we'll actually make do something, in this case check and uncheck itself
	throwAwayMenuData.groupName = kMenuPlayMenuGroup;	
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 6, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );

	// We keep the AIMenuItemHandle to figure out which menu was selected later
	error = sMenu->AddMenuItem( message->d.self, "Check me", &throwAwayMenuData, 
								0, &g->checkMeAIMenu );
	if ( error )
		goto error;		

	//sMenu->SetItemCmd( g->checkMeAIMenu, 'u', kMenuItemCmdShiftModifier );
	g->checkMeChecked = false;


	// This menu will dim the above menu and change it's own icon
	throwAwayMenuData.groupName = kMenuPlayMenuGroup;	
	*strBuffer = '\0';
	error = sADMBasic->GetIndexString(message->d.self, kMenuStringResID, 7, strBuffer, sizeof(strBuffer));
	if (error)
		goto error;
	throwAwayMenuData.itemText = SUctopstr ( strBuffer );
	error = sMenu->AddMenuItem( message->d.self, "Disable Check Me", &throwAwayMenuData, 
								0, &g->multiDemoAIMenu );
	if ( error )
		goto error;		
	
	sMenu->SetItemIcon( g->multiDemoAIMenu, 2 );

	g->checkMeEnabled = true;




error:
	return error;





}
Пример #4
0
/* Converts strings to Postscript string format 
	(i.e. bracketed by parens and with appropriate special character codes 
*/
void SUpasToPostscriptStr( unsigned char dst, unsigned char src) {
	SUctopstr(strPS((char *) dst, (char *) SUptocstr((unsigned char *) src)));
	SUctopstr((char *) src);
	}