From: <kr_...@us...> - 2003-08-17 16:45:10
|
Update of /cvsroot/htoolkit/port/src/cbits/Win32 In directory sc8-pr-cvs1:/tmp/cvs-serv25012/port/src/cbits/Win32 Modified Files: Menu.c MenuHandlesMap.c MenuHandlesMap.h Log Message: Implementation for popup menus Index: Menu.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/Win32/Menu.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** Menu.c 15 Aug 2003 21:24:54 -0000 1.12 --- Menu.c 17 Aug 2003 16:45:07 -0000 1.13 *************** *** 6,10 **** #define CHECK_MENU_TYPE(handle,mask,ret) \ ! if (((handle ? handle->type : MENU_POPUP) & (mask)) == 0) \ { \ printf("Invalid menu handle type."); \ --- 6,10 ---- #define CHECK_MENU_TYPE(handle,mask,ret) \ ! if (((handle ? handle->type : MENU_SUBMENU) & (mask)) == 0) \ { \ printf("Invalid menu handle type."); \ *************** *** 13,17 **** #define CHECK_MENU_TYPE_V(handle,mask) \ ! if (((handle ? handle->type : MENU_POPUP) & (mask)) == 0) \ { \ printf("Invalid menu handle type."); \ --- 13,17 ---- #define CHECK_MENU_TYPE_V(handle,mask) \ ! if (((handle ? handle->type : MENU_SUBMENU) & (mask)) == 0) \ { \ printf("Invalid menu handle type."); \ *************** *** 103,106 **** --- 103,129 ---- } + MenuHandle osCreatePopupMenu() + { + MenuHandle handle; + FrameData *pFrameData; + + pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); + handle = newMenuHandle(pFrameData->pMenuHandlesMap, NULL, MENU_POPUP, -1); + + if (handle) + handle->hMenu = CreatePopupMenu(); + + return handle; + }; + + void osTrackPopupMenu(MenuHandle handle, WindowHandle hWnd, int x, int y) + { + POINT pos; + pos.x = x; + pos.y = y; + ClientToScreen(hWnd, &pos); + TrackPopupMenu(handle->hMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pos.x, pos.y, 0, ghWndFrame, NULL); + } + MenuHandle osInsertMenu(MenuHandle parent, int pos) { *************** *** 108,115 **** FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! handle = newMenuHandle(pFrameData->pMenuHandlesMap, parent, MENU_POPUP, pos); if (handle) --- 131,138 ---- FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_SUBMENU | MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! handle = newMenuHandle(pFrameData->pMenuHandlesMap, parent, MENU_SUBMENU, pos); if (handle) *************** *** 130,134 **** FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); --- 153,157 ---- FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_SUBMENU | MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); *************** *** 149,153 **** FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); --- 172,176 ---- FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_SUBMENU | MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); *************** *** 168,172 **** FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); --- 191,195 ---- FrameData *pFrameData; ! CHECK_MENU_TYPE(parent, MENU_SUBMENU | MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); *************** *** 188,192 **** MENUITEMINFO mii; ! CHECK_MENU_TYPE(parent, MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); --- 211,215 ---- MENUITEMINFO mii; ! CHECK_MENU_TYPE(parent, MENU_SUBMENU | MENU_POPUP, NULL); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); *************** *** 238,245 **** notifyHandleForDestroy(handle); ! DeleteMenu(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), MF_BYPOSITION); deleteMenuHandle(pFrameData->pMenuHandlesMap, handle); - - updateMenuBar(handle->parent); } --- 261,271 ---- notifyHandleForDestroy(handle); ! if (handle->type != MENU_POPUP) ! { ! DeleteMenu(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), MF_BYPOSITION); ! updateMenuBar(handle->parent); ! } ! deleteMenuHandle(pFrameData->pMenuHandlesMap, handle); } *************** *** 248,252 **** FrameData *pFrameData; ! CHECK_MENU_TYPE(handle, MENU_POPUP, 0); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); --- 274,278 ---- FrameData *pFrameData; ! CHECK_MENU_TYPE(handle, MENU_SUBMENU | MENU_POPUP, 0); pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); *************** *** 257,283 **** void osSetMenuItemEnabled(MenuHandle handle, BOOL bState) { ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE_V(handle, MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM | MENU_POPUP); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! EnableMenuItem(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), (bState ? MF_ENABLED : MF_GRAYED) | MF_BYPOSITION); ! updateMenuBar(handle->parent); }; BOOL osGetMenuItemEnabled(MenuHandle handle) { ! MENUITEMINFO mii; ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE(handle, MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM | MENU_POPUP, FALSE); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STATE; ! GetMenuItemInfo(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), TRUE, &mii); ! return (mii.fState & MFS_DISABLED) == 0; }; --- 283,317 ---- void osSetMenuItemEnabled(MenuHandle handle, BOOL bState) { ! if (handle->type != MENU_POPUP) ! { ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE_V(handle, MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM | MENU_SUBMENU); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! EnableMenuItem(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), (bState ? MF_ENABLED : MF_GRAYED) | MF_BYPOSITION); ! updateMenuBar(handle->parent); ! } }; BOOL osGetMenuItemEnabled(MenuHandle handle) { ! if (handle->type != MENU_POPUP) ! { ! MENUITEMINFO mii; ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE(handle, MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM | MENU_SUBMENU, FALSE); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STATE; ! GetMenuItemInfo(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), TRUE, &mii); ! return (mii.fState & MFS_DISABLED) == 0; ! } ! else ! return TRUE; }; *************** *** 327,405 **** char *osGetMenuLabel(MenuHandle handle) { ! int pos; ! HMENU hParent; ! char *s; ! MENUITEMINFO mii; ! FrameData *pFrameData; ! CHECK_MENU_TYPE(handle, MENU_POPUP | MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM, NULL); ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! pos = getMenuPos(pFrameData->pMenuHandlesMap, handle); ! hParent = getParentHMENU(handle); ! ! memset(&mii,0,sizeof(mii)); ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STRING; ! mii.fType = MFT_STRING; ! mii.dwTypeData = NULL; ! mii.cch = 0; ! GetMenuItemInfo(hParent, pos, TRUE, &mii); ! mii.cch++; ! mii.dwTypeData = malloc(mii.cch); ! ! if (mii.dwTypeData) ! { GetMenuItemInfo(hParent, pos, TRUE, &mii); ! ! s = mii.dwTypeData; ! while (*s && *s != '\t') s++; ! *s = 0; } ! ! return mii.dwTypeData; } void osSetMenuLabel(MenuHandle handle, char *title) { ! char *s, *temp; ! MENUITEMINFO mii; ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE_V(handle, MENU_POPUP | MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! if (handle->parent == NULL) ! temp = title; ! else { ! temp = malloc(strlen(title)+32); ! if (!temp) temp = title; else { ! s = temp; ! while (*title) { ! if (*title != '\t') *s++ = *title; ! title++; } - *s = 0; - AddAccelString(handle->key, handle->mods, temp); } - } ! memset(&mii,0,sizeof(mii)); ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STRING; ! mii.fType = MFT_STRING; ! mii.dwTypeData = temp; ! mii.cch = strlen(temp); ! SetMenuItemInfo(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), TRUE, &mii); ! updateMenuBar(handle->parent); ! if (temp != title) free(temp); } --- 361,447 ---- char *osGetMenuLabel(MenuHandle handle) { ! if (handle->type != MENU_POPUP) ! { ! int pos; ! HMENU hParent; ! char *s; ! MENUITEMINFO mii; ! FrameData *pFrameData; ! CHECK_MENU_TYPE(handle, MENU_SUBMENU | MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM, NULL); ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! pos = getMenuPos(pFrameData->pMenuHandlesMap, handle); ! hParent = getParentHMENU(handle); ! ! memset(&mii,0,sizeof(mii)); ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STRING; ! mii.fType = MFT_STRING; ! mii.dwTypeData = NULL; ! mii.cch = 0; GetMenuItemInfo(hParent, pos, TRUE, &mii); ! mii.cch++; ! mii.dwTypeData = malloc(mii.cch); ! ! if (mii.dwTypeData) ! { ! GetMenuItemInfo(hParent, pos, TRUE, &mii); ! ! s = mii.dwTypeData; ! while (*s && *s != '\t') s++; ! *s = 0; ! } ! ! return mii.dwTypeData; } ! else ! return NULL; } void osSetMenuLabel(MenuHandle handle, char *title) { ! if (handle->type != MENU_POPUP) { ! char *s, *temp; ! MENUITEMINFO mii; ! FrameData *pFrameData; ! ! CHECK_MENU_TYPE_V(handle, MENU_SUBMENU | MENU_RADIO_ITEM | MENU_CHECK_ITEM | MENU_ITEM); ! ! pFrameData = (FrameData *) GetWindowLong(ghWndFrame,GWL_USERDATA); ! ! if (handle->parent == NULL) temp = title; else { ! temp = malloc(strlen(title)+32); ! if (!temp) ! temp = title; ! else { ! s = temp; ! while (*title) ! { ! if (*title != '\t') *s++ = *title; ! title++; ! } ! *s = 0; ! AddAccelString(handle->key, handle->mods, temp); } } ! memset(&mii,0,sizeof(mii)); ! mii.cbSize = sizeof(mii); ! mii.fMask = MIIM_STRING; ! mii.fType = MFT_STRING; ! mii.dwTypeData = temp; ! mii.cch = strlen(temp); ! SetMenuItemInfo(getParentHMENU(handle), getMenuPos(pFrameData->pMenuHandlesMap, handle), TRUE, &mii); ! updateMenuBar(handle->parent); ! if (temp != title) free(temp); ! } } Index: MenuHandlesMap.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/Win32/MenuHandlesMap.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** MenuHandlesMap.c 15 Aug 2003 21:24:54 -0000 1.2 --- MenuHandlesMap.c 17 Aug 2003 16:45:07 -0000 1.3 *************** *** 14,17 **** --- 14,18 ---- pMap->children = NULL; + pMap->popups = NULL; pMap->pFreeList = NULL; pMap->pBlocks = NULL; *************** *** 84,97 **** handle->hMenu = NULL; handle->nextInGroup = handle; ! if (parent) { ! child = parent->children; ! prev = &parent->children; } else { ! child = pMap->children; ! prev = &pMap->children; } --- 85,107 ---- handle->hMenu = NULL; handle->nextInGroup = handle; + handle->sibling = NULL; ! if (type != MENU_POPUP) { ! if (parent) ! { ! child = parent->children; ! prev = &parent->children; ! } ! else ! { ! child = pMap->children; ! prev = &pMap->children; ! } } else { ! child = pMap->popups; ! prev = &pMap->popups; } *************** *** 99,103 **** while (child) { ! prev = &child->sibling; child = child->sibling; } --- 109,113 ---- while (child) { ! prev = &child->sibling; child = child->sibling; } *************** *** 111,115 **** handle->sibling = child; *prev = handle; - // put into hash table --- 121,124 ---- *************** *** 129,143 **** deleteMenuHandle(pMap, handle->children); ! if (handle->parent) { ! prev = &handle->parent->children; ! child = handle->parent->children; } else { ! prev = &pMap->children; ! child = pMap->children; } ! while (child) { --- 138,160 ---- deleteMenuHandle(pMap, handle->children); ! if (handle->type != MENU_POPUP) { ! if (handle->parent) ! { ! prev = &handle->parent->children; ! child = handle->parent->children; ! } ! else ! { ! prev = &pMap->children; ! child = pMap->children; ! } } else { ! prev = &pMap->popups; ! child = pMap->popups; } ! while (child) { *************** *** 298,303 **** MenuHandle h; pos = 0; - h = handle->parent ? handle->parent->children : pMap->children; while (h && h != handle) { --- 315,324 ---- MenuHandle h; + if (handle->type != MENU_POPUP) + h = handle->parent ? handle->parent->children : pMap->children; + else + h = pMap->popups; + pos = 0; while (h && h != handle) { *************** *** 311,318 **** HMENU getParentHMENU(MenuHandle handle) { ! if (handle->parent == NULL) ! return GetMenu(ghWndFrame); else ! return handle->parent->hMenu; } --- 332,342 ---- HMENU getParentHMENU(MenuHandle handle) { ! if (handle->type != MENU_POPUP) ! if (handle->parent == NULL) ! return GetMenu(ghWndFrame); ! else ! return handle->parent->hMenu; else ! return NULL; } *************** *** 369,372 **** child = child->sibling; } } - --- 393,402 ---- child = child->sibling; } + + child = pMap->popups; + while (child) + { + notifyHandleForDestroy(child); + child = child->sibling; + } } Index: MenuHandlesMap.h =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/Win32/MenuHandlesMap.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** MenuHandlesMap.h 15 Aug 2003 21:24:54 -0000 1.3 --- MenuHandlesMap.h 17 Aug 2003 16:45:07 -0000 1.4 *************** *** 8,16 **** enum MENU_TYPE ! { MENU_SEPARATOR = 1 ! , MENU_ITEM = 2 ! , MENU_POPUP = 4 ! , MENU_CHECK_ITEM = 8 ! , MENU_RADIO_ITEM = 16 }; --- 8,17 ---- enum MENU_TYPE ! { MENU_POPUP = 1 ! , MENU_SUBMENU = 2 ! , MENU_SEPARATOR = 4 ! , MENU_ITEM = 8 ! , MENU_CHECK_ITEM = 16 ! , MENU_RADIO_ITEM = 32 }; *************** *** 40,43 **** --- 41,45 ---- { struct MenuHandle *children; + struct MenuHandle *popups; Block* pBlocks; |