+ document->get_nameProp(&title);
+ document->Release();
+ return wxString(title);
+}
+
+bool wxWebViewIE::CanCut() const
+{
+ return CanExecCommand("Cut");
+}
+
+bool wxWebViewIE::CanCopy() const
+{
+ return CanExecCommand("Copy");
+}
+bool wxWebViewIE::CanPaste() const
+{
+ return CanExecCommand("Paste");
+}
+
+void wxWebViewIE::Cut()
+{
+ ExecCommand("Cut");
+}
+
+void wxWebViewIE::Copy()
+{
+ ExecCommand("Copy");
+}
+
+void wxWebViewIE::Paste()
+{
+ ExecCommand("Paste");
+}
+
+bool wxWebViewIE::CanUndo() const
+{
+ return CanExecCommand("Undo");
+}
+bool wxWebViewIE::CanRedo() const
+{
+ return CanExecCommand("Redo");
+}
+
+void wxWebViewIE::Undo()
+{
+ ExecCommand("Undo");
+}
+
+void wxWebViewIE::Redo()
+{
+ ExecCommand("Redo");
+}
+
+void wxWebViewIE::SetEditable(bool enable)
+{
+ IHTMLDocument2* document = GetDocument();
+ if( enable )
+ document->put_designMode(SysAllocString(L"On"));
+ else
+ document->put_designMode(SysAllocString(L"Off"));
+
+ document->Release();
+}
+
+bool wxWebViewIE::IsEditable() const
+{
+ IHTMLDocument2* document = GetDocument();
+ BSTR mode;
+ document->get_designMode(&mode);
+ document->Release();
+ if(wxString(mode) == "On")
+ return true;
+ else
+ return false;
+}
+
+void wxWebViewIE::SelectAll()
+{
+ ExecCommand("SelectAll");
+}
+
+bool wxWebViewIE::HasSelection() const
+{
+ IHTMLDocument2* document = GetDocument();
+ IHTMLSelectionObject* selection;
+ wxString sel;
+ HRESULT hr = document->get_selection(&selection);
+ if(SUCCEEDED(hr))
+ {
+ BSTR type;
+ selection->get_type(&type);
+ sel = wxString(type);
+ selection->Release();
+ }
+ document->Release();
+ return sel != "None";
+}
+
+void wxWebViewIE::DeleteSelection()
+{
+ ExecCommand("Delete");
+}
+
+wxString wxWebViewIE::GetSelectedText() const
+{
+ 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;
+}
+
+wxString wxWebViewIE::GetSelectedSource() const
+{
+ 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_htmlText(&text);
+ selected = wxString(text);
+ range->Release();
+ }
+ disrange->Release();
+ }
+ selection->Release();
+ }
+ document->Release();
+ return selected;
+}
+
+void wxWebViewIE::ClearSelection()
+{
+ IHTMLDocument2* document = GetDocument();
+ IHTMLSelectionObject* selection;
+ wxString selected;
+ HRESULT hr = document->get_selection(&selection);
+ if(SUCCEEDED(hr))
+ {
+ selection->empty();
+ selection->Release();
+ }
+ document->Release();
+}
+
+wxString wxWebViewIE::GetPageText() const
+{
+ IHTMLDocument2* document = GetDocument();
+ wxString text;
+ IHTMLElement* body;
+ HRESULT hr = document->get_body(&body);
+ if(SUCCEEDED(hr))
+ {
+ BSTR out;
+ body->get_innerText(&out);
+ text = wxString(out);
+ body->Release();
+ }
+ document->Release();
+ return text;
+}
+
+void wxWebViewIE::RunScript(const wxString& javascript)
+{
+ IHTMLDocument2* document = GetDocument();
+ IHTMLWindow2* window;
+ wxString language = "javascript";
+ HRESULT hr = document->get_parentWindow(&window);
+ if(SUCCEEDED(hr))
+ {
+ VARIANT level;
+ VariantInit(&level);
+ V_VT(&level) = VT_EMPTY;
+ window->execScript(SysAllocString(javascript.wc_str()),
+ SysAllocString(language.wc_str()),
+ &level);
+ }
+ document->Release();
+}
+
+void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
+{
+ wxDynamicLibrary urlMon(wxT("urlmon.dll"));
+ if(urlMon.HasSymbol(wxT("CoInternetGetSession")))
+ {
+ typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD, wxIInternetSession**, DWORD);
+ wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon);
+
+ ClassFactory* cf = new ClassFactory(handler);
+ wxIInternetSession* session;
+ HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0);
+ if(FAILED(res))
+ {
+ wxFAIL_MSG("Could not retrive internet session");
+ }
+
+ HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol,
+ handler->GetName().wc_str(),
+ 0, NULL, 0);
+ if(FAILED(hr))
+ {
+ wxFAIL_MSG("Could not register protocol");
+ }
+ m_factories.push_back(cf);
+ }
+ else
+ {
+ wxFAIL_MSG("urlmon does not contain CoInternetGetSession");
+ }
+}
+
+bool wxWebViewIE::CanExecCommand(wxString command) const
+{
+ IHTMLDocument2* document = GetDocument();
+ VARIANT_BOOL enabled;
+
+ document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled);
+ document->Release();
+
+ return (enabled == VARIANT_TRUE);
+}
+
+void wxWebViewIE::ExecCommand(wxString command)
+{
+ IHTMLDocument2* document = GetDocument();
+ document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL);
+ document->Release();
+}
+
+IHTMLDocument2* wxWebViewIE::GetDocument() const
+{
+ wxVariant variant = m_ie.GetProperty("Document");
+ IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr();
+
+ wxASSERT(document);
+
+ return document;