Add the ability to enable / disable and check for the editable property of a renderin...
authorSteve Lamerton <steve.lamerton@gmail.com>
Fri, 8 Jul 2011 19:34:56 +0000 (19:34 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Fri, 8 Jul 2011 19:34:56 +0000 (19:34 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68193 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/webview_webkit.h
include/wx/msw/webview_ie.h
include/wx/osx/webview_webkit.h
include/wx/webview.h
interface/wx/webview.h
samples/web/web.cpp
src/gtk/webview_webkit.cpp
src/msw/webview_ie.cpp
src/osx/webview_webkit.mm
tests/controls/webtest.cpp

index 07d71e2310e5f53e533f61520ec93750d818c1dd..a52d8c06e4e293d852393bb29bc78453b856732f 100644 (file)
@@ -134,6 +134,10 @@ public:
     virtual void Undo();
     virtual void Redo();
 
+    //Editing functions
+    virtual void SetEditable(bool enable = true);
+    virtual bool IsEditable();
+
     /** FIXME: hack to work around signals being received too early */
     bool m_ready;
 
index 2907de503d92c57a94b0dbeae5ef25db57e1cf21..3ca29ebaa4a8c94acfcacc20c0af7a3b6e674b8e 100644 (file)
@@ -93,6 +93,10 @@ public:
     virtual void Undo();
     virtual void Redo();
 
+    //Editing functions
+    virtual void SetEditable(bool enable = true);
+    virtual bool IsEditable();
+
     // ---- IE-specific methods
 
     // FIXME: I seem to be able to access remote webpages even in offline mode...
index 5a068d9b8f61a37e80def74226d170006c1f834e..ef41abb7fbe22b6e65dddbc4112cf384ad2caa48 100644 (file)
@@ -97,6 +97,10 @@ public:
     virtual void Cut();
     virtual void Copy();
     virtual void Paste();
+    
+    //Editing functions
+    void  SetEditable(bool enable = true);
+    bool  IsEditable();
 
     // ---- methods not from the parent (common) interface
     wxString GetSelectedText();
@@ -108,9 +112,6 @@ public:
     void  SetScrollPos(int pos);
     int   GetScrollPos();
 
-    void  MakeEditable(bool enable = true);
-    bool  IsEditable();
-
     wxString GetSelection();
 
     bool  CanIncreaseTextSize();
index fe010713fa32ec9b48f9bf1ae1e930fc7941129e..8e938ea9ee99f85c943c12cc5193e9c903bd1bba 100644 (file)
@@ -281,13 +281,13 @@ public:
         SetPage(stream.GetString(), baseUrl);
     }
 
+    virtual void SetEditable(bool enable = true) = 0;
+    virtual bool IsEditable() = 0;
+
     // 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?
 
index 2e5e3dbdbb6bbae8218e20600cf6073a7a43755c..e28d43ba85c63a6d1383a82249c350b99baa06b3 100644 (file)
@@ -229,7 +229,12 @@ public:
     /**
         Returns whether the web control is currently busy (e.g. loading a page).
     */
-    virtual bool IsBusy() = 0;          
+    virtual bool IsBusy() = 0;
+
+    /**
+        Returns whether the web control is currently editable
+    */
+    virtual bool IsEditable() = 0;
 
     /**
         Load a web page from a URL
@@ -251,6 +256,13 @@ public:
         @param flags A bit array that may optionally contain reload options.
     */
     virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT) = 0;
