From: Steve Lamerton Date: Sun, 10 Jul 2011 18:11:43 +0000 (+0000) Subject: Add support for retrieving the currently selected text. Implement on all backends... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c9355a3df6912d5faca668bb04494c64d4d3d4cb?ds=inline Add support for retrieving the currently selected text. Implement on all backends, document and unit test. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68220 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/gtk/webview_webkit.h b/include/wx/gtk/webview_webkit.h index 3e4e0f7c88..455007a3ec 100644 --- a/include/wx/gtk/webview_webkit.h +++ b/include/wx/gtk/webview_webkit.h @@ -142,6 +142,7 @@ public: virtual void DeleteSelection(); virtual bool HasSelection(); virtual void SelectAll(); + virtual wxString GetSelectedText(); /** FIXME: hack to work around signals being received too early */ bool m_ready; diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index 2a8163c111..75f2a583dd 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -101,6 +101,7 @@ public: virtual void SelectAll(); virtual bool HasSelection(); virtual void DeleteSelection(); + virtual wxString GetSelectedText(); // ---- IE-specific methods diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 37fbf22acc..0a3ec2d638 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -106,10 +106,9 @@ public: virtual void DeleteSelection(); virtual bool HasSelection() { return false }; virtual void SelectAll() {}; + virtual wxString GetSelectedText(); // ---- methods not from the parent (common) interface - wxString GetSelectedText(); - wxString RunScript(const wxString& javascript); bool CanGetPageSource(); diff --git a/include/wx/webview.h b/include/wx/webview.h index ea241d606c..06aa126ef3 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -287,11 +287,9 @@ public: virtual void SelectAll() = 0; virtual bool HasSelection() = 0; virtual void DeleteSelection() = 0; + virtual wxString GetSelectedText() = 0; // TODO: - // wxString GetSelection(); // maybe? - // void SetSelection(...); // maybe? - // void EnableJavascript(bool enabled); // maybe? // wxString RunScript(const wxString& javascript); // maybe? diff --git a/interface/wx/webview.h b/interface/wx/webview.h index 5927871edd..441dd6894a 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -392,11 +392,16 @@ public: correct HTML attribute. */ virtual void DeleteSelection() = 0; + + /** + Returns the currently selected text, if any. + */ + virtual wxString GetSelectedText() = 0; /** Returns @true if there is a current selection. */ - virtual bool HasSelection = 0; + virtual bool HasSelection() = 0; /** Selects the entire page. diff --git a/src/gtk/webview_webkit.cpp b/src/gtk/webview_webkit.cpp index dd9a375a75..96765cfd98 100644 --- a/src/gtk/webview_webkit.cpp +++ b/src/gtk/webview_webkit.cpp @@ -727,6 +727,21 @@ void wxWebViewWebKit::SelectAll() webkit_web_view_select_all(WEBKIT_WEB_VIEW(web_view)); } +wxString wxWebViewWebKit::GetSelectedText() +{ + WebKitDOMDocument* doc; + WebKitDOMDOMWindow* win; + WebKitDOMDOMSelection* sel; + WebKitDOMRange* range; + + doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); + win = webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc)); + sel = webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win)); + range = webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel), + 0, NULL); + return wxString(webkit_dom_range_get_text(WEBKIT_DOM_RANGE(range)), + wxConvUTF8); +} // static wxVisualAttributes diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 3e0ce6c5e2..0735858ff6 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -584,6 +584,35 @@ void wxWebViewIE::DeleteSelection() ExecCommand("Delete"); } +wxString wxWebViewIE::GetSelectedText() +{ + IHTMLDocument2* document = GetDocument(); + IHTMLSelectionObject* selection; + wxString selected; + HRESULT hr = document->get_selection(&selection); + if(SUCCEEDED(hr)) + { + IDispatch* disrange; + hr = selection->createRange(&disrange); + if(SUCCEEDED(hr)) + { + IHTMLTxtRange* range; + hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); + if(SUCCEEDED(hr)) + { + BSTR text; + range->get_text(&text); + selected = wxString(text); + range->Release(); + } + disrange->Release(); + } + selection->Release(); + } + document->Release(); + return selected; +} + bool wxWebViewIE::CanExecCommand(wxString command) { IHTMLDocument2* document = GetDocument(); diff --git a/tests/controls/webtest.cpp b/tests/controls/webtest.cpp index d4cd6f341a..d509c04a28 100644 --- a/tests/controls/webtest.cpp +++ b/tests/controls/webtest.cpp @@ -41,6 +41,7 @@ private: CPPUNIT_TEST( HistoryClear ); CPPUNIT_TEST( HistoryList ); CPPUNIT_TEST( Editable ); + CPPUNIT_TEST( Selection ); CPPUNIT_TEST_SUITE_END(); void Title(); @@ -50,6 +51,7 @@ private: void HistoryClear(); void HistoryList(); void Editable(); + void Selection(); void LoadUrl(const wxString& url, int times = 1); wxWebView* m_browser; @@ -181,4 +183,19 @@ void WebTestCase::Editable() CPPUNIT_ASSERT(!m_browser->IsEditable()); } +void WebTestCase::Selection() +{ + m_browser->SetPage("Some text", ""); + CPPUNIT_ASSERT(!m_browser->HasSelection()); + + m_browser->SelectAll(); + + CPPUNIT_ASSERT(m_browser->HasSelection()); + CPPUNIT_ASSERT_EQUAL("Some text", m_browser->GetSelectedText()); + + m_browser->DeleteSelection(); + + CPPUNIT_ASSERT(!m_browser->HasSelection()); +} + #endif //wxUSE_WEB