MenuStack.c
上传用户:duwei1288
上传日期:2009-12-27
资源大小:451k
文件大小:4k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #include "MenuStack.h"
  2. #include "MenuList.brh"
  3. #include "AEEModGen.h"
  4. #include "AEEAppGen.h"
  5. /////////////////////////////////////////////////////////////
  6. static boolean IMENUSTACK_MoveIntoSubMenu(IMenuStack* pStack);
  7. /////////////////////////////////////////////////////////////
  8. IMenuStack* IMENUSTACK_CreateInstance(TMenuItem* pItem,PFNMENUREDRAWHDL *pRedrawCb,PFNGETSELITEM *pGetSelCb)
  9. {
  10. IMenuStack* pStack=NULL;
  11. AEEApplet*  pApp=(AEEApplet*)GETAPPINSTANCE();
  12. if(!pApp) 
  13. return NULL;
  14.     pStack=MALLOCREC(IMenuStack);
  15. if(!pStack)
  16. return NULL;
  17. pStack->m_pStack=ISTACK_CreateInstance();
  18. if(!pStack->m_pStack)
  19. {
  20. IMENUSTACK_Release(&pStack);
  21. return NULL;
  22. }
  23. if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_MENUCTL,(void**)&pStack->m_pCtl))
  24. {
  25. IMENUSTACK_Release(&pStack);
  26. return NULL;
  27. }
  28. pStack->m_pGetSelCb=pGetSelCb;
  29. pStack->m_pRedrawCb=pRedrawCb;
  30. ISTACK_PushOnStack(pStack->m_pStack,(void*)pItem);
  31. return pStack;
  32. }
  33. void IMENUSTACK_Release(IMenuStack** pStack)
  34. {
  35. if(*pStack)
  36. {
  37. if((*pStack)->m_pCtl)
  38. IMENUCTL_Release((*pStack)->m_pCtl);
  39. ISTACK_Release(&(*pStack)->m_pStack);
  40. FREEIF(*pStack);
  41. }
  42. }
  43. boolean IMENUSTACK_Redraw(IMenuStack* pStack)
  44. {
  45. int nLoop=0;
  46. uint16 uiSel=0;
  47. CtlAddItem ai;
  48. TMenuItem* pMenu; 
  49. if((!pStack)||(!pStack->m_pCtl)) 
  50. return FALSE;
  51. IMENUCTL_DeleteAll(pStack->m_pCtl);
  52. pMenu=(TMenuItem*)ISTACK_GetTopElement(pStack->m_pStack);
  53. if(!pMenu)
  54. return FALSE;
  55. ai.pImage = NULL;
  56. while(MENUITEM_NULL!=pMenu[nLoop].tItemId)
  57. {
  58. if(pStack->m_pRedrawCb)
  59. ai.pText = pStack->m_pRedrawCb(pMenu[nLoop].uiResourceId);
  60. else
  61. ai.pText = NULL;
  62. ai.wImage = pMenu[nLoop].tImageId;
  63. ai.wText = pMenu[nLoop].uiResourceId;
  64. ai.wItemID = pMenu[nLoop].tItemId;
  65. ai.wFont = AEE_FONT_NORMAL;
  66. if(ai.wImage)
  67. ai.pszResImage = MENULIST_RES_FILE;
  68. else
  69. ai.pszResImage = NULL;
  70. ai.pszResText = MENULIST_RES_FILE;
  71. IMENUCTL_AddItemEx(pStack->m_pCtl, &ai);
  72. FREEIF(ai.pText);
  73. nLoop++;
  74. }
  75. if(pStack->m_pGetSelCb)
  76. {
  77. uiSel=pStack->m_pGetSelCb(pMenu);
  78. if(uiSel>0)
  79. IMENUCTL_SetSel(pStack->m_pCtl,uiSel);
  80. }
  81. IMENUCTL_SetActive(pStack->m_pCtl,TRUE);
  82. IMENUCTL_Redraw(pStack->m_pCtl);
  83. return TRUE;
  84. }
  85. boolean IMENUSTACK_HandleEvent(IMenuStack* pStack,AEEEvent eCode,uint16 wParam,uint32 dwParam)
  86. {
  87. if(!pStack||!pStack->m_pCtl)
  88. return FALSE;
  89. switch(eCode)
  90. {
  91. case EVT_KEY:
  92. if(AVK_CLR==wParam)
  93. {
  94. ISTACK_PopFromStack(pStack->m_pStack);
  95. return IMENUSTACK_Redraw(pStack);
  96. }
  97. else
  98. return IMENUCTL_HandleEvent(pStack->m_pCtl,eCode,wParam,dwParam);
  99. case EVT_COMMAND:
  100. return IMENUSTACK_MoveIntoSubMenu(pStack);
  101. default:
  102. return FALSE;
  103. }
  104. }
  105. //////////////////////////////////////////////////////////////////////////////
  106. static boolean IMENUSTACK_MoveIntoSubMenu(IMenuStack* pStack)
  107. {
  108. TMenuItem* pList;
  109. TMenuItemId itemId;
  110. int        SeekLoop=0;
  111. if(!pStack)
  112. return FALSE;
  113. itemId=IMENUCTL_GetSel(pStack->m_pCtl);
  114. pList=(TMenuItem*)ISTACK_GetTopElement(pStack->m_pStack);
  115. if(!pList)
  116. return FALSE;
  117. while((itemId!=pList[SeekLoop].tItemId)&&
  118.   (MENUITEM_NULL!=pList[SeekLoop].tItemId))
  119. SeekLoop++;
  120. if(MENUITEM_NULL==pList[SeekLoop].tItemId)
  121. return FALSE;
  122. if(pList[SeekLoop].ChildFunc)
  123. if(FALSE==pList[SeekLoop].ChildFunc())
  124. return FALSE;
  125. if(!pList[SeekLoop].ptChildMenu)
  126. return FALSE;
  127. if(!ISTACK_PushOnStack(pStack->m_pStack,(void*)pList[SeekLoop].ptChildMenu))
  128. return FALSE;
  129. return IMENUSTACK_Redraw(pStack);
  130. }