EXPORT(sqInt) primitiveGetItemMark(void) { CharParameter aCharacter; MenuHandle menuHandle; sqInt menuHandleOop; sqInt anInteger; sqInt _return_value; menuHandleOop = interpreterProxy->stackValue(1); anInteger = interpreterProxy->stackIntegerValue(0); if (interpreterProxy->failed()) { return null; } menuHandle = ((MenuHandle) (interpreterProxy->positive64BitValueOf(menuHandleOop))); if (!(ioCheckMenuHandle(menuHandle))) { _return_value = interpreterProxy->success(0); if (interpreterProxy->failed()) { return null; } interpreterProxy->popthenPush(3, _return_value); return null; } aCharacter = 0; GetItemMark(menuHandle,anInteger,&aCharacter); _return_value = interpreterProxy->integerObjectOf(aCharacter); if (interpreterProxy->failed()) { return null; } interpreterProxy->popthenPush(3, _return_value); return null; }
pascal void main(short message,MenuHandle theMenu,Rect *menuRect,Point hitPt,short *whichItem) #endif { short i,j; short currentItem; Rect r; OSErr err; long response; #if TARGET_API_MAC_CARBON MenuTrackingData *trackingData; HiliteMenuItemData *hiliteData; #endif switch (message) { case kMenuDrawMsg: /* メニューの描画 */ err=Gestalt(gestaltAppearanceAttr,&response); if (err==noErr && (response & (kGestaltMask << gestaltAppearanceExists))) { /* Appearance Managerのバージョンが1.0.1以降かどうか */ err=Gestalt(gestaltAppearanceVersion,&response); if (err==noErr && response>=0x0101) #if powerc if (DrawThemeMenuBackground != nil) #endif err=DrawThemeMenuBackground(menuRect,kThemeMenuTypePopUp); } /* チェック */ for (i=0; i<kRows; i++) for (j=0; j<kColumns; j++) { short markChar; GetItemRect(&r,menuRect,i*kColumns+j); DrawItem(&r,i,j); GetItemMark(theMenu,i*kColumns+j+1,&markChar); if (markChar != noMark) { InsetRect(&r,2,2); PenMode(srcXor); FrameRect(&r); PenNormal(); } } break; #if TARGET_API_MAC_CARBON case kMenuFindItemMsg: trackingData=(MenuTrackingData *)whichItem; currentItem=0; if (PtInRect(hitPt,menuRect)) { for (i=0; i<kRows; i++) for (j=0; j<kColumns; j++) { GetItemRect(&r,menuRect,i*kColumns+j); if (PtInRect(hitPt,&r)) { currentItem=i*kColumns+j+1; break; } } } trackingData->itemSelected = currentItem; trackingData->itemUnderMouse = currentItem; break; case kMenuHiliteItemMsg: hiliteData=(HiliteMenuItemData *)whichItem; if (hiliteData->previousItem != 0) { GetItemRect(&r,menuRect,hiliteData->previousItem-1); InsetRect(&r,1,1); PenMode(srcXor); FrameRect(&r); PenNormal(); } if (hiliteData->newItem != 0) { GetItemRect(&r,menuRect,hiliteData->newItem-1); InsetRect(&r,1,1); PenMode(srcXor); FrameRect(&r); PenNormal(); } break; #else case mChooseMsg: /* メニューの選択(反転) */ currentItem=0; if (PtInRect(hitPt,menuRect)) { for (i=0; i<kRows; i++) for (j=0; j<kColumns; j++) { GetItemRect(&r,menuRect,i*kColumns+j); if (PtInRect(hitPt,&r)) { currentItem=i*kColumns+j+1; break; } } } if (currentItem!=*whichItem) { if (currentItem!=0) { GetItemRect(&r,menuRect,currentItem-1); InsetRect(&r,1,1); PenMode(srcXor); FrameRect(&r); PenNormal(); } if (*whichItem!=0) { GetItemRect(&r,menuRect,*whichItem-1); InsetRect(&r,1,1); PenMode(srcXor); FrameRect(&r); PenNormal(); } *whichItem=currentItem; } break; #endif case kMenuSizeMsg: /* メニューのサイズを設定 */ #if TARGET_API_MAC_CARBON SetMenuWidth(theMenu,kRows*kItemWidth); SetMenuHeight(theMenu,kColumns*kItemHeight); #else (**theMenu).menuWidth=kRows*kItemWidth; (**theMenu).menuHeight=kColumns*kItemHeight; #endif break; case kMenuPopUpMsg: /* ポップアップのRectを計算 */ /* theMenu メニューへのハンドル whichItem 最初に選ばれているアイテム hitPt ポップアップメニューの左上 menuRect ポップアップのRectを入れて返す */ /* なぜかhitPtのhとvは入れ代わっている */ SetRect(menuRect,hitPt.v,hitPt.h,hitPt.v+kRows*kItemWidth,hitPt.h+kColumns*kItemHeight); break; case kMenuThemeSavvyMsg: *whichItem=kThemeSavvyMenuResponse; break; } }
bool PopupMenu::isItemChecked(S32 pos) { CharParameter mark; GetItemMark(mData->mMenu, pos, &mark); return (mark == checkMark); }