Skip to content
Snippets Groups Projects
Commit 566bfdaf authored by rods%netscape.com's avatar rods%netscape.com
Browse files

Changed GetItemAt to return a nsISupports instead of a nsIMenuItem, this is

because a menu can hold both other menus and menu items.
Implemented several more of the menu methods and added the listenr methods to the
menu item.
parent 8b143ceb
No related branches found
No related tags found
No related merge requests found
......@@ -32,6 +32,7 @@
#include "nsIDeviceContext.h"
#include "nsRect.h"
#include "nsGfxCIID.h"
#include "nsMenuItem.h"
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIMenuIID, NS_IMENU_IID);
......@@ -157,6 +158,39 @@ NS_METHOD nsMenu::AddItem(const nsString &aText)
return NS_OK;
}
//-------------------------------------------------------------------------
nsIMenuBar * nsMenu::GetMenuBar(nsIMenu * aMenu)
{
if (!aMenu) {
return nsnull;
}
nsMenu * menu = (nsMenu *)aMenu;
if (menu->GetMenuBarParent()) {
return menu->GetMenuBarParent();
}
if (menu->GetMenuParent()) {
return GetMenuBar(menu->GetMenuParent());
}
return nsnull;
}
//-------------------------------------------------------------------------
nsIWidget * nsMenu::GetParentWidget()
{
nsIWidget * parent = nsnull;
nsIMenuBar * menuBar = GetMenuBar(this);
if (menuBar) {
menuBar->GetParent(parent);
}
return parent;
}
//-------------------------------------------------------------------------
NS_METHOD nsMenu::AddMenuItem(nsIMenuItem * aMenuItem)
{
......@@ -165,6 +199,11 @@ NS_METHOD nsMenu::AddMenuItem(nsIMenuItem * aMenuItem)
aMenuItem->GetCommand(command);
aMenuItem->GetLabel(name);
mItems.AppendElement((nsISupports *)aMenuItem);
nsIWidget * win = GetParentWidget();
PRInt32 id = ((nsWindow *)win)->GetNewCmdMenuId();
((nsMenuItem *)aMenuItem)->SetCmdId(id);
char * nameStr = name.ToNewCString();
MENUITEMINFO menuInfo;
......@@ -172,10 +211,10 @@ NS_METHOD nsMenu::AddMenuItem(nsIMenuItem * aMenuItem)
menuInfo.fMask = MIIM_TYPE | MIIM_ID;
menuInfo.fType = MFT_STRING;
menuInfo.dwTypeData = nameStr;
menuInfo.wID = (DWORD)command;
menuInfo.wID = (DWORD)id;
menuInfo.cch = strlen(nameStr);
BOOL status = InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
BOOL status = ::InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
delete[] nameStr;
......@@ -187,6 +226,7 @@ NS_METHOD nsMenu::AddMenu(nsIMenu * aMenu)
{
nsString name;
aMenu->GetLabel(name);
mItems.AppendElement((nsISupports *)aMenu);
char * nameStr = name.ToNewCString();
HMENU nativeMenuHandle;
......@@ -202,7 +242,7 @@ NS_METHOD nsMenu::AddMenu(nsIMenu * aMenu)
menuInfo.fType = MFT_STRING;
menuInfo.dwTypeData = nameStr;
BOOL status = InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
BOOL status = ::InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
delete[] nameStr;
......@@ -219,7 +259,7 @@ NS_METHOD nsMenu::AddSeparator()
menuInfo.fMask = MIIM_TYPE;
menuInfo.fType = MFT_SEPARATOR;
BOOL status = InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
BOOL status = ::InsertMenuItem(mMenu, mNumMenuItems++, TRUE, &menuInfo);
return NS_OK;
}
......@@ -227,12 +267,15 @@ NS_METHOD nsMenu::AddSeparator()
//-------------------------------------------------------------------------
NS_METHOD nsMenu::GetItemCount(PRUint32 &aCount)
{
aCount = mItems.Count();
return NS_OK;
}
//-------------------------------------------------------------------------
NS_METHOD nsMenu::GetItemAt(const PRUint32 aCount, nsIMenuItem *& aMenuItem)
NS_METHOD nsMenu::GetItemAt(const PRUint32 aCount, nsISupports *& aMenuItem)
{
aMenuItem = (nsISupports *)mItems[aCount];
return NS_OK;
}
......
......@@ -26,6 +26,7 @@
#include "nsIMenu.h"
#include "nsVoidArray.h"
#include "nsIMenuListener.h"
#include "nsVoidArray.h"
/**
* Native Win32 button wrapper
......@@ -55,7 +56,7 @@ public:
NS_IMETHOD AddMenu(nsIMenu * aMenu);
NS_IMETHOD AddSeparator();
NS_IMETHOD GetItemCount(PRUint32 &aCount);
NS_IMETHOD GetItemAt(const PRUint32 aCount, nsIMenuItem *& aMenuItem);
NS_IMETHOD GetItemAt(const PRUint32 aCount, nsISupports *& aMenuItem);
NS_IMETHOD InsertItemAt(const PRUint32 aCount, nsIMenuItem *& aMenuItem);
NS_IMETHOD InsertItemAt(const PRUint32 aCount, const nsString & aMenuItemName);
NS_IMETHOD InsertSeparator(const PRUint32 aCount);
......@@ -63,7 +64,14 @@ public:
NS_IMETHOD RemoveAll();
NS_IMETHOD GetNativeData(void*& aData);
// Native Impl Methods
nsIMenu * GetMenuParent() { return mMenuParent; }
nsIMenuBar * GetMenuBarParent() { return mMenuBarParent; }
protected:
nsIMenuBar * GetMenuBar(nsIMenu * aMenu);
nsIWidget * GetParentWidget();
nsString mLabel;
PRUint32 mNumMenuItems;
HMENU mMenu;
......@@ -71,6 +79,8 @@ protected:
nsIMenuBar * mMenuBarParent;
nsIMenu * mMenuParent;
nsVoidArray mItems;
};
#endif // nsMenu_h__
......@@ -127,6 +127,8 @@ NS_METHOD nsMenuBar::AddMenu(nsIMenu * aMenu)
aMenu->GetLabel(name);
char * nameStr = name.ToNewCString();
mItems.AppendElement(aMenu);
HMENU nativeMenuHandle;
void * voidData;
aMenu->GetNativeData(voidData);
......@@ -157,12 +159,14 @@ NS_METHOD nsMenuBar::AddMenu(nsIMenu * aMenu)
//-------------------------------------------------------------------------
NS_METHOD nsMenuBar::GetMenuCount(PRUint32 &aCount)
{
aCount = mItems.Count();
return NS_OK;
}
//-------------------------------------------------------------------------
NS_METHOD nsMenuBar::GetMenuAt(const PRUint32 aCount, nsIMenu *& aMenu)
{
aMenu = (nsIMenu *)mItems[aCount];
return NS_OK;
}
......
......@@ -58,6 +58,7 @@ public:
NS_IMETHOD RemoveAll();
NS_IMETHOD GetNativeData(void*& aData);
NS_IMETHOD Paint();
protected:
PRUint32 mNumMenus;
HMENU mMenu;
......@@ -65,6 +66,8 @@ protected:
PRBool mIsMenuBarAdded;
nsVoidArray mItems;
};
#endif // nsMenuBar_h__
......@@ -81,8 +81,9 @@ NS_IMPL_RELEASE(nsMenuItem)
nsMenuItem::nsMenuItem() : nsIMenuItem()
{
NS_INIT_REFCNT();
mMenu = nsnull;
mTarget = nsnull;
mMenu = nsnull;
mTarget = nsnull;
mListener = nsnull;
}
//-------------------------------------------------------------------------
......@@ -207,12 +208,39 @@ NS_METHOD nsMenuItem::GetNativeData(void *& aData)
aData = (void *)mMenu;
return NS_OK;
}
//-------------------------------------------------------------------------
NS_METHOD nsMenuItem::AddMenuListener(nsIMenuListener * aMenuListener)
{
mListener = aMenuListener;
return NS_OK;
}
//-------------------------------------------------------------------------
NS_METHOD nsMenuItem::RemoveMenuListener(nsIMenuListener * aMenuListener)
{
return NS_OK;
}
//-------------------------------------------------------------------------
void nsMenuItem::SetCmdId(PRInt32 aId)
{
mCmdId = aId;
}
//-------------------------------------------------------------------------
PRInt32 nsMenuItem::GetCmdId()
{
return mCmdId;
}
//-------------------------------------------------------------------------
// nsIMenuListener interface
//-------------------------------------------------------------------------
nsEventStatus nsMenuItem::MenuSelected(const nsMenuEvent & aMenuEvent)
{
return nsEventStatus_eIgnore;
if (mListener) {
mListener->MenuSelected(aMenuEvent);
}
return nsEventStatus_eIgnore;
}
......@@ -29,6 +29,7 @@
class nsIMenu;
class nsIPopUpMenu;
class nsIMenuListener;
/**
* Native Win32 MenuItem wrapper
......@@ -53,10 +54,16 @@ public:
NS_IMETHOD GetCommand(PRUint32 & aCommand);
NS_IMETHOD GetTarget(nsIWidget *& aTarget);
NS_IMETHOD GetNativeData(void*& aData);
NS_IMETHOD AddMenuListener(nsIMenuListener * aMenuListener);
NS_IMETHOD RemoveMenuListener(nsIMenuListener * aMenuListener);
// nsIMenuListener interface
nsEventStatus MenuSelected(const nsMenuEvent & aMenuEvent);
// Need for Native Impl
void SetCmdId(PRInt32 aId);
PRInt32 GetCmdId();
protected:
nsIWidget * GetMenuBarParent(nsISupports * aParent);
......@@ -64,6 +71,8 @@ protected:
PRUint32 mCommand;
nsIWidget * mTarget;
nsIMenu * mMenu;
nsIMenuListener * mListener;
PRInt32 mCmdId;
};
#endif // nsMenuItem_h__
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment