Allow registering of custom wxWebView backends.

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
This commit is contained in:
Steve Lamerton
2013-01-13 19:22:24 +00:00
parent 0ecd03525b
commit 4c687fff5e
7 changed files with 212 additions and 98 deletions

View 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 previous 2.9 versions (but like in 2.8). Use wxLocale (preferred) or call
wxApp::SetCLocale() from your overridden wxApp::Initialize() to restore the wxApp::SetCLocale() from your overridden wxApp::Initialize() to restore the
old behaviour. old behaviour.
- wxWebView::New now takes a string identifier for the backend to be used
rather than a wxWebViewBackend enum value.
All: All:
@@ -564,6 +566,8 @@ All (GUI):
- Add generic wxFileSystem support to wxWebView with - Add generic wxFileSystem support to wxWebView with
wxWebViewFSHandler (Nick Matthews). wxWebViewFSHandler (Nick Matthews).
- Add possibility to disable context menu in wxWebView. - 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 possibility to hide and show again wxRibbonBar pages (wxBen).
- Add wxRibbonBar pages highlighting (wxBen). - Add wxRibbonBar pages highlighting (wxBen).
- Add expand/collapse button to wxRibbonBar (rakeshthp). - Add expand/collapse button to wxRibbonBar (rakeshthp).

View File

@@ -164,6 +164,21 @@ private:
wxDECLARE_DYNAMIC_CLASS(wxWebViewWebKit); 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 // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__)
#endif #endif

View File