+    
+    /**
+        Set the editable property of the web control. Enabling allows the user
+        to edit the page even if the @c contenteditable attribute is not set.
+        The exact capabilities vary with the backend being used.
+    */
+    virtual void SetEditable(bool enable = true) = 0;
 
     /**
         Set the displayed page source to the contents of the given string.
index 1130e5aff4b7b6c8e812c5ed90c1112f8ae33509..8ca51027606b7ec3d5317296a297a2e67cf695fa 100644 (file)
@@ -76,6 +76,7 @@ public:
     void OnPaste(wxCommandEvent& evt);
     void OnUndo(wxCommandEvent& evt);
     void OnRedo(wxCommandEvent& evt);
+    void OnMode(wxCommandEvent& evt);
 
 private:
     wxTextCtrl* m_url;
@@ -102,6 +103,7 @@ private:
     wxMenuItem* m_edit_paste;
     wxMenuItem* m_edit_undo;
     wxMenuItem* m_edit_redo;
+    wxMenuItem* m_edit_mode;
 
     wxTimer* m_timer;
     int m_animation_angle;
@@ -213,6 +215,8 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample")
     editmenu->AppendSeparator();
     m_edit_undo = editmenu->Append(wxID_ANY, _("Undo"));
     m_edit_redo = editmenu->Append(wxID_ANY, _("Redo"));
+    editmenu->AppendSeparator();
+    m_edit_mode = editmenu->AppendCheckItem(wxID_ANY, _("Edit Mode"));
 
     m_tools_menu->AppendSeparator();
     m_tools_menu->AppendSubMenu(editmenu, "Edit");
@@ -279,6 +283,8 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample")
             wxCommandEventHandler(WebFrame::OnUndo),  NULL, this );
     Connect(m_edit_redo->GetId(), wxEVT_COMMAND_MENU_SELECTED,
             wxCommandEventHandler(WebFrame::OnRedo),  NULL, this );
+    Connect(m_edit_mode->GetId(), wxEVT_COMMAND_MENU_SELECTED,
+            wxCommandEventHandler(WebFrame::OnMode),  NULL, this );
 }
 
 void WebFrame::OnAnimationTimer(wxTimerEvent& evt)
@@ -428,6 +434,12 @@ void WebFrame::OnRedo(wxCommandEvent& evt)
     m_browser->Redo();
 }
 
+void WebFrame::OnMode(wxCommandEvent& evt)
+{
+    m_browser->SetEditable(m_edit_mode->IsChecked());
+}
+
+
 /**
   * Callback invoked when there is a request to load a new page (for instance
   * when the user clicks a link)
index d4f0c20071e9849e209a13741b63a132900a53dd..9db8e7b24a3a2828afc07d58911cc2c55604236d 100644 (file)
@@ -702,6 +702,16 @@ bool wxWebViewWebKit::IsBusy()
      */
 }
 
+void wxWebViewWebKit::SetEditable(bool enable)
+{
+    webkit_web_view_set_editable(WEBKIT_WEB_VIEW(web_view), enable);
+}
+
+bool wxWebViewWebKit::IsEditable()
+{
+    return webkit_web_view_get_editable(WEBKIT_WEB_VIEW(web_view));
+}
+
 // static
 wxVisualAttributes
 wxWebViewWebKit::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
index 9451961d8b0effcd9ddb8429045ab06ece804aa2..2d04aba3e49be87481771f0cc8c6c25624e6935f 100644 (file)
@@ -544,6 +544,26 @@ 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"));
+}
+
+bool wxWebViewIE::IsEditable()
+{
+    IHTMLDocument2* document = GetDocument();
+    BSTR mode;
+    document->get_designMode(&mode);
+    if(wxString(mode) == "On")
+        return true;
+    else
+        return false;
+}
+
 bool wxWebViewIE::CanExecCommand(wxString command)
 {
     IHTMLDocument2* document = GetDocument();
index cfac4c777a3e45da1ce17ff0e2f2cfb36164a457..b33f48a68481c296b4951bd1d39c3dfa666e5b27 100644 (file)
@@ -660,7 +660,7 @@ void wxWebViewWebKit::Print()
     [op runOperation];
 }
 
-void wxWebViewWebKit::MakeEditable(bool enable)
+void wxWebViewWebKit::SetEditable(bool enable)
 {
     if ( !m_webView )
         return;
index 23663a2232aefb5cd64cd17e779acbf9eae3ce88..d4cd6f341a27424fd2eacb6d80488d0c17b1bacf 100644 (file)
@@ -40,6 +40,7 @@ private:
         CPPUNIT_TEST( HistoryEnable );
         CPPUNIT_TEST( HistoryClear );
         CPPUNIT_TEST( HistoryList );
+        CPPUNIT_TEST( Editable );
     CPPUNIT_TEST_SUITE_END();
 
     void Title();
@@ -48,6 +49,7 @@ private:
     void HistoryEnable();
     void HistoryClear();
     void HistoryList();
+    void Editable();
     void LoadUrl(const wxString& url, int times = 1);
 
     wxWebView* m_browser;
@@ -166,4 +168,17 @@ void WebTestCase::HistoryList()
     CPPUNIT_ASSERT_EQUAL(2, m_browser->GetBackwardHistory().size());
 }
 
+void WebTestCase::Editable()
+{
+    CPPUNIT_ASSERT(!m_browser->IsEditable());
+
+    m_browser->SetEditable(true);
+
+    CPPUNIT_ASSERT(m_browser->IsEditable());
+
+    m_browser->SetEditable(false);
+
+    CPPUNIT_ASSERT(!m_browser->IsEditable());
+}
+
 #endif //wxUSE_WEB