diff --git a/mozilla/widget/src/windows/nsMenu.cpp b/mozilla/widget/src/windows/nsMenu.cpp index 847ba01c8e0..cc0aa1d2e2b 100644 --- a/mozilla/widget/src/windows/nsMenu.cpp +++ b/mozilla/widget/src/windows/nsMenu.cpp @@ -38,7 +38,10 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIMenuIID, NS_IMENU_IID); -//NS_IMPL_ISUPPORTS(nsMenu, kIMenuIID) +static NS_DEFINE_IID(kIMenuBarIID, NS_IMENUBAR_IID); + +static NS_DEFINE_IID(kIMenuItemIID, NS_IMENUITEM_IID); + nsresult nsMenu::QueryInterface(REFNSIID aIID, void** aInstancePtr) { @@ -106,29 +109,87 @@ nsMenu::~nsMenu() // Create the proper widget // //------------------------------------------------------------------------- -NS_METHOD nsMenu::Create(nsIMenuBar *aParent, const nsString &aLabel) +NS_METHOD nsMenu::Create(nsISupports *aParent, const nsString &aLabel) + { - mMenuBarParent = aParent; - NS_ADDREF(mMenuBarParent); + + if(aParent) + + { + + nsIMenuBar * menubar = nsnull; + + aParent->QueryInterface(kIMenuBarIID, (void**) &menubar); + + if(menubar) + + { + + mMenuBarParent = menubar; + + NS_ADDREF(mMenuBarParent); + + NS_RELEASE(menubar); // Balance the QI + + } + + else + + { + + nsIMenu * menu = nsnull; + + aParent->QueryInterface(kIMenuIID, (void**) &menu); + + if(menu) + + { + + mMenuParent = menu; + + NS_ADDREF(mMenuParent); + + NS_RELEASE(menu); // Balance the QI + + } + + } + + } + + mLabel = aLabel; + mMenu = CreateMenu(); + + return NS_OK; + } +/* + //------------------------------------------------------------------------- NS_METHOD nsMenu::Create(nsIMenu *aParent, const nsString &aLabel) { mMenuParent = aParent; NS_ADDREF(mMenuParent); + + mLabel = aLabel; mMenu = CreateMenu(); + + return NS_OK; + } +*/ + //------------------------------------------------------------------------- NS_METHOD nsMenu::GetParent(nsISupports*& aParent) { @@ -151,7 +212,8 @@ NS_METHOD nsMenu::GetLabel(nsString &aText) } //------------------------------------------------------------------------- -NS_METHOD nsMenu::SetLabel(nsString &aText) +NS_METHOD nsMenu::SetLabel(const nsString &aText) + { mLabel = aText; @@ -159,8 +221,56 @@ NS_METHOD nsMenu::SetLabel(nsString &aText) } //------------------------------------------------------------------------- -NS_METHOD nsMenu::AddItem(const nsString &aText) +NS_METHOD nsMenu::AddItem(nsISupports * aItem) + { + + if(aItem) + + { + + // Figure out what we're adding + + nsIMenuItem * menuitem = nsnull; + + aItem->QueryInterface(kIMenuItemIID, (void**) &menuitem); + + if(menuitem) + + { + + // case menuitem + + AddMenuItem(menuitem); + + NS_RELEASE(menuitem); + + } + + else + + { + + nsIMenu * menu = nsnull; + + aItem->QueryInterface(kIMenuIID, (void**) &menu); + + if(menu) + + { + + // case menu + + AddMenu(menu); + + NS_RELEASE(menu); + + } + + } + + } + return NS_OK; } @@ -274,7 +384,8 @@ NS_METHOD nsMenu::InsertItemAt(const PRUint32 aCount, nsISupports * aMenuItem) HMENU nativeMenuHandle; void * voidData; - menu->GetNativeData(voidData); + menu->GetNativeData(&voidData); + nativeMenuHandle = (HMENU)voidData; MENUITEMINFO menuInfo; @@ -334,9 +445,12 @@ NS_METHOD nsMenu::RemoveAll() } //------------------------------------------------------------------------- -NS_METHOD nsMenu::GetNativeData(void *& aData) +NS_METHOD nsMenu::GetNativeData(void ** aData) + { - aData = (void *)mMenu; + + *aData = (void *)mMenu; + return NS_OK; } diff --git a/mozilla/widget/src/windows/nsMenu.h b/mozilla/widget/src/windows/nsMenu.h index af655856a8c..671e59ec114 100644 --- a/mozilla/widget/src/windows/nsMenu.h +++ b/mozilla/widget/src/windows/nsMenu.h @@ -45,27 +45,32 @@ public: nsEventStatus MenuSelected(const nsMenuEvent & aMenuEvent); nsEventStatus MenuDeselected(const nsMenuEvent & aMenuEvent); - NS_IMETHOD Create(nsIMenuBar * aParent, const nsString &aLabel); - NS_IMETHOD Create(nsIMenu * aParent, const nsString &aLabel); + NS_IMETHOD Create(nsISupports * aParent, const nsString &aLabel); + // nsIMenu Methods NS_IMETHOD GetParent(nsISupports *&aParent); NS_IMETHOD GetLabel(nsString &aText); - NS_IMETHOD SetLabel(nsString &aText); - NS_IMETHOD AddItem(const nsString &aText); - NS_IMETHOD AddMenuItem(nsIMenuItem * aMenuItem); - NS_IMETHOD AddMenu(nsIMenu * aMenu); + NS_IMETHOD SetLabel(const nsString &aText); + + NS_IMETHOD AddItem(nsISupports * aItem); + NS_IMETHOD AddSeparator(); NS_IMETHOD GetItemCount(PRUint32 &aCount); NS_IMETHOD GetItemAt(const PRUint32 aPos, nsISupports *& aMenuItem); NS_IMETHOD InsertItemAt(const PRUint32 aPos, nsISupports * aMenuItem); - NS_IMETHOD InsertSeparator(const PRUint32 aPos); NS_IMETHOD RemoveItem(const PRUint32 aPos); NS_IMETHOD RemoveAll(); - NS_IMETHOD GetNativeData(void*& aData); + NS_IMETHOD GetNativeData(void** aData); + NS_IMETHOD AddMenuListener(nsIMenuListener * aMenuListener); NS_IMETHOD RemoveMenuListener(nsIMenuListener * aMenuListener); + // + NS_IMETHOD AddMenuItem(nsIMenuItem * aMenuItem); + NS_IMETHOD AddMenu(nsIMenu * aMenu); + NS_IMETHOD InsertSeparator(const PRUint32 aCount); + // Native Impl Methods // These are not ref counted nsIMenu * GetMenuParent() { return mMenuParent; } diff --git a/mozilla/widget/src/windows/nsMenuBar.cpp b/mozilla/widget/src/windows/nsMenuBar.cpp index a5a22b5d8fe..775d57d342a 100644 --- a/mozilla/widget/src/windows/nsMenuBar.cpp +++ b/mozilla/widget/src/windows/nsMenuBar.cpp @@ -171,7 +171,8 @@ NS_METHOD nsMenuBar::InsertMenuAt(const PRUint32 aPos, nsIMenu *& aMenu) HMENU nativeMenuHandle; void * voidData; - aMenu->GetNativeData(voidData); + aMenu->GetNativeData(&voidData); + nativeMenuHandle = (HMENU)voidData; MENUITEMINFO menuInfo; diff --git a/mozilla/widget/src/windows/nsPopUpMenu.cpp b/mozilla/widget/src/windows/nsPopUpMenu.cpp index eb38eaf9d75..0fafd4fc504 100644 --- a/mozilla/widget/src/windows/nsPopUpMenu.cpp +++ b/mozilla/widget/src/windows/nsPopUpMenu.cpp @@ -119,7 +119,8 @@ NS_METHOD nsPopUpMenu::AddMenu(nsIMenu * aMenu) HMENU nativeMenuHandle; void * voidData; - aMenu->GetNativeData(voidData); + aMenu->GetNativeData(&voidData); + nativeMenuHandle = (HMENU)voidData; MENUITEMINFO menuInfo;