@@ -195,6 +195,20 @@ private:
wxDECLARE_DYNAMIC_CLASS(wxWebViewIE); 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 class VirtualProtocol : public wxIInternetProtocol
{ {
protected: protected:

View File

@@ -168,6 +168,20 @@ private:
//TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this. //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 // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT
#endif // _WX_WEBKIT_H_ #endif // _WX_WEBKIT_H_

View File

@@ -32,6 +32,7 @@
class wxFSFile; class wxFSFile;
class wxFileSystem; class wxFileSystem;
class wxWebView;
enum wxWebViewZoom enum wxWebViewZoom
{ {
@@ -78,13 +79,6 @@ enum wxWebViewFindFlags
wxWEB_VIEW_FIND_DEFAULT = 0 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 //Base class for custom scheme handlers
class WXDLLIMPEXP_WEBVIEW wxWebViewHandler class WXDLLIMPEXP_WEBVIEW wxWebViewHandler
{ {
@@ -99,6 +93,24 @@ private:
extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[]; extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[];
extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[]; 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 class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl
{ {
@@ -118,16 +130,21 @@ public:
long style = 0, long style = 0,
const wxString& name = wxWebViewNameStr) = 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, static wxWebView* New(wxWindow* parent,
wxWindowID id, wxWindowID id,
const wxString& url = wxWebViewDefaultURLStr, const wxString& url = wxWebViewDefaultURLStr,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT, const wxString& backend = wxWebViewBackendDefault,
long style = 0, long style = 0,
const wxString& name = wxWebViewNameStr); const wxString& name = wxWebViewNameStr);
static void RegisterFactory(const wxString& backend,
wxSharedPtr<wxWebViewFactory> factory);
// General methods // General methods
virtual void EnableContextMenu(bool enable = true) virtual void EnableContextMenu(bool enable = true)
{ {
@@ -208,7 +225,11 @@ protected:
virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0; virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0;
private: private:
static void InitFactoryMap();
static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend);
bool m_showMenu; bool m_showMenu;
static wxStringWebViewFactoryMap m_factoryMap;
wxDECLARE_ABSTRACT_CLASS(wxWebView); wxDECLARE_ABSTRACT_CLASS(wxWebView);
}; };

View File

@@ -140,6 +140,46 @@ public:
wxString GetTitle(); 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 @class wxWebViewHandler
@@ -290,36 +330,50 @@ public:
const wxString& name = wxWebViewNameStr) = 0; const wxString& name = wxWebViewNameStr) = 0;
/** /**
Factory function to create a new wxWebView for two-step creation Factory function to create a new wxWebView with two-step creation,
(you need to call wxWebView::Create on the returned object) wxWebView::Create should be called on the returned object.
@param backend which web engine to use as backend for wxWebView @param backend The backend web rendering engine to use.
@return the created wxWebView, or NULL if the requested backend is @c wxWebViewBackendDefault, @c wxWebViewBackendIE and
not available @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 Factory function to create a new wxWebView using a wxWebViewFactory.
@param parent parent window to create this view in @param parent Parent window for the control
@param id ID of this control @param id ID of this control
@param url URL to load by default in the web view @param url Initial URL to load
@param pos position to create this control at @param pos Position of the control
(you may use wxDefaultPosition if you use sizers) @param size Size of the control
@param size size to create this control with @param backend The backend web rendering engine to use.
(you may use wxDefaultSize if you use sizers) @c wxWebViewBackendDefault, @c wxWebViewBackendIE and
@param backend which web engine to use as backend for wxWebView @c wxWebViewBackendWebKit are predefined where appropriate.
@return the created wxWebView, or NULL if the requested backend @return The created wxWebView, or @c NULL if the requested backend
is not available is not available
@since 2.9.5
*/ */
static wxWebView* New(wxWindow* parent, static wxWebView* New(wxWindow* parent,
wxWindowID id, wxWindowID id,
const wxString& url = wxWebViewDefaultURLStr, const wxString& url = wxWebViewDefaultURLStr,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT, const wxString& backend = wxWebViewBackendDefault,
long style = 0, long style = 0,
const wxString& name = wxWebViewNameStr); 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 Get the title of the current web page, or its URL/path if title is not
available. available.

View File

@@ -32,6 +32,14 @@ WX_CHECK_BUILD_OPTIONS("wxWEBVIEW")
extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[] = "wxWebView"; extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[] = "wxWebView";
extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[] = "about:blank"; 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_ABSTRACT_CLASS(wxWebView, wxControl);
wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEvent, wxCommandEvent); 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_NEWWINDOW, wxWebViewEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebViewEvent );
wxStringWebViewFactoryMap wxWebView::m_factoryMap;
// static // static
wxWebView* wxWebView::New(wxWebViewBackend backend) wxWebView* wxWebView::New(const wxString& backend)
{ {
switch (backend) wxStringWebViewFactoryMap::iterator iter = FindFactory(backend);
{
#if defined(wxUSE_WEBVIEW_WEBKIT) && \
(defined(__WXGTK__) || defined(__WXOSX__))
case wxWEB_VIEW_BACKEND_WEBKIT:
return new wxWebViewWebKit();
#endif
#if wxUSE_WEBVIEW_IE if(iter == m_factoryMap.end())
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; return NULL;
} else
return (*iter).second->Create();
} }
// static // static
wxWebView* wxWebView::New(wxWindow* parent, wxWebView* wxWebView::New(wxWindow* parent, wxWindowID id, const wxString& url,
wxWindowID id, const wxPoint& pos, const wxSize& size,
const wxString& url, const wxString& backend, long style,
const wxPoint& pos,
const wxSize& size,
wxWebViewBackend backend,
long style,
const wxString& name) const wxString& name)
{ {
switch (backend) wxStringWebViewFactoryMap::iterator iter = FindFactory(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 if(iter == m_factoryMap.end())
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; return NULL;
else
return (*iter).second->Create(parent, id, url, pos, size, style, name);
} }
// static
void wxWebView::RegisterFactory(const wxString& backend,
wxSharedPtr<wxWebViewFactory> factory)
{
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
void wxWebView::InitFactoryMap()
{
#ifdef __WXMSW__
RegisterFactory(wxWebViewBackendIE, wxSharedPtr<wxWebViewFactory>
(new wxWebViewFactoryIE));
#else
RegisterFactory(wxWebViewBackendWebKit, wxSharedPtr<wxWebViewFactory>
(new wxWebViewFactoryWebKit));
#endif
} }
#endif // wxUSE_WEBVIEW #endif // wxUSE_WEBVIEW