diff --git a/docs/changes.txt b/docs/changes.txt index 3d55d295db..f851eebc05 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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). diff --git a/include/wx/gtk/webview_webkit.h b/include/wx/gtk/webview_webkit.h index c42f0ad564..b89fa9f106 100644 --- a/include/wx/gtk/webview_webkit.h +++ b/include/wx/gtk/webview_webkit.h @@ -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 diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 0d66b0fa30..0f613d1200 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -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: diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 94f99c1d58..a21bf6551e 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -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_ diff --git a/include/wx/webview.h b/include/wx/webview.h index 0e319d7e97..2ff23c6a76 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -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, 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); + 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); - //General methods + static void RegisterFactory(const wxString& backend, + wxSharedPtr 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); }; diff --git a/interface/wx/webview.h b/interface/wx/webview.h index 55ff6e77b9..88b21496b2 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -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 factory); /** Get the title of the current web page, or its URL/path if title is not diff --git a/src/common/webview.cpp b/src/common/webview.cpp index bbd6f3168f..81d042e94f 100644 --- a/src/common/webview.cpp +++ b/src/common/webview.cpp @@ -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(wxWebViewBackend backend) +wxWebView* wxWebView::New(const wxString& backend) { - switch (backend) - { - #if defined(wxUSE_WEBVIEW_WEBKIT) && \ - (defined(__WXGTK__) || defined(__WXOSX__)) - case wxWEB_VIEW_BACKEND_WEBKIT: - return new wxWebViewWebKit(); - #endif + wxStringWebViewFactoryMap::iterator iter = FindFactory(backend); - #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; - } + 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, - wxWebViewBackend backend, - long style, - const wxString& name) +wxWebView* wxWebView::New(wxWindow* parent, wxWindowID id, const wxString& url, + const wxPoint& pos, const wxSize& size, + const wxString& backend, long style, + const wxString& name) { - 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 + wxStringWebViewFactoryMap::iterator iter = FindFactory(backend); - #if wxUSE_WEBVIEW_IE - case wxWEB_VIEW_BACKEND_IE: - return new wxWebViewIE(parent, id, url, pos, size, style, name); - #endif + if(iter == m_factoryMap.end()) + return NULL; + else + return (*iter).second->Create(parent, id, url, pos, size, style, name); - 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 +// static +void wxWebView::RegisterFactory(const wxString& backend, + wxSharedPtr factory) +{ + m_factoryMap[backend] = factory; +} - #if wxUSE_WEBVIEW_IE - return new wxWebViewIE(parent, id, url, pos, size, style, name); - #endif +// static +wxStringWebViewFactoryMap::iterator wxWebView::FindFactory(const wxString &backend) +{ + // Initialise the map if needed + if(m_factoryMap.empty()) + InitFactoryMap(); - // fall-through intended - default: - return NULL; - } + return m_factoryMap.find(backend); +} + +// static +void wxWebView::InitFactoryMap() +{ +#ifdef __WXMSW__ + RegisterFactory(wxWebViewBackendIE, wxSharedPtr + (new wxWebViewFactoryIE)); +#else + RegisterFactory(wxWebViewBackendWebKit, wxSharedPtr + (new wxWebViewFactoryWebKit)); +#endif } #endif // wxUSE_WEBVIEW