]> git.saurik.com Git - wxWidgets.git/commitdiff
Add context menu enabling and disabling to wxWebView, all backends supported.
authorSteve Lamerton <steve.lamerton@gmail.com>
Mon, 31 Dec 2012 13:21:21 +0000 (13:21 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Mon, 31 Dec 2012 13:21:21 +0000 (13:21 +0000)
Closes #14789.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73326 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/webview_webkit.h
include/wx/msw/webview_ie.h
include/wx/webview.h
interface/wx/webview.h
samples/webview/webview.cpp
src/gtk/webview_webkit.cpp
src/msw/webview_ie.cpp
src/osx/webview_webkit.mm

index 2246303c509aa5fa25749067c5f0003587cbfeb5..c42f0ad5646c60440ecf3de2e76d1aba4dbf7246 100644 (file)
@@ -63,6 +63,7 @@ public:
     virtual bool CanGoBack() const;
     virtual bool CanGoForward() const;
     virtual void ClearHistory();
+    virtual void EnableContextMenu(bool enable = true);
     virtual void EnableHistory(bool enable = true);
     virtual wxVector<wxSharedPtr<wxWebViewHistoryItem> > GetBackwardHistory();
     virtual wxVector<wxSharedPtr<wxWebViewHistoryItem> > GetForwardHistory();
index 9e038ebe3d6aa27cfa4c6002f920d16856bef6ee..0d66b0fa30f698bf0fcaf5ef219a53b5e0cc6413 100644 (file)
@@ -271,8 +271,9 @@ private:
 class DocHostUIHandler : public wxIDocHostUIHandler
 {
 public:
-    DocHostUIHandler() {};
+    DocHostUIHandler(wxWebView* browser) { m_browser = browser; }
     ~DocHostUIHandler() {};
+
     virtual HRESULT wxSTDCALL ShowContextMenu(DWORD dwID, POINT *ppt,
                                               IUnknown *pcmdtReserved,
                                               IDispatch *pdispReserved);
@@ -319,6 +320,9 @@ public:
                                                IDataObject **ppDORet);
     //IUnknown
     DECLARE_IUNKNOWN_METHODS;
+
+private:
+    wxWebView* m_browser;
 };
 
 class wxFindPointers
index 050c31953e5092a42a0742984cf640021f7cde19..0e319d7e97ec34da80d252325aebd06a233874c3 100644 (file)
@@ -103,6 +103,11 @@ extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[];
 class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl
 {
 public:
+    wxWebView()
+    {
+        m_showMenu = true;
+    }
+
     virtual ~wxWebView() {}
 
     virtual bool Create(wxWindow* parent,
@@ -124,12 +129,17 @@ public:
            const wxString& name = wxWebViewNameStr);
 
     //General methods
+    virtual void EnableContextMenu(bool enable = true)
+    {
+        m_showMenu = enable;
+    }
     virtual wxString GetCurrentTitle() const = 0;
     virtual wxString GetCurrentURL() const = 0;
     // TODO: handle choosing a frame when calling GetPageSource()?
     virtual wxString GetPageSource() const = 0;
     virtual wxString GetPageText() const = 0;
     virtual bool IsBusy() const = 0;
+    virtual bool IsContextMenuEnabled() const { return m_showMenu; }
     virtual bool IsEditable() const = 0;
     virtual void LoadURL(const wxString& url) = 0;
     virtual void Print() = 0;
@@ -197,6 +207,9 @@ public:
 protected:
     virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0;
 
+private:
+    bool m_showMenu;
+
     wxDECLARE_ABSTRACT_CLASS(wxWebView);
 };
 
index 27ac796d416f57dd2b3930cd817fc4d0fbbbbd5b..64e7d68829f1f4b9aa76a44716b98af1fcdc3baf 100644 (file)
@@ -487,6 +487,20 @@ public:
     */
     virtual void Paste() = 0;
 
+    /**
+        @name Context Menu
+    */
+
+    /**
+        Enable or disbale the right click context menu.
+    */
+    virtual void EnableContextMenu(bool enable = true);
+
+   /**
+        Returns @true if a context menu will be shown on right click.
+    */
+    virtual bool IsContextMenuEnabled() const;
+
     /**
         @name History
     */
index 8589f4cbce928e274dd8692d1671abb559575b3b..a5e56df68c234c8e78f41618b228c47f0f12017e 100644 (file)
@@ -143,6 +143,7 @@ public:
     void OnFindDone(wxCommandEvent& evt);
     void OnFindText(wxCommandEvent& evt);
     void OnFindOptions(wxCommandEvent& evt);
+    void OnEnableContextMenu(wxCommandEvent& evt);
 
 private:
     wxTextCtrl* m_url;
@@ -188,6 +189,7 @@ private:
     wxMenuItem* m_selection_clear;
     wxMenuItem* m_selection_delete;
     wxMenuItem* m_find;
+    wxMenuItem* m_context_menu;
 
     wxInfoBar *m_info;
     wxStaticText* m_info_text;
@@ -403,6 +405,8 @@ WebFrame::WebFrame(const wxString& url) :
     wxMenuItem* loadscheme =  m_tools_menu->Append(wxID_ANY, _("Custom Scheme Example"));
     wxMenuItem* usememoryfs =  m_tools_menu->Append(wxID_ANY, _("Memory File System Example"));
 
+    m_context_menu = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Context Menu"));
+
     //By default we want to handle navigation and new windows
     m_tools_handle_navigation->Check();
     m_tools_handle_new_window->Check();
@@ -509,6 +513,8 @@ WebFrame::WebFrame(const wxString& url) :
             wxCommandEventHandler(WebFrame::OnUseMemoryFS),  NULL, this );
     Connect(m_find->GetId(), wxEVT_COMMAND_MENU_SELECTED,
             wxCommandEventHandler(WebFrame::OnFind),  NULL, this );
+    Connect(m_context_menu->GetId(), wxEVT_COMMAND_MENU_SELECTED,
+            wxCommandEventHandler(WebFrame::OnEnableContextMenu), NULL, this );
 
     //Connect the idle events
     Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(WebFrame::OnIdle), NULL, this);
@@ -659,6 +665,11 @@ void WebFrame::OnUseMemoryFS(wxCommandEvent& WXUNUSED(evt))
     m_browser->LoadURL("memory:page1.htm");
 }
 
+void WebFrame::OnEnableContextMenu(wxCommandEvent& evt)
+{
+    m_browser->EnableContextMenu(evt.IsChecked());
+}
+
 void WebFrame::OnFind(wxCommandEvent& WXUNUSED(evt))
 {
     wxString value = m_browser->GetSelectedText();
@@ -850,6 +861,8 @@ void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt))
     m_selection_clear->Enable(m_browser->HasSelection());
     m_selection_delete->Enable(m_browser->HasSelection());
 
+    m_context_menu->Check(m_browser->IsContextMenuEnabled());
+
     //Firstly we clear the existing menu items, then we add the current ones
     wxMenuHistoryMap::const_iterator it;
     for( it = m_histMenuItems.begin(); it != m_histMenuItems.end(); ++it )
index 3e9008503fc5eb246c24f90b3c72c599902dbda1..5a3ad0cb04058170dcea95e29c3c26c15781aede 100644 (file)
@@ -378,6 +378,23 @@ wxgtk_webview_webkit_resource_req(WebKitWebView *,
     }
 }
 
+#if WEBKIT_CHECK_VERSION(1, 10, 0)
+
+static gboolean
+wxgtk_webview_webkit_context_menu(WebKitWebView *,
+                                  GtkWidget *,
+                                  WebKitHitTestResult *,
+                                  gboolean,
+                                  wxWebViewWebKit *webKitCtrl)
+{
+    if(webKitCtrl->IsContextMenuEnabled())
+        return FALSE;
+    else
+        return TRUE;
+}
+
+#endif
+
 } // extern "C"
 
 //-----------------------------------------------------------------------------
@@ -433,6 +450,11 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
 
     g_signal_connect_after(m_web_view, "resource-request-starting",
                            G_CALLBACK(wxgtk_webview_webkit_resource_req), this);
+      
+#if WEBKIT_CHECK_VERSION(1, 10, 0)    
+     g_signal_connect_after(m_web_view, "context-menu",
+                           G_CALLBACK(wxgtk_webview_webkit_context_menu), this);
+#endif
 
     m_parent->DoAddChild( this );
 
@@ -926,6 +948,15 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
     m_handlerList.push_back(handler);
 }
 
+void wxWebViewWebKit::EnableContextMenu(bool enable)
+{
+#if !WEBKIT_CHECK_VERSION(1, 10, 0) //If we are using an older version
+    g_object_set(webkit_web_view_get_settings(m_web_view), 
+                 "enable-default-context-menu", enable, NULL);
+#endif
+    wxWebView::EnableContextMenu(enable);
+}
+
 long wxWebViewWebKit::Find(const wxString& text, int flags)
 {
     bool newSearch = false;
index 2f6ac73c3dfb8fddf2015b1b51b51d0441601f6e..093707bb17d83c4097484b73d2b8ba07bcca150b 100644 (file)
@@ -100,7 +100,7 @@ bool wxWebViewIE::Create(wxWindow* parent,
     m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
     m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
 
-    m_uiHandler = new DocHostUIHandler;
+    m_uiHandler = new DocHostUIHandler(this);
 
     m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler);
 
@@ -1549,7 +1549,10 @@ HRESULT wxSTDCALL DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt,
     wxUnusedVar(ppt);
     wxUnusedVar(pcmdtReserved);
     wxUnusedVar(pdispReserved);
-    return E_NOTIMPL;
+    if(m_browser->IsContextMenuEnabled()) 
+        return E_NOTIMPL; 
+    else 
+        return S_OK; 
 }
 
 HRESULT wxSTDCALL DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
index 3b869b6f32ee9edb1292579843adcc018226a093..83b1946c897c5042ea2aebffb5f1f3108b6e6cf2 100644 (file)
@@ -1346,6 +1346,15 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out)
 
     webKitWindow->Print();
 }
+
+- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
+                                                 defaultMenuItems:(NSArray *) defaultMenuItems
+{
+    if(webKitWindow->IsContextMenuEnabled())
+        return defaultMenuItems;
+    else
+        return nil;
+}
 @end
 
 #endif //wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT