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; }
/* 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); }