diff --git a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp index 7f71ee024dd..1c0553f1d55 100644 --- a/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp +++ b/mozilla/xpfe/appshell/src/nsWebShellWindow.cpp @@ -47,6 +47,7 @@ #include "nsIMenu.h" #include "nsIMenuItem.h" #include "nsIMenuListener.h" +#include "nsIContextMenu.h" // For JS Execution #include "nsIScriptContextOwner.h" @@ -84,9 +85,11 @@ static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID); static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID); static NS_DEFINE_IID(kAppShellCID, NS_APPSHELL_CID); +#include "nsWidgetsCID.h" static NS_DEFINE_IID(kMenuBarCID, NS_MENUBAR_CID); static NS_DEFINE_IID(kMenuCID, NS_MENU_CID); static NS_DEFINE_IID(kMenuItemCID, NS_MENUITEM_CID); +static NS_DEFINE_IID(kContextMenuCID, NS_CONTEXTMENU_CID); static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); @@ -111,11 +114,12 @@ static NS_DEFINE_IID(kIDOMCharacterDataIID, NS_IDOMCHARACTERDATA_IID); //static NS_DEFINE_IID(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID); //static NS_DEFINE_IID(kIDOMHTMLImageElementIID, NS_IDOMHTMLIMAGEELEMENT_IID); -static NS_DEFINE_IID(kIMenuIID, NS_IMENU_IID); -static NS_DEFINE_IID(kIMenuBarIID, NS_IMENUBAR_IID); -static NS_DEFINE_IID(kIMenuItemIID, NS_IMENUITEM_IID); -static NS_DEFINE_IID(kIXULCommandIID, NS_IXULCOMMAND_IID); -static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); +static NS_DEFINE_IID(kIMenuIID, NS_IMENU_IID); +static NS_DEFINE_IID(kIMenuBarIID, NS_IMENUBAR_IID); +static NS_DEFINE_IID(kIMenuItemIID, NS_IMENUITEM_IID); +static NS_DEFINE_IID(kIContextMenuIID, NS_ICONTEXTMENU_IID); +static NS_DEFINE_IID(kIXULCommandIID, NS_IXULCOMMAND_IID); +static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID); #ifdef DEBUG_rods @@ -813,6 +817,46 @@ void nsWebShellWindow::LoadMenus(nsIDOMDocument * aDOMDoc, nsIWidget * aParentWi } // nsWebShellWindow::LoadMenus +//------------------------------------------------------------------------------ +void nsWebShellWindow::DoContextMenu( + nsMenuEvent * aMenuEvent, + nsIDOMNode * aMenuNode, + nsIWidget * aParentWindow, + PRInt32 aX, + PRInt32 aY) +{ + if (aMenuNode) { + nsIContextMenu * pnsContextMenu; + nsresult rv = nsComponentManager::CreateInstance(kContextMenuCID, nsnull, kIContextMenuIID, (void**)&pnsContextMenu); + if (NS_SUCCEEDED(rv) && pnsContextMenu) { + nsISupports * supports; + aParentWindow->QueryInterface(kISupportsIID, (void**) &supports); + pnsContextMenu->Create(supports); + NS_RELEASE(supports); + pnsContextMenu->SetLocation(aX,aY); + // Set webshell + //pnsContextMenu->SetWebShell( ); + // Set DOM node + pnsContextMenu->SetDOMNode( aMenuNode ); + + // Construct and show menu + nsIMenuListener * listener; + pnsContextMenu->QueryInterface(kIMenuListenerIID, (void**) &listener); + + // Dynamically construct and track the menu + listener->MenuSelected(*aMenuEvent); + + // Destroy the menu + listener->MenuDeselected(*aMenuEvent); + + // The parent owns the context menu, so we can release it + NS_RELEASE(listener); + NS_RELEASE(pnsContextMenu); + } + } // end if (aMenuNode) +} + +//------------------------------------------------------------------------------ NS_IMETHODIMP nsWebShellWindow::GetContentShellById(const nsString& aID, nsIWebShell** aChildShell) { @@ -840,6 +884,7 @@ nsWebShellWindow::GetContentShellById(const nsString& aID, nsIWebShell** aChildS return NS_ERROR_FAILURE; } +//------------------------------------------------------------------------------ NS_IMETHODIMP nsWebShellWindow::AddWebShellInfo(const nsString& aID, nsIWebShell* aChildShell) @@ -1160,6 +1205,14 @@ nsWebShellWindow::OnEndDocumentLoad(nsIDocumentLoader* loader, { #ifdef XP_MAC LoadMenus(menubarDOMDoc, mWindow); + // Context Menu test + nsCOMPtr element; + menubarDOMDoc->GetDocumentElement(getter_AddRefs(element)); + nsCOMPtr window(do_QueryInterface(element)); + + int endCount = 0; + contextMenuTest = FindNamedDOMNode(nsAutoString("contextmenu"), window, endCount, 1); + // End Context Menu test #else DynamicLoadMenus(menubarDOMDoc, mWindow); #endif diff --git a/mozilla/xpfe/appshell/src/nsWebShellWindow.h b/mozilla/xpfe/appshell/src/nsWebShellWindow.h index d6ba7bc4412..52153c83cef 100644 --- a/mozilla/xpfe/appshell/src/nsWebShellWindow.h +++ b/mozilla/xpfe/appshell/src/nsWebShellWindow.h @@ -117,6 +117,13 @@ public: PRInt32 aInitialWidth, PRInt32 aInitialHeight); nsIWidget* GetWidget(void) { return mWindow; } + void DoContextMenu( + nsMenuEvent * aMenuEvent, + nsIDOMNode * aMenuNode, + nsIWidget * aParentWindow, + PRInt32 aX, + PRInt32 aY); + // nsIDocumentLoaderObserver NS_IMETHOD OnStartDocumentLoad(nsIDocumentLoader* loader, nsIURL* aURL, const char* aCommand); @@ -251,6 +258,7 @@ protected: nsVoidArray* mContentShells; // Tracks an array of information about new shells that will be // created as the XUL file for this window loads. + nsIDOMNode * contextMenuTest; private: static void * HandleModalDialogEvent(PLEvent *aEvent);