Application of the most recent wxWebView patch, the only changes were so tab to space conversions. Please note this probably won't compile.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@67698 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
@echo USE_THREADS=$(USE_THREADS) >>$(BUILD_CFG_FILE)
|
@echo USE_THREADS=$(USE_THREADS) >>$(BUILD_CFG_FILE)
|
||||||
@echo USE_GUI=$(USE_GUI) >>$(BUILD_CFG_FILE)
|
@echo USE_GUI=$(USE_GUI) >>$(BUILD_CFG_FILE)
|
||||||
@echo USE_HTML=$(USE_HTML) >>$(BUILD_CFG_FILE)
|
@echo USE_HTML=$(USE_HTML) >>$(BUILD_CFG_FILE)
|
||||||
|
@echo USE_WEB=$(USE_WEB) >>$(BUILD_CFG_FILE)
|
||||||
@echo USE_MEDIA=$(USE_MEDIA) >>$(BUILD_CFG_FILE)
|
@echo USE_MEDIA=$(USE_MEDIA) >>$(BUILD_CFG_FILE)
|
||||||
@echo USE_OPENGL=$(USE_OPENGL) >>$(BUILD_CFG_FILE)
|
@echo USE_OPENGL=$(USE_OPENGL) >>$(BUILD_CFG_FILE)
|
||||||
@echo USE_QA=$(USE_QA) >>$(BUILD_CFG_FILE)
|
@echo USE_QA=$(USE_QA) >>$(BUILD_CFG_FILE)
|
||||||
|
@@ -161,7 +161,9 @@
|
|||||||
<set var="WXLIB_STC">
|
<set var="WXLIB_STC">
|
||||||
<if cond="MONOLITHIC=='0'">$(mk.evalExpr(wxwin.mkLibName('stc')))</if>
|
<if cond="MONOLITHIC=='0'">$(mk.evalExpr(wxwin.mkLibName('stc')))</if>
|
||||||
</set>
|
</set>
|
||||||
|
<set var="WXLIB_WEB">
|
||||||
|
<if cond="MONOLITHIC=='0'">$(mk.evalExpr(wxwin.mkLibName('web')))</if>
|
||||||
|
</set>
|
||||||
<set var="WXLIB_MONO">
|
<set var="WXLIB_MONO">
|
||||||
<if cond="MONOLITHIC=='1'">$(mk.evalExpr(wxwin.mkLibName('mono')))</if>
|
<if cond="MONOLITHIC=='1'">$(mk.evalExpr(wxwin.mkLibName('mono')))</if>
|
||||||
</set>
|
</set>
|
||||||
|
@@ -200,6 +200,14 @@ Default is to use debug CRT if and only if BUILD==debug.
|
|||||||
</description>
|
</description>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option name="USE_WEB">
|
||||||
|
<values>0,1</values>
|
||||||
|
<default-value>1</default-value>
|
||||||
|
<description>
|
||||||
|
Build wxWeb library (USE_GUI must be 1)?
|
||||||
|
</description>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option name="USE_MEDIA">
|
<option name="USE_MEDIA">
|
||||||
<values>0,1</values>
|
<values>0,1</values>
|
||||||
<default-value>1</default-value>
|
<default-value>1</default-value>
|
||||||
@@ -372,6 +380,7 @@ to run the tests, include CppUnit library here.
|
|||||||
<option name="EXTRALIBS"/>
|
<option name="EXTRALIBS"/>
|
||||||
<option name="EXTRALIBS_XML"/>
|
<option name="EXTRALIBS_XML"/>
|
||||||
<option name="EXTRALIBS_HTML"/>
|
<option name="EXTRALIBS_HTML"/>
|
||||||
|
<option name="EXTRALIBS_WEB"/>
|
||||||
<option name="EXTRALIBS_MEDIA"/>
|
<option name="EXTRALIBS_MEDIA"/>
|
||||||
<option name="EXTRALIBS_GUI"/>
|
<option name="EXTRALIBS_GUI"/>
|
||||||
<option name="EXTRALIBS_OPENGL"/>
|
<option name="EXTRALIBS_OPENGL"/>
|
||||||
@@ -432,6 +441,7 @@ it if SHARED=1 unless you know what you are doing.
|
|||||||
<set var="EXTRALIBS"/>
|
<set var="EXTRALIBS"/>
|
||||||
<set var="EXTRALIBS_XML"/>
|
<set var="EXTRALIBS_XML"/>
|
||||||
<set var="EXTRALIBS_HTML"/>
|
<set var="EXTRALIBS_HTML"/>
|
||||||
|
<set var="EXTRALIBS_WEB"/>
|
||||||
<set var="EXTRALIBS_MEDIA"/>
|
<set var="EXTRALIBS_MEDIA"/>
|
||||||
<set var="EXTRALIBS_GUI"/>
|
<set var="EXTRALIBS_GUI"/>
|
||||||
<set var="EXTRALIBS_OPENGL">
|
<set var="EXTRALIBS_OPENGL">
|
||||||
@@ -480,6 +490,7 @@ Set the version of your Mingw installation here.
|
|||||||
<set var="USE_RICHTEXT">1</set>
|
<set var="USE_RICHTEXT">1</set>
|
||||||
<set var="USE_STC">1</set>
|
<set var="USE_STC">1</set>
|
||||||
<set var="USE_HTML">1</set>
|
<set var="USE_HTML">1</set>
|
||||||
|
<set var="USE_WEB">1</set>
|
||||||
<set var="USE_MEDIA">1</set>
|
<set var="USE_MEDIA">1</set>
|
||||||
<set var="USE_XRC">1</set>
|
<set var="USE_XRC">1</set>
|
||||||
<set var="USE_OPENGL">1</set>
|
<set var="USE_OPENGL">1</set>
|
||||||
|
@@ -3309,6 +3309,21 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
<!-- wxHTML users: -->
|
<!-- wxHTML users: -->
|
||||||
src/generic/htmllbox.cpp
|
src/generic/htmllbox.cpp
|
||||||
</set>
|
</set>
|
||||||
|
<set var="WEB_SRC_PLATFORM">
|
||||||
|
<if cond="TOOLKIT=='MSW'">
|
||||||
|
src/msw/webview.cpp
|
||||||
|
</if>
|
||||||
|
<if cond="PLATFORM_UNIX=='1'">
|
||||||
|
src/gtk/webview.cpp
|
||||||
|
</if>
|
||||||
|
<if cond="PLATFORM_MACOSX=='1'">
|
||||||
|
src/osx/webview.mm
|
||||||
|
</if>
|
||||||
|
</set>
|
||||||
|
<set var="WEB_SRC" hints="files">
|
||||||
|
$(WEB_SRC_PLATFORM)
|
||||||
|
src/common/webview.cpp
|
||||||
|
</set>
|
||||||
<set var="MSW_HTML_HDR" hints="files">
|
<set var="MSW_HTML_HDR" hints="files">
|
||||||
<if cond="TOOLKIT=='MSW'">wx/msw/helpbest.h</if>
|
<if cond="TOOLKIT=='MSW'">wx/msw/helpbest.h</if>
|
||||||
</set>
|
</set>
|
||||||
@@ -3334,7 +3349,21 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
wx/htmllbox.h
|
wx/htmllbox.h
|
||||||
$(MSW_HTML_HDR)
|
$(MSW_HTML_HDR)
|
||||||
</set>
|
</set>
|
||||||
|
<set var="PLATFORM_WEB_HDR" hints="files">
|
||||||
|
<if cond="TOOLKIT=='MSW'">
|
||||||
|
wx/msw/webviewie.h
|
||||||
|
</if>
|
||||||
|
<if cond="PLATFORM_UNIX=='1'">
|
||||||
|
wx/gtk/webview.h
|
||||||
|
</if>
|
||||||
|
<if cond="PLATFORM_MACOSX=='1'">
|
||||||
|
wx/osx/webview.h
|
||||||
|
</if>
|
||||||
|
</set>
|
||||||
|
<set var="WEB_HDR" hints="files">
|
||||||
|
$(PLATFORM_WEB_HDR)
|
||||||
|
wx/webview.h
|
||||||
|
</set>
|
||||||
|
|
||||||
|
|
||||||
<!-- ====================================================================== -->
|
<!-- ====================================================================== -->
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<set var="MONOLIB_GUI_SRC">
|
<set var="MONOLIB_GUI_SRC">
|
||||||
<if cond="USE_GUI=='1'">
|
<if cond="USE_GUI=='1'">
|
||||||
$(CORE_SRC) $(ADVANCED_SRC) $(MEDIA_SRC) $(HTML_SRC) $(QA_SRC)
|
$(CORE_SRC) $(ADVANCED_SRC) $(MEDIA_SRC) $(HTML_SRC) $(WEB_SRC) $(QA_SRC)
|
||||||
$(XRC_SRC) $(AUI_SRC) $(PROPGRID_SRC) $(RIBBON_SRC) $(RICHTEXT_SRC)
|
$(XRC_SRC) $(AUI_SRC) $(PROPGRID_SRC) $(RIBBON_SRC) $(RICHTEXT_SRC)
|
||||||
$(STC_SRC)
|
$(STC_SRC)
|
||||||
</if>
|
</if>
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
<define>WXMAKINGDLL</define>
|
<define>WXMAKINGDLL</define>
|
||||||
<ldlibs>$(EXTRALIBS_XML)</ldlibs>
|
<ldlibs>$(EXTRALIBS_XML)</ldlibs>
|
||||||
<ldlibs>$(EXTRALIBS_HTML)</ldlibs>
|
<ldlibs>$(EXTRALIBS_HTML)</ldlibs>
|
||||||
|
<ldlibs>$(EXTRALIBS_WEB)</ldlibs>
|
||||||
<ldlibs>$(EXTRALIBS_MEDIA)</ldlibs>
|
<ldlibs>$(EXTRALIBS_MEDIA)</ldlibs>
|
||||||
<ldlibs>$(PLUGIN_MONOLIB_EXTRALIBS)</ldlibs>
|
<ldlibs>$(PLUGIN_MONOLIB_EXTRALIBS)</ldlibs>
|
||||||
<library>$(wxscintilla_library_link)</library>
|
<library>$(wxscintilla_library_link)</library>
|
||||||
|
@@ -173,6 +173,36 @@
|
|||||||
|
|
||||||
<set var="MSVC6PRJ_MERGED_TARGETS_MULTILIB" append="1">html=htmllib+htmldll</set>
|
<set var="MSVC6PRJ_MERGED_TARGETS_MULTILIB" append="1">html=htmllib+htmldll</set>
|
||||||
|
|
||||||
|
<!-- ================================================================ -->
|
||||||
|
<!-- wxWEB -->
|
||||||
|
<!-- ================================================================ -->
|
||||||
|
|
||||||
|
<dll id="webdll" template="wx_dll"
|
||||||
|
cond="SHARED=='1' and USE_GUI=='1' and USE_WEB=='1' and MONOLITHIC=='0'">
|
||||||
|
<define>WXUSINGDLL</define>
|
||||||
|
<define>WXMAKINGDLL_WEB</define>
|
||||||
|
<sources>$(WEB_SRC)</sources>
|
||||||
|
<library>coredll</library>
|
||||||
|
<library>basedll</library>
|
||||||
|
<ldlibs>$(EXTRALIBS_WEB)</ldlibs>
|
||||||
|
<msvc-headers>$(WEB_HDR)</msvc-headers>
|
||||||
|
</dll>
|
||||||
|
|
||||||
|
<!-- use this to conditonally link against htmldll with <library>: -->
|
||||||
|
<set var="webdll_library_link">
|
||||||
|
<if cond="SHARED=='1' and USE_GUI=='1' and USE_WEB=='1' and MONOLITHIC=='0'">webdll</if>
|
||||||
|
</set>
|
||||||
|
|
||||||
|
<lib id="weblib" template="wx_lib"
|
||||||
|
cond="SHARED=='0' and USE_GUI=='1' and USE_WEB=='1' and MONOLITHIC=='0'">
|
||||||
|
<sources>$(WEB_SRC)</sources>
|
||||||
|
<msvc-headers>$(WEB_HDR)</msvc-headers>
|
||||||
|
</lib>
|
||||||
|
|
||||||
|
<wxshortcut id="wxweb" cond="MONOLITHIC=='0' and USE_WEB=='1'"/>
|
||||||
|
|
||||||
|
<set var="MSVC6PRJ_MERGED_TARGETS_MULTILIB" append="1">web=weblib+webdll</set>
|
||||||
|
|
||||||
<!-- ================================================================ -->
|
<!-- ================================================================ -->
|
||||||
<!-- OpenGL -->
|
<!-- OpenGL -->
|
||||||
<!-- ================================================================ -->
|
<!-- ================================================================ -->
|
||||||
|
@@ -104,6 +104,7 @@
|
|||||||
<wx-lib>xml</wx-lib>
|
<wx-lib>xml</wx-lib>
|
||||||
<wx-lib>core</wx-lib>
|
<wx-lib>core</wx-lib>
|
||||||
<wx-lib>base</wx-lib>
|
<wx-lib>base</wx-lib>
|
||||||
|
<wx-lib>web</wx-lib>
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -124,7 +125,7 @@
|
|||||||
tag definitions.
|
tag definitions.
|
||||||
-->
|
-->
|
||||||
<set var="WX_LIB_LIST">
|
<set var="WX_LIB_LIST">
|
||||||
base core net xml xrc html adv media gl qa aui ribbon propgrid richtext stc
|
base core net xml xrc html adv media gl qa aui ribbon propgrid richtext stc web
|
||||||
</set>
|
</set>
|
||||||
|
|
||||||
<!-- if you define this variable to 0 before including wx presets, the
|
<!-- if you define this variable to 0 before including wx presets, the
|
||||||
|
@@ -39,12 +39,12 @@ def mk_wxid(id):
|
|||||||
|
|
||||||
|
|
||||||
# All libs that are part of the main library:
|
# All libs that are part of the main library:
|
||||||
MAIN_LIBS = ['mono', 'base', 'core', 'adv', 'html', 'xml', 'net',
|
MAIN_LIBS = ['mono', 'base', 'core', 'adv', 'html', 'xml', 'net', 'web',
|
||||||
'media', 'qa', 'xrc', 'aui', 'ribbon', 'propgrid', 'richtext', 'stc']
|
'media', 'qa', 'xrc', 'aui', 'ribbon', 'propgrid', 'richtext', 'stc']
|
||||||
# List of library names/ids for categories with different names:
|
# List of library names/ids for categories with different names:
|
||||||
LIBS_NOGUI = ['xml', 'net']
|
LIBS_NOGUI = ['xml', 'net']
|
||||||
LIBS_GUI = ['core', 'adv', 'html', 'gl', 'qa', 'xrc', 'media',
|
LIBS_GUI = ['core', 'adv', 'html', 'gl', 'qa', 'xrc', 'media',
|
||||||
'aui', 'propgrid', 'richtext', 'stc', 'ribbon']
|
'aui', 'propgrid', 'richtext', 'stc', 'ribbon', 'web']
|
||||||
# Additional libraries that must be linked in:
|
# Additional libraries that must be linked in:
|
||||||
EXTRALIBS = {
|
EXTRALIBS = {
|
||||||
'gl' : '$(EXTRALIBS_OPENGL)',
|
'gl' : '$(EXTRALIBS_OPENGL)',
|
||||||
@@ -52,6 +52,7 @@ EXTRALIBS = {
|
|||||||
'html' : '$(EXTRALIBS_HTML)',
|
'html' : '$(EXTRALIBS_HTML)',
|
||||||
'adv' : '$(PLUGIN_ADV_EXTRALIBS)',
|
'adv' : '$(PLUGIN_ADV_EXTRALIBS)',
|
||||||
'media' : '$(EXTRALIBS_MEDIA)',
|
'media' : '$(EXTRALIBS_MEDIA)',
|
||||||
|
'web' : '$(EXTRALIBS_WEB)',
|
||||||
}
|
}
|
||||||
|
|
||||||
def mkLibName(wxid):
|
def mkLibName(wxid):
|
||||||
|
116
include/wx/gtk/webview.h
Normal file
116
include/wx/gtk/webview.h
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: include/gtk/wx/webview.h
|
||||||
|
// Purpose: GTK webkit backend for web view component
|
||||||
|
// Author: Robert Roebling, Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 200 Marianne Gagnon, 1998 Robert Roebling
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_GTK_WEBKITCTRL_H_
|
||||||
|
#define _WX_GTK_WEBKITCTRL_H_
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
|
||||||
|
#include "wx/webview.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxWebViewGTKWebKit
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLIMPEXP_CORE wxWebViewGTKWebKit : public wxWebView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxWebViewGTKWebKit() { Init(); }
|
||||||
|
|
||||||
|
wxWebViewGTKWebKit(wxWindow *parent,
|
||||||
|
wxWindowID id = wxID_ANY,
|
||||||
|
const wxString& url = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize, long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
|
||||||
|
Create(parent, id, url, pos, size, style, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Create(wxWindow *parent,
|
||||||
|
wxWindowID id = wxID_ANY,
|
||||||
|
const wxString& url = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize, long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr);
|
||||||
|
|
||||||
|
virtual bool Enable( bool enable = true );
|
||||||
|
|
||||||
|
// implementation
|
||||||
|
// --------------
|
||||||
|
|
||||||
|
static wxVisualAttributes
|
||||||
|
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||||
|
|
||||||
|
// helper to allow access to protected member from GTK callback
|
||||||
|
void MoveWindow(int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
DoMoveWindow(x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZoomIn();
|
||||||
|
void ZoomOut();
|
||||||
|
void SetWebkitZoom(float level);
|
||||||
|
float GetWebkitZoom();
|
||||||
|
|
||||||
|
virtual void Stop();
|
||||||
|
virtual void LoadUrl(const wxString& url);
|
||||||
|
virtual void GoBack();
|
||||||
|
virtual void GoForward();
|
||||||
|
virtual void Reload(wxWebViewReloadFlags flags = 0);
|
||||||
|
virtual bool CanGoBack();
|
||||||
|
virtual bool CanGoForward();
|
||||||
|
virtual wxString GetCurrentURL();
|
||||||
|
virtual wxString GetCurrentTitle();
|
||||||
|
virtual wxString GetPageSource();
|
||||||
|
virtual void SetPage(const wxString& html, const wxString& baseUrl);
|
||||||
|
virtual void Print();
|
||||||
|
virtual bool IsBusy();
|
||||||
|
|
||||||
|
void SetZoomType(wxWebViewZoomType);
|
||||||
|
wxWebViewZoomType GetZoomType() const;
|
||||||
|
bool CanSetZoomType(wxWebViewZoomType) const;
|
||||||
|
virtual wxWebViewZoom GetZoom();
|
||||||
|
virtual void SetZoom(wxWebViewZoom);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** FIXME: hack to work around signals being received too early */
|
||||||
|
bool m_ready;
|
||||||
|
|
||||||
|
|
||||||
|
/** TODO: check if this can be made private
|
||||||
|
* The native control has a getter to check for busy state, but except in
|
||||||
|
* very recent versions of webkit this getter doesn't say everything we need
|
||||||
|
* (namely it seems to stay indefinitely busy when loading is cancelled by
|
||||||
|
* user)
|
||||||
|
*/
|
||||||
|
bool m_busy;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// focus event handler: calls GTKUpdateBitmap()
|
||||||
|
void GTKOnFocus(wxFocusEvent& event);
|
||||||
|
|
||||||
|
GtkWidget *web_view;
|
||||||
|
|
||||||
|
// FIXME: try to get DECLARE_DYNAMIC_CLASS macros & stuff right
|
||||||
|
//DECLARE_DYNAMIC_CLASS(wxWebViewGTKWebKit)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
|
126
include/wx/msw/webviewie.h
Normal file
126
include/wx/msw/webviewie.h
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: include/wx/msw/webviewie.h
|
||||||
|
// Purpose: wxMSW IE wxWebView backend
|
||||||
|
// Author: Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef wxWebViewIE_H
|
||||||
|
#define wxWebViewIE_H
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
|
||||||
|
#include "wx/control.h"
|
||||||
|
#include "wx/webview.h"
|
||||||
|
#include "wx/msw/ole/automtn.h"
|
||||||
|
#include "wx/msw/ole/activex.h"
|
||||||
|
|
||||||
|
// TODO: move this to wx/msw/chkconf.h
|
||||||
|
#if wxUSE_ACTIVEX != 1
|
||||||
|
#error "wxUSE_ACTIVEX must be activated for this to work"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_OLE_AUTOMATION != 1
|
||||||
|
#error "wxUSE_OLE_AUTOMATION must be activated for this to work"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// FIXME: get those DLL export macros right...
|
||||||
|
|
||||||
|
class wxWebViewIE : public wxWebView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
wxWebViewIE() {}
|
||||||
|
|
||||||
|
wxWebViewIE(wxWindow* parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& url = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr)
|
||||||
|
{
|
||||||
|
Create(parent, id, url, pos, size, style, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Create(wxWindow* parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& url = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr);
|
||||||
|
|
||||||
|
virtual void LoadUrl(const wxString& url);
|
||||||
|
|
||||||
|
virtual bool CanGoForward() { return m_canNavigateForward; }
|
||||||
|
virtual bool CanGoBack() { return m_canNavigateBack; }
|
||||||
|
virtual void GoBack();
|
||||||
|
virtual void GoForward();
|
||||||
|
virtual void Stop();
|
||||||
|
virtual void Reload(wxWebViewReloadFlags flags=0);
|
||||||
|
|
||||||
|
virtual wxString GetPageSource();
|
||||||
|
|
||||||
|
virtual bool IsBusy();
|
||||||
|
virtual wxString GetCurrentURL();
|
||||||
|
virtual wxString GetCurrentTitle();
|
||||||
|
|
||||||
|
virtual void SetZoomType(wxWebViewZoomType);
|
||||||
|
virtual wxWebViewZoomType GetZoomType() const;
|
||||||
|
virtual bool CanSetZoomType(wxWebViewZoomType) const;
|
||||||
|
|
||||||
|
virtual void Print();
|
||||||
|
|
||||||
|
virtual void SetPage(const wxString& html, const wxString& baseUrl);
|
||||||
|
|
||||||
|
virtual wxWebViewZoom GetZoom();
|
||||||
|
virtual void SetZoom(wxWebViewZoom zoom);
|
||||||
|
|
||||||
|
// ---- IE-specific methods
|
||||||
|
|
||||||
|
// FIXME: I seem to be able to access remote webpages even in offline mode...
|
||||||
|
bool IsOfflineMode();
|
||||||
|
void SetOfflineMode(bool offline);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get text zoom
|
||||||
|
* @return text zoom from 0 to 4
|
||||||
|
*/
|
||||||
|
int GetIETextZoom();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param level 0 to 4
|
||||||
|
*/
|
||||||
|
void SetIETextZoom(int level);
|
||||||
|
|
||||||
|
void SetIEOpticalZoom(float zoom);
|
||||||
|
float GetIEOpticalZoom();
|
||||||
|
|
||||||
|
void onActiveXEvent(wxActiveXEvent& evt);
|
||||||
|
void onEraseBg(wxEraseEvent& evt) {}
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE();
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxActiveXContainer* m_container;
|
||||||
|
wxAutomationObject m_ie;
|
||||||
|
IWebBrowser2* m_webBrowser;
|
||||||
|
DWORD m_dwCookie;
|
||||||
|
bool m_canNavigateBack;
|
||||||
|
bool m_canNavigateForward;
|
||||||
|
|
||||||
|
/** The "Busy" property of IWebBrowser2 does not always return busy when
|
||||||
|
* we'd want it to; this variable may be set to true in cases where the
|
||||||
|
* Busy property is false but should be true.
|
||||||
|
*/
|
||||||
|
bool m_isBusy;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // wxHAVE_WEB_BACKEND_IE
|
||||||
|
|
||||||
|
#endif // wxWebViewIE_H
|
142
include/wx/osx/webview.h
Normal file
142
include/wx/osx/webview.h
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: include/wx/osx/webkit.h
|
||||||
|
// Purpose: wxOSXWebKitCtrl - embeddable web kit control,
|
||||||
|
// OS X implementation of web view component
|
||||||
|
// Author: Jethro Grassie / Kevin Ollivier / Marianne Gagnon
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2004-4-16
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Jethro Grassie / Kevin Ollivier / Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_WEBKIT_H
|
||||||
|
#define _WX_WEBKIT_H
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxUSE_WEBKIT && (defined(__WXMAC__) || defined(__WXCOCOA__))
|
||||||
|
|
||||||
|
// TODO: define this in setup.h ?
|
||||||
|
#define wxHAVE_WEB_BACKEND_OSX_WEBKIT 1
|
||||||
|
|
||||||
|
#include "wx/control.h"
|
||||||
|
#include "wx/webview.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Web Kit Control
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLIMPEXP_CORE wxOSXWebKitCtrl : public wxWebView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxDECLARE_DYNAMIC_CLASS(wxOSXWebKitCtrl);
|
||||||
|
|
||||||
|
wxOSXWebKitCtrl() {}
|
||||||
|
wxOSXWebKitCtrl(wxWindow *parent,
|
||||||
|
wxWindowID winID = wxID_ANY,
|
||||||
|
const wxString& strURL = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize, long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr)
|
||||||
|
{
|
||||||
|
Create(parent, winID, strURL, pos, size, style, name);
|
||||||
|
}
|
||||||
|
bool Create(wxWindow *parent,
|
||||||
|
wxWindowID winID = wxID_ANY,
|
||||||
|
const wxString& strURL = wxWebViewDefaultURLStr,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize, long style = 0,
|
||||||
|
const wxString& name = wxWebViewNameStr);
|
||||||
|
virtual ~wxOSXWebKitCtrl();
|
||||||
|
|
||||||
|
void InternalLoadURL(const wxString &url);
|
||||||
|
|
||||||
|
virtual bool CanGoBack();
|
||||||
|
virtual bool CanGoForward();
|
||||||
|
virtual void GoBack();
|
||||||
|
virtual void GoForward();
|
||||||
|
virtual void Reload(wxWebViewReloadFlags flags = 0);
|
||||||
|
virtual void Stop();
|
||||||
|
virtual wxString GetPageSource();
|
||||||
|
virtual void SetPageTitle(const wxString& title) { m_pageTitle = title; }
|
||||||
|
virtual wxString GetPageTitle(){ return m_pageTitle; }
|
||||||
|
|
||||||
|
virtual void SetPage(const wxString& html, const wxString& baseUrl);
|
||||||
|
|
||||||
|
virtual void Print();
|
||||||
|
|
||||||
|
virtual void LoadUrl(const wxString& url);
|
||||||
|
virtual wxString GetCurrentURL();
|
||||||
|
virtual wxString GetCurrentTitle();
|
||||||
|
virtual wxWebViewZoom GetZoom();
|
||||||
|
virtual void SetZoom(wxWebViewZoom zoom);
|
||||||
|
|
||||||
|
virtual void SetZoomType(wxWebViewZoomType zoomType);
|
||||||
|
virtual wxWebViewZoomType GetZoomType() const;
|
||||||
|
virtual bool CanSetZoomType(wxWebViewZoomType type) const;
|
||||||
|
|
||||||
|
virtual bool IsBusy() { return m_busy; }
|
||||||
|
|
||||||
|
// ---- methods not from the parent (common) interface
|
||||||
|
wxString GetSelectedText();
|
||||||
|
|
||||||
|
wxString RunScript(const wxString& javascript);
|
||||||
|
|
||||||
|
bool CanGetPageSource();
|
||||||
|
|
||||||
|
void SetScrollPos(int pos);
|
||||||
|
int GetScrollPos();
|
||||||
|
|
||||||
|
void MakeEditable(bool enable = true);
|
||||||
|
bool IsEditable();
|
||||||
|
|
||||||
|
wxString GetSelection();
|
||||||
|
|
||||||
|
bool CanIncreaseTextSize();
|
||||||
|
void IncreaseTextSize();
|
||||||
|
bool CanDecreaseTextSize();
|
||||||
|
void DecreaseTextSize();
|
||||||
|
|
||||||
|
float GetWebkitZoom();
|
||||||
|
void SetWebkitZoom(float zoom);
|
||||||
|
|
||||||
|
// don't hide base class virtuals
|
||||||
|
virtual void SetScrollPos( int orient, int pos, bool refresh = true )
|
||||||
|
{ return wxControl::SetScrollPos(orient, pos, refresh); }
|
||||||
|
virtual int GetScrollPos( int orient ) const
|
||||||
|
{ return wxControl::GetScrollPos(orient); }
|
||||||
|
|
||||||
|
//we need to resize the webview when the control size changes
|
||||||
|
void OnSize(wxSizeEvent &event);
|
||||||
|
void OnMove(wxMoveEvent &event);
|
||||||
|
void OnMouseEvents(wxMouseEvent &event);
|
||||||
|
|
||||||
|
bool m_busy;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
void MacVisibilityChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxWindow *m_parent;
|
||||||
|
wxWindowID m_windowID;
|
||||||
|
wxString m_pageTitle;
|
||||||
|
|
||||||
|
struct objc_object *m_webView;
|
||||||
|
|
||||||
|
// we may use this later to setup our own mouse events,
|
||||||
|
// so leave it in for now.
|
||||||
|
void* m_webKitCtrlEventHandler;
|
||||||
|
//It should be WebView*, but WebView is an Objective-C class
|
||||||
|
//TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
// TODO: define this in setup.h ?
|
||||||
|
#define wxHAVE_WEB_BACKEND_OSX_WEBKIT 0
|
||||||
|
|
||||||
|
#endif // wxUSE_WEBKIT
|
||||||
|
|
||||||
|
#endif // _WX_WEBKIT_H_
|
429
include/wx/webview.h
Normal file
429
include/wx/webview.h
Normal file
@@ -0,0 +1,429 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: webview.h
|
||||||
|
// Purpose: Common interface and events for web view component
|
||||||
|
// Author: Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_WEB_VIEW_H_
|
||||||
|
#define _WX_WEB_VIEW_H_
|
||||||
|
|
||||||
|
#include <wx/control.h>
|
||||||
|
#include <wx/event.h>
|
||||||
|
#include <wx/sstream.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zoom level in web view component
|
||||||
|
*/
|
||||||
|
enum wxWebViewZoom
|
||||||
|
{
|
||||||
|
wxWEB_VIEW_ZOOM_TINY,
|
||||||
|
wxWEB_VIEW_ZOOM_SMALL,
|
||||||
|
wxWEB_VIEW_ZOOM_MEDIUM,
|
||||||
|
wxWEB_VIEW_ZOOM_LARGE,
|
||||||
|
wxWEB_VIEW_ZOOM_LARGEST
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of zooming that the web view control can perform
|
||||||
|
*/
|
||||||
|
enum wxWebViewZoomType
|
||||||
|
{
|
||||||
|
/** The entire layout scales when zooming, including images */
|
||||||
|
wxWEB_VIEW_ZOOM_TYPE_LAYOUT,
|
||||||
|
/** Only the text changes in size when zooming, images and other layout
|
||||||
|
* elements retain their initial size */
|
||||||
|
wxWEB_VIEW_ZOOM_TYPE_TEXT
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Types of errors that can cause navigation to fail */
|
||||||
|
enum wxWebNavigationError
|
||||||
|
{
|
||||||
|
/** Connection error (timeout, etc.) */
|
||||||
|
wxWEB_NAV_ERR_CONNECTION = 1,
|
||||||
|
/** Invalid certificate */
|
||||||
|
wxWEB_NAV_ERR_CERTIFICATE = 2,
|
||||||
|
/** Authentication required */
|
||||||
|
wxWEB_NAV_ERR_AUTH = 3,
|
||||||
|
/** Other security error */
|
||||||
|
wxWEB_NAV_ERR_SECURITY = 4,
|
||||||
|
/** Requested resource not found */
|
||||||
|
wxWEB_NAV_ERR_NOT_FOUND = 5,
|
||||||
|
/** Invalid request/parameters (e.g. bad URL, bad protocol,
|
||||||
|
* unsupported resource type) */
|
||||||
|
wxWEB_NAV_ERR_REQUEST = 6,
|
||||||
|
/** The user cancelled (e.g. in a dialog) */
|
||||||
|
wxWEB_NAV_ERR_USER_CANCELLED = 7,
|
||||||
|
/** Another (exotic) type of error that didn't fit in other categories*/
|
||||||
|
wxWEB_NAV_ERR_OTHER = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Type of refresh */
|
||||||
|
enum wxWebViewReloadFlags
|
||||||
|
{
|
||||||
|
/** Reload the current view without accessing the cache */
|
||||||
|
wxWEB_VIEW_RELOAD_NO_CACHE = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of available backends for wxWebView
|
||||||
|
*/
|
||||||
|
enum wxWebViewBackend
|
||||||
|
{
|
||||||
|
/** Value that may be passed to wxWebView to let it pick an appropriate
|
||||||
|
* engine for the current platform*/
|
||||||
|
wxWEB_VIEW_BACKEND_DEFAULT,
|
||||||
|
|
||||||
|
/** The OSX-native WebKit web engine */
|
||||||
|
wxWEB_VIEW_BACKEND_OSX_WEBKIT,
|
||||||
|
|
||||||
|
/** The GTK port of the WebKit engine */
|
||||||
|
wxWEB_VIEW_BACKEND_GTK_WEBKIT,
|
||||||
|
|
||||||
|
/** Use Microsoft Internet Explorer as web engine */
|
||||||
|
wxWEB_VIEW_BACKEND_IE
|
||||||
|
};
|
||||||
|
|
||||||
|
extern WXDLLIMPEXP_DATA_CORE(const char) wxWebViewNameStr[];
|
||||||
|
extern WXDLLIMPEXP_DATA_CORE(const char) wxWebViewDefaultURLStr[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class wxWebView
|
||||||
|
*
|
||||||
|
* This control may be used to render web (HTML / CSS / javascript) documents.
|
||||||
|
* Capabilities of the HTML renderer will depend upon the backed.
|
||||||
|
* TODO: describe each backend and its capabilities here
|
||||||
|
*
|
||||||
|
* Note that errors are generally reported asynchronously though the
|
||||||
|
* wxEVT_COMMAND_WEB_VIEW_ERROR event described below.
|
||||||
|
*
|
||||||
|
* @beginEventEmissionTable{wxWebNavigationEvent}
|
||||||
|
* @event{EVT_BUTTON(id, func)}
|
||||||
|
*
|
||||||
|
* @event{EVT_WEB_VIEW_NAVIGATING(id, func)}
|
||||||
|
* Process a wxEVT_COMMAND_WEB_VIEW_NAVIGATING event, generated before trying
|
||||||
|
* to get a resource. This event may be vetoed to prevent navigating to this
|
||||||
|
* resource. Note that if the displayed HTML document has several frames, one
|
||||||
|
* such event will be generated per frame.
|
||||||
|
*
|
||||||
|
* @event{EVT_WEB_VIEW_NAVIGATED(id, func)}
|
||||||
|
* Process a wxEVT_COMMAND_WEB_VIEW_NAVIGATED event generated after it was
|
||||||
|
* confirmed that a resource would be requested. This event may not be vetoed.
|
||||||
|
* Note that if the displayed HTML document has several frames, one such event
|
||||||
|
* will be generated per frame.
|
||||||
|
*
|
||||||
|
* @event{EVT_WEB_VIEW_LOADED(id, func)}
|
||||||
|
* Process a wxEVT_COMMAND_WEB_VIEW_LOADED event generated when the document
|
||||||
|
* is fully loaded and displayed.
|
||||||
|
*
|
||||||
|
* @event{EVT_WEB_VIEW_ERRROR(id, func)}
|
||||||
|
* Process a wxEVT_COMMAND_WEB_VIEW_ERROR event generated when a navigation
|
||||||
|
* error occurs.
|
||||||
|
* The integer associated with this event will be a wxWebNavigationError item.
|
||||||
|
* The string associated with this event may contain a backend-specific more
|
||||||
|
* precise error message/code.
|
||||||
|
*
|
||||||
|
* @endEventTable
|
||||||
|
*/
|
||||||
|
class wxWebView : public wxControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creation function for two-step creation.
|
||||||
|
*/
|
||||||
|
virtual bool Create(wxWindow* parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& url,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name) = 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
|
||||||
|
*/
|
||||||
|
static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT);
|
||||||
|
|
||||||
|
// TODO: clarify what styles can do, or remove this flag
|
||||||
|
/**
|
||||||
|
* Factory function to create a new wxWebView
|
||||||
|
* @param parent parent window to create this view in
|
||||||
|
* @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
|
||||||
|
* is not available
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
||||||
|
|
||||||
|
/** Get whether it is possible to navigate back in the history of
|
||||||
|
* visited pages
|
||||||
|
*/
|
||||||
|
virtual bool CanGoBack() = 0;
|
||||||
|
|
||||||
|
/** Get whether it is possible to navigate forward in the history of
|
||||||
|
* visited pages
|
||||||
|
*/
|
||||||
|
virtual bool CanGoForward() = 0;
|
||||||
|
|
||||||
|
/** Navigate back in the history of visited pages.
|
||||||
|
* Only valid if CanGoBack() returned true.
|
||||||
|
*/
|
||||||
|
virtual void GoBack() = 0;
|
||||||
|
|
||||||
|
/** Navigate forwardin the history of visited pages.
|
||||||
|
* Only valid if CanGoForward() returned true.
|
||||||
|
*/
|
||||||
|
virtual void GoForward() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a HTMl document (web page) from a URL
|
||||||
|
* @param url the URL where the HTML document to display can be found
|
||||||
|
* @note web engines generally report errors asynchronously, so if you wish
|
||||||
|
* to know whether loading the URL was successful, register to receive
|
||||||
|
* navigation error events
|
||||||
|
*/
|
||||||
|
virtual void LoadUrl(const wxString& url) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the current page loading process, if any.
|
||||||
|
* May trigger an error event of type wxWEB_NAV_ERR_USER_CANCELLED.
|
||||||
|
* TODO: make wxWEB_NAV_ERR_USER_CANCELLED errors uniform across ports.
|
||||||
|
*/
|
||||||
|
virtual void Stop() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reload the currently displayed URL.
|
||||||
|
* @param flags A bit array that may optionnally contain reload options
|
||||||
|
*/
|
||||||
|
virtual void Reload(wxWebViewReloadFlags flags=0) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URL of the currently displayed document
|
||||||
|
*/
|
||||||
|
virtual wxString GetCurrentURL() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the title of the current web page, or its URL/path if title is not
|
||||||
|
* available
|
||||||
|
*/
|
||||||
|
virtual wxString GetCurrentTitle() = 0;
|
||||||
|
|
||||||
|
// TODO: handle choosing a frame when calling GetPageSource()?
|
||||||
|
/**
|
||||||
|
* Get the HTML source code of the currently displayed document
|
||||||
|
* @return the HTML source code, or an empty string if no page is currently
|
||||||
|
* shown
|
||||||
|
*/
|
||||||
|
virtual wxString GetPageSource() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the zoom factor of the page
|
||||||
|
* @return How much the HTML document is zoomed (scaleed)
|
||||||
|
*/
|
||||||
|
virtual wxWebViewZoom GetZoom() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the zoom factor of the page
|
||||||
|
* @param zoom How much to zoom (scale) the HTML document
|
||||||
|
*/
|
||||||
|
virtual void SetZoom(wxWebViewZoom zoom) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set how to interpret the zoom factor
|
||||||
|
* @param zoomType how the zoom factor should be interpreted by the
|
||||||
|
* HTML engine
|
||||||
|
* @note invoke canSetZoomType() first, some HTML renderers may not
|
||||||
|
* support all zoom types
|
||||||
|
*/
|
||||||
|
virtual void SetZoomType(wxWebViewZoomType zoomType) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get how the zoom factor is currently interpreted
|
||||||
|
* @return how the zoom factor is currently interpreted by the HTML engine
|
||||||
|
*/
|
||||||
|
virtual wxWebViewZoomType GetZoomType() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve whether the current HTML engine supports a type of zoom
|
||||||
|
* @param type the type of zoom to test
|
||||||
|
* @return whether this type of zoom is supported by this HTML engine
|
||||||
|
* (and thus can be set through setZoomType())
|
||||||
|
*/
|
||||||
|
virtual bool CanSetZoomType(wxWebViewZoomType type) const = 0;
|
||||||
|
|
||||||
|
// TODO: allow 'SetPage' to find files (e.g. images) from a virtual file
|
||||||
|
// system if possible
|
||||||
|
/**
|
||||||
|
* Set the displayed page source to the contents of the given string
|
||||||
|
* @param html the string that contains the HTML data to display
|
||||||
|
* @param baseUrl URL assigned to the HTML data, to be used to resolve
|
||||||
|
* relative paths, for instance
|
||||||
|
*/
|
||||||
|
virtual void SetPage(const wxString& html, const wxString& baseUrl) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the displayed page source to the contents of the given stream
|
||||||
|
* @param html the stream to read HTML data from
|
||||||
|
* @param baseUrl URL assigned to the HTML data, to be used to resolve
|
||||||
|
* relative paths, for instance
|
||||||
|
*/
|
||||||
|
virtual void SetPage(wxInputStream& html, wxString baseUrl)
|
||||||
|
{
|
||||||
|
wxStringOutputStream stream;
|
||||||
|
stream.Write(html);
|
||||||
|
SetPage(stream.GetString(), baseUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// wxString GetSelection(); // maybe?
|
||||||
|
// void SetSelection(...); // maybe?
|
||||||
|
|
||||||
|
// void MakeEditable(bool enable = true); // maybe?
|
||||||
|
// bool IsEditable(); // maybe?
|
||||||
|
|
||||||
|
// void EnableJavascript(bool enabled); // maybe?
|
||||||
|
// wxString RunScript(const wxString& javascript); // maybe?
|
||||||
|
|
||||||
|
// void SetScrollPos(int pos); // maybe?
|
||||||
|
// int GetScrollPos(); // maybe?
|
||||||
|
|
||||||
|
// wxString GetStatusText(); // maybe?
|
||||||
|
// void SetStatusText(wxString text); // maybe?
|
||||||
|
// * status text changed event?
|
||||||
|
// * title changed event?
|
||||||
|
|
||||||
|
// virtual bool IsOfflineMode() = 0; // maybe?
|
||||||
|
// virtual void SetOfflineMode(bool offline) = 0; // maybe?
|
||||||
|
|
||||||
|
// TODO: offer API to control the opening of new frames
|
||||||
|
// (through <a target="..."> as well as through javascript), OR
|
||||||
|
// provide a behavior consistent across ports.
|
||||||
|
// - OSX : I receive an event for new frames opened with HTML target, and
|
||||||
|
// currently block them all.
|
||||||
|
// - IE : The DISPID_NEWWINDOW2 event looks like it should work, but I
|
||||||
|
// receive way too many of them. A new IE instance opens.
|
||||||
|
// - GTK : All frame open requests are blocked. A slot exists that I could
|
||||||
|
// connect to to be notified if ever needed
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a print dialog so that the user may print the currently
|
||||||
|
* displayed page.
|
||||||
|
*/
|
||||||
|
virtual void Print() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the web control is currently busy (e.g. loading a page)
|
||||||
|
*/
|
||||||
|
virtual bool IsBusy() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
//class WXDLLIMPEXP_FWD_HTML wxWebNavigationEvent;
|
||||||
|
|
||||||
|
// FIXME: get those WXDLLIMPEXP_HTML & DECLARE_DYNAMIC_CLASS right...
|
||||||
|
//wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_HTML, wxEVT_COMMAND_WEB_VIEW_NAVIGATE,
|
||||||
|
// wxWebNavigationEvent );
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME: get those WXDLLIMPEXP_HTML & DECLARE_DYNAMIC_CLASS right...
|
||||||
|
class wxWebNavigationEvent : public wxCommandEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxWebNavigationEvent() {}
|
||||||
|
wxWebNavigationEvent(wxEventType type, int id, const wxString href,
|
||||||
|
const wxString target, bool canVeto)
|
||||||
|
: wxCommandEvent(type, id)
|
||||||
|
{
|
||||||
|
m_href = href;
|
||||||
|
m_target = target;
|
||||||
|
m_vetoed = false;
|
||||||
|
m_canVeto = canVeto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URL being visited
|
||||||
|
*/
|
||||||
|
const wxString& GetHref() const { return m_href; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the target (frame or window) in which the URL that caused this event
|
||||||
|
* is viewed, or an empty string if not available.
|
||||||
|
*/
|
||||||
|
const wxString& GetTarget() const { return m_target; }
|
||||||
|
|
||||||
|
// default copy ctor, assignment operator and dtor are ok
|
||||||
|
virtual wxEvent* Clone() const { return new wxWebNavigationEvent(*this); }
|
||||||
|
|
||||||
|
/** Get whether this event may be vetoed (stopped/prevented). Only
|
||||||
|
* meaningful for events fired before navigation takes place.
|
||||||
|
*/
|
||||||
|
bool CanVeto() const { return m_canVeto; }
|
||||||
|
|
||||||
|
/** Whether this event was vetoed (stopped/prevented). Only meaningful for
|
||||||
|
* events fired before navigation takes place.
|
||||||
|
*/
|
||||||
|
bool IsVetoed() const { return m_vetoed; }
|
||||||
|
|
||||||
|
/** Veto (prevent/stop) this event. Only meaningful for events fired
|
||||||
|
* before navigation takes place. Only valid if CanVeto() returned true.
|
||||||
|
*/
|
||||||
|
void Veto() { wxASSERT(m_canVeto); m_vetoed = true; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxString m_href;
|
||||||
|
wxString m_target;
|
||||||
|
bool m_canVeto;
|
||||||
|
bool m_vetoed;
|
||||||
|
|
||||||
|
wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWebNavigationEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
wxDECLARE_EVENT( wxEVT_COMMAND_WEB_VIEW_NAVIGATING, wxWebNavigationEvent );
|
||||||
|
wxDECLARE_EVENT( wxEVT_COMMAND_WEB_VIEW_NAVIGATED, wxWebNavigationEvent );
|
||||||
|
wxDECLARE_EVENT( wxEVT_COMMAND_WEB_VIEW_LOADED, wxWebNavigationEvent );
|
||||||
|
wxDECLARE_EVENT( wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebNavigationEvent );
|
||||||
|
|
||||||
|
typedef void (wxEvtHandler::*wxWebNavigationEventFunction)
|
||||||
|
(wxWebNavigationEvent&);
|
||||||
|
|
||||||
|
#define wxWebNavigationEventHandler(func) \
|
||||||
|
wxEVENT_HANDLER_CAST(wxWebNavigationEventFunction, func)
|
||||||
|
|
||||||
|
#define EVT_WEB_VIEW_NAVIGATING(id, fn) \
|
||||||
|
wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, id,
|
||||||
|
wxHtmlNavigatingEventHandler(fn))
|
||||||
|
|
||||||
|
#define EVT_WEB_VIEW_NAVIGATED(id, fn) \
|
||||||
|
wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, id,
|
||||||
|
wxHtmlNavigatingEventHandler(fn))
|
||||||
|
|
||||||
|
#define EVT_WEB_VIEW_LOADED(id, fn) \
|
||||||
|
wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_LOADED, id,
|
||||||
|
wxHtmlNavigatingEventHandler(fn))
|
||||||
|
|
||||||
|
#define EVT_WEB_VIEW_ERRROR(id, fn) \
|
||||||
|
wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_ERROR, id,
|
||||||
|
wxHtmlNavigatingEventHandler(fn))
|
||||||
|
|
||||||
|
#endif
|
@@ -87,6 +87,7 @@
|
|||||||
<subproject id="uiaction" template="sub"/>
|
<subproject id="uiaction" template="sub"/>
|
||||||
<subproject id="validate" template="sub"/>
|
<subproject id="validate" template="sub"/>
|
||||||
<subproject id="vscroll" template="sub"/>
|
<subproject id="vscroll" template="sub"/>
|
||||||
|
<subproject id="web" template="sub"/>
|
||||||
<subproject id="widgets" template="sub"/>
|
<subproject id="widgets" template="sub"/>
|
||||||
<subproject id="wizard" template="sub"/>
|
<subproject id="wizard" template="sub"/>
|
||||||
<subproject id="wrapsizer" template="sub"/>
|
<subproject id="wrapsizer" template="sub"/>
|
||||||
|
260
samples/web/forward.xpm
Normal file
260
samples/web/forward.xpm
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
/* XPM */
|
||||||
|
static const char * forward_xpm[] = {
|
||||||
|
"32 32 225 2",
|
||||||
|
" c None",
|
||||||
|
". c #3A7304",
|
||||||
|
"+ c #5B8B2C",
|
||||||
|
"@ c #3C7404",
|
||||||
|
"# c #CBE0B7",
|
||||||
|
"$ c #77A24E",
|
||||||
|
"% c #3B7504",
|
||||||
|
"& c #CDE2B8",
|
||||||
|
"* c #C7DEB0",
|
||||||
|
"= c #8EB469",
|
||||||
|
"- c #3C7605",
|
||||||
|
"; c #C7DFB1",
|
||||||
|
"> c #9EC776",
|
||||||
|
", c #BBD8A0",
|
||||||
|
"' c #9FC280",
|
||||||
|
") c #42790D",
|
||||||
|
"! c #C5DDAD",
|
||||||
|
"~ c #96C36A",
|
||||||
|
"{ c #92C065",
|
||||||
|
"] c #AFD18E",
|
||||||
|
"^ c #AECD91",
|
||||||
|
"/ c #4D821B",
|
||||||
|
"( c #3A7404",
|
||||||
|
"_ c #C2DCA9",
|
||||||
|
": c #92C064",
|
||||||
|
"< c #8CBD5D",
|
||||||
|
"[ c #8BBC5B",
|
||||||
|
"} c #A0C979",
|
||||||
|
"| c #B5D299",
|
||||||
|
"1 c #5D8D2E",
|
||||||
|
"2 c #3B7503",
|
||||||
|
"3 c #B8D59B",
|
||||||
|
"4 c #BDD8A2",
|
||||||
|
"5 c #BED9A3",
|
||||||
|
"6 c #BFD9A4",
|
||||||
|
"7 c #BFDAA5",
|
||||||
|
"8 c #C0DAA6",
|
||||||
|
"9 c #C0DBA6",
|
||||||
|
"0 c #C2DCAA",
|
||||||
|
"a c #8DBD5E",
|
||||||
|
"b c #88BB57",
|
||||||
|
"c c #86B954",
|
||||||
|
"d c #85B952",
|
||||||
|
"e c #92C066",
|
||||||
|
"f c #B5D498",
|
||||||
|
"g c #729E46",
|
||||||
|
"h c #B8D69A",
|
||||||
|
"i c #7DB447",
|
||||||
|
"j c #7FB54A",
|
||||||
|
"k c #81B64D",
|
||||||
|
"l c #83B750",
|
||||||
|
"m c #84B851",
|
||||||
|
"n c #86B953",
|
||||||
|
"o c #86BA53",
|
||||||
|
"p c #86BA52",
|
||||||
|
"q c #84B850",
|
||||||
|
"r c #82B74F",
|
||||||
|
"s c #80B64C",
|
||||||
|
"t c #7EB549",
|
||||||
|
"u c #85B853",
|
||||||
|
"v c #B0D18F",
|
||||||
|
"w c #85AF5D",
|
||||||
|
"x c #3C7505",
|
||||||
|
"y c #B5D597",
|
||||||
|
"z c #78B141",
|
||||||
|
"A c #7AB344",
|
||||||
|
"B c #7FB54B",
|
||||||
|
"C c #81B74C",
|
||||||
|
"D c #82B94D",
|
||||||
|
"E c #83BA4D",
|
||||||
|
"F c #84BA4D",
|
||||||
|
"G c #83BA4C",
|
||||||
|
"H c #81B94A",
|
||||||
|
"I c #7FB848",
|
||||||
|
"J c #7DB646",
|
||||||
|
"K c #7AB343",
|
||||||
|
"L c #78B140",
|
||||||
|
"M c #7AB242",
|
||||||
|
"N c #A3CB7E",
|
||||||
|
"O c #97BD70",
|
||||||
|
"P c #427A0E",
|
||||||
|
"Q c #B4D495",
|
||||||
|
"R c #74AF3B",
|
||||||
|
"S c #76B03E",
|
||||||
|
"T c #79B342",
|
||||||
|
"U c #7CB644",
|
||||||
|
"V c #7EB745",
|
||||||
|
"W c #7FB946",
|
||||||
|
"X c #80BB48",
|
||||||
|
"Y c #80BB47",
|
||||||
|
"Z c #7FBA45",
|
||||||
|
"` c #7CB841",
|
||||||
|
" . c #71B132",
|
||||||
|
".. c #68AB27",
|
||||||
|
"+. c #62A61F",
|
||||||
|
"@. c #61A41F",
|
||||||
|
"#. c #65A625",
|
||||||
|
"$. c #91C064",
|
||||||
|
"%. c #A1C67D",
|
||||||
|
"&. c #4C821A",
|
||||||
|
"*. c #B2D292",
|
||||||
|
"=. c #70AD35",
|
||||||
|
"-. c #71AD37",
|
||||||
|
";. c #73AF39",
|
||||||
|
">. c #77B23C",
|
||||||
|
",. c #79B63E",
|
||||||
|
"'. c #7CB940",
|
||||||
|
"). c #7CBA40",
|
||||||
|
"!. c #7EBC41",
|
||||||
|
"~. c #7BBB3D",
|
||||||
|
"{. c #70B52C",
|
||||||
|
"]. c #62AD18",
|
||||||
|
"^. c #58A80B",
|
||||||
|
"/. c #56A508",
|
||||||
|
"(. c #54A207",
|
||||||
|
"_. c #529F06",
|
||||||
|
":. c #509C05",
|
||||||
|
"<. c #4E9905",
|
||||||
|
"[. c #A8CB85",
|
||||||
|
"}. c #598C29",
|
||||||
|
"|. c #3B7404",
|
||||||
|
"1. c #ADD08B",
|
||||||
|
"2. c #66A727",
|
||||||
|
"3. c #69A92B",
|
||||||
|
"4. c #6EAE30",
|
||||||
|
"5. c #6FB02F",
|
||||||
|
"6. c #6EB22C",
|
||||||
|
"7. c #6DB328",
|
||||||
|
"8. c #69B221",
|
||||||
|
"9. c #62B015",
|
||||||
|
"0. c #5CAD0B",
|
||||||
|
"a. c #5BAE0B",
|
||||||
|
"b. c #5BAD0A",
|
||||||
|
"c. c #5AAC0A",
|
||||||
|
"d. c #59A909",
|
||||||
|
"e. c #57A608",
|
||||||
|
"f. c #54A308",
|
||||||
|
"g. c #4F9B05",
|
||||||
|
"h. c #A2C97E",
|
||||||
|
"i. c #578B25",
|
||||||
|
"j. c #A3CA7E",
|
||||||
|
"k. c #52A007",
|
||||||
|
"l. c #55A408",
|
||||||
|
"m. c #58A809",
|
||||||
|
"n. c #5CAF0B",
|
||||||
|
"o. c #5EB10B",
|
||||||
|
"p. c #5EB20C",
|
||||||
|
"q. c #5FB20C",
|
||||||
|
"r. c #5DB00B",
|
||||||
|
"s. c #59AA0A",
|
||||||
|
"t. c #57A709",
|
||||||
|
"u. c #529E07",
|
||||||
|
"v. c #94BE6B",
|
||||||
|
"w. c #4B8116",
|
||||||
|
"x. c #519E06",
|
||||||
|
"y. c #54A307",
|
||||||
|
"z. c #5DAF0B",
|
||||||
|
"A. c #5FB30C",
|
||||||
|
"B. c #61B50D",
|
||||||
|
"C. c #62B70D",
|
||||||
|
"D. c #61B60D",
|
||||||
|
"E. c #60B40C",
|
||||||
|
"F. c #5EB10C",
|
||||||
|
"G. c #5CAE0B",
|
||||||
|
"H. c #59AA09",
|
||||||
|
"I. c #5BA810",
|
||||||
|
"J. c #8FC25E",
|
||||||
|
"K. c #8AB65C",
|
||||||
|
"L. c #41790C",
|
||||||
|
"M. c #53A007",
|
||||||
|
"N. c #61B70D",
|
||||||
|
"O. c #63BA0E",
|
||||||
|
"P. c #65BC0F",
|
||||||
|
"Q. c #64BB0E",
|
||||||
|
"R. c #63B90E",
|
||||||
|
"S. c #60B50D",
|
||||||
|
"T. c #67B31B",
|
||||||
|
"U. c #9CCB6D",
|
||||||
|
"V. c #7AAA4A",
|
||||||
|
"W. c #3B7405",
|
||||||
|
"X. c #A4CC7E",
|
||||||
|
"Y. c #A6CF7F",
|
||||||
|
"Z. c #A8D180",
|
||||||
|
"`. c #AAD480",
|
||||||
|
" + c #ACD781",
|
||||||
|
".+ c #ADD982",
|
||||||
|
"++ c #AFDB82",
|
||||||
|
"@+ c #B0DD83",
|
||||||
|
"#+ c #B1DE83",
|
||||||
|
"$+ c #6CC317",
|
||||||
|
"%+ c #67BF10",
|
||||||
|
"&+ c #75BE2B",
|
||||||
|
"*+ c #A3D075",
|
||||||
|
"=+ c #689C37",
|
||||||
|
"-+ c #3A7204",
|
||||||
|
";+ c #AEDE7D",
|
||||||
|
">+ c #6FC818",
|
||||||
|
",+ c #6AC411",
|
||||||
|
"'+ c #68C010",
|
||||||
|
")+ c #84C93E",
|
||||||
|
"!+ c #A4D275",
|
||||||
|
"~+ c #578B23",
|
||||||
|
"{+ c #376E03",
|
||||||
|
"]+ c #AEDF7D",
|
||||||
|
"^+ c #72CB19",
|
||||||
|
"/+ c #6DC714",
|
||||||
|
"(+ c #94D455",
|
||||||
|
"_+ c #9DCD6E",
|
||||||
|
":+ c #488016",
|
||||||
|
"<+ c #336204",
|
||||||
|
"[+ c #AEE07E",
|
||||||
|
"}+ c #7AD223",
|
||||||
|
"|+ c #A2DD67",
|
||||||
|
"1+ c #91C35E",
|
||||||
|
"2+ c #41790B",
|
||||||
|
"3+ c #B2E184",
|
||||||
|
"4+ c #AFE37C",
|
||||||
|
"5+ c #7EB24A",
|
||||||
|
"6+ c #3D7506",
|
||||||
|
"7+ c #3C7504",
|
||||||
|
"8+ c #AFDC84",
|
||||||
|
"9+ c #6A9D39",
|
||||||
|
"0+ c #3A7305",
|
||||||
|
"a+ c #50851D",
|
||||||
|
"b+ c #386F03",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . ",
|
||||||
|
" . + @ ",
|
||||||
|
" . # $ % ",
|
||||||
|
" . & * = - ",
|
||||||
|
" . ; > , ' ) ",
|
||||||
|
" . ! ~ { ] ^ / ",
|
||||||
|
" . ( ( ( ( ( ( ( ( . _ : < [ } | 1 2 ",
|
||||||
|
" . 3 , 4 5 6 7 8 8 9 0 a b c d e f g % ",
|
||||||
|
" . h i j k l m d n o o p q r s t u v w x ",
|
||||||
|
" . y z A i t B C D E F G H I J K L M N O P ",
|
||||||
|
" . Q R S L T U V W X Y Y Z ` ...+.@.#.$.%.&. ",
|
||||||
|
" . *.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.<.R [.}.|. ",
|
||||||
|
" . 1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f._.g.<.=.h.i.|. ",
|
||||||
|
" . j.<.g.k.l.m.c.n.o.p.q.p.r.b.s.t.(.u.t v.w.@ ",
|
||||||
|
" . j.<.x.y.t.c.z.A.B.C.C.D.E.F.G.H.I.J.K.L. ",
|
||||||
|
" . j.g.M./.s.n.A.N.O.P.P.Q.R.S.F.T.U.V.W. ",
|
||||||
|
" . j.X.Y.Z.`. +.+++@+#+$+%+P.R.&+*+=+-+ ",
|
||||||
|
" . . . . . . . . . . ;+>+,+'+)+!+~+{+ ",
|
||||||
|
" @ ]+^+/+(+_+:+<+ ",
|
||||||
|
" @ [+}+|+1+2+ ",
|
||||||
|
" @ 3+4+5+6+ ",
|
||||||
|
" 7+8+9+0+ ",
|
||||||
|
" . a+b+ ",
|
||||||
|
" . ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
322
samples/web/refresh.xpm
Normal file
322
samples/web/refresh.xpm
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
/* XPM */
|
||||||
|
static const char * refresh_xpm[] = {
|
||||||
|
"32 32 287 2",
|
||||||
|
" c None",
|
||||||
|
". c #396AA9",
|
||||||
|
"+ c #3D6CA9",
|
||||||
|
"@ c #3968A8",
|
||||||
|
"# c #3565A5",
|
||||||
|
"$ c #3767A6",
|
||||||
|
"% c #3867A7",
|
||||||
|
"& c #3A6AA8",
|
||||||
|
"* c #3567A6",
|
||||||
|
"= c #3C6BA8",
|
||||||
|
"- c #4B77B0",
|
||||||
|
"; c #87A6CE",
|
||||||
|
"> c #A5BFDE",
|
||||||
|
", c #B3CAE4",
|
||||||
|
"' c #BAD0E8",
|
||||||
|
") c #B6CEE6",
|
||||||
|
"! c #AFC6E1",
|
||||||
|
"~ c #9CB8D9",
|
||||||
|
"{ c #82A3CB",
|
||||||
|
"] c #537EB5",
|
||||||
|
"^ c #3767A7",
|
||||||
|
"/ c #3869A6",
|
||||||
|
"( c #3364A4",
|
||||||
|
"_ c #3E6CA9",
|
||||||
|
": c #94B1D4",
|
||||||
|
"< c #BCD2E8",
|
||||||
|
"[ c #BBD1E8",
|
||||||
|
"} c #B9D0E7",
|
||||||
|
"| c #B8CEE6",
|
||||||
|
"1 c #B5CDE5",
|
||||||
|
"2 c #B3CBE5",
|
||||||
|
"3 c #B2CBE5",
|
||||||
|
"4 c #B4CCE5",
|
||||||
|
"5 c #AAC4E1",
|
||||||
|
"6 c #799EC9",
|
||||||
|
"7 c #3B69A9",
|
||||||
|
"8 c #3768A6",
|
||||||
|
"9 c #3F6EAA",
|
||||||
|
"0 c #AEC5E1",
|
||||||
|
"a c #BED3E9",
|
||||||
|
"b c #B8CEE7",
|
||||||
|
"c c #B6CDE6",
|
||||||
|
"d c #B1CAE4",
|
||||||
|
"e c #AFC8E3",
|
||||||
|
"f c #ADC7E3",
|
||||||
|
"g c #ABC6E3",
|
||||||
|
"h c #769AC6",
|
||||||
|
"i c #3867A6",
|
||||||
|
"j c #3868A7",
|
||||||
|
"k c #87AAD2",
|
||||||
|
"l c #A6BFDD",
|
||||||
|
"m c #C0D4E9",
|
||||||
|
"n c #BDD3E8",
|
||||||
|
"o c #B4CCE4",
|
||||||
|
"p c #A2BCDB",
|
||||||
|
"q c #9AB6D7",
|
||||||
|
"r c #9EB9DA",
|
||||||
|
"s c #ABC4E0",
|
||||||
|
"t c #BAD0E7",
|
||||||
|
"u c #B9CFE7",
|
||||||
|
"v c #AEC8E3",
|
||||||
|
"w c #AAC5E2",
|
||||||
|
"x c #A8C4E1",
|
||||||
|
"y c #A6C2E0",
|
||||||
|
"z c #A9C4E1",
|
||||||
|
"A c #B3CBE6",
|
||||||
|
"B c #9DBADB",
|
||||||
|
"C c #4574AD",
|
||||||
|
"D c #3465A4",
|
||||||
|
"E c #89AAD1",
|
||||||
|
"F c #A5C2E0",
|
||||||
|
"G c #6E94C1",
|
||||||
|
"H c #BFD4EA",
|
||||||
|
"I c #93B1D4",
|
||||||
|
"J c #4E79B2",
|
||||||
|
"K c #3969A8",
|
||||||
|
"L c #3969A7",
|
||||||
|
"M c #3868A6",
|
||||||
|
"N c #3B6AA7",
|
||||||
|
"O c #5C84B8",
|
||||||
|
"P c #8CACD2",
|
||||||
|
"Q c #B3CCE5",
|
||||||
|
"R c #9EBDDE",
|
||||||
|
"S c #8FB3D8",
|
||||||
|
"T c #81A9D3",
|
||||||
|
"U c #8CB0D7",
|
||||||
|
"V c #9FBDDD",
|
||||||
|
"W c #96B5D8",
|
||||||
|
"X c #9CBCDD",
|
||||||
|
"Y c #A2C0DF",
|
||||||
|
"Z c #A5BFDC",
|
||||||
|
"` c #5D86B8",
|
||||||
|
" . c #3B6AA8",
|
||||||
|
".. c #3768A7",
|
||||||
|
"+. c #3A6AA9",
|
||||||
|
"@. c #3464A5",
|
||||||
|
"#. c #3969A5",
|
||||||
|
"$. c #6B90C0",
|
||||||
|
"%. c #98B7D9",
|
||||||
|
"&. c #98B9DC",
|
||||||
|
"*. c #84ABD5",
|
||||||
|
"=. c #7EA7D3",
|
||||||
|
"-. c #7BA5D2",
|
||||||
|
";. c #80A9D4",
|
||||||
|
">. c #97B8DB",
|
||||||
|
",. c #79A4D1",
|
||||||
|
"'. c #A3C0DF",
|
||||||
|
"). c #3C6AA9",
|
||||||
|
"!. c #6B91C0",
|
||||||
|
"~. c #4A77B3",
|
||||||
|
"{. c #4E7BB5",
|
||||||
|
"]. c #3667A5",
|
||||||
|
"^. c #7197C5",
|
||||||
|
"/. c #A0BEDE",
|
||||||
|
"(. c #8BAFD7",
|
||||||
|
"_. c #7AA5D2",
|
||||||
|
":. c #78A3D1",
|
||||||
|
"<. c #75A1D0",
|
||||||
|
"[. c #3364A5",
|
||||||
|
"}. c #5884BB",
|
||||||
|
"|. c #5D88BE",
|
||||||
|
"1. c #517EB8",
|
||||||
|
"2. c #3666A6",
|
||||||
|
"3. c #406EAA",
|
||||||
|
"4. c #9EBBDB",
|
||||||
|
"5. c #77A2D0",
|
||||||
|
"6. c #74A0CF",
|
||||||
|
"7. c #ABC6E2",
|
||||||
|
"8. c #4172AF",
|
||||||
|
"9. c #648DC3",
|
||||||
|
"0. c #678FC5",
|
||||||
|
"a. c #4D7AB4",
|
||||||
|
"b. c #3565A3",
|
||||||
|
"c. c #4472AC",
|
||||||
|
"d. c #A2BFDF",
|
||||||
|
"e. c #87ADD6",
|
||||||
|
"f. c #76A1D0",
|
||||||
|
"g. c #739FCF",
|
||||||
|
"h. c #76A2D0",
|
||||||
|
"i. c #5783BB",
|
||||||
|
"j. c #4571AC",
|
||||||
|
"k. c #9EBCDC",
|
||||||
|
"l. c #8BB0D7",
|
||||||
|
"m. c #74A1D0",
|
||||||
|
"n. c #729FCF",
|
||||||
|
"o. c #AFC9E4",
|
||||||
|
"p. c #3F6EAB",
|
||||||
|
"q. c #A3BEDD",
|
||||||
|
"r. c #A9C4E2",
|
||||||
|
"s. c #A9C5E1",
|
||||||
|
"t. c #AFC8E4",
|
||||||
|
"u. c #B2CAE4",
|
||||||
|
"v. c #3565A4",
|
||||||
|
"w. c #3666A5",
|
||||||
|
"x. c #CADBED",
|
||||||
|
"y. c #C9DAED",
|
||||||
|
"z. c #C7D9EC",
|
||||||
|
"A. c #C2D6EA",
|
||||||
|
"B. c #C0D4EA",
|
||||||
|
"C. c #C1D5EA",
|
||||||
|
"D. c #A0BCDB",
|
||||||
|
"E. c #3769A6",
|
||||||
|
"F. c #C8DAEC",
|
||||||
|
"G. c #9BBBDD",
|
||||||
|
"H. c #3C6CA8",
|
||||||
|
"I. c #B3CBE4",
|
||||||
|
"J. c #416EAA",
|
||||||
|
"K. c #C8D9EC",
|
||||||
|
"L. c #99BADC",
|
||||||
|
"M. c #BDD2E8",
|
||||||
|
"N. c #A9C2DF",
|
||||||
|
"O. c #416EA9",
|
||||||
|
"P. c #82A9D8",
|
||||||
|
"Q. c #3869A7",
|
||||||
|
"R. c #C6D8EC",
|
||||||
|
"S. c #98B9DB",
|
||||||
|
"T. c #A7C4E1",
|
||||||
|
"U. c #B2CBE4",
|
||||||
|
"V. c #7399C5",
|
||||||
|
"W. c #3668A6",
|
||||||
|
"X. c #87ADD9",
|
||||||
|
"Y. c #C4D6E9",
|
||||||
|
"Z. c #B1CAE2",
|
||||||
|
"`. c #3F70AD",
|
||||||
|
" + c #4577B4",
|
||||||
|
".+ c #3667A6",
|
||||||
|
"++ c #C4D7EB",
|
||||||
|
"@+ c #9DBCDE",
|
||||||
|
"#+ c #B5CDE6",
|
||||||
|
"$+ c #96B8DB",
|
||||||
|
"%+ c #95B7DB",
|
||||||
|
"&+ c #95B6DA",
|
||||||
|
"*+ c #85AAD2",
|
||||||
|
"=+ c #5682B9",
|
||||||
|
"-+ c #4982C6",
|
||||||
|
";+ c #B3CDE5",
|
||||||
|
">+ c #769CCC",
|
||||||
|
",+ c #3A6CAB",
|
||||||
|
"'+ c #4476B3",
|
||||||
|
")+ c #4D81BC",
|
||||||
|
"!+ c #A9C2DE",
|
||||||
|
"~+ c #B7CEE7",
|
||||||
|
"{+ c #9FBEDE",
|
||||||
|
"]+ c #6D9BCE",
|
||||||
|
"^+ c #6A99CC",
|
||||||
|
"/+ c #719ECF",
|
||||||
|
"(+ c #82A9D4",
|
||||||
|
"_+ c #80A7D3",
|
||||||
|
":+ c #618DC1",
|
||||||
|
"<+ c #4573AF",
|
||||||
|
"[+ c #3466A5",
|
||||||
|
"}+ c #3769A9",
|
||||||
|
"|+ c #386BAD",
|
||||||
|
"1+ c #376CAE",
|
||||||
|
"2+ c #3667A9",
|
||||||
|
"3+ c #4072B0",
|
||||||
|
"4+ c #5183BE",
|
||||||
|
"5+ c #588DC7",
|
||||||
|
"6+ c #3B6EAD",
|
||||||
|
"7+ c #94B3D7",
|
||||||
|
"8+ c #5882B7",
|
||||||
|
"9+ c #A1BEDC",
|
||||||
|
"0+ c #88AED7",
|
||||||
|
"a+ c #6E9CCD",
|
||||||
|
"b+ c #6999CC",
|
||||||
|
"c+ c #6797CB",
|
||||||
|
"d+ c #6696CB",
|
||||||
|
"e+ c #729ECF",
|
||||||
|
"f+ c #76A0D0",
|
||||||
|
"g+ c #6995C8",
|
||||||
|
"h+ c #5E8DC3",
|
||||||
|
"i+ c #5A8AC2",
|
||||||
|
"j+ c #5C8CC3",
|
||||||
|
"k+ c #5E90C9",
|
||||||
|
"l+ c #5B8FC7",
|
||||||
|
"m+ c #578CC7",
|
||||||
|
"n+ c #4A7EBC",
|
||||||
|
"o+ c #3566A5",
|
||||||
|
"p+ c #9FBCDA",
|
||||||
|
"q+ c #3768A5",
|
||||||
|
"r+ c #6990C1",
|
||||||
|
"s+ c #7CA5D2",
|
||||||
|
"t+ c #6A9ACC",
|
||||||
|
"u+ c #6596CB",
|
||||||
|
"v+ c #6395CA",
|
||||||
|
"w+ c #6294CA",
|
||||||
|
"x+ c #6093C9",
|
||||||
|
"y+ c #6093CA",
|
||||||
|
"z+ c #5D91C8",
|
||||||
|
"A+ c #5B8FC8",
|
||||||
|
"B+ c #588DC6",
|
||||||
|
"C+ c #588CC7",
|
||||||
|
"D+ c #4D82BE",
|
||||||
|
"E+ c #315F98",
|
||||||
|
"F+ c #3A69A6",
|
||||||
|
"G+ c #648EC0",
|
||||||
|
"H+ c #7EA5D2",
|
||||||
|
"I+ c #7AA4D2",
|
||||||
|
"J+ c #6F9DCE",
|
||||||
|
"K+ c #6193CA",
|
||||||
|
"L+ c #5F91C8",
|
||||||
|
"M+ c #5D90C8",
|
||||||
|
"N+ c #5C90C7",
|
||||||
|
"O+ c #5C90C8",
|
||||||
|
"P+ c #588EC6",
|
||||||
|
"Q+ c #477AB7",
|
||||||
|
"R+ c #3465A5",
|
||||||
|
"S+ c #2E578E",
|
||||||
|
"T+ c #3666A2",
|
||||||
|
"U+ c #4674AD",
|
||||||
|
"V+ c #5A88BE",
|
||||||
|
"W+ c #6592C6",
|
||||||
|
"X+ c #6B98CB",
|
||||||
|
"Y+ c #6B99CC",
|
||||||
|
"Z+ c #6797CC",
|
||||||
|
"`+ c #6090C7",
|
||||||
|
" @ c #5588C1",
|
||||||
|
".@ c #4679B6",
|
||||||
|
"+@ c #32609C",
|
||||||
|
"@@ c #1B3558",
|
||||||
|
"#@ c #2B5185",
|
||||||
|
"$@ c #325E9A",
|
||||||
|
"%@ c #3464A1",
|
||||||
|
"&@ c #3463A3",
|
||||||
|
"*@ c #3464A2",
|
||||||
|
"=@ c #32609B",
|
||||||
|
"-@ c #2A4F83",
|
||||||
|
" ",
|
||||||
|
" . + @ # $ % & * ",
|
||||||
|
" = - ; > , ' ) ! ~ { ] ^ / ( ",
|
||||||
|
" _ : < [ } | 1 2 2 3 4 | 5 6 7 8 % ( ",
|
||||||
|
" 9 0 a < ' } b c 3 d e f g f 4 d h i j k ( ",
|
||||||
|
" j l m n o p q r s t u 4 v w x y z A B C D E F ( ",
|
||||||
|
" G H I J K & L L M N O P Q c g R S T U V W X Y ( ",
|
||||||
|
" = Z ` ...+.@. L #.$.%.&.*.=.-.;.>.,.'.( ",
|
||||||
|
" ).!.K ~.{.]. @ ^./.(._.:.<.<.z [. ",
|
||||||
|
" .N }.|.1.2. 8 3.4.&.5.6.<.7.# ",
|
||||||
|
" ( 8.9.0.a.b. c.d.e.f.g.h.f # ",
|
||||||
|
" ( i. j.k.l.5.m.n.h.o.# ",
|
||||||
|
" ( p.q.w r.z s.w t.u.v. ",
|
||||||
|
" ( ( ( ( ( ( ( ( ( ( ( ",
|
||||||
|
" ( w.w.w.D ( ( ( ( ( ( ",
|
||||||
|
" ( x.x.y.z.A.B.C.D.E. ( ",
|
||||||
|
" ( F.G.&.&.&.v s H. ( ",
|
||||||
|
" ( F.G.&.&.w I.J. . ( ",
|
||||||
|
" ( K.G.&.L.M.N.O.^ P. Q.D ",
|
||||||
|
" ( R.G.&.&.S.T.U.V.W. X.Y.Z.`. +.+ ",
|
||||||
|
" ( ++@+#+G.$+%+%+&+*+=+]..+ -+;+>+,+'+)+* ",
|
||||||
|
" ( A.} !+~+{+*.]+^+/+(+_+:+<+[+}+|+1+|+2+3+4+5+6+ ",
|
||||||
|
" ( C.7+( 8+9+0+a+b+c+d+b+e+5.f+g+h+i+j+k+l+m+n+o+ ",
|
||||||
|
" ( p+M q+r+l.s+t+u+v+w+x+x+x+y+z+A+B+C+D+o+ ",
|
||||||
|
" D . E+F+G+H+I+J+c+K+L+M+N+O+l+P+Q+R+ ",
|
||||||
|
" ( S+T+U+V+W+X+Y+Z+`+ @.@$ +@ ",
|
||||||
|
" @@#@$@%@&@( *@=@-@ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
401
samples/web/stop.xpm
Normal file
401
samples/web/stop.xpm
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
/* XPM */
|
||||||
|
static const char * stop_xpm[] = {
|
||||||
|
"32 32 366 2",
|
||||||
|
" c None",
|
||||||
|
". c #860000",
|
||||||
|
"+ c #890000",
|
||||||
|
"@ c #991414",
|
||||||
|
"# c #F38989",
|
||||||
|
"$ c #F79393",
|
||||||
|
"% c #F79292",
|
||||||
|
"& c #F79090",
|
||||||
|
"* c #F78F8F",
|
||||||
|
"= c #F68C8C",
|
||||||
|
"- c #F68A8A",
|
||||||
|
"; c #F58787",
|
||||||
|
"> c #A61F1F",
|
||||||
|
", c #8A0000",
|
||||||
|
"' c #991515",
|
||||||
|
") c #F18383",
|
||||||
|
"! c #E76565",
|
||||||
|
"~ c #D94040",
|
||||||
|
"{ c #D93F3F",
|
||||||
|
"] c #D83E3E",
|
||||||
|
"^ c #D83D3D",
|
||||||
|
"/ c #D83C3C",
|
||||||
|
"( c #D83B3B",
|
||||||
|
"_ c #E15252",
|
||||||
|
": c #F17C7C",
|
||||||
|
"< c #A51C1C",
|
||||||
|
"[ c #880000",
|
||||||
|
"} c #9B1616",
|
||||||
|
"| c #F18484",
|
||||||
|
"1 c #E76666",
|
||||||
|
"2 c #D94242",
|
||||||
|
"3 c #D94141",
|
||||||
|
"4 c #E05252",
|
||||||
|
"5 c #F07878",
|
||||||
|
"6 c #A41A1A",
|
||||||
|
"7 c #F28585",
|
||||||
|
"8 c #E66565",
|
||||||
|
"9 c #D94343",
|
||||||
|
"0 c #DA4444",
|
||||||
|
"a c #E15151",
|
||||||
|
"b c #EF7474",
|
||||||
|
"c c #A21818",
|
||||||
|
"d c #9D1818",
|
||||||
|
"e c #DA4545",
|
||||||
|
"f c #D83A3A",
|
||||||
|
"g c #E05050",
|
||||||
|
"h c #EE7070",
|
||||||
|
"i c #9F1616",
|
||||||
|
"j c #9E1818",
|
||||||
|
"k c #E56363",
|
||||||
|
"l c #DA4646",
|
||||||
|
"m c #DA4747",
|
||||||
|
"n c #D73A3A",
|
||||||
|
"o c #D63939",
|
||||||
|
"p c #DF4F4F",
|
||||||
|
"q c #EE6C6C",
|
||||||
|
"r c #9E1414",
|
||||||
|
"s c #A01919",
|
||||||
|
"t c #E56262",
|
||||||
|
"u c #E54B4B",
|
||||||
|
"v c #FA4F4F",
|
||||||
|
"w c #DD4848",
|
||||||
|
"x c #EB4444",
|
||||||
|
"y c #F64545",
|
||||||
|
"z c #D63A3A",
|
||||||
|
"A c #D53939",
|
||||||
|
"B c #D43838",
|
||||||
|
"C c #EC6868",
|
||||||
|
"D c #9D1212",
|
||||||
|
"E c #A01A1A",
|
||||||
|
"F c #E45F5F",
|
||||||
|
"G c #E54A4A",
|
||||||
|
"H c #F96161",
|
||||||
|
"I c #EFA9A9",
|
||||||
|
"J c #F75454",
|
||||||
|
"K c #DC4747",
|
||||||
|
"L c #EA4646",
|
||||||
|
"M c #F56B6B",
|
||||||
|
"N c #F08E8E",
|
||||||
|
"O c #F24747",
|
||||||
|
"P c #D43939",
|
||||||
|
"Q c #D33838",
|
||||||
|
"R c #D23737",
|
||||||
|
"S c #DD4C4C",
|
||||||
|
"T c #E96363",
|
||||||
|
"U c #9A0F0F",
|
||||||
|
"V c #F68E8E",
|
||||||
|
"W c #E45D5D",
|
||||||
|
"X c #E54848",
|
||||||
|
"Y c #F85F5F",
|
||||||
|
"Z c #E6DBDB",
|
||||||
|
"` c #E5E5E5",
|
||||||
|
" . c #EEB2B2",
|
||||||
|
".. c #F75252",
|
||||||
|
"+. c #DC4545",
|
||||||
|
"@. c #EB4848",
|
||||||
|
"#. c #F66C6C",
|
||||||
|
"$. c #E5E1E1",
|
||||||
|
"%. c #E4E4E4",
|
||||||
|
"&. c #EF9292",
|
||||||
|
"*. c #F24848",
|
||||||
|
"=. c #CF3535",
|
||||||
|
"-. c #DC4B4B",
|
||||||
|
";. c #ED6666",
|
||||||
|
">. c #FC4848",
|
||||||
|
",. c #EEAAAA",
|
||||||
|
"'. c #E6E6E6",
|
||||||
|
"). c #E7E7E7",
|
||||||
|
"!. c #EFB3B3",
|
||||||
|
"~. c #DC4343",
|
||||||
|
"{. c #EB4B4B",
|
||||||
|
"]. c #F67171",
|
||||||
|
"^. c #E8E4E4",
|
||||||
|
"/. c #E6D9D9",
|
||||||
|
"(. c #FF4848",
|
||||||
|
"_. c #DB3C3C",
|
||||||
|
":. c #D13838",
|
||||||
|
"<. c #D03636",
|
||||||
|
"[. c #CE3434",
|
||||||
|
"}. c #EF6B6B",
|
||||||
|
"|. c #F85353",
|
||||||
|
"1. c #EEB6B6",
|
||||||
|
"2. c #E8E8E8",
|
||||||
|
"3. c #E9E9E9",
|
||||||
|
"4. c #EAEAEA",
|
||||||
|
"5. c #F0B7B7",
|
||||||
|
"6. c #F75858",
|
||||||
|
"7. c #EC4E4E",
|
||||||
|
"8. c #F77777",
|
||||||
|
"9. c #EBE7E7",
|
||||||
|
"0. c #E9DDDD",
|
||||||
|
"a. c #F86565",
|
||||||
|
"b. c #DF4242",
|
||||||
|
"c. c #D03737",
|
||||||
|
"d. c #CF3636",
|
||||||
|
"e. c #CE3535",
|
||||||
|
"f. c #CD3333",
|
||||||
|
"g. c #EF6969",
|
||||||
|
"h. c #DB4343",
|
||||||
|
"i. c #F85A5A",
|
||||||
|
"j. c #F0BABA",
|
||||||
|
"k. c #EBEBEB",
|
||||||
|
"l. c #ECECEC",
|
||||||
|
"m. c #F2BABA",
|
||||||
|
"n. c #F97878",
|
||||||
|
"o. c #ECE9E9",
|
||||||
|
"p. c #ECE0E0",
|
||||||
|
"q. c #F96C6C",
|
||||||
|
"r. c #DF4646",
|
||||||
|
"s. c #D13939",
|
||||||
|
"t. c #D03838",
|
||||||
|
"u. c #CF3737",
|
||||||
|
"v. c #CD3434",
|
||||||
|
"w. c #CC3333",
|
||||||
|
"x. c #EE6767",
|
||||||
|
"y. c #F79191",
|
||||||
|
"z. c #DB4141",
|
||||||
|
"A. c #F86161",
|
||||||
|
"B. c #F2BFBF",
|
||||||
|
"C. c #EDEDED",
|
||||||
|
"D. c #EEEEEE",
|
||||||
|
"E. c #EEE3E3",
|
||||||
|
"F. c #F97272",
|
||||||
|
"G. c #DF4949",
|
||||||
|
"H. c #CE3636",
|
||||||
|
"I. c #CD3535",
|
||||||
|
"J. c #CC3434",
|
||||||
|
"K. c #CB3232",
|
||||||
|
"L. c #EE6565",
|
||||||
|
"M. c #F76868",
|
||||||
|
"N. c #F4C0C0",
|
||||||
|
"O. c #EFEFEF",
|
||||||
|
"P. c #F0F0F0",
|
||||||
|
"Q. c #F0E7E7",
|
||||||
|
"R. c #FA7979",
|
||||||
|
"S. c #DF4A4A",
|
||||||
|
"T. c #CC3131",
|
||||||
|
"U. c #CA2D2D",
|
||||||
|
"V. c #C82929",
|
||||||
|
"W. c #C72828",
|
||||||
|
"X. c #ED5F5F",
|
||||||
|
"Y. c #D73939",
|
||||||
|
"Z. c #ED5A5A",
|
||||||
|
"`. c #FA8686",
|
||||||
|
" + c #F1F1F1",
|
||||||
|
".+ c #F2F2F2",
|
||||||
|
"++ c #F5CFCF",
|
||||||
|
"@+ c #FD7171",
|
||||||
|
"#+ c #D33939",
|
||||||
|
"$+ c #CB2424",
|
||||||
|
"%+ c #C71616",
|
||||||
|
"&+ c #C40B0B",
|
||||||
|
"*+ c #C00202",
|
||||||
|
"=+ c #BF0000",
|
||||||
|
"-+ c #BE0000",
|
||||||
|
";+ c #BD0000",
|
||||||
|
">+ c #BC0000",
|
||||||
|
",+ c #E93D3D",
|
||||||
|
"'+ c #D73838",
|
||||||
|
")+ c #EA5B5B",
|
||||||
|
"!+ c #F99191",
|
||||||
|
"~+ c #F2EFEF",
|
||||||
|
"{+ c #F3F3F3",
|
||||||
|
"]+ c #F4F4F4",
|
||||||
|
"^+ c #F45353",
|
||||||
|
"/+ c #C60505",
|
||||||
|
"(+ c #C10000",
|
||||||
|
"_+ c #C00000",
|
||||||
|
":+ c #BA0000",
|
||||||
|
"<+ c #E93B3B",
|
||||||
|
"[+ c #F68D8D",
|
||||||
|
"}+ c #D73737",
|
||||||
|
"|+ c #EA5E5E",
|
||||||
|
"1+ c #F99595",
|
||||||
|
"2+ c #F3F0F0",
|
||||||
|
"3+ c #F5F5F5",
|
||||||
|
"4+ c #F6EEEE",
|
||||||
|
"5+ c #F7DDDD",
|
||||||
|
"6+ c #F3BFBF",
|
||||||
|
"7+ c #F45C5C",
|
||||||
|
"8+ c #C40606",
|
||||||
|
"9+ c #BB0000",
|
||||||
|
"0+ c #B90000",
|
||||||
|
"a+ c #E83939",
|
||||||
|
"b+ c #F68B8B",
|
||||||
|
"c+ c #D73535",
|
||||||
|
"d+ c #D73636",
|
||||||
|
"e+ c #F99A9A",
|
||||||
|
"f+ c #F7EFEF",
|
||||||
|
"g+ c #FA8181",
|
||||||
|
"h+ c #FD6767",
|
||||||
|
"i+ c #F8C7C7",
|
||||||
|
"j+ c #F3C3C3",
|
||||||
|
"k+ c #F36666",
|
||||||
|
"l+ c #C20707",
|
||||||
|
"m+ c #B80000",
|
||||||
|
"n+ c #E73838",
|
||||||
|
"o+ c #F68989",
|
||||||
|
"p+ c #D63434",
|
||||||
|
"q+ c #EB6363",
|
||||||
|
"r+ c #F89D9D",
|
||||||
|
"s+ c #F1EFEF",
|
||||||
|
"t+ c #F7EEEE",
|
||||||
|
"u+ c #F97F7F",
|
||||||
|
"v+ c #D62424",
|
||||||
|
"w+ c #C80707",
|
||||||
|
"x+ c #F56C6C",
|
||||||
|
"y+ c #F9CCCC",
|
||||||
|
"z+ c #F2C6C6",
|
||||||
|
"A+ c #F47272",
|
||||||
|
"B+ c #BF0707",
|
||||||
|
"C+ c #B70000",
|
||||||
|
"D+ c #E73636",
|
||||||
|
"E+ c #F48686",
|
||||||
|
"F+ c #E14E4E",
|
||||||
|
"G+ c #D63333",
|
||||||
|
"H+ c #F78383",
|
||||||
|
"I+ c #F5BCBC",
|
||||||
|
"J+ c #F5ECEC",
|
||||||
|
"K+ c #F98484",
|
||||||
|
"L+ c #D62727",
|
||||||
|
"M+ c #C40000",
|
||||||
|
"N+ c #C30000",
|
||||||
|
"O+ c #C60808",
|
||||||
|
"P+ c #F57676",
|
||||||
|
"Q+ c #F8CFCF",
|
||||||
|
"R+ c #F0DFDF",
|
||||||
|
"S+ c #FE8A8A",
|
||||||
|
"T+ c #C41515",
|
||||||
|
"U+ c #B80202",
|
||||||
|
"V+ c #E63434",
|
||||||
|
"W+ c #A82323",
|
||||||
|
"X+ c #F07A7A",
|
||||||
|
"Y+ c #E04C4C",
|
||||||
|
"Z+ c #D63232",
|
||||||
|
"`+ c #D53333",
|
||||||
|
" @ c #D53535",
|
||||||
|
".@ c #F27E7E",
|
||||||
|
"+@ c #F5BBBB",
|
||||||
|
"@@ c #F1E9E9",
|
||||||
|
"#@ c #F98B8B",
|
||||||
|
"$@ c #D62A2A",
|
||||||
|
"%@ c #C20000",
|
||||||
|
"&@ c #C40909",
|
||||||
|
"*@ c #F48080",
|
||||||
|
"=@ c #F6D2D2",
|
||||||
|
"-@ c #F3E4E4",
|
||||||
|
";@ c #C61B1B",
|
||||||
|
">@ c #D92626",
|
||||||
|
",@ c #CD2020",
|
||||||
|
"'@ c #8B0000",
|
||||||
|
")@ c #A72222",
|
||||||
|
"!@ c #EF6E6E",
|
||||||
|
"~@ c #DE3C3C",
|
||||||
|
"{@ c #D11B1B",
|
||||||
|
"]@ c #CE1313",
|
||||||
|
"^@ c #CA0707",
|
||||||
|
"/@ c #C90303",
|
||||||
|
"(@ c #FF8F8F",
|
||||||
|
"_@ c #D62D2D",
|
||||||
|
":@ c #C10A0A",
|
||||||
|
"<@ c #F58B8B",
|
||||||
|
"[@ c #FD9898",
|
||||||
|
"}@ c #C61C1C",
|
||||||
|
"|@ c #B90303",
|
||||||
|
"1@ c #DB2828",
|
||||||
|
"2@ c #CA1F1F",
|
||||||
|
"3@ c #890101",
|
||||||
|
"4@ c #A01313",
|
||||||
|
"5@ c #EC5555",
|
||||||
|
"6@ c #D61F1F",
|
||||||
|
"7@ c #C90000",
|
||||||
|
"8@ c #C80000",
|
||||||
|
"9@ c #C70000",
|
||||||
|
"0@ c #C70303",
|
||||||
|
"a@ c #CD1616",
|
||||||
|
"b@ c #BF0909",
|
||||||
|
"c@ c #C11010",
|
||||||
|
"d@ c #B90404",
|
||||||
|
"e@ c #DC2929",
|
||||||
|
"f@ c #C71E1E",
|
||||||
|
"g@ c #A01111",
|
||||||
|
"h@ c #EA5252",
|
||||||
|
"i@ c #D51E1E",
|
||||||
|
"j@ c #C60000",
|
||||||
|
"k@ c #C50000",
|
||||||
|
"l@ c #BA0404",
|
||||||
|
"m@ c #DC2A2A",
|
||||||
|
"n@ c #C31C1C",
|
||||||
|
"o@ c #9E1010",
|
||||||
|
"p@ c #EA4E4E",
|
||||||
|
"q@ c #D51D1D",
|
||||||
|
"r@ c #BB0505",
|
||||||
|
"s@ c #DE2B2B",
|
||||||
|
"t@ c #BF1A1A",
|
||||||
|
"u@ c #840000",
|
||||||
|
"v@ c #9E0F0F",
|
||||||
|
"w@ c #E94A4A",
|
||||||
|
"x@ c #D31C1C",
|
||||||
|
"y@ c #BC0606",
|
||||||
|
"z@ c #DF2D2D",
|
||||||
|
"A@ c #BA1818",
|
||||||
|
"B@ c #870000",
|
||||||
|
"C@ c #790000",
|
||||||
|
"D@ c #9C0D0D",
|
||||||
|
"E@ c #E84646",
|
||||||
|
"F@ c #D01B1B",
|
||||||
|
"G@ c #BC0707",
|
||||||
|
"H@ c #E02E2E",
|
||||||
|
"I@ c #B61717",
|
||||||
|
"J@ c #810000",
|
||||||
|
"K@ c #730000",
|
||||||
|
"L@ c #9A0C0C",
|
||||||
|
"M@ c #EC4949",
|
||||||
|
"N@ c #EB4747",
|
||||||
|
"O@ c #EB4545",
|
||||||
|
"P@ c #E94343",
|
||||||
|
"Q@ c #E94141",
|
||||||
|
"R@ c #E93F3F",
|
||||||
|
"S@ c #E73939",
|
||||||
|
"T@ c #E73737",
|
||||||
|
"U@ c #E63535",
|
||||||
|
"V@ c #B31515",
|
||||||
|
"W@ c #7D0000",
|
||||||
|
"X@ c #720000",
|
||||||
|
"Y@ c #7C0000",
|
||||||
|
" . . . . . . . . . . . . + ",
|
||||||
|
" @ # $ $ $ $ $ % & * = - ; > , ",
|
||||||
|
" ' ) ! ~ ~ ~ ~ { { ] ^ / ( _ : < [ ",
|
||||||
|
" } | 1 2 2 2 2 3 3 ~ { ] ^ / ( 4 5 6 [ ",
|
||||||
|
" } 7 8 9 9 0 0 9 9 2 3 ~ { ] ^ / ( a b c ",
|
||||||
|
" d 7 8 0 0 e e e e 0 9 2 3 ~ { ] / ( f g h i ",
|
||||||
|
" j 7 k 0 e l m m m l e 0 9 2 3 { ] ^ / n o p q r ",
|
||||||
|
" s 7 t 9 0 e m u v w m l e 9 2 3 ~ x y / z A B p C D ",
|
||||||
|
" E 7 F 2 9 0 e G H I J K l e 9 2 3 L M N O z P Q R S T U ",
|
||||||
|
" . V W ~ 3 2 0 X Y Z ` ...+.0 9 2 @.#.$.%.&.*.P Q R =.-.;.. ",
|
||||||
|
" . % ] { 3 2 9 >.,.` '.).!...~.2 {.].^.).'./.(._.:.<.=.[.}.. ",
|
||||||
|
" . % ] { ~ 3 2 ~.|.1.2.3.4.5.6.7.8.9.3.2.0.a.b.:.c.d.e.f.g.. ",
|
||||||
|
" . % ^ ] { ~ ~ 3 h.i.j.4.k.l.m.n.o.k.k.p.q.r.s.t.u.e.v.w.x.. ",
|
||||||
|
" . y./ ^ ] ] { ~ ~ z.A.B.C.D.D.D.D.D.E.F.G.s.t.u.H.I.J.K.L.. ",
|
||||||
|
" . y.( ( / ^ ] ] { { z.M.N.O.P.P.P.Q.R.S.s.t.u.H.T.U.V.W.X.. ",
|
||||||
|
" . & Y.f ( / / ^ ^ ^ ^ Z.`. +.+.+.+++@+#+$+%+&+*+=+-+;+>+,+. ",
|
||||||
|
" . * '+Y.f f ( ( ( / )+!+~+{+{+]+]+{+N.^+/+(+_+=+-+;+>+:+<+. ",
|
||||||
|
" . [+}+}+'+Y.Y.Y.f |+1+2+{+3+4+5+]+.+ +6+7+8+=+-+;+9+:+0+a+. ",
|
||||||
|
" . b+c+d+}+}+'+'+|+e+~+{+3+f+g+h+i+3+{+ +j+k+l+;+9+:+0+m+n+. ",
|
||||||
|
" . o+p+c+c+d+d+q+r+s+.+3+t+u+v+w+x+y+3+{+P.z+A+B+:+0+m+C+D+. ",
|
||||||
|
" . E+F+G+p+p+p+H+I+ +{+J+K+L+M+N+O+P+Q+]+ +R+S+T+0+m+C+U+V+. ",
|
||||||
|
" [ W+X+Y+Z+Z+`+ @.@+@@@#@$@M+N+%@(+&@*@=@-@& ;@0+m+C+U+>@,@. ",
|
||||||
|
" '@)@!@~@{@]@^@/@!@(@_@M+N+%@(+_+-+:@<@[@}@0+m+C+|@1@2@3@ ",
|
||||||
|
" + 4@5@6@7@8@9@0@a@M+N+%@(+=+-+;+>+b@c@0+m+C+d@e@f@+ ",
|
||||||
|
" + g@h@i@9@j@k@M+N+%@(+=+-+;+>+9+:+0+m+C+l@m@n@, ",
|
||||||
|
" , o@p@q@k@M+N+%@_+=+-+;+>+9+:+0+m+C+r@s@t@+ ",
|
||||||
|
" u@v@w@x@N+%@_+=+-+;+>+9+:+0+m+C+y@z@A@B@ ",
|
||||||
|
" C@D@E@F@_+=+-+;+>+9+:+0+m+C+G@H@I@J@ ",
|
||||||
|
" K@L@{.M@N@O@P@Q@R@,+<+S@T@U@V@W@ ",
|
||||||
|
" X@. . . . . . . . . . . . Y@ ",
|
||||||
|
" ",
|
||||||
|
" "};
|
19
samples/web/web.bkl
Normal file
19
samples/web/web.bkl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!-- $Id: widgets.bkl 59311 2009-03-04 11:47:32Z FM $ -->
|
||||||
|
<makefile>
|
||||||
|
|
||||||
|
<include file="../../build/bakefiles/common_samples.bkl"/>
|
||||||
|
|
||||||
|
<exe id="web" template="wx_sample" template_append="wx_append">
|
||||||
|
<sources>
|
||||||
|
web.cpp
|
||||||
|
</sources>
|
||||||
|
<headers></headers>
|
||||||
|
<wx-lib>core</wx-lib>
|
||||||
|
<wx-lib>base</wx-lib>
|
||||||
|
<wx-lib>web</wx-lib>
|
||||||
|
<wx-lib>stc</wx-lib>
|
||||||
|
<win32-res>../sample.rc</win32-res>
|
||||||
|
</exe>
|
||||||
|
|
||||||
|
</makefile>
|
640
samples/web/web.cpp
Normal file
640
samples/web/web.cpp
Normal file
@@ -0,0 +1,640 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: wxiepanel.cpp
|
||||||
|
// Purpose: wxBetterHTMLControl test
|
||||||
|
// Author: Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <wx/wx.h>
|
||||||
|
#include <wx/artprov.h>
|
||||||
|
#include <wx/notifmsg.h>
|
||||||
|
#include <wx/settings.h>
|
||||||
|
|
||||||
|
#if wxUSE_STC
|
||||||
|
#include <wx/stc/stc.h>
|
||||||
|
#else
|
||||||
|
#error "wxStyledTextControl is needed by this sample"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/webview.h"
|
||||||
|
#include "wxlogo.xpm"
|
||||||
|
#include "back.xpm"
|
||||||
|
#include "forward.xpm"
|
||||||
|
#include "stop.xpm"
|
||||||
|
#include "refresh.xpm"
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
// SOURCE VIEW FRAME
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
MARGIN_LINE_NUMBERS,
|
||||||
|
//MARGIN_DIVIDER,
|
||||||
|
//MARGIN_FOLDING
|
||||||
|
};
|
||||||
|
|
||||||
|
class SourceViewDialog : public wxDialog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
void onClose(wxCloseEvent& evt)
|
||||||
|
{
|
||||||
|
EndModal( GetReturnCode() );
|
||||||
|
}
|
||||||
|
|
||||||
|
SourceViewDialog(wxWindow* parent, wxString source) :
|
||||||
|
wxDialog(parent, wxID_ANY, "Source Code",
|
||||||
|
wxDefaultPosition, wxSize(700,500),
|
||||||
|
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
|
||||||
|
{
|
||||||
|
wxStyledTextCtrl* text = new wxStyledTextCtrl(this, wxID_ANY);
|
||||||
|
|
||||||
|
//text->SetLexer(wxSTC_LEX_HTML);
|
||||||
|
text->SetMarginWidth (MARGIN_LINE_NUMBERS, 50);
|
||||||
|
text->StyleSetForeground (wxSTC_STYLE_LINENUMBER, wxColour (75, 75, 75) );
|
||||||
|
text->StyleSetBackground (wxSTC_STYLE_LINENUMBER, wxColour (220, 220, 220));
|
||||||
|
text->SetMarginType (MARGIN_LINE_NUMBERS, wxSTC_MARGIN_NUMBER);
|
||||||
|
|
||||||
|
text->SetWrapMode (wxSTC_WRAP_WORD);
|
||||||
|
|
||||||
|
text->SetText(source);
|
||||||
|
|
||||||
|
text->StyleClearAll();
|
||||||
|
text->SetLexer(wxSTC_LEX_HTML);
|
||||||
|
text->StyleSetForeground (wxSTC_H_DOUBLESTRING, wxColour(255,0,0));
|
||||||
|
text->StyleSetForeground (wxSTC_H_SINGLESTRING, wxColour(255,0,0));
|
||||||
|
text->StyleSetForeground (wxSTC_H_ENTITY, wxColour(255,0,0));
|
||||||
|
text->StyleSetForeground (wxSTC_H_TAG, wxColour(0,150,0));
|
||||||
|
text->StyleSetForeground (wxSTC_H_TAGUNKNOWN, wxColour(0,150,0));
|
||||||
|
text->StyleSetForeground (wxSTC_H_ATTRIBUTE, wxColour(0,0,150));
|
||||||
|
text->StyleSetForeground (wxSTC_H_ATTRIBUTEUNKNOWN, wxColour(0,0,150));
|
||||||
|
text->StyleSetForeground (wxSTC_H_COMMENT, wxColour(150,150,150));
|
||||||
|
|
||||||
|
|
||||||
|
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
sizer->Add(text, 1, wxEXPAND);
|
||||||
|
SetSizer(sizer);
|
||||||
|
|
||||||
|
Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(SourceViewDialog::onClose), NULL, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
// MAIN BROWSER CLASS
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
class wxMiniApp : public wxApp
|
||||||
|
{
|
||||||
|
wxTextCtrl* url;
|
||||||
|
wxWebView* m_browser_ctrl;
|
||||||
|
wxFrame* frame;
|
||||||
|
|
||||||
|
wxToolBarToolBase* back;
|
||||||
|
wxToolBarToolBase* forward;
|
||||||
|
wxToolBarToolBase* stop;
|
||||||
|
wxToolBarToolBase* reload;
|
||||||
|
wxToolBarToolBase* tools;
|
||||||
|
|
||||||
|
wxMenu* toolsMenu;
|
||||||
|
wxMenuItem* tinySize;
|
||||||
|
wxMenuItem* smallSize;
|
||||||
|
wxMenuItem* mediumSize;
|
||||||
|
wxMenuItem* largeSize;
|
||||||
|
wxMenuItem* largestSize;
|
||||||
|
|
||||||
|
//wxMenuItem* offlineMode;
|
||||||
|
//wxMenuItem* onlineMode;
|
||||||
|
|
||||||
|
wxLogWindow* logging;
|
||||||
|
wxToolBar* m_toolbar;
|
||||||
|
|
||||||
|
wxTimer* m_timer;
|
||||||
|
int m_animation_angle;
|
||||||
|
|
||||||
|
wxPanel* m_notification_panel;
|
||||||
|
wxStaticText* m_notification_text;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// function called at the application initialization
|
||||||
|
virtual bool OnInit();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement timer to display the loading animation (OK, I admit this is totally irrelevant to
|
||||||
|
* the HTML control being demonstrated here, but it's fun ;)
|
||||||
|
*/
|
||||||
|
void onAnimationTimer(wxTimerEvent& evt)
|
||||||
|
{
|
||||||
|
m_animation_angle += 15;
|
||||||
|
if (m_animation_angle > 360) m_animation_angle -= 360;
|
||||||
|
|
||||||
|
wxBitmap image(32, 32);
|
||||||
|
|
||||||
|
{
|
||||||
|
wxMemoryDC dc;
|
||||||
|
dc.SelectObject(image);
|
||||||
|
dc.SetBackground(wxBrush(wxColour(255,0,255)));
|
||||||
|
dc.Clear();
|
||||||
|
|
||||||
|
if (m_animation_angle >= 0 && m_animation_angle <= 180)
|
||||||
|
{
|
||||||
|
dc.SetBrush(*wxYELLOW_BRUSH);
|
||||||
|
dc.SetPen(*wxYELLOW_PEN);
|
||||||
|
dc.DrawCircle(16 - int(sin(m_animation_angle*0.01745f /* convert to radians */)*14.0f),
|
||||||
|
16 + int(cos(m_animation_angle*0.01745f /* convert to radians */)*14.0f), 3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.DrawBitmap(wxBitmap(wxlogo_xpm), 0, 0, true);
|
||||||
|
|
||||||
|
if (m_animation_angle > 180)
|
||||||
|
{
|
||||||
|
dc.SetBrush(*wxYELLOW_BRUSH);
|
||||||
|
dc.SetPen(*wxYELLOW_PEN);
|
||||||
|
dc.DrawCircle(16 - int(sin(m_animation_angle*0.01745f /* convert to radians */)*14.0f),
|
||||||
|
16 + int(cos(m_animation_angle*0.01745f /* convert to radians */)*14.0f), 3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
image.SetMask(new wxMask(image, wxColour(255,0,255)));
|
||||||
|
m_toolbar->SetToolNormalBitmap(tools->GetId(), image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method that retrieves the current state from the web control and updates the GUI
|
||||||
|
* the reflect this current state.
|
||||||
|
*/
|
||||||
|
void updateState()
|
||||||
|
{
|
||||||
|
m_toolbar->EnableTool( back->GetId(), m_browser_ctrl->CanGoBack() );
|
||||||
|
m_toolbar->EnableTool( forward->GetId(), m_browser_ctrl->CanGoForward() );
|
||||||
|
|
||||||
|
if (m_browser_ctrl->IsBusy())
|
||||||
|
{
|
||||||
|
//tools->SetLabel(_("Loading..."));
|
||||||
|
|
||||||
|
if (m_timer == NULL)
|
||||||
|
{
|
||||||
|
m_timer = new wxTimer(this);
|
||||||
|
this->Connect(wxEVT_TIMER, wxTimerEventHandler(wxMiniApp::onAnimationTimer), NULL, this);
|
||||||
|
}
|
||||||
|
m_timer->Start(100); // start animation timer
|
||||||
|
|
||||||
|
m_toolbar->EnableTool( stop->GetId(), true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_timer != NULL) m_timer->Stop(); // stop animation timer
|
||||||
|
|
||||||
|
//tools->SetLabel(_("Tools"));
|
||||||
|
m_toolbar->SetToolNormalBitmap(tools->GetId(), wxBitmap(wxlogo_xpm));
|
||||||
|
m_toolbar->EnableTool( stop->GetId(), false );
|
||||||
|
}
|
||||||
|
|
||||||
|
frame->SetTitle( m_browser_ctrl->GetCurrentTitle() );
|
||||||
|
url->SetValue( m_browser_ctrl->GetCurrentURL() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when user entered an URL and pressed enter
|
||||||
|
*/
|
||||||
|
void onUrl(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
if (m_notification_panel->IsShown())
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_browser_ctrl->LoadUrl( url->GetValue() );
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when user pressed the "back" button
|
||||||
|
*/
|
||||||
|
void onBack(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
// First, hide notification panel if it was shown
|
||||||
|
if (m_notification_panel->IsShown())
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_browser_ctrl->GoBack();
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when user pressed the "forward" button
|
||||||
|
*/
|
||||||
|
void onForward(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
// First, hide notification panel if it was shown
|
||||||
|
if (m_notification_panel->IsShown())
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_browser_ctrl->GoForward();
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when user pressed the "stop" button
|
||||||
|
*/
|
||||||
|
void onStop(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
m_browser_ctrl->Stop();
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when user pressed the "reload" button
|
||||||
|
*/
|
||||||
|
void onReload(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
// First, hide notification panel if it was shown
|
||||||
|
if (m_notification_panel->IsShown())
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_browser_ctrl->Reload();
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when there is a request to load a new page (for instance
|
||||||
|
* when the user clicks a link)
|
||||||
|
*/
|
||||||
|
void onNavigationRequest(wxWebNavigationEvent& evt)
|
||||||
|
{
|
||||||
|
// First, hide notification panel if it was shown
|
||||||
|
if (m_notification_panel->IsShown())
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogMessage("Navigation request to '" + evt.GetHref() + "' (target='" +
|
||||||
|
evt.GetTarget() + "')");
|
||||||
|
|
||||||
|
wxASSERT(m_browser_ctrl->IsBusy());
|
||||||
|
|
||||||
|
// Uncomment this to see how to block navigation requests
|
||||||
|
//int answer = wxMessageBox("Proceed with navigation to '" + evt.GetHref() + "'?",
|
||||||
|
// "Proceed with navigation?", wxYES_NO );
|
||||||
|
//if (answer != wxYES)
|
||||||
|
//{
|
||||||
|
// evt.Veto();
|
||||||
|
//}
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when a navigation request was accepted
|
||||||
|
*/
|
||||||
|
void onNavigationComplete(wxWebNavigationEvent& evt)
|
||||||
|
{
|
||||||
|
wxLogMessage("Navigation complete; url='" + evt.GetHref() + "'");
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when a page is finished loading
|
||||||
|
*/
|
||||||
|
void onDocumentLoaded(wxWebNavigationEvent& evt)
|
||||||
|
{
|
||||||
|
wxLogMessage("Document loaded; url='" + evt.GetHref() + "'");
|
||||||
|
updateState();
|
||||||
|
|
||||||
|
m_browser_ctrl->GetZoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when user selects the "View Source" menu item
|
||||||
|
*/
|
||||||
|
void onViewSourceRequest(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
SourceViewDialog dlg(frame, m_browser_ctrl->GetPageSource());
|
||||||
|
dlg.Center();
|
||||||
|
dlg.ShowModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when user selects the "Menu" item
|
||||||
|
*/
|
||||||
|
void onToolsClicked(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
tinySize->Check(false);
|
||||||
|
smallSize->Check(false);
|
||||||
|
mediumSize->Check(false);
|
||||||
|
largeSize->Check(false);
|
||||||
|
largestSize->Check(false);
|
||||||
|
|
||||||
|
wxWebViewZoom zoom = m_browser_ctrl->GetZoom();
|
||||||
|
switch (zoom)
|
||||||
|
{
|
||||||
|
case wxWEB_VIEW_ZOOM_TINY:
|
||||||
|
tinySize->Check();
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_SMALL:
|
||||||
|
smallSize->Check();
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_MEDIUM:
|
||||||
|
mediumSize->Check();
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGE:
|
||||||
|
largeSize->Check();
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGEST:
|
||||||
|
largestSize->Check();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bool IsOfflineMode();
|
||||||
|
// void SetOfflineMode(bool offline);
|
||||||
|
|
||||||
|
//offlineMode->Check(false);
|
||||||
|
//onlineMode->Check(false);
|
||||||
|
//const bool offline = m_browser_ctrl->IsOfflineMode();
|
||||||
|
//if (offline) offlineMode->Check();
|
||||||
|
//else onlineMode->Check();
|
||||||
|
|
||||||
|
wxPoint position = frame->ScreenToClient( wxGetMousePosition() );
|
||||||
|
frame->PopupMenu(toolsMenu, position.x, position.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when user selects the zoom size in the menu
|
||||||
|
*/
|
||||||
|
void onSetZoom(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
if (evt.GetId() == tinySize->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetZoom(wxWEB_VIEW_ZOOM_TINY);
|
||||||
|
}
|
||||||
|
else if (evt.GetId() == smallSize->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetZoom(wxWEB_VIEW_ZOOM_SMALL);
|
||||||
|
}
|
||||||
|
else if (evt.GetId() == mediumSize->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetZoom(wxWEB_VIEW_ZOOM_MEDIUM);
|
||||||
|
}
|
||||||
|
else if (evt.GetId() == largeSize->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetZoom(wxWEB_VIEW_ZOOM_LARGE);
|
||||||
|
}
|
||||||
|
else if (evt.GetId() == largestSize->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetZoom(wxWEB_VIEW_ZOOM_LARGEST);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void onChangeOnlineMode(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
if (evt.GetId() == offlineMode->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetOfflineMode(true);
|
||||||
|
m_browser_ctrl->SetPage("<html><body><h1>You are now in offline mode.</h1></body></html>");
|
||||||
|
}
|
||||||
|
else if (evt.GetId() == onlineMode->GetId())
|
||||||
|
{
|
||||||
|
m_browser_ctrl->SetOfflineMode(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked when a loading error occurs
|
||||||
|
*/
|
||||||
|
void onError(wxWebNavigationEvent& evt)
|
||||||
|
{
|
||||||
|
wxString errorCategory;
|
||||||
|
switch (evt.GetInt())
|
||||||
|
{
|
||||||
|
case wxWEB_NAV_ERR_CONNECTION:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_CONNECTION";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_CERTIFICATE:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_CERTIFICATE";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_AUTH:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_AUTH";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_SECURITY:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_SECURITY";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_NOT_FOUND:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_NOT_FOUND";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_REQUEST:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_REQUEST";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_USER_CANCELLED:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_USER_CANCELLED";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_NAV_ERR_OTHER:
|
||||||
|
errorCategory = "wxWEB_NAV_ERR_OTHER";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogMessage("Error; url='" + evt.GetHref() + "', error='" + errorCategory + "' (" + evt.GetString() + ")");
|
||||||
|
|
||||||
|
// show the notification panel
|
||||||
|
m_notification_text->SetLabel(_("An error occurred loading ") + evt.GetHref() + "\n" +
|
||||||
|
"'" + errorCategory + "' (" + evt.GetString() + ")");
|
||||||
|
m_notification_panel->Layout();
|
||||||
|
m_notification_panel->GetSizer()->SetSizeHints(m_notification_panel);
|
||||||
|
m_notification_panel->Show();
|
||||||
|
frame->Layout();
|
||||||
|
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when user clicks "Hide" in the notification panel
|
||||||
|
*/
|
||||||
|
void onHideNotifBar(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
frame->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onClose(wxCloseEvent& evt)
|
||||||
|
{
|
||||||
|
frame->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onQuitMenu(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
frame->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when user selects "Print" from the menu
|
||||||
|
*/
|
||||||
|
void onPrint(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
m_browser_ctrl->Print();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_APP(wxMiniApp);
|
||||||
|
|
||||||
|
bool wxMiniApp::OnInit()
|
||||||
|
{
|
||||||
|
m_timer = NULL;
|
||||||
|
m_animation_angle = 0;
|
||||||
|
|
||||||
|
frame = new wxFrame( NULL, -1, _("wxBetterHTMLControl Browser Example"), wxDefaultPosition, wxSize(800, 600) );
|
||||||
|
|
||||||
|
// wx has a default mechanism to expand the only control of a frame; but since this mechanism
|
||||||
|
// does not involve sizers, invoking ->Layout on the frame does not udpate the layout which is
|
||||||
|
// not good.
|
||||||
|
wxBoxSizer* expandSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
wxPanel* mainpane = new wxPanel(frame, wxID_ANY);
|
||||||
|
expandSizer->Add(mainpane, 1, wxEXPAND);
|
||||||
|
frame->SetSizer(expandSizer);
|
||||||
|
|
||||||
|
wxLog::SetLogLevel(wxLOG_Max);
|
||||||
|
logging = new wxLogWindow(frame, _("Logging"));
|
||||||
|
wxLog::SetLogLevel(wxLOG_Max);
|
||||||
|
|
||||||
|
// ---- Create the Tools menu
|
||||||
|
toolsMenu = new wxMenu();
|
||||||
|
wxMenuItem* print = toolsMenu->Append(wxID_ANY , _("Print"));
|
||||||
|
wxMenuItem* viewSource = toolsMenu->Append(wxID_ANY , _("View Source"));
|
||||||
|
toolsMenu->AppendSeparator();
|
||||||
|
tinySize = toolsMenu->AppendCheckItem(wxID_ANY, _("Tiny"));
|
||||||
|
smallSize = toolsMenu->AppendCheckItem(wxID_ANY, _("Small"));
|
||||||
|
mediumSize = toolsMenu->AppendCheckItem(wxID_ANY, _("Medium"));
|
||||||
|
largeSize = toolsMenu->AppendCheckItem(wxID_ANY, _("Large"));
|
||||||
|
largestSize = toolsMenu->AppendCheckItem(wxID_ANY, _("Largest"));
|
||||||
|
//toolsMenu->AppendSeparator();
|
||||||
|
//offlineMode = toolsMenu->AppendCheckItem(wxID_ANY, _("Offline Mode"));
|
||||||
|
//onlineMode = toolsMenu->AppendCheckItem(wxID_ANY, _("Online Mode"));
|
||||||
|
|
||||||
|
// ---- Create the Toolbar
|
||||||
|
m_toolbar = frame->CreateToolBar(/*wxNO_BORDER |*/ wxTB_TEXT);
|
||||||
|
m_toolbar->SetToolBitmapSize(wxSize(32, 32));
|
||||||
|
|
||||||
|
back = m_toolbar->AddTool(wxID_ANY, _("Back"), wxBitmap(back_xpm));
|
||||||
|
forward = m_toolbar->AddTool(wxID_ANY, _("Forward"), wxBitmap(forward_xpm));
|
||||||
|
stop = m_toolbar->AddTool(wxID_ANY, _("Stop"), wxBitmap(stop_xpm));
|
||||||
|
reload = m_toolbar->AddTool(wxID_ANY, _("Reload"), wxBitmap(refresh_xpm));
|
||||||
|
|
||||||
|
url = new wxTextCtrl(m_toolbar, wxID_ANY, wxT("http://www.google.com"),
|
||||||
|
wxDefaultPosition, wxSize(400, -1), wxTE_PROCESS_ENTER );
|
||||||
|
m_toolbar->AddControl(url, _("URL"));
|
||||||
|
tools = m_toolbar->AddTool(wxID_ANY, _("Menu"), wxBitmap(wxlogo_xpm));
|
||||||
|
//m_toolbar->SetDropdownMenu(tools->GetId(), toolsMenu);
|
||||||
|
|
||||||
|
m_toolbar->Realize();
|
||||||
|
|
||||||
|
m_toolbar->Connect(back->GetId(), wxEVT_COMMAND_TOOL_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onBack), NULL, this );
|
||||||
|
m_toolbar->Connect(forward->GetId(), wxEVT_COMMAND_TOOL_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onForward), NULL, this );
|
||||||
|
m_toolbar->Connect(stop->GetId(), wxEVT_COMMAND_TOOL_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onStop), NULL, this );
|
||||||
|
m_toolbar->Connect(reload->GetId(), wxEVT_COMMAND_TOOL_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onReload), NULL, this );
|
||||||
|
m_toolbar->Connect(tools->GetId(), wxEVT_COMMAND_TOOL_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onToolsClicked), NULL, this );
|
||||||
|
|
||||||
|
url->Connect(url->GetId(), wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(wxMiniApp::onUrl), NULL, this );
|
||||||
|
|
||||||
|
|
||||||
|
frame->Connect(viewSource->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onViewSourceRequest), NULL, this );
|
||||||
|
frame->Connect(print->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onPrint), NULL, this );
|
||||||
|
|
||||||
|
frame->Connect(tinySize->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onSetZoom), NULL, this );
|
||||||
|
frame->Connect(smallSize->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onSetZoom), NULL, this );
|
||||||
|
frame->Connect(mediumSize->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onSetZoom), NULL, this );
|
||||||
|
frame->Connect(largeSize->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onSetZoom), NULL, this );
|
||||||
|
frame->Connect(largestSize->GetId(), wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onSetZoom), NULL, this );
|
||||||
|
|
||||||
|
// ---- Create the web view
|
||||||
|
m_browser_ctrl = wxWebView::GetNew(mainpane, wxID_ANY);
|
||||||
|
|
||||||
|
// ---- Create the notification panel
|
||||||
|
{
|
||||||
|
wxBoxSizer* notification_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
m_notification_panel = new wxPanel(mainpane, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE);
|
||||||
|
m_notification_text = new wxStaticText(m_notification_panel, wxID_ANY, "[No message]");
|
||||||
|
notification_sizer->Add( new wxStaticBitmap(m_notification_panel, wxID_ANY,
|
||||||
|
wxArtProvider::GetBitmap(wxART_WARNING, wxART_OTHER , wxSize(48, 48))),
|
||||||
|
0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
|
||||||
|
notification_sizer->Add(m_notification_text, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
|
||||||
|
wxButton* hideNotif = new wxButton(m_notification_panel, wxID_ANY, _("Hide"));
|
||||||
|
notification_sizer->Add(hideNotif, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
|
||||||
|
m_notification_panel->SetSizer(notification_sizer);
|
||||||
|
m_notification_panel->SetBackgroundColour(wxColor(255,225,110));
|
||||||
|
m_notification_panel->Hide();
|
||||||
|
hideNotif->Connect(hideNotif->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,
|
||||||
|
wxCommandEventHandler(wxMiniApp::onHideNotifBar), NULL, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
sizer->Add(m_notification_panel, 0, wxEXPAND | wxALL, 5);
|
||||||
|
sizer->Add(m_browser_ctrl, 1, wxEXPAND | wxALL, 5);
|
||||||
|
|
||||||
|
mainpane->SetSizer(sizer);
|
||||||
|
frame->Layout();
|
||||||
|
frame->Center();
|
||||||
|
frame->Show();
|
||||||
|
|
||||||
|
m_browser_ctrl->Connect(m_browser_ctrl->GetId(), wxEVT_COMMAND_WEB_VIEW_NAVIGATING,
|
||||||
|
wxWebNavigationEventHandler(wxMiniApp::onNavigationRequest), NULL, this);
|
||||||
|
|
||||||
|
m_browser_ctrl->Connect(m_browser_ctrl->GetId(), wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
|
||||||
|
wxWebNavigationEventHandler(wxMiniApp::onNavigationComplete), NULL, this);
|
||||||
|
|
||||||
|
m_browser_ctrl->Connect(m_browser_ctrl->GetId(), wxEVT_COMMAND_WEB_VIEW_LOADED,
|
||||||
|
wxWebNavigationEventHandler(wxMiniApp::onDocumentLoaded), NULL, this);
|
||||||
|
|
||||||
|
m_browser_ctrl->Connect(m_browser_ctrl->GetId(), wxEVT_COMMAND_WEB_VIEW_ERROR,
|
||||||
|
wxWebNavigationEventHandler(wxMiniApp::onError), NULL, this);
|
||||||
|
|
||||||
|
frame->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(wxMiniApp::onClose), NULL, this);
|
||||||
|
Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(wxMiniApp::onQuitMenu), NULL, this);
|
||||||
|
|
||||||
|
// You can test different zoom types (if supported by the backend)
|
||||||
|
// if (m_browser_ctrl->CanSetZoomType(wxWEB_VIEW_ZOOM_TYPE_LAYOUT))
|
||||||
|
// m_browser_ctrl->SetZoomType(wxWEB_VIEW_ZOOM_TYPE_LAYOUT);
|
||||||
|
|
||||||
|
SetTopWindow(frame);
|
||||||
|
frame->Layout();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
44
samples/web/wxlogo.xpm
Normal file
44
samples/web/wxlogo.xpm
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/* XPM */
|
||||||
|
static const char *const wxlogo_xpm[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"32 32 6 1",
|
||||||
|
" c black",
|
||||||
|
". c navy",
|
||||||
|
"X c red",
|
||||||
|
"o c yellow",
|
||||||
|
"O c gray100",
|
||||||
|
"+ c None",
|
||||||
|
/* pixels */
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++ ++++++++++",
|
||||||
|
"++++++++ ............ ++++++++++",
|
||||||
|
"++++++++ ............ ++++++++++",
|
||||||
|
"++++++++ .OO......... ++++++++++",
|
||||||
|
"++++++++ .OO......... ++++++++++",
|
||||||
|
"++++++++ .OO......... ++++++++++",
|
||||||
|
"++++++++ .OO...... ",
|
||||||
|
"++++++++ .OO...... oooooooooooo ",
|
||||||
|
" .OO...... oooooooooooo ",
|
||||||
|
" XXXXXXX .OO...... oOOooooooooo ",
|
||||||
|
" XXXXXXX .OO...... oOOooooooooo ",
|
||||||
|
" XOOXXXX ......... oOOooooooooo ",
|
||||||
|
" XOOXXXX ......... oOOooooooooo ",
|
||||||
|
" XOOXXXX oOOooooooooo ",
|
||||||
|
" XOOXXXXXXXXX ++++ oOOooooooooo ",
|
||||||
|
" XOOXXXXXXXXX ++++ oOOooooooooo ",
|
||||||
|
" XOOXXXXXXXXX ++++ oOOooooooooo ",
|
||||||
|
" XOOXXXXXXXXX ++++ oooooooooooo ",
|
||||||
|
" XOOXXXXXXXXX ++++ oooooooooooo ",
|
||||||
|
" XXXXXXXXXXXX ++++ ",
|
||||||
|
" XXXXXXXXXXXX ++++++++++++++++++",
|
||||||
|
" ++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++"
|
||||||
|
};
|
113
src/common/webview.cpp
Normal file
113
src/common/webview.cpp
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: webview.cpp
|
||||||
|
// Purpose: Common interface and events for web view component
|
||||||
|
// Author: Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "wx/webview.h"
|
||||||
|
|
||||||
|
#include "wx/osx/webkit.h"
|
||||||
|
#include "wx/gtk/webkit.h"
|
||||||
|
#include "wx/msw/webkitie.h"
|
||||||
|
|
||||||
|
extern WXDLLEXPORT_DATA(const char) wxWebViewNameStr[] = "wxWebView";
|
||||||
|
extern WXDLLEXPORT_DATA(const char) wxWebViewDefaultURLStr[] = "about:blank";
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxWebNavigationEvent, wxCommandEvent)
|
||||||
|
|
||||||
|
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NAVIGATING, wxWebNavigationEvent );
|
||||||
|
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NAVIGATED, wxWebNavigationEvent );
|
||||||
|
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_LOADED, wxWebNavigationEvent );
|
||||||
|
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebNavigationEvent );
|
||||||
|
|
||||||
|
// static
|
||||||
|
wxWebView* wxWebView::New(wxWebViewBackend backend)
|
||||||
|
{
|
||||||
|
switch (backend)
|
||||||
|
{
|
||||||
|
#if wxHAVE_WEB_BACKEND_OSX_WEBKIT
|
||||||
|
case wxWEB_VIEW_BACKEND_OSX_WEBKIT:
|
||||||
|
return new wxOSXWebKitCtrl();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
case wxWEB_VIEW_BACKEND_GTK_WEBKIT:
|
||||||
|
return new wxGtkWebKitCtrl();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
case wxWEB_VIEW_BACKEND_IE:
|
||||||
|
return new wxIEPanel();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case wxWEB_VIEW_BACKEND_DEFAULT:
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_OSX_WEBKIT
|
||||||
|
return new wxOSXWebKitCtrl();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
return new wxGtkWebKitCtrl();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
return new wxIEPanel();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// fall-through intended
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
wxWebView* wxWebView::New(wxWindow* parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& url,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
wxWebViewBackend backend,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
switch (backend)
|
||||||
|
{
|
||||||
|
#if wxHAVE_WEB_BACKEND_OSX_WEBKIT
|
||||||
|
case wxWEB_VIEW_BACKEND_OSX_WEBKIT:
|
||||||
|
return new wxOSXWebKitCtrl(parent, id, url, pos, size, style,
|
||||||
|
name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
case wxWEB_VIEW_BACKEND_GTK_WEBKIT:
|
||||||
|
return new wxGtkWebKitCtrl(parent, id, url, pos, size, style,
|
||||||
|
name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
case wxWEB_VIEW_BACKEND_IE:
|
||||||
|
return new wxIEPanel(parent, id, url, pos, size, style, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case wxWEB_VIEW_BACKEND_DEFAULT:
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_OSX_WEBKIT
|
||||||
|
return new wxOSXWebKitCtrl(parent, id, url, pos, size, style, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
return new wxGtkWebKitCtrl(parent, id, url, pos, size, style, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
return new wxIEPanel(parent, id, url, pos, size, style, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// fall-through intended
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
560
src/gtk/webview.cpp
Normal file
560
src/gtk/webview.cpp
Normal file
@@ -0,0 +1,560 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: src/gtk/webview.cpp
|
||||||
|
// Purpose: GTK WebKit backend for web view component
|
||||||
|
// Author: Marianne Gagnon, Robert Roebling
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon, 1998 Robert Roebling
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
||||||
|
|
||||||
|
#include "wx/stockitem.h"
|
||||||
|
#include "wx/gtk/webview.h"
|
||||||
|
#include "wx/gtk/control.h"
|
||||||
|
#include "wx/gtk/private.h"
|
||||||
|
#include "webkit/webkit.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// GTK callbacks
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
|
||||||
|
static void
|
||||||
|
wxgtk_webkitctrl_load_status_callback(GtkWidget* widget, GParamSpec* arg1,
|
||||||
|
wxWebViewGTKWebKit *webKitCtrl)
|
||||||
|
{
|
||||||
|
if (!webKitCtrl->m_ready) return;
|
||||||
|
|
||||||
|
wxString url = webKitCtrl->GetCurrentURL();
|
||||||
|
|
||||||
|
WebKitLoadStatus status;
|
||||||
|
g_object_get(G_OBJECT(widget), "load-status", &status, NULL);
|
||||||
|
|
||||||
|
wxString target; // TODO: get target (if possible)
|
||||||
|
|
||||||
|
if (status == WEBKIT_LOAD_FINISHED)
|
||||||
|
{
|
||||||
|
webKitCtrl->m_busy = false;
|
||||||
|
wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_LOADED,
|
||||||
|
webKitCtrl->GetId(),
|
||||||
|
url, target, false);
|
||||||
|
|
||||||
|
if (webKitCtrl && webKitCtrl->GetEventHandler())
|
||||||
|
webKitCtrl->GetEventHandler()->ProcessEvent(thisEvent);
|
||||||
|
}
|
||||||
|
else if (status == WEBKIT_LOAD_COMMITTED)
|
||||||
|
{
|
||||||
|
webKitCtrl->m_busy = true;
|
||||||
|
wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
|
||||||
|
webKitCtrl->GetId(),
|
||||||
|
url, target, false);
|
||||||
|
|
||||||
|
if (webKitCtrl && webKitCtrl->GetEventHandler())
|
||||||
|
webKitCtrl->GetEventHandler()->ProcessEvent(thisEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static WebKitNavigationResponse
|
||||||
|
wxgtk_webkitctrl_navigation_requ_callback(WebKitWebView *web_view,
|
||||||
|
WebKitWebFrame *frame,
|
||||||
|
WebKitNetworkRequest *request,
|
||||||
|
wxWebViewGTKWebKit *webKitCtrl)
|
||||||
|
{
|
||||||
|
webKitCtrl->m_busy = true;
|
||||||
|
|
||||||
|
const gchar* uri = webkit_network_request_get_uri(request);
|
||||||
|
|
||||||
|
wxString target = webkit_web_frame_get_name (frame);
|
||||||
|
wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATING,
|
||||||
|
webKitCtrl->GetId(),
|
||||||
|
wxString( uri, wxConvUTF8 ),
|
||||||
|
target,
|
||||||
|
true);
|
||||||
|
|
||||||
|
if (webKitCtrl && webKitCtrl->GetEventHandler())
|
||||||
|
webKitCtrl->GetEventHandler()->ProcessEvent(thisEvent);
|
||||||
|
|
||||||
|
if (thisEvent.IsVetoed())
|
||||||
|
{
|
||||||
|
webKitCtrl->m_busy = false;
|
||||||
|
return WEBKIT_NAVIGATION_RESPONSE_IGNORE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return WEBKIT_NAVIGATION_RESPONSE_ACCEPT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
wxgtk_webkitctrl_error (WebKitWebView *web_view,
|
||||||
|
WebKitWebFrame *web_frame,
|
||||||
|
gchar *uri,
|
||||||
|
gpointer web_error,
|
||||||
|
wxWebViewGTKWebKit* webKitWindow)
|
||||||
|
{
|
||||||
|
webKitWindow->m_busy = false;
|
||||||
|
wxWebNavigationError type = wxWEB_NAV_ERR_OTHER;
|
||||||
|
|
||||||
|
GError* error = (GError*)web_error;
|
||||||
|
wxString description(error->message, wxConvUTF8);
|
||||||
|
|
||||||
|
if (strcmp(g_quark_to_string(error->domain), "soup_http_error_quark") == 0)
|
||||||
|
{
|
||||||
|
switch (error->code)
|
||||||
|
{
|
||||||
|
case SOUP_STATUS_CANCELLED:
|
||||||
|
type = wxWEB_NAV_ERR_USER_CANCELLED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_CANT_RESOLVE:
|
||||||
|
case SOUP_STATUS_NOT_FOUND:
|
||||||
|
type = wxWEB_NAV_ERR_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_CANT_RESOLVE_PROXY:
|
||||||
|
case SOUP_STATUS_CANT_CONNECT:
|
||||||
|
case SOUP_STATUS_CANT_CONNECT_PROXY:
|
||||||
|
case SOUP_STATUS_SSL_FAILED:
|
||||||
|
case SOUP_STATUS_IO_ERROR:
|
||||||
|
type = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_MALFORMED:
|
||||||
|
//case SOUP_STATUS_TOO_MANY_REDIRECTS:
|
||||||
|
type = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
|
||||||
|
//case SOUP_STATUS_NO_CONTENT:
|
||||||
|
//case SOUP_STATUS_RESET_CONTENT:
|
||||||
|
|
||||||
|
case SOUP_STATUS_BAD_REQUEST:
|
||||||
|
type = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_UNAUTHORIZED:
|
||||||
|
case SOUP_STATUS_FORBIDDEN:
|
||||||
|
type = wxWEB_NAV_ERR_AUTH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_METHOD_NOT_ALLOWED:
|
||||||
|
case SOUP_STATUS_NOT_ACCEPTABLE:
|
||||||
|
type = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED:
|
||||||
|
type = wxWEB_NAV_ERR_AUTH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_REQUEST_TIMEOUT:
|
||||||
|
type = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
|
||||||
|
//case SOUP_STATUS_PAYMENT_REQUIRED:
|
||||||
|
case SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE:
|
||||||
|
case SOUP_STATUS_REQUEST_URI_TOO_LONG:
|
||||||
|
case SOUP_STATUS_UNSUPPORTED_MEDIA_TYPE:
|
||||||
|
type = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_BAD_GATEWAY:
|
||||||
|
case SOUP_STATUS_SERVICE_UNAVAILABLE:
|
||||||
|
case SOUP_STATUS_GATEWAY_TIMEOUT:
|
||||||
|
type = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED:
|
||||||
|
type = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
//case SOUP_STATUS_INSUFFICIENT_STORAGE:
|
||||||
|
//case SOUP_STATUS_NOT_EXTENDED:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(g_quark_to_string(error->domain),
|
||||||
|
"webkit-network-error-quark") == 0)
|
||||||
|
{
|
||||||
|
switch (error->code)
|
||||||
|
{
|
||||||
|
//WEBKIT_NETWORK_ERROR_FAILED:
|
||||||
|
//WEBKIT_NETWORK_ERROR_TRANSPORT:
|
||||||
|
|
||||||
|
case WEBKIT_NETWORK_ERROR_UNKNOWN_PROTOCOL:
|
||||||
|
type = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WEBKIT_NETWORK_ERROR_CANCELLED:
|
||||||
|
type = wxWEB_NAV_ERR_USER_CANCELLED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WEBKIT_NETWORK_ERROR_FILE_DOES_NOT_EXIST:
|
||||||
|
type = wxWEB_NAV_ERR_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(g_quark_to_string(error->domain),
|
||||||
|
"webkit-policy-error-quark") == 0)
|
||||||
|
{
|
||||||
|
switch (error->code)
|
||||||
|
{
|
||||||
|
//case WEBKIT_POLICY_ERROR_FAILED:
|
||||||
|
//case WEBKIT_POLICY_ERROR_CANNOT_SHOW_MIME_TYPE:
|
||||||
|
//case WEBKIT_POLICY_ERROR_CANNOT_SHOW_URL:
|
||||||
|
//case WEBKIT_POLICY_ERROR_FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE:
|
||||||
|
case WEBKIT_POLICY_ERROR_CANNOT_USE_RESTRICTED_PORT:
|
||||||
|
type = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
webkit_plugin_error_quark
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Error domain %s\n", g_quark_to_string(error->domain));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_ERROR,
|
||||||
|
webKitWindow->GetId(),
|
||||||
|
uri,
|
||||||
|
wxEmptyString,
|
||||||
|
false);
|
||||||
|
thisEvent.SetString(description);
|
||||||
|
thisEvent.SetInt(type);
|
||||||
|
|
||||||
|
if (webKitWindow && webKitWindow->GetEventHandler())
|
||||||
|
{
|
||||||
|
webKitWindow->GetEventHandler()->ProcessEvent(thisEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // extern "C"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxWebViewGTKWebKit
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//IMPLEMENT_DYNAMIC_CLASS(wxWebViewGTKWebKit, wxControl)
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString &url,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
m_ready = false;
|
||||||
|
m_busy = false;
|
||||||
|
|
||||||
|
if (!PreCreation( parent, pos, size ) ||
|
||||||
|
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( wxT("wxWebViewGTKWebKit creation failed") );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
||||||
|
web_view = webkit_web_view_new ();
|
||||||
|
g_object_ref(web_view); // TODO: check memory management
|
||||||
|
|
||||||
|
m_widget = scrolled_window;
|
||||||
|
g_object_ref(m_widget); // TODO: check memory management
|
||||||
|
|
||||||
|
/* Place the WebKitWebView in the GtkScrolledWindow */
|
||||||
|
gtk_container_add (GTK_CONTAINER (scrolled_window), web_view);
|
||||||
|
gtk_widget_show(m_widget);
|
||||||
|
gtk_widget_show(web_view);
|
||||||
|
|
||||||
|
g_signal_connect_after(web_view, "notify::load-status",
|
||||||
|
G_CALLBACK(wxgtk_webkitctrl_load_status_callback),
|
||||||
|
this);
|
||||||
|
g_signal_connect_after(web_view, "navigation-requested",
|
||||||
|
G_CALLBACK(wxgtk_webkitctrl_navigation_requ_callback),
|
||||||
|
this);
|
||||||
|
g_signal_connect_after(web_view, "load-error",
|
||||||
|
G_CALLBACK(wxgtk_webkitctrl_error),
|
||||||
|
this);
|
||||||
|
|
||||||
|
// this signal can be added if we care about new frames open requests
|
||||||
|
//g_signal_connect_after(web_view, "new-window-policy-decision-requested",
|
||||||
|
// G_CALLBACK(...), this);
|
||||||
|
|
||||||
|
m_parent->DoAddChild( this );
|
||||||
|
|
||||||
|
PostCreation(size);
|
||||||
|
|
||||||
|
/* Open a webpage */
|
||||||
|
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), url);
|
||||||
|
|
||||||
|
m_ready = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::Enable( bool enable )
|
||||||
|
{
|
||||||
|
if (!wxControl::Enable(enable))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
|
||||||
|
|
||||||
|
//if (enable)
|
||||||
|
// GTKFixSensitivity();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkWindow*
|
||||||
|
wxWebViewGTKWebKit::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
|
||||||
|
{
|
||||||
|
GdkWindow* window = gtk_widget_get_parent_window(m_widget);
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::ZoomIn()
|
||||||
|
{
|
||||||
|
webkit_web_view_zoom_in (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::ZoomOut()
|
||||||
|
{
|
||||||
|
webkit_web_view_zoom_out (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::SetWebkitZoom(float level)
|
||||||
|
{
|
||||||
|
webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(web_view), level);
|
||||||
|
}
|
||||||
|
|
||||||
|
float wxWebViewGTKWebKit::GetWebkitZoom()
|
||||||
|
{
|
||||||
|
return webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::Stop()
|
||||||
|
{
|
||||||
|
webkit_web_view_stop_loading (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::Reload(wxWebViewReloadFlags flags)
|
||||||
|
{
|
||||||
|
if (flags & wxWEB_VIEW_RELOAD_NO_CACHE)
|
||||||
|
{
|
||||||
|
webkit_web_view_reload_bypass_cache (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
webkit_web_view_reload (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::LoadUrl(const wxString& url)
|
||||||
|
{
|
||||||
|
webkit_web_view_open(WEBKIT_WEB_VIEW(web_view), wxGTK_CONV(loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::GoBack()
|
||||||
|
{
|
||||||
|
webkit_web_view_go_back (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::GoForward()
|
||||||
|
{
|
||||||
|
webkit_web_view_go_forward (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::CanGoBack()
|
||||||
|
{
|
||||||
|
return webkit_web_view_can_go_back (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::CanGoForward()
|
||||||
|
{
|
||||||
|
return webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW(web_view));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString wxWebViewGTKWebKit::GetCurrentURL()
|
||||||
|
{
|
||||||
|
// FIXME: check which encoding the web kit control uses instead of
|
||||||
|
// assuming UTF8 (here and elsewhere too)
|
||||||
|
return wxString::FromUTF8(webkit_web_view_get_uri(
|
||||||
|
WEBKIT_WEB_VIEW(web_view)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString wxWebViewGTKWebKit::GetCurrentTitle()
|
||||||
|
{
|
||||||
|
return wxString::FromUTF8(webkit_web_view_get_title(
|
||||||
|
WEBKIT_WEB_VIEW(web_view)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString wxWebViewGTKWebKit::GetPageSource()
|
||||||
|
{
|
||||||
|
WebKitWebFrame* frame = webkit_web_view_get_main_frame(
|
||||||
|
WEBKIT_WEB_VIEW(web_view));
|
||||||
|
WebKitWebDataSource* src = webkit_web_frame_get_data_source (frame);
|
||||||
|
|
||||||
|
// TODO: check encoding with
|
||||||
|
// const gchar*
|
||||||
|
// webkit_web_data_source_get_encoding(WebKitWebDataSource *data_source);
|
||||||
|
return wxString(webkit_web_data_source_get_data (src)->str, wxConvUTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxWebViewZoom wxWebViewGTKWebKit::GetZoom()
|
||||||
|
{
|
||||||
|
float zoom = GetWebkitZoom();
|
||||||
|
|
||||||
|
// arbitrary way to map float zoom to our common zoom enum
|
||||||
|
if (zoom <= 0.65)
|
||||||
|
{
|
||||||
|
return wxWEB_VIEW_ZOOM_TINY;
|
||||||
|
}
|
||||||
|
else if (zoom > 0.65 && zoom <= 0.90)
|
||||||
|
{
|
||||||
|
return wxWEB_VIEW_ZOOM_SMALL;
|
||||||
|
}
|
||||||
|
else if (zoom > 0.90 && zoom <= 1.15)
|
||||||
|
{
|
||||||
|
return wxWEB_VIEW_ZOOM_MEDIUM;
|
||||||
|
}
|
||||||
|
else if (zoom > 1.15 && zoom <= 1.45)
|
||||||
|
{
|
||||||
|
return wxWEB_VIEW_ZOOM_LARGE;
|
||||||
|
}
|
||||||
|
else if (zoom > 1.45)
|
||||||
|
{
|
||||||
|
return wxWEB_VIEW_ZOOM_LARGEST;
|
||||||
|
}
|
||||||
|
|
||||||
|
// to shut up compilers, this can never be reached logically
|
||||||
|
wxASSERT(false);
|
||||||
|
return wxWEB_VIEW_ZOOM_MEDIUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::SetZoom(wxWebViewZoom zoom)
|
||||||
|
{
|
||||||
|
// arbitrary way to map our common zoom enum to float zoom
|
||||||
|
switch (zoom)
|
||||||
|
{
|
||||||
|
case wxWEB_VIEW_ZOOM_TINY:
|
||||||
|
SetWebkitZoom(0.6f);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_VIEW_ZOOM_SMALL:
|
||||||
|
SetWebkitZoom(0.8f);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_VIEW_ZOOM_MEDIUM:
|
||||||
|
SetWebkitZoom(1.0f);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGE:
|
||||||
|
SetWebkitZoom(1.3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGEST:
|
||||||
|
SetWebkitZoom(1.6);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
wxASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::SetZoomType(wxWebViewZoomType type)
|
||||||
|
{
|
||||||
|
webkit_web_view_set_full_content_zoom(WEBKIT_WEB_VIEW(web_view),
|
||||||
|
(type == wxWEB_VIEW_ZOOM_TYPE_LAYOUT ?
|
||||||
|
TRUE : FALSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWebViewZoomType wxWebViewGTKWebKit::GetZoomType() const
|
||||||
|
{
|
||||||
|
gboolean fczoom = webkit_web_view_get_full_content_zoom(
|
||||||
|
WEBKIT_WEB_VIEW(web_view));
|
||||||
|
|
||||||
|
if (fczoom) return wxWEB_VIEW_ZOOM_TYPE_LAYOUT;
|
||||||
|
else return wxWEB_VIEW_ZOOM_TYPE_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::CanSetZoomType(wxWebViewZoomType) const
|
||||||
|
{
|
||||||
|
// this port supports all zoom types
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::SetPage(const wxString& html, const wxString& baseUri)
|
||||||
|
{
|
||||||
|
webkit_web_view_load_string (WEBKIT_WEB_VIEW(web_view),
|
||||||
|
html.mb_str(wxConvUTF8),
|
||||||
|
"text/html",
|
||||||
|
"UTF-8",
|
||||||
|
baseUri.mb_str(wxConvUTF8));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewGTKWebKit::Print()
|
||||||
|
{
|
||||||
|
WebKitWebFrame* frame = webkit_web_view_get_main_frame(
|
||||||
|
WEBKIT_WEB_VIEW(web_view));
|
||||||
|
webkit_web_frame_print (frame);
|
||||||
|
|
||||||
|
// GtkPrintOperationResult webkit_web_frame_print_full
|
||||||
|
// (WebKitWebFrame *frame,
|
||||||
|
// GtkPrintOperation *operation,
|
||||||
|
// GtkPrintOperationAction action,
|
||||||
|
// GError **error);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxWebViewGTKWebKit::IsBusy()
|
||||||
|
{
|
||||||
|
return m_busy;
|
||||||
|
|
||||||
|
// This code looks nice but returns true after a page was cancelled
|
||||||
|
/*
|
||||||
|
WebKitLoadStatus status = webkit_web_view_get_load_status
|
||||||
|
(WEBKIT_WEB_VIEW(web_view));
|
||||||
|
|
||||||
|
|
||||||
|
#if WEBKIT_CHECK_VERSION(1,1,16)
|
||||||
|
// WEBKIT_LOAD_FAILED is new in webkit 1.1.16
|
||||||
|
if (status == WEBKIT_LOAD_FAILED)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (status == WEBKIT_LOAD_FINISHED)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
wxVisualAttributes
|
||||||
|
wxWebViewGTKWebKit::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
|
||||||
|
{
|
||||||
|
return GetDefaultAttributesFromGTKWidget(webkit_web_view_new);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // wxHAVE_WEB_BACKEND_GTK_WEBKIT
|
667
src/msw/webviewie.cpp
Normal file
667
src/msw/webviewie.cpp
Normal file
@@ -0,0 +1,667 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: src/msw/webviewie.cpp
|
||||||
|
// Purpose: wxMSW wxWebViewIE class implementation for web view component
|
||||||
|
// Author: Marianne Gagnon
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 2010 Marianne Gagnon
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "wx/msw/webview.h"
|
||||||
|
|
||||||
|
#if wxHAVE_WEB_BACKEND_IE
|
||||||
|
|
||||||
|
#include <olectl.h>
|
||||||
|
#include <oleidl.h>
|
||||||
|
#include <exdispid.h>
|
||||||
|
#include <exdisp.h>
|
||||||
|
#include <mshtml.h>
|
||||||
|
|
||||||
|
// FIXME: Seems like MINGW does not have these, how to handle cleanly?
|
||||||
|
#define DISPID_COMMANDSTATECHANGE 105
|
||||||
|
typedef enum CommandStateChangeConstants {
|
||||||
|
CSC_UPDATECOMMANDS = (int) 0xFFFFFFFF,
|
||||||
|
CSC_NAVIGATEFORWARD = 0x1,
|
||||||
|
CSC_NAVIGATEBACK = 0x2
|
||||||
|
} CommandStateChangeConstants;
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME: Seems like MINGW does not have these, how to handle cleanly?
|
||||||
|
#define DISPID_NAVIGATECOMPLETE2 252
|
||||||
|
#define DISPID_NAVIGATEERROR 271
|
||||||
|
#define OLECMDID_OPTICAL_ZOOM 63
|
||||||
|
#define INET_E_ERROR_FIRST 0x800C0002L
|
||||||
|
#define INET_E_INVALID_URL 0x800C0002L
|
||||||
|
#define INET_E_NO_SESSION 0x800C0003L
|
||||||
|
#define INET_E_CANNOT_CONNECT 0x800C0004L
|
||||||
|
#define INET_E_RESOURCE_NOT_FOUND 0x800C0005L
|
||||||
|
#define INET_E_OBJECT_NOT_FOUND 0x800C0006L
|
||||||
|
#define INET_E_DATA_NOT_AVAILABLE 0x800C0007L
|
||||||
|
#define INET_E_DOWNLOAD_FAILURE 0x800C0008L
|
||||||
|
#define INET_E_AUTHENTICATION_REQUIRED 0x800C0009L
|
||||||
|
#define INET_E_NO_VALID_MEDIA 0x800C000AL
|
||||||
|
#define INET_E_CONNECTION_TIMEOUT 0x800C000BL
|
||||||
|
#define INET_E_INVALID_REQUEST 0x800C000CL
|
||||||
|
#define INET_E_UNKNOWN_PROTOCOL 0x800C000DL
|
||||||
|
#define INET_E_SECURITY_PROBLEM 0x800C000EL
|
||||||
|
#define INET_E_CANNOT_LOAD_DATA 0x800C000FL
|
||||||
|
#define INET_E_CANNOT_INSTANTIATE_OBJECT 0x800C0010L
|
||||||
|
#define INET_E_QUERYOPTION_UNKNOWN 0x800C0013L
|
||||||
|
#define INET_E_REDIRECT_FAILED 0x800C0014L
|
||||||
|
#define INET_E_REDIRECT_TO_DIR 0x800C0015L
|
||||||
|
#define INET_E_CANNOT_LOCK_REQUEST 0x800C0016L
|
||||||
|
#define INET_E_USE_EXTEND_BINDING 0x800C0017L
|
||||||
|
#define INET_E_TERMINATED_BIND 0x800C0018L
|
||||||
|
#define INET_E_INVALID_CERTIFICATE 0x800C0019L
|
||||||
|
#define INET_E_CODE_DOWNLOAD_DECLINED 0x800C0100L
|
||||||
|
#define INET_E_RESULT_DISPATCHED 0x800C0200L
|
||||||
|
#define INET_E_CANNOT_REPLACE_SFP_FILE 0x800C0300L
|
||||||
|
#define INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY 0x800C0500L
|
||||||
|
#define INET_E_CODE_INSTALL_SUPPRESSED 0x800C0400L
|
||||||
|
|
||||||
|
#define REFRESH_COMPLETELY 3
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxWebViewIE, wxControl)
|
||||||
|
EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent)
|
||||||
|
EVT_ERASE_BACKGROUND(wxWebViewIE::onEraseBg)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
bool wxWebViewIE::Create(wxWindow* parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& url,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if (!wxControl::Create(parent, id, pos, size, style,
|
||||||
|
wxDefaultValidator, name))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_webBrowser = NULL;
|
||||||
|
m_canNavigateBack = false;
|
||||||
|
m_canNavigateForward = false;
|
||||||
|
m_isBusy = false;
|
||||||
|
|
||||||
|
if (::CoCreateInstance(CLSID_WebBrowser, NULL,
|
||||||
|
CLSCTX_INPROC_SERVER, // CLSCTX_INPROC,
|
||||||
|
IID_IWebBrowser2 , (void**)&m_webBrowser) != 0)
|
||||||
|
{
|
||||||
|
wxLogError("Failed to initialize IE, CoCreateInstance returned an error");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ie.SetDispatchPtr(m_webBrowser); // wxAutomationObject will release itself
|
||||||
|
|
||||||
|
m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
|
||||||
|
m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
|
||||||
|
//m_webBrowser->put_Silent(VARIANT_FALSE);
|
||||||
|
|
||||||
|
m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser);
|
||||||
|
|
||||||
|
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
|
SetDoubleBuffered(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxWebViewIE::LoadUrl(const wxString& url)
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.CallMethod("Navigate", (BSTR) url.wc_str(),
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
// FIXME: why is out value null??
|
||||||
|
//(HRESULT)(out.GetLong()) == S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
|
||||||
|
{
|
||||||
|
LoadUrl("about:blank");
|
||||||
|
|
||||||
|
// Let the wx events generated for navigation events be processed, so
|
||||||
|
// that the underlying IE component completes its Document object.
|
||||||
|
// FIXME: calling wxYield is not elegant nor very reliable probably
|
||||||
|
wxYield();
|
||||||
|
|
||||||
|
wxVariant documentVariant = m_ie.GetProperty("Document");
|
||||||
|
void* documentPtr = documentVariant.GetVoidPtr();
|
||||||
|
|
||||||
|
wxASSERT (documentPtr != NULL);
|
||||||
|
|
||||||
|
// TODO: consider the "baseUrl" parameter if possible
|
||||||
|
// TODO: consider encoding
|
||||||
|
BSTR bstr = SysAllocString(html.wc_str());
|
||||||
|
|
||||||
|
// Creates a new one-dimensional array
|
||||||
|
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
|
||||||
|
if (psaStrings != NULL)
|
||||||
|
{
|
||||||
|
VARIANT *param;
|
||||||
|
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
|
||||||
|
param->vt = VT_BSTR;
|
||||||
|
param->bstrVal = bstr;
|
||||||
|
|
||||||
|
hr = SafeArrayUnaccessData(psaStrings);
|
||||||
|
|
||||||
|
IHTMLDocument2* document = (IHTMLDocument2*)documentPtr;
|
||||||
|
document->write(psaStrings);
|
||||||
|
|
||||||
|
// SafeArrayDestroy calls SysFreeString for each BSTR
|
||||||
|
SafeArrayDestroy(psaStrings);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxWebViewIE::GetPageSource()
|
||||||
|
{
|
||||||
|
wxVariant documentVariant = m_ie.GetProperty("Document");
|
||||||
|
void* documentPtr = documentVariant.GetVoidPtr();
|
||||||
|
|
||||||
|
if (documentPtr == NULL)
|
||||||
|
{
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
IHTMLDocument2* document = (IHTMLDocument2*)documentPtr;
|
||||||
|
|
||||||
|
IHTMLElement *bodyTag = NULL;
|
||||||
|
IHTMLElement *htmlTag = NULL;
|
||||||
|
document->get_body(&bodyTag);
|
||||||
|
wxASSERT(bodyTag != NULL);
|
||||||
|
|
||||||
|
document->Release();
|
||||||
|
bodyTag->get_parentElement(&htmlTag);
|
||||||
|
wxASSERT(htmlTag != NULL);
|
||||||
|
|
||||||
|
BSTR bstr;
|
||||||
|
htmlTag->get_outerHTML(&bstr);
|
||||||
|
|
||||||
|
bodyTag->Release();
|
||||||
|
htmlTag->Release();
|
||||||
|
|
||||||
|
//wxMessageBox(wxString(bstr));
|
||||||
|
|
||||||
|
// TODO: check encoding
|
||||||
|
return wxString(bstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME? retrieve OLECMDID_GETZOOMRANGE instead of hardcoding range 0-4
|
||||||
|
wxWebViewZoom wxWebViewIE::GetZoom()
|
||||||
|
{
|
||||||
|
const int zoom = GetIETextZoom();
|
||||||
|
|
||||||
|
switch (zoom)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return wxWEB_VIEW_ZOOM_TINY;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return wxWEB_VIEW_ZOOM_SMALL;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
return wxWEB_VIEW_ZOOM_MEDIUM;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
return wxWEB_VIEW_ZOOM_LARGE;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
return wxWEB_VIEW_ZOOM_LARGEST;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
wxASSERT(false);
|
||||||
|
return wxWEB_VIEW_ZOOM_MEDIUM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
|
||||||
|
{
|
||||||
|
// I know I could cast from enum to int since wxWebViewZoom happens to
|
||||||
|
// match with IE's zoom levels, but I don't like doing that, what if enum
|
||||||
|
// values change...
|
||||||
|
switch (zoom)
|
||||||
|
{
|
||||||
|
case wxWEB_VIEW_ZOOM_TINY:
|
||||||
|
SetIETextZoom(0);
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_SMALL:
|
||||||
|
SetIETextZoom(1);
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_MEDIUM:
|
||||||
|
SetIETextZoom(2);
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGE:
|
||||||
|
SetIETextZoom(3);
|
||||||
|
break;
|
||||||
|
case wxWEB_VIEW_ZOOM_LARGEST:
|
||||||
|
SetIETextZoom(4);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
wxASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::SetIETextZoom(int level)
|
||||||
|
{
|
||||||
|
VARIANT zoomVariant;
|
||||||
|
VariantInit (&zoomVariant);
|
||||||
|
V_VT(&zoomVariant) = VT_I4;
|
||||||
|
V_I4(&zoomVariant) = level;
|
||||||
|
|
||||||
|
HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM,
|
||||||
|
OLECMDEXECOPT_DONTPROMPTUSER,
|
||||||
|
&zoomVariant, NULL);
|
||||||
|
wxASSERT (result == S_OK);
|
||||||
|
|
||||||
|
VariantClear (&zoomVariant);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxWebViewIE::GetIETextZoom()
|
||||||
|
{
|
||||||
|
VARIANT zoomVariant;
|
||||||
|
VariantInit (&zoomVariant);
|
||||||
|
V_VT(&zoomVariant) = VT_I4;
|
||||||
|
V_I4(&zoomVariant) = 4;
|
||||||
|
|
||||||
|
HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM,
|
||||||
|
OLECMDEXECOPT_DONTPROMPTUSER,
|
||||||
|
NULL, &zoomVariant);
|
||||||
|
wxASSERT (result == S_OK);
|
||||||
|
|
||||||
|
int zoom = V_I4(&zoomVariant);
|
||||||
|
// wxMessageBox(wxString::Format("Zoom : %i", zoom));
|
||||||
|
VariantClear (&zoomVariant);
|
||||||
|
|
||||||
|
return zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::SetIEOpticalZoom(float zoom)
|
||||||
|
{
|
||||||
|
// TODO: add support for optical zoom (IE7+ only)
|
||||||
|
|
||||||
|
// TODO: get range from OLECMDID_OPTICAL_GETZOOMRANGE instead of hardcoding?
|
||||||
|
wxASSERT(zoom >= 10.0f);
|
||||||
|
wxASSERT(zoom <= 1000.0f);
|
||||||
|
|
||||||
|
VARIANT zoomVariant;
|
||||||
|
VariantInit (&zoomVariant);
|
||||||
|
V_VT(&zoomVariant) = VT_I4;
|
||||||
|
V_I4(&zoomVariant) = (zoom * 100.0f);
|
||||||
|
|
||||||
|
HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM,
|
||||||
|
OLECMDEXECOPT_DODEFAULT,
|
||||||
|
&zoomVariant,
|
||||||
|
NULL);
|
||||||
|
wxASSERT (result == S_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
float wxWebViewIE::GetIEOpticalZoom()
|
||||||
|
{
|
||||||
|
// TODO: add support for optical zoom (IE7+ only)
|
||||||
|
|
||||||
|
VARIANT zoomVariant;
|
||||||
|
VariantInit (&zoomVariant);
|
||||||
|
V_VT(&zoomVariant) = VT_I4;
|
||||||
|
V_I4(&zoomVariant) = -1;
|
||||||
|
|
||||||
|
HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM,
|
||||||
|
OLECMDEXECOPT_DODEFAULT, NULL,
|
||||||
|
&zoomVariant);
|
||||||
|
wxASSERT (result == S_OK);
|
||||||
|
|
||||||
|
const int zoom = V_I4(&zoomVariant);
|
||||||
|
VariantClear (&zoomVariant);
|
||||||
|
|
||||||
|
return zoom / 100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::SetZoomType(wxWebViewZoomType)
|
||||||
|
{
|
||||||
|
// TODO: add support for optical zoom (IE7+ only)
|
||||||
|
wxASSERT(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWebViewZoomType wxWebViewIE::GetZoomType() const
|
||||||
|
{
|
||||||
|
// TODO: add support for optical zoom (IE7+ only)
|
||||||
|
return wxWEB_VIEW_ZOOM_TYPE_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWebViewIE::CanSetZoomType(wxWebViewZoomType) const
|
||||||
|
{
|
||||||
|
// both are supported
|
||||||
|
// TODO: IE6 only supports text zoom, check if it's IE6 first
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::Print()
|
||||||
|
{
|
||||||
|
m_webBrowser->ExecWB(OLECMDID_PRINTPREVIEW,
|
||||||
|
OLECMDEXECOPT_DODEFAULT, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::GoBack()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.CallMethod("GoBack");
|
||||||
|
|
||||||
|
// FIXME: why is out value null??
|
||||||
|
//return (HRESULT)(out.GetLong()) == S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::GoForward()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.CallMethod("GoForward");
|
||||||
|
|
||||||
|
// FIXME: why is out value null??
|
||||||
|
//return (HRESULT)(out.GetLong()) == S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::Stop()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.CallMethod("Stop");
|
||||||
|
|
||||||
|
// FIXME: why is out value null??
|
||||||
|
//return (HRESULT)(out.GetLong()) == S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxWebViewIE::Reload(wxWebViewReloadFlags flags)
|
||||||
|
{
|
||||||
|
wxVariant out;
|
||||||
|
|
||||||
|
if (flags & wxWEB_VIEW_RELOAD_NO_CACHE)
|
||||||
|
{
|
||||||
|
VARIANTARG level;
|
||||||
|
level.vt = VT_I2;
|
||||||
|
level.iVal = 3;
|
||||||
|
out = m_ie.CallMethod("Refresh2", &level);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out = m_ie.CallMethod("Refresh");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out.GetType() != "null")
|
||||||
|
{
|
||||||
|
wxMessageBox("Non-null return message : " + out.GetType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWebViewIE::IsOfflineMode()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.GetProperty("Offline");
|
||||||
|
|
||||||
|
wxASSERT(out.GetType() == "bool");
|
||||||
|
|
||||||
|
return out.GetBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::SetOfflineMode(bool offline)
|
||||||
|
{
|
||||||
|
// FIXME: the wxWidgets docs do not really document what the return
|
||||||
|
// parameter of PutProperty is
|
||||||
|
const bool success = m_ie.PutProperty("Offline", (offline ?
|
||||||
|
VARIANT_TRUE :
|
||||||
|
VARIANT_FALSE));
|
||||||
|
wxASSERT(success);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWebViewIE::IsBusy()
|
||||||
|
{
|
||||||
|
if (m_isBusy) return true;
|
||||||
|
|
||||||
|
wxVariant out = m_ie.GetProperty("Busy");
|
||||||
|
|
||||||
|
wxASSERT(out.GetType() == "bool");
|
||||||
|
|
||||||
|
return out.GetBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxWebViewIE::GetCurrentURL()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.GetProperty("LocationURL");
|
||||||
|
|
||||||
|
wxASSERT(out.GetType() == "string");
|
||||||
|
return out.GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxWebViewIE::GetCurrentTitle()
|
||||||
|
{
|
||||||
|
wxVariant out = m_ie.GetProperty("LocationName");
|
||||||
|
|
||||||
|
wxASSERT(out.GetType() == "string");
|
||||||
|
return out.GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt)
|
||||||
|
{
|
||||||
|
if (m_webBrowser == NULL) return;
|
||||||
|
|
||||||
|
switch (evt.GetDispatchId())
|
||||||
|
{
|
||||||
|
case DISPID_BEFORENAVIGATE2:
|
||||||
|
{
|
||||||
|
m_isBusy = true;
|
||||||
|
|
||||||
|
wxString url = evt[1].GetString();
|
||||||
|
wxString target = evt[3].GetString();
|
||||||
|
|
||||||
|
wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING,
|
||||||
|
GetId(), url, target, true);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
HandleWindowEvent(event);
|
||||||
|
|
||||||
|
if (event.IsVetoed())
|
||||||
|
{
|
||||||
|
wxActiveXEventNativeMSW* nativeParams =
|
||||||
|
evt.GetNativeParameters();
|
||||||
|
*V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, either the navigation event has been cancelled
|
||||||
|
// and we're not busy, either it was accepted and IWebBrowser2's
|
||||||
|
// Busy property will be true; so we don't need our override
|
||||||
|
// flag anymore.
|
||||||
|
m_isBusy = false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_NAVIGATECOMPLETE2:
|
||||||
|
{
|
||||||
|
wxString url = evt[1].GetString();
|
||||||
|
// TODO: set target parameter if possible
|
||||||
|
wxString target = wxEmptyString;
|
||||||
|
wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
|
||||||
|
GetId(), url, target, false);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
HandleWindowEvent(event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_PROGRESSCHANGE:
|
||||||
|
{
|
||||||
|
// download progress
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_DOCUMENTCOMPLETE:
|
||||||
|
{
|
||||||
|
wxString url = evt[1].GetString();
|
||||||
|
// TODO: set target parameter if possible
|
||||||
|
wxString target = wxEmptyString;
|
||||||
|
wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(),
|
||||||
|
url, target, false);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
HandleWindowEvent(event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_STATUSTEXTCHANGE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_TITLECHANGE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_NAVIGATEERROR:
|
||||||
|
{
|
||||||
|
wxWebNavigationError errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
wxString errorCode = "?";
|
||||||
|
switch (evt[3].GetLong())
|
||||||
|
{
|
||||||
|
case INET_E_INVALID_URL: // (0x800C0002L or -2146697214)
|
||||||
|
errorCode = "INET_E_INVALID_URL";
|
||||||
|
errorType = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
case INET_E_NO_SESSION: // (0x800C0003L or -2146697213)
|
||||||
|
errorCode = "INET_E_NO_SESSION";
|
||||||
|
errorType = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
case INET_E_CANNOT_CONNECT: // (0x800C0004L or -2146697212)
|
||||||
|
errorCode = "INET_E_CANNOT_CONNECT";
|
||||||
|
errorType = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
case INET_E_RESOURCE_NOT_FOUND: // (0x800C0005L or -2146697211)
|
||||||
|
errorCode = "INET_E_RESOURCE_NOT_FOUND";
|
||||||
|
errorType = wxWEB_NAV_ERR_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
case INET_E_OBJECT_NOT_FOUND: // (0x800C0006L or -2146697210)
|
||||||
|
errorCode = "INET_E_OBJECT_NOT_FOUND";
|
||||||
|
errorType = wxWEB_NAV_ERR_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
case INET_E_DATA_NOT_AVAILABLE: // (0x800C0007L or -2146697209)
|
||||||
|
errorCode = "INET_E_DATA_NOT_AVAILABLE";
|
||||||
|
errorType = wxWEB_NAV_ERR_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
case INET_E_DOWNLOAD_FAILURE: // (0x800C0008L or -2146697208)
|
||||||
|
errorCode = "INET_E_DOWNLOAD_FAILURE";
|
||||||
|
errorType = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
case INET_E_AUTHENTICATION_REQUIRED: // (0x800C0009L or -2146697207)
|
||||||
|
errorCode = "INET_E_AUTHENTICATION_REQUIRED";
|
||||||
|
errorType = wxWEB_NAV_ERR_AUTH;
|
||||||
|
break;
|
||||||
|
case INET_E_NO_VALID_MEDIA: // (0x800C000AL or -2146697206)
|
||||||
|
errorCode = "INET_E_NO_VALID_MEDIA";
|
||||||
|
errorType = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
case INET_E_CONNECTION_TIMEOUT: // (0x800C000BL or -2146697205)
|
||||||
|
errorCode = "INET_E_CONNECTION_TIMEOUT";
|
||||||
|
errorType = wxWEB_NAV_ERR_CONNECTION;
|
||||||
|
break;
|
||||||
|
case INET_E_INVALID_REQUEST: // (0x800C000CL or -2146697204)
|
||||||
|
errorCode = "INET_E_INVALID_REQUEST";
|
||||||
|
errorType = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
case INET_E_UNKNOWN_PROTOCOL: // (0x800C000DL or -2146697203)
|
||||||
|
errorCode = "INET_E_UNKNOWN_PROTOCOL";
|
||||||
|
errorType = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
case INET_E_SECURITY_PROBLEM: // (0x800C000EL or -2146697202)
|
||||||
|
errorCode = "INET_E_SECURITY_PROBLEM";
|
||||||
|
errorType = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
case INET_E_CANNOT_LOAD_DATA: // (0x800C000FL or -2146697201)
|
||||||
|
errorCode = "INET_E_CANNOT_LOAD_DATA";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_CANNOT_INSTANTIATE_OBJECT:
|
||||||
|
// CoCreateInstance will return an error code if this happens,
|
||||||
|
// we'll handle this above.
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case INET_E_REDIRECT_FAILED: // (0x800C0014L or -2146697196)
|
||||||
|
errorCode = "INET_E_REDIRECT_FAILED";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_REDIRECT_TO_DIR: // (0x800C0015L or -2146697195)
|
||||||
|
errorCode = "INET_E_REDIRECT_TO_DIR";
|
||||||
|
errorType = wxWEB_NAV_ERR_REQUEST;
|
||||||
|
break;
|
||||||
|
case INET_E_CANNOT_LOCK_REQUEST: // (0x800C0016L or -2146697194)
|
||||||
|
errorCode = "INET_E_CANNOT_LOCK_REQUEST";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_USE_EXTEND_BINDING: // (0x800C0017L or -2146697193)
|
||||||
|
errorCode = "INET_E_USE_EXTEND_BINDING";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_TERMINATED_BIND: // (0x800C0018L or -2146697192)
|
||||||
|
errorCode = "INET_E_TERMINATED_BIND";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_INVALID_CERTIFICATE: // (0x800C0019L or -2146697191)
|
||||||
|
errorCode = "INET_E_INVALID_CERTIFICATE";
|
||||||
|
errorType = wxWEB_NAV_ERR_CERTIFICATE;
|
||||||
|
break;
|
||||||
|
case INET_E_CODE_DOWNLOAD_DECLINED: // (0x800C0100L or -2146696960)
|
||||||
|
errorCode = "INET_E_CODE_DOWNLOAD_DECLINED";
|
||||||
|
errorType = wxWEB_NAV_ERR_USER_CANCELLED;
|
||||||
|
break;
|
||||||
|
case INET_E_RESULT_DISPATCHED: // (0x800C0200L or -2146696704)
|
||||||
|
// cancel request cancelled...
|
||||||
|
errorCode = "INET_E_RESULT_DISPATCHED";
|
||||||
|
errorType = wxWEB_NAV_ERR_OTHER;
|
||||||
|
break;
|
||||||
|
case INET_E_CANNOT_REPLACE_SFP_FILE: // (0x800C0300L or -2146696448)
|
||||||
|
errorCode = "INET_E_CANNOT_REPLACE_SFP_FILE";
|
||||||
|
errorType = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
case INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY:
|
||||||
|
errorCode = "INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY";
|
||||||
|
errorType = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
case INET_E_CODE_INSTALL_SUPPRESSED:
|
||||||
|
errorCode = "INET_E_CODE_INSTALL_SUPPRESSED";
|
||||||
|
errorType = wxWEB_NAV_ERR_SECURITY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString url = evt[1].GetString();
|
||||||
|
wxString target = evt[2].GetString();
|
||||||
|
wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(),
|
||||||
|
url, target, false);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
event.SetInt(errorType);
|
||||||
|
event.SetString(errorCode);
|
||||||
|
HandleWindowEvent(event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DISPID_COMMANDSTATECHANGE:
|
||||||
|
{
|
||||||
|
long commandId = evt[0].GetLong();
|
||||||
|
bool enable = evt[1].GetBool();
|
||||||
|
if (commandId == CSC_NAVIGATEBACK)
|
||||||
|
{
|
||||||
|
m_canNavigateBack = enable;
|
||||||
|
}
|
||||||
|
else if (commandId == CSC_NAVIGATEFORWARD)
|
||||||
|
{
|
||||||
|
m_canNavigateForward = enable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
case DISPID_NEWWINDOW2:
|
||||||
|
//case DISPID_NEWWINDOW3:
|
||||||
|
{
|
||||||
|
wxLogMessage("DISPID_NEWWINDOW2\n");
|
||||||
|
wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters();
|
||||||
|
// Cancel the attempt to open a new window
|
||||||
|
*V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
evt.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
1208
src/osx/webview.mm
Normal file
1208
src/osx/webview.mm
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user