|
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;
|