]> git.saurik.com Git - wxWidgets.git/commitdiff
Allow registering of custom wxWebView backends.
authorSteve Lamerton <steve.lamerton@gmail.com>
Sun, 13 Jan 2013 19:22:24 +0000 (19:22 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Sun, 13 Jan 2013 19:22:24 +0000 (19:22 +0000)
Add wxWebViewFactory as an abstract factory to provide backend creation. Remove old factory methods using wxWebViewBackend enum in favour of the new wxString based method.

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

docs/changes.txt
include/wx/gtk/webview_webkit.h
include/wx/msw/webview_ie.h
include/wx/osx/webview_webkit.h
include/wx/webview.h
interface/wx/webview.h
src/common/webview.cpp

index 3d55d295db9d4ad19f537006283b6680f1d0d3f1..f851eebc0578e91cf9e13ac50108570da5028166 100644 (file)
@@ -533,6 +533,8 @@ INCOMPATIBLE CHANGES SINCE 2.9.4:
   previous 2.9 versions (but like in 2.8). Use wxLocale (preferred) or call
   wxApp::SetCLocale() from your overridden wxApp::Initialize() to restore the
   old behaviour.
+- wxWebView::New now takes a string identifier for the backend to be used
+  rather than a wxWebViewBackend enum value.
 
 All:
 
@@ -564,6 +566,8 @@ All (GUI):
 - Add generic wxFileSystem support to wxWebView with 
   wxWebViewFSHandler (Nick Matthews).
 - Add possibility to disable context menu in wxWebView.
+- Add ability to register custom wxWebView backends using 
+  wxWebView::RegisterFactory and a wxWebViewFactory derived class.
 - Add possibility to hide and show again wxRibbonBar pages (wxBen).
 - Add wxRibbonBar pages highlighting (wxBen).
 - Add expand/collapse button to wxRibbonBar (rakeshthp).
index c42f0ad5646c60440ecf3de2e76d1aba4dbf7246..b89fa9f106224da8f3c68696cc757572faac9d1c 100644 (file)
@@ -164,6 +164,21 @@ private:
     wxDECLARE_DYNAMIC_CLASS(wxWebViewWebKit);
 };
 
+class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory
+{
+public:
+    virtual wxWebView* Create() { return new wxWebViewWebKit; }
+    virtual wxWebView* Create(wxWindow* parent,
+                              wxWindowID id,
+                              const wxString& url = wxWebViewDefaultURLStr,
+                              const wxPoint& pos = wxDefaultPosition,
+                              const wxSize& size = wxDefaultSize,
+                              long style = 0,
+                              const wxString& name = wxWebViewNameStr)
+    { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); }
+};
+
+
 #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__)
 
 #endif
index 0d66b0fa30f698bf0fcaf5ef219a53b5e0cc6413..0f613d1200721b1f557a22459fd6d513c0e2e204 100644 (file)
@@ -195,6 +195,20 @@ private:
     wxDECLARE_DYNAMIC_CLASS(wxWebViewIE);
 };
 
+class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryIE : public wxWebViewFactory
+{
+public:
+    virtual wxWebView* Create() { return new wxWebViewIE; }
+    virtual wxWebView* Create(wxWindow* parent,
+                              wxWindowID id,
+                              const wxString& url = wxWebViewDefaultURLStr,
+                              const wxPoint& pos = wxDefaultPosition,
+                              const wxSize& size = wxDefaultSize,
+                              long style = 0,
+                              const wxString& name = wxWebViewNameStr)
+    { return new wxWebViewIE(parent, id, url, pos, size, style, name); }
+};
+
 class VirtualProtocol : public wxIInternetProtocol
 {
 protected:
index 94f99c1d580ee34a314d9000351927aa2752bd37..a21bf6551e05b97be2afbbb97bcbc18bdb9cf66e 100644 (file)
@@ -168,6 +168,20 @@ private:
     //TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this.
 };
 
+class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory
+{
+public:
+    virtual wxWebView* Create() { return new wxWebViewWebKit; }
+    virtual wxWebView* Create(wxWindow* parent,
+                              wxWindowID id,
+                              const wxString& url = wxWebViewDefaultURLStr,
+                              const wxPoint& pos = wxDefaultPosition,
+                              const wxSize& size = wxDefaultSize,
+                              long style = 0,
+                              const wxString& name = wxWebViewNameStr)
+    { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); }
+};
+
 #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT
 
 #endif // _WX_WEBKIT_H_
index 0e319d7e97ec34da80d252325aebd06a233874c3..2ff23c6a769b404f4f19759b7bb2ce270542171f 100644 (file)
@@ -32,6 +32,7 @@
 
 class wxFSFile;
 class wxFileSystem;
+class wxWebView;
 
 enum wxWebViewZoom
 {
@@ -78,13 +79,6 @@ enum wxWebViewFindFlags
     wxWEB_VIEW_FIND_DEFAULT =          0
 };
 
-enum wxWebViewBackend
-{
-    wxWEB_VIEW_BACKEND_DEFAULT,
-    wxWEB_VIEW_BACKEND_WEBKIT,
-    wxWEB_VIEW_BACKEND_IE
-};
-
 //Base class for custom scheme handlers
 class WXDLLIMPEXP_WEBVIEW wxWebViewHandler
 {
@@ -99,6 +93,24 @@ private:
 
 extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[];
 extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[];
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[];
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[];
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[];
+
+class WXDLLIMPEXP_WEBVIEW wxWebViewFactory : public wxObject
+{
+public:
+    virtual wxWebView* Create() = 0;
+    virtual wxWebView* Create(wxWindow* parent,
+                              wxWindowID id,
+                              const wxString& url = wxWebViewDefaultURLStr,
+                              const wxPoint& pos = wxDefaultPosition,
+                              const wxSize& size = wxDefaultSize,
+                              long style = 0,
+                              const wxString& name = wxWebViewNameStr) = 0;
+};
+
+WX_DECLARE_STRING_HASH_MAP(wxSharedPtr<wxWebViewFactory>, wxStringWebViewFactoryMap);
 
 class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl
 {
@@ -118,17 +130,22 @@ public:
            long style = 0,
            const wxString& name = wxWebViewNameStr) = 0;
 
-    static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT);
+    // Factory methods allowing the use of custom factories registered with
+    // RegisterFactory
+    static wxWebView* New(const wxString& backend = wxWebViewBackendDefault);
     static wxWebView* New(wxWindow* parent,
-           wxWindowID id,
-           const wxString& url = wxWebViewDefaultURLStr,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize,
-           wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT,
-           long style = 0,
-           const wxString& name = wxWebViewNameStr);
-
-    //General methods
+                          wxWindowID id,
+                          const wxString& url = wxWebViewDefaultURLStr,
+                          const wxPoint& pos = wxDefaultPosition,
+                          const wxSize& size = wxDefaultSize,
+                          const wxString& backend = wxWebViewBackendDefault,
+                          long style = 0,
+                          const wxString& name = wxWebViewNameStr);
+
+    static void RegisterFactory(const wxString& backend, 
+                                wxSharedPtr<wxWebViewFactory> factory);
+
+    // General methods
     virtual void EnableContextMenu(bool enable = true)
     {
         m_showMenu = enable;
@@ -208,7 +225,11 @@ protected:
     virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0;
 
 private:
+    static void InitFactoryMap();
+    static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend);
+
     bool m_showMenu;
+    static wxStringWebViewFactoryMap m_factoryMap;
 
     wxDECLARE_ABSTRACT_CLASS(wxWebView);
 };
index 55ff6e77b9eb83bfa07bf92de133739955f84033..88b21496b2c4d1a11e1decaf3ba215bb15b1bb68 100644 (file)
@@ -140,6 +140,46 @@ public:
     wxString GetTitle();
 };
 
+/**
+    @class wxWebViewFactory
+
+    An abstract factory class for creating wxWebView backends. Each
+    implementation of wxWebView should have its own factory.
+
+    @since 2.9.5
+    @library{wxwebview}
+    @category{webview}
+
+    @see wxWebView
+ */
+class wxWebViewFactory : public wxObject
+{
+public:
+    /**
+        Function to create a new wxWebView with two-step creation,
+        wxWebView::Create should be called on the returned object.
+        @return the created wxWebView
+     */
+    virtual wxWebView* Create() = 0;
+
+    /**
+        Function to create a new wxWebView with parameters.
+        @param parent Parent window for the control
+        @param id ID of this control
+        @param url Initial URL to load
+        @param pos Position of the control
+        @param size Size of the control
+        @return the created wxWebView
+    */
+    virtual wxWebView* Create(wxWindow* parent,
+                              wxWindowID id,
+                              const wxString& url = wxWebViewDefaultURLStr,
+                              const wxPoint& pos = wxDefaultPosition,
+                              const wxSize& size = wxDefaultSize,
+                              long style = 0,
+                              const wxString& name = wxWebViewNameStr) = 0;
+};
+
 /**
     @class wxWebViewHandler
 
@@ -290,35 +330,49 @@ public:
                         const wxString& name = wxWebViewNameStr) = 0;
 
     /**
-        Factory function to create a new wxWebView for two-step creation
-        (you need to call wxWebView::Create on the returned object)
-        @param backend which web engine to use as backend for wxWebView
-        @return the created wxWebView, or NULL if the requested backend is
-                not available
+        Factory function to create a new wxWebView with two-step creation,
+        wxWebView::Create should be called on the returned object.
+        @param backend The backend web rendering engine to use. 
+                       @c wxWebViewBackendDefault, @c wxWebViewBackendIE and
+                       @c wxWebViewBackendWebKit are predefined where appropriate.
+        @return The created wxWebView
+        @since 2.9.5
      */
-    static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT);
-
+    static wxWebView* New(const wxString& backend = wxWebViewBackendDefault);
+    
     /**
-        Factory function to create a new wxWebView
-        @param parent parent window to create this view in
+        Factory function to create a new wxWebView using a wxWebViewFactory.
+        @param parent Parent window for the control
         @param id ID of this control
-        @param url URL to load by default in the web view
-        @param pos position to create this control at
-               (you may use wxDefaultPosition if you use sizers)
-        @param size size to create this control with
-               (you may use wxDefaultSize if you use sizers)
-        @param backend which web engine to use as backend for wxWebView
-        @return the created wxWebView, or NULL if the requested backend
+        @param url Initial URL to load
+        @param pos Position of the control
+        @param size Size of the control
+        @param backend The backend web rendering engine to use.
+                       @c wxWebViewBackendDefault, @c wxWebViewBackendIE and
+                       @c wxWebViewBackendWebKit are predefined where appropriate.
+        @return The created wxWebView, or @c NULL if the requested backend
                 is not available
+        @since 2.9.5
     */
     static wxWebView* New(wxWindow* parent,
-           wxWindowID id,
-           const wxString& url = wxWebViewDefaultURLStr,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize,
-           wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT,
-           long style = 0,
-           const wxString& name = wxWebViewNameStr);
+                          wxWindowID id,
+                          const wxString& url = wxWebViewDefaultURLStr,
+                          const wxPoint& pos = wxDefaultPosition,
+                          const wxSize& size = wxDefaultSize,
+                          const wxString& backend = wxWebViewBackendDefault,
+                          long style = 0,
+                          const wxString& name = wxWebViewNameStr);
+
+    /** 
+        Allows the registering of new backend for wxWebView. @a backend can be
+        used as an argument to New().
+        @param backend The name for the new backend to be registered under
+        @param factory A shared pointer to the factory which creates the 
+                       appropriate backend.
+        @since 2.9.5
+    */
+    static void RegisterFactory(const wxString& backend, 
+                                wxSharedPtr<wxWebViewFactory> factory);
 
     /**
         Get the title of the current web page, or its URL/path if title is not
index bbd6f3168f2bc83a452c3e1a8048b7d3635c1cb7..81d042e94f4c7dd1803affca4ab596b27c68d497 100644 (file)
@@ -32,6 +32,14 @@ WX_CHECK_BUILD_OPTIONS("wxWEBVIEW")
 
 extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[] = "wxWebView";
 extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[] = "about:blank";
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[] = "wxWebViewIE";
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[] = "wxWebViewWebKit";
+
+#ifdef __WXMSW__
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[] = "wxWebViewIE";
+#else
+extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[] = "wxWebViewWebKit";
+#endif
 
 wxIMPLEMENT_ABSTRACT_CLASS(wxWebView, wxControl);
 wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEvent, wxCommandEvent);
@@ -43,77 +51,61 @@ wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebViewEvent );
 wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, wxWebViewEvent );
 wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebViewEvent );
 
+wxStringWebViewFactoryMap wxWebView::m_factoryMap;
+
+// static
+wxWebView* wxWebView::New(const wxString& backend)
+{
+    wxStringWebViewFactoryMap::iterator iter = FindFactory(backend);
+
+    if(iter == m_factoryMap.end())
+        return NULL;
+    else
+        return (*iter).second->Create();
+}
+
+// static
+wxWebView* wxWebView::New(wxWindow* parent, wxWindowID id, const wxString& url,
+                          const wxPoint& pos, const wxSize& size, 
+                          const wxString& backend, long style, 
+                          const wxString& name)
+{
+    wxStringWebViewFactoryMap::iterator iter = FindFactory(backend);
+
+    if(iter == m_factoryMap.end())
+        return NULL;
+    else
+        return (*iter).second->Create(parent, id, url, pos, size, style, name);
+
+}
+
 // static
-wxWebView* wxWebView::New(wxWebViewBackend backend)
+void wxWebView::RegisterFactory(const wxString& backend, 
+                                wxSharedPtr<wxWebViewFactory> factory)
 {
-    switch (backend)
-    {
-        #if defined(wxUSE_WEBVIEW_WEBKIT) && \
-           (defined(__WXGTK__) || defined(__WXOSX__))
-        case wxWEB_VIEW_BACKEND_WEBKIT:
-            return new wxWebViewWebKit();
-        #endif
-
-        #if wxUSE_WEBVIEW_IE
-        case wxWEB_VIEW_BACKEND_IE:
-            return new wxWebViewIE();
-        #endif
-
-        case wxWEB_VIEW_BACKEND_DEFAULT:
-
-            #if defined(wxUSE_WEBVIEW_WEBKIT) && \
-               (defined(__WXGTK__) || defined(__WXOSX__))
-            return new wxWebViewWebKit();
-            #endif
-
-            #if wxUSE_WEBVIEW_IE
-            return new wxWebViewIE();
-            #endif
-
-        // fall-through intended
-        default:
-            return NULL;
-    }
+    m_factoryMap[backend] = factory;
 }
 
+// static 
+wxStringWebViewFactoryMap::iterator wxWebView::FindFactory(const wxString &backend)
+{
+    // Initialise the map if needed
+    if(m_factoryMap.empty())
+        InitFactoryMap();
+
+    return m_factoryMap.find(backend);
+}
 // static
-wxWebView* wxWebView::New(wxWindow* parent,
-       wxWindowID id,
-       const wxString& url,
-       const wxPoint& pos,
-       const wxSize& size,
-       wxWebViewBackend backend,
-       long style,
-       const wxString& name)
+void wxWebView::InitFactoryMap()
 {
-    switch (backend)
-    {
-        #if defined(wxUSE_WEBVIEW_WEBKIT) && \
-           (defined(__WXGTK__) || defined(__WXOSX__))
-        case wxWEB_VIEW_BACKEND_WEBKIT:
-            return new wxWebViewWebKit(parent, id, url, pos, size, style, name);
-        #endif
-
-        #if wxUSE_WEBVIEW_IE
-        case wxWEB_VIEW_BACKEND_IE:
-            return new wxWebViewIE(parent, id, url, pos, size, style, name);
-        #endif
-
-        case wxWEB_VIEW_BACKEND_DEFAULT:
-
-            #if defined(wxUSE_WEBVIEW_WEBKIT) && \
-               (defined(__WXGTK__) || defined(__WXOSX__))
-            return new wxWebViewWebKit(parent, id, url, pos, size, style, name);
-            #endif
-
-            #if wxUSE_WEBVIEW_IE
-            return new wxWebViewIE(parent, id, url, pos, size, style, name);
-            #endif
-
-        // fall-through intended
-        default:
-            return NULL;
-    }
+#ifdef __WXMSW__
+    RegisterFactory(wxWebViewBackendIE, wxSharedPtr<wxWebViewFactory>
+                                                   (new wxWebViewFactoryIE));
+#else
+    RegisterFactory(wxWebViewBackendWebKit, wxSharedPtr<wxWebViewFactory>
+                                                       (new wxWebViewFactoryWebKit));
+#endif
 }
 
 #endif // wxUSE_WEBVIEW