Implement text selection in wxWebViewEdge
Text selection/copy/paste etc implemented via javascript
This commit is contained in:
		@@ -111,6 +111,9 @@ public:
 | 
				
			|||||||
    virtual void EnableAccessToDevTools(bool enable = true) wxOVERRIDE;
 | 
					    virtual void EnableAccessToDevTools(bool enable = true) wxOVERRIDE;
 | 
				
			||||||
    virtual bool IsAccessToDevToolsEnabled() const wxOVERRIDE;
 | 
					    virtual bool IsAccessToDevToolsEnabled() const wxOVERRIDE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool QueryCommandEnabled(const wxString& command) const;
 | 
				
			||||||
 | 
					    void ExecCommand(const wxString& command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual bool RunScript(const wxString& javascript, wxString* output = NULL) wxOVERRIDE;
 | 
					    virtual bool RunScript(const wxString& javascript, wxString* output = NULL) wxOVERRIDE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual void RegisterHandler(wxSharedPtr<wxWebViewHandler> handler) wxOVERRIDE;
 | 
					    virtual void RegisterHandler(wxSharedPtr<wxWebViewHandler> handler) wxOVERRIDE;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -285,7 +285,7 @@ public:
 | 
				
			|||||||
    <a href="https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2">Edge WebView2</a>.
 | 
					    <a href="https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2">Edge WebView2</a>.
 | 
				
			||||||
    It is available for Windows 7 and newer.
 | 
					    It is available for Windows 7 and newer.
 | 
				
			||||||
    The following features are currently unsupported with this backend:
 | 
					    The following features are currently unsupported with this backend:
 | 
				
			||||||
    virtual filesystems, custom urls, text selection, find, source code.
 | 
					    virtual filesystems, custom urls, find, source code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This backend is not enabled by default, to build it follow these steps:
 | 
					    This backend is not enabled by default, to build it follow these steps:
 | 
				
			||||||
    - Visual Studio 2015, or newer, is required
 | 
					    - Visual Studio 2015, or newer, is required
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -598,57 +598,52 @@ void wxWebViewEdge::SetZoom(wxWebViewZoom zoom)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::CanCut() const
 | 
					bool wxWebViewEdge::CanCut() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    return QueryCommandEnabled("cut");
 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::CanCopy() const
 | 
					bool wxWebViewEdge::CanCopy() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    return QueryCommandEnabled("copy");
 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::CanPaste() const
 | 
					bool wxWebViewEdge::CanPaste() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    return QueryCommandEnabled("paste");
 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::Cut()
 | 
					void wxWebViewEdge::Cut()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("cut");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::Copy()
 | 
					void wxWebViewEdge::Copy()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("copy");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::Paste()
 | 
					void wxWebViewEdge::Paste()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("paste");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::CanUndo() const
 | 
					bool wxWebViewEdge::CanUndo() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    return QueryCommandEnabled("undo");
 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::CanRedo() const
 | 
					bool wxWebViewEdge::CanRedo() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    return QueryCommandEnabled("redo");
 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::Undo()
 | 
					void wxWebViewEdge::Undo()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("undo");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::Redo()
 | 
					void wxWebViewEdge::Redo()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("redo");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long wxWebViewEdge::Find(const wxString& WXUNUSED(text), int WXUNUSED(flags))
 | 
					long wxWebViewEdge::Find(const wxString& WXUNUSED(text), int WXUNUSED(flags))
 | 
				
			||||||
@@ -670,24 +665,26 @@ bool wxWebViewEdge::IsEditable() const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::SelectAll()
 | 
					void wxWebViewEdge::SelectAll()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    RunScript("window.getSelection().selectAllChildren(document);");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::HasSelection() const
 | 
					bool wxWebViewEdge::HasSelection() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    wxString rangeCountStr;
 | 
				
			||||||
    return false;
 | 
					    const_cast<wxWebViewEdge*>(this)->RunScript("window.getSelection().rangeCount;", &rangeCountStr);
 | 
				
			||||||
 | 
					    return rangeCountStr != "0";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::DeleteSelection()
 | 
					void wxWebViewEdge::DeleteSelection()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    ExecCommand("delete");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxString wxWebViewEdge::GetSelectedText() const
 | 
					wxString wxWebViewEdge::GetSelectedText() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    wxString selectedText;
 | 
				
			||||||
    return wxString();
 | 
					    const_cast<wxWebViewEdge*>(this)->RunScript("window.getSelection().toString();", &selectedText);
 | 
				
			||||||
 | 
					    return selectedText;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxString wxWebViewEdge::GetSelectedSource() const
 | 
					wxString wxWebViewEdge::GetSelectedSource() const
 | 
				
			||||||
@@ -698,7 +695,7 @@ wxString wxWebViewEdge::GetSelectedSource() const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::ClearSelection()
 | 
					void wxWebViewEdge::ClearSelection()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // TODO: not implemented in SDK (could probably be implemented by script)
 | 
					    RunScript("window.getSelection().empty();");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxWebViewEdge::EnableContextMenu(bool enable)
 | 
					void wxWebViewEdge::EnableContextMenu(bool enable)
 | 
				
			||||||
@@ -749,6 +746,19 @@ void* wxWebViewEdge::GetNativeBackend() const
 | 
				
			|||||||
    return m_impl->m_webView;
 | 
					    return m_impl->m_webView;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxWebViewEdge::QueryCommandEnabled(const wxString& command) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxString resultStr;
 | 
				
			||||||
 | 
					    const_cast<wxWebViewEdge*>(this)->RunScript(
 | 
				
			||||||
 | 
					        wxString::Format("function f(){ return document.queryCommandEnabled('%s'); } f();", command), &resultStr);
 | 
				
			||||||
 | 
					    return resultStr.IsSameAs("true", false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxWebViewEdge::ExecCommand(const wxString& command)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    RunScript(wxString::Format("document.execCommand('%s');", command));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output)
 | 
					bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    bool scriptExecuted = false;
 | 
					    bool scriptExecuted = false;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user