diff --git a/mozilla/widget/src/mac/nsMenu.cpp b/mozilla/widget/src/mac/nsMenu.cpp index a02ba0d1e5a..5c920231ebd 100644 --- a/mozilla/widget/src/mac/nsMenu.cpp +++ b/mozilla/widget/src/mac/nsMenu.cpp @@ -91,32 +91,32 @@ nsMenu::nsMenu() : nsIMenu() //------------------------------------------------------------------------- nsMenu::~nsMenu() { - NS_IF_RELEASE(mMenuBarParent); - NS_IF_RELEASE(mMenuParent); NS_IF_RELEASE(mListener); while(mNumMenuItems) { --mNumMenuItems; - // Figure out what we're releasing - nsIMenuItem * menuitem = nsnull; - ((nsISupports*)mMenuItemVoidArray[mNumMenuItems])->QueryInterface(kIMenuItemIID, (void**) &menuitem); - if(menuitem) - { - // case menuitem - NS_RELEASE(menuitem); // Release our hold - NS_RELEASE(menuitem); // Balance QI - } - else - { - nsIMenu * menu = nsnull; - ((nsISupports*)mMenuItemVoidArray[mNumMenuItems])->QueryInterface(kIMenuIID, (void**) &menu); - if(menu) - { - // case menu - NS_RELEASE(menu); // Release our hold - NS_RELEASE(menu); // Balance QI + if(mMenuItemVoidArray[mNumMenuItems]) { + // Figure out what we're releasing + nsIMenuItem * menuitem = nsnull; + ((nsISupports*)mMenuItemVoidArray[mNumMenuItems])->QueryInterface(kIMenuItemIID, (void**) &menuitem); + if(menuitem) + { + // case menuitem + menuitem->Release(); // Release our hold + NS_IF_RELEASE(menuitem); // Balance QI + } + else + { + nsIMenu * menu = nsnull; + ((nsISupports*)mMenuItemVoidArray[mNumMenuItems])->QueryInterface(kIMenuIID, (void**) &menu); + if(menu) + { + // case menu + menu->Release(); // Release our hold + NS_IF_RELEASE(menu); // Balance QI + } } } } @@ -135,8 +135,7 @@ NS_METHOD nsMenu::Create(nsISupports *aParent, const nsString &aLabel) aParent->QueryInterface(kIMenuBarIID, (void**) &menubar); if(menubar) { - mMenuBarParent = menubar; - NS_ADDREF(mMenuBarParent); + mMenuBarParent = menubar;; NS_RELEASE(menubar); // Balance the QI } else @@ -145,7 +144,6 @@ NS_METHOD nsMenu::Create(nsISupports *aParent, const nsString &aLabel) aParent->QueryInterface(kIMenuIID, (void**) &menu); { mMenuParent = menu; - NS_ADDREF(mMenuParent); NS_RELEASE(menu); // Balance the QI } } @@ -222,16 +220,20 @@ NS_METHOD nsMenu::AddItem(nsISupports* aItem) //------------------------------------------------------------------------- NS_METHOD nsMenu::AddMenuItem(nsIMenuItem * aMenuItem) { - NS_IF_ADDREF(aMenuItem); - mMenuItemVoidArray.AppendElement(aMenuItem); - - nsString label; - aMenuItem->GetLabel(label); - char* menuLabel = label.ToNewCString(); - mNumMenuItems++; - ::InsertMenuItem(mMacMenuHandle, c2pstr(menuLabel), mNumMenuItems); - delete[] menuLabel; - + if(aMenuItem) { + nsISupports * supports = nsnull; + aMenuItem->QueryInterface(kISupportsIID, (void**)&supports); + if(supports) { + mMenuItemVoidArray.AppendElement(supports); + + nsString label; + aMenuItem->GetLabel(label); + char* menuLabel = label.ToNewCString(); + mNumMenuItems++; + ::InsertMenuItem(mMacMenuHandle, c2pstr(menuLabel), mNumMenuItems); + delete[] menuLabel; + } + } return NS_OK; } @@ -239,24 +241,28 @@ NS_METHOD nsMenu::AddMenuItem(nsIMenuItem * aMenuItem) NS_METHOD nsMenu::AddMenu(nsIMenu * aMenu) { // Add a submenu - NS_IF_ADDREF(aMenu); - mMenuItemVoidArray.AppendElement(aMenu); + if(aMenu) { + nsISupports * supports = nsnull; + aMenu->QueryInterface(kISupportsIID, (void**)&supports); + if(supports) { + mMenuItemVoidArray.AppendElement(supports); - // We have to add it as a menu item and then associate it with the item - nsString label; - aMenu->GetLabel(label); - char* menuLabel = label.ToNewCString(); - mNumMenuItems++; - ::InsertMenuItem(mMacMenuHandle, "\p ", mNumMenuItems); - ::SetMenuItemText(mMacMenuHandle, mNumMenuItems, c2pstr(menuLabel)); - delete[] menuLabel; + // We have to add it as a menu item and then associate it with the item + nsString label; + aMenu->GetLabel(label); + char* menuLabel = label.ToNewCString(); + mNumMenuItems++; + ::InsertMenuItem(mMacMenuHandle, "\p ", mNumMenuItems); + ::SetMenuItemText(mMacMenuHandle, mNumMenuItems, c2pstr(menuLabel)); + delete[] menuLabel; - MenuHandle menuHandle; - aMenu->GetNativeData((void**)&menuHandle); - ::InsertMenu(menuHandle, hierMenu); - PRInt16 temp = mMacMenuIDCount; - ::SetMenuItemHierarchicalID((MenuHandle) mMacMenuHandle, mNumMenuItems, --temp); - + MenuHandle menuHandle; + aMenu->GetNativeData((void**)&menuHandle); + ::InsertMenu(menuHandle, hierMenu); + PRInt16 temp = mMacMenuIDCount; + ::SetMenuItemHierarchicalID((MenuHandle) mMacMenuHandle, mNumMenuItems, --temp); + } + } return NS_OK; } @@ -312,7 +318,7 @@ NS_METHOD nsMenu::GetNativeData(void ** aData) NS_METHOD nsMenu::AddMenuListener(nsIMenuListener * aMenuListener) { mListener = aMenuListener; - NS_ADDREF(mListener); + //NS_ADDREF(mListener); return NS_OK; } @@ -320,7 +326,7 @@ NS_METHOD nsMenu::AddMenuListener(nsIMenuListener * aMenuListener) NS_METHOD nsMenu::RemoveMenuListener(nsIMenuListener * aMenuListener) { if (aMenuListener == mListener) { - NS_IF_RELEASE(mListener); + //NS_IF_RELEASE(mListener); } return NS_OK; } diff --git a/mozilla/widget/src/mac/nsMenuBar.cpp b/mozilla/widget/src/mac/nsMenuBar.cpp index dbdb1a81a61..1b967cfc8ea 100644 --- a/mozilla/widget/src/mac/nsMenuBar.cpp +++ b/mozilla/widget/src/mac/nsMenuBar.cpp @@ -31,7 +31,7 @@ static NS_DEFINE_IID(kIMenuBarIID, NS_IMENUBAR_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -//NS_IMPL_ISUPPORTS(nsMenuBar, kMenuBarIID) + nsresult nsMenuBar::QueryInterface(REFNSIID aIID, void** aInstancePtr) { if (NULL == aInstancePtr) { @@ -77,20 +77,17 @@ nsEventStatus nsMenuBar::MenuSelected(const nsMenuEvent & aMenuEvent) { // Dispatch menu event nsEventStatus eventStatus = nsEventStatus_eIgnore; - - //if( mMenuVoidArray ) + + for (int i = mMenuVoidArray.Count(); i > 0; --i) { - for (int i = mMenuVoidArray.Count(); i > 0; i--) - { - nsIMenuListener * menuListener = nsnull; - ((nsIMenu*)mMenuVoidArray[i-1])->QueryInterface(kIMenuListenerIID, &menuListener); - if(menuListener){ - eventStatus = menuListener->MenuSelected(aMenuEvent); - NS_IF_RELEASE(menuListener); - if(nsEventStatus_eIgnore != eventStatus) - return eventStatus; - } - } + nsIMenuListener * menuListener = nsnull; + ((nsISupports*)mMenuVoidArray[i-1])->QueryInterface(kIMenuListenerIID, &menuListener); + if(menuListener){ + eventStatus = menuListener->MenuSelected(aMenuEvent); + NS_RELEASE(menuListener); + if(nsEventStatus_eIgnore != eventStatus) + return eventStatus; + } } return nsEventStatus_eIgnore; @@ -143,12 +140,12 @@ nsMenuBar::nsMenuBar() : nsIMenuBar(), nsIMenuListener() //------------------------------------------------------------------------- nsMenuBar::~nsMenuBar() { - NS_IF_RELEASE(mParent); + //NS_IF_RELEASE(mParent); while(mNumMenus) { --mNumMenus; - nsIMenu* menu = (nsIMenu*)mMenuVoidArray[mNumMenus]; + nsISupports* menu = (nsISupports*)mMenuVoidArray[mNumMenus]; NS_IF_RELEASE( menu ); } } @@ -162,23 +159,13 @@ NS_METHOD nsMenuBar::Create(nsIWidget *aParent) { SetParent(aParent); - //Widget parentWidget = (Widget)mParent->GetNativeData(NS_NATIVE_WIDGET); - - //Widget mainWindow = XtParent(parentWidget); - - //mMenu = XmCreateMenuBar(mainWindow, "menubar", nsnull, 0); - //XtManageChild(mMenu); - return NS_OK; - } //------------------------------------------------------------------------- NS_METHOD nsMenuBar::GetParent(nsIWidget *&aParent) { - aParent = mParent; - NS_IF_ADDREF(aParent); return NS_OK; } @@ -187,21 +174,21 @@ NS_METHOD nsMenuBar::GetParent(nsIWidget *&aParent) //------------------------------------------------------------------------- NS_METHOD nsMenuBar::SetParent(nsIWidget *aParent) { - - NS_IF_RELEASE(mParent); mParent = aParent; - NS_IF_ADDREF(mParent); + return NS_OK; } //------------------------------------------------------------------------- NS_METHOD nsMenuBar::AddMenu(nsIMenu * aMenu) { - // XXX add to internal data structure - NS_IF_ADDREF(aMenu); - mMenuVoidArray.AppendElement( aMenu ); - + nsISupports * supports = nsnull; + aMenu->QueryInterface(kISupportsIID, (void**)&supports); + if(supports){ + mMenuVoidArray.AppendElement( supports ); + } + MenuHandle menuHandle = nsnull; aMenu->GetNativeData(&menuHandle); diff --git a/mozilla/widget/src/mac/nsMenuItem.cpp b/mozilla/widget/src/mac/nsMenuItem.cpp index 77db3f40d58..f7efcde9873 100644 --- a/mozilla/widget/src/mac/nsMenuItem.cpp +++ b/mozilla/widget/src/mac/nsMenuItem.cpp @@ -31,7 +31,6 @@ static NS_DEFINE_IID(kIMenuBarIID, NS_IMENUBAR_IID); static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIPopUpMenuIID, NS_IPOPUPMENU_IID); static NS_DEFINE_IID(kIMenuItemIID, NS_IMENUITEM_IID); -//NS_IMPL_ISUPPORTS(nsMenuItem, kIMenuItemIID) nsresult nsMenuItem::QueryInterface(REFNSIID aIID, void** aInstancePtr) { @@ -85,8 +84,6 @@ nsMenuItem::nsMenuItem() : nsIMenuItem() //------------------------------------------------------------------------- nsMenuItem::~nsMenuItem() { - NS_IF_RELEASE(mMenuParent); - NS_IF_RELEASE(mPopUpParent); NS_IF_RELEASE(mTarget); NS_IF_RELEASE(mXULCommandListener); } @@ -192,24 +189,7 @@ NS_METHOD nsMenuItem::Create(nsIMenu *aParent, PRBool aIsSeparator) { -/* - if (nsnull == aParent) { - return NS_ERROR_FAILURE; - } - - mMenuParent = aParent; - NS_ADDREF(mMenuParent); - - nsIWidget * widget = nsnull; // MenuBar's Parent - nsISupports * sups; - if (NS_OK == aParent->QueryInterface(kISupportsIID,(void**)&sups)) { - widget = GetMenuBarParent(sups); - NS_RELEASE(sups); - } - - // Create(widget, GetNativeParent(), aLabel, aCommand); - aParent->AddMenuItem(this); -*/ + mIsSeparator = aIsSeparator; SetLabel(NS_CONST_CAST(nsString&, aLabel)); return NS_OK; } @@ -221,16 +201,10 @@ NS_METHOD nsMenuItem::Create(nsIPopUpMenu *aParent, { mPopUpParent = aParent; if ( mPopUpParent ) { - - NS_ADDREF(mPopUpParent); nsIWidget * widget = nsnull; - /*if (NS_OK != aParent->GetParent(widget)) { - widget = nsnull; - }*/ - //Create(widget, GetNativeParent(), aLabel, aCommand); - aParent->AddItem(this); + mPopUpParent->AddItem(this); } return NS_OK; @@ -339,6 +313,7 @@ nsEventStatus nsMenuItem::MenuItemSelected(const nsMenuEvent & aMenuEvent) return nsEventStatus_eIgnore; } +//------------------------------------------------------------------------- nsEventStatus nsMenuItem::MenuSelected(const nsMenuEvent & aMenuEvent) { if(mXULCommandListener) @@ -355,6 +330,7 @@ nsEventStatus nsMenuItem::MenuDeselected(const nsMenuEvent & aMenuEvent) return nsEventStatus_eIgnore; } +//------------------------------------------------------------------------- nsEventStatus nsMenuItem::MenuConstruct( const nsMenuEvent & aMenuEvent, nsIWidget * aParentWindow, @@ -364,6 +340,7 @@ nsEventStatus nsMenuItem::MenuConstruct( return nsEventStatus_eIgnore; } +//------------------------------------------------------------------------- nsEventStatus nsMenuItem::MenuDestruct(const nsMenuEvent & aMenuEvent) { return nsEventStatus_eIgnore; diff --git a/mozilla/widget/src/mac/nsMenuItem.h b/mozilla/widget/src/mac/nsMenuItem.h index 1a961b96ea2..665b0721c2e 100644 --- a/mozilla/widget/src/mac/nsMenuItem.h +++ b/mozilla/widget/src/mac/nsMenuItem.h @@ -97,9 +97,8 @@ protected: nsIWidget * mTarget; nsIMenuListener * mXULCommandListener; - PRBool mIsSeparator; + PRBool mIsSeparator; nsIMenuListener * mListener; - }; #endif // nsMenuItem_h__ diff --git a/mozilla/widget/src/mac/nsWindow.cpp b/mozilla/widget/src/mac/nsWindow.cpp index 909d4595154..6645eafc029 100644 --- a/mozilla/widget/src/mac/nsWindow.cpp +++ b/mozilla/widget/src/mac/nsWindow.cpp @@ -98,6 +98,8 @@ nsWindow::~nsWindow() } NS_IF_RELEASE(mTempRenderingContext); + + NS_IF_RELEASE(mMenuBar); NS_IF_RELEASE(mMenuListener); if (mPluginPort != nsnull) { @@ -199,6 +201,8 @@ NS_IMETHODIMP nsWindow::Destroy() nsBaseWidget::OnDestroy(); nsBaseWidget::Destroy(); + + NS_IF_RELEASE(mMenuBar); SetMenuBar(nsnull); ReportDestroyEvent(); // beard: this seems to cause the window to be deleted. moved all release code to destructor. @@ -378,7 +382,7 @@ NS_IMETHODIMP nsWindow::SetColorMap(nsColorMap *aColorMap) //------------------------------------------------------------------------- NS_IMETHODIMP nsWindow::SetMenuBar(nsIMenuBar * aMenuBar) { - if (mMenuBar != nsnull) + if (mMenuBar) mMenuBar->SetParent(nsnull); NS_IF_RELEASE(mMenuBar); NS_IF_ADDREF(aMenuBar); diff --git a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp index d1c1c91d179..65b142e9bdc 100644 --- a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp +++ b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp @@ -537,6 +537,8 @@ NS_IMETHODIMP nsWebShellWindow::CreateMenu(nsIMenuBar * aMenuBar, nsCOMPtr oldmenuitemNode(menuitemNode); oldmenuitemNode->GetNextSibling(getter_AddRefs(menuitemNode)); } // end menu item innner loop + // The parent owns us, so we can release + NS_RELEASE(pnsMenu); } return NS_OK; @@ -606,6 +608,9 @@ NS_IMETHODIMP nsWebShellWindow::LoadMenuItem( } #endif } + + // The parent owns us, so we can release + NS_RELEASE(pnsMenuItem); } return NS_OK; } @@ -665,6 +670,9 @@ void nsWebShellWindow::LoadSubMenu( nsCOMPtr oldmenuitemNode(menuitemNode); oldmenuitemNode->GetNextSibling(getter_AddRefs(menuitemNode)); } // end menu item innner loop + + // The parent owns us, so we can release + NS_RELEASE(pnsMenu); } } @@ -686,24 +694,15 @@ void nsWebShellWindow::DynamicLoadMenus(nsIDOMDocument * aDOMDoc, nsIWidget * aP nsIMenuBar * pnsMenuBar = nsnull; rv = nsComponentManager::CreateInstance(kMenuBarCID, nsnull, kIMenuBarIID, (void**)&pnsMenuBar); if (NS_OK == rv) { - if (nsnull != pnsMenuBar) { - //pnsMenuBar->Create(aParentWindow); - + if (nsnull != pnsMenuBar) { // set pnsMenuBar as a nsMenuListener on aParentWindow nsCOMPtr menuListener; pnsMenuBar->QueryInterface(kIMenuListenerIID, getter_AddRefs(menuListener)); - //aParentWindow->AddMenuListener(menuListener); //fake event nsMenuEvent fake; menuListener->MenuConstruct(fake, aParentWindow, menubarNode, mWebShell); - // Give the aParentWindow this nsMenuBar to hold onto. - //aParentWindow->SetMenuBar(pnsMenuBar); - - // HACK: force a paint for now - //pnsMenuBar->Paint(); - } // end if ( nsnull != pnsMenuBar ) } } // end if (menuBar) @@ -757,7 +756,7 @@ void nsWebShellWindow::LoadMenus(nsIDOMDocument * aDOMDoc, nsIWidget * aParentWi oldmenuNode->GetNextSibling(getter_AddRefs(menuNode)); } // end while (nsnull != menuNode) - // Give the aParentWindow this nsMenuBar to hold onto. + // Give the aParentWindow this nsMenuBar to own. aParentWindow->SetMenuBar(pnsMenuBar); // HACK: force a paint for now @@ -768,6 +767,9 @@ void nsWebShellWindow::LoadMenus(nsIDOMDocument * aDOMDoc, nsIWidget * aParentWi Handle tempMenuBar = ::GetMenuBar(); // Get a copy of the menu list pnsMenuBar->SetNativeData((void*)tempMenuBar); #endif + + // The parent owns the menubar, so we can release it + NS_RELEASE(pnsMenuBar); } // end if ( nsnull != pnsMenuBar ) } } // end if (menuBar) diff --git a/mozilla/xpfe/appshell/src/nsXULCommand.cpp b/mozilla/xpfe/appshell/src/nsXULCommand.cpp index 0aed932cf63..b3a90386c64 100644 --- a/mozilla/xpfe/appshell/src/nsXULCommand.cpp +++ b/mozilla/xpfe/appshell/src/nsXULCommand.cpp @@ -35,7 +35,6 @@ #define DEBUG_MENUSDEL 1 //---------------------------------------------------------------------- - // Class IID's // IID's @@ -44,21 +43,19 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIXULCommandIID, NS_IXULCOMMAND_IID); //---------------------------------------------------------------------- - nsXULCommand::nsXULCommand() { NS_INIT_REFCNT(); mMenuItem = nsnull; - } //---------------------------------------------------------------------- nsXULCommand::~nsXULCommand() { - NS_IF_RELEASE(mMenuItem); + //NS_IF_RELEASE(mMenuItem); } - +//---------------------------------------------------------------------- NS_IMPL_ADDREF(nsXULCommand) NS_IMPL_RELEASE(nsXULCommand) @@ -112,7 +109,7 @@ NS_IMETHODIMP nsXULCommand::SetCommand(const nsString & aStrCmd) NS_IMETHODIMP nsXULCommand::SetMenuItem(nsIMenuItem * aMenuItem) { mMenuItem = aMenuItem; - NS_ADDREF(mMenuItem); + //NS_ADDREF(mMenuItem); return NS_OK; } @@ -179,14 +176,14 @@ NS_IMETHODIMP nsXULCommand::DoCommand() //---------------------------------------------------------------------- NS_IMETHODIMP nsXULCommand::SetWebShell(nsIWebShell * aWebShell) { - mWebShell = do_QueryInterface(aWebShell); + mWebShell = aWebShell; return NS_OK; } //---------------------------------------------------------------------- NS_IMETHODIMP nsXULCommand::SetDOMElement(nsIDOMElement * aDOMElement) { - mDOMElement = do_QueryInterface(aDOMElement); + mDOMElement = aDOMElement; return NS_OK; } @@ -218,15 +215,10 @@ nsEventStatus nsXULCommand::MenuDeselected(const nsMenuEvent & aMenuEvent) } nsEventStatus nsXULCommand::MenuConstruct( - const nsMenuEvent & aMenuEvent, - nsIWidget * aParentWindow, - void * menubarNode, - void * aWebShell) - { DoCommand(); return nsEventStatus_eConsumeNoDefault; diff --git a/mozilla/xpfe/appshell/src/nsXULCommand.h b/mozilla/xpfe/appshell/src/nsXULCommand.h index 207718451c0..830120ad4b6 100644 --- a/mozilla/xpfe/appshell/src/nsXULCommand.h +++ b/mozilla/xpfe/appshell/src/nsXULCommand.h @@ -61,13 +61,9 @@ public: virtual nsEventStatus MenuSelected(const nsMenuEvent & aMenuEvent); virtual nsEventStatus MenuDeselected(const nsMenuEvent & aMenuEvent) ; virtual nsEventStatus MenuConstruct( - const nsMenuEvent & aMenuEvent, - nsIWidget * aParentWindow, - void * menubarNode, - void * aWebShell); virtual nsEventStatus MenuDestruct(const nsMenuEvent & aMenuEvent); @@ -75,12 +71,10 @@ public: protected: NS_IMETHOD ExecuteJavaScriptString(nsIWebShell* aWebShell, nsString& aJavaScript); - nsString mCommandStr; - nsCOMPtr mWebShell; - nsCOMPtr mDOMElement; - - nsIMenuItem * mMenuItem; - + nsString mCommandStr; + nsIWebShell * mWebShell; + nsIDOMElement * mDOMElement; + nsIMenuItem * mMenuItem; };