]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmlctrl/webkit/webkit.mm
WinCE apparently should not have rectangle adjusted if using transparent pen
[wxWidgets.git] / src / html / htmlctrl / webkit / webkit.mm
index adb86342ff202e5147157df251482d51e1d43a64..0f0bbda20b7c20c9c1239fce0f6ada55a6a7d267 100755 (executable)
@@ -20,6 +20,8 @@
     #include "wx/wx.h"
 #endif
 
     #include "wx/wx.h"
 #endif
 
+#if wxUSE_WEBKIT
+
 #ifdef __WXCOCOA__
 #include "wx/cocoa/autorelease.h"
 #else
 #ifdef __WXCOCOA__
 #include "wx/cocoa/autorelease.h"
 #else
@@ -31,7 +33,6 @@
 
 #include "wx/html/webkit.h"
 #include "wx/notebook.h"
 
 #include "wx/html/webkit.h"
 #include "wx/notebook.h"
-//#include "wx/html/wklisten.h"
 
 
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
@@ -107,12 +108,12 @@ bool wxWebKitCtrl::Create(wxWindow *parent,
 
     m_currentURL = strURL;
     //m_pageTitle = _("Untitled Page");
 
     m_currentURL = strURL;
     //m_pageTitle = _("Untitled Page");
+
  //still needed for wxCocoa??
 /*
     int width, height;
     wxSize sizeInstance;
  //still needed for wxCocoa??
 /*
     int width, height;
     wxSize sizeInstance;
-    if (size.x == -1 || size.y == -1)
+    if (size.x == wxDefaultCoord || size.y == wxDefaultCoord)
     {
         m_parent->GetClientSize(&width, &height);
         sizeInstance.x = width;
     {
         m_parent->GetClientSize(&width, &height);
         sizeInstance.x = width;
@@ -123,12 +124,12 @@ bool wxWebKitCtrl::Create(wxWindow *parent,
         sizeInstance.x = size.x;
         sizeInstance.y = size.y;
     }
         sizeInstance.x = size.x;
         sizeInstance.y = size.y;
     }
-*/  
+*/
     // now create and attach WebKit view...
 #ifdef __WXCOCOA__
     wxControl::Create(parent, m_windowID, pos, sizeInstance, style , validator , name);
     SetSize(pos.x, pos.y, sizeInstance.x, sizeInstance.y);
     // now create and attach WebKit view...
 #ifdef __WXCOCOA__
     wxControl::Create(parent, m_windowID, pos, sizeInstance, style , validator , name);
     SetSize(pos.x, pos.y, sizeInstance.x, sizeInstance.y);
-    
+
     wxTopLevelWindowCocoa *topWin = wxDynamicCast(this, wxTopLevelWindowCocoa);
     NSWindow* nsWin = topWin->GetNSWindow();
     NSRect rect;
     wxTopLevelWindowCocoa *topWin = wxDynamicCast(this, wxTopLevelWindowCocoa);
     NSWindow* nsWin = topWin->GetNSWindow();
     NSRect rect;
@@ -144,20 +145,21 @@ bool wxWebKitCtrl::Create(wxWindow *parent,
     SetInitialFrameRect(pos,sizeInstance);
 #else
     m_macIsUserPane = false;
     SetInitialFrameRect(pos,sizeInstance);
 #else
     m_macIsUserPane = false;
+    m_peer = new wxMacControl(this);
     wxControl::Create(parent, m_windowID, pos, size, style , validator , name);
     WebInitForCarbon();
     wxControl::Create(parent, m_windowID, pos, size, style , validator , name);
     WebInitForCarbon();
-    HIWebViewCreate( (HIViewRef*) &m_macControl );
-    
-    m_webView = (WebView*) HIWebViewGetWebView( (HIViewRef) m_macControl );
+    HIWebViewCreate( m_peer->GetControlRefAddr() );
+
+    m_webView = (WebView*) HIWebViewGetWebView( m_peer->GetControlRef() );
     MacPostControlCreate(pos, size);
     MacPostControlCreate(pos, size);
-    
-    HIViewSetVisible( (HIViewRef) m_macControl, true );           
+    HIViewSetVisible( m_peer->GetControlRef(), true );
+    [m_webView setHidden:false];
 #endif
 
     // Register event listener interfaces
     MyFrameLoadMonitor* myFrameLoadMonitor = [[MyFrameLoadMonitor alloc] initWithWxWindow: (wxWindow*)this];
     [m_webView setFrameLoadDelegate:myFrameLoadMonitor];
 #endif
 
     // Register event listener interfaces
     MyFrameLoadMonitor* myFrameLoadMonitor = [[MyFrameLoadMonitor alloc] initWithWxWindow: (wxWindow*)this];
     [m_webView setFrameLoadDelegate:myFrameLoadMonitor];
-    
+
     LoadURL(m_currentURL);
     return true;
 }
     LoadURL(m_currentURL);
     return true;
 }
@@ -175,7 +177,7 @@ void wxWebKitCtrl::LoadURL(const wxString &url)
 {
     if( !m_webView )
         return;
 {
     if( !m_webView )
         return;
-        
+
     [[m_webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:wxNSStringWithWxString(url)]]];
 
     m_currentURL = url;
     [[m_webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:wxNSStringWithWxString(url)]]];
 
     m_currentURL = url;
@@ -184,70 +186,69 @@ void wxWebKitCtrl::LoadURL(const wxString &url)
 bool wxWebKitCtrl::CanGoBack(){
     if ( !m_webView )
         return false;
 bool wxWebKitCtrl::CanGoBack(){
     if ( !m_webView )
         return false;
-        
+
     return [m_webView canGoBack];
 }
 
 bool wxWebKitCtrl::CanGoForward(){
     if ( !m_webView )
         return false;
     return [m_webView canGoBack];
 }
 
 bool wxWebKitCtrl::CanGoForward(){
     if ( !m_webView )
         return false;
-        
+
     return [m_webView canGoForward];
 }
 
 bool wxWebKitCtrl::GoBack(){
     if ( !m_webView )
         return false;
     return [m_webView canGoForward];
 }
 
 bool wxWebKitCtrl::GoBack(){
     if ( !m_webView )
         return false;
-        
-    [m_webView goBack];
-    return true;
+
+    bool result = [(WebView*)m_webView goBack];
+    return result;
 }
 
 }
 
-bool wxWebKitCtrl::GoForward(){ 
+bool wxWebKitCtrl::GoForward(){
     if ( !m_webView )
         return false;
     if ( !m_webView )
         return false;
-        
-    [m_webView goForward];
-    return true;
+
+    bool result = [(WebView*)m_webView goForward];
+    return result;
 }
 
 }
 
-void wxWebKitCtrl::Reload(){ 
+void wxWebKitCtrl::Reload(){
     if ( !m_webView )
         return;
     if ( !m_webView )
         return;
-        
+
     [[m_webView mainFrame] reload];
 }
 
 void wxWebKitCtrl::Stop(){
     if ( !m_webView )
         return;
     [[m_webView mainFrame] reload];
 }
 
 void wxWebKitCtrl::Stop(){
     if ( !m_webView )
         return;
-        
+
     [[m_webView mainFrame] stopLoading];
 }
 
 bool wxWebKitCtrl::CanGetPageSource(){
     if ( !m_webView )
         return false;
     [[m_webView mainFrame] stopLoading];
 }
 
 bool wxWebKitCtrl::CanGetPageSource(){
     if ( !m_webView )
         return false;
-        
+
     WebDataSource* dataSource = [[m_webView mainFrame] dataSource];
     return ( [[dataSource representation] canProvideDocumentSource] );
 }
 
 wxString wxWebKitCtrl::GetPageSource(){
     WebDataSource* dataSource = [[m_webView mainFrame] dataSource];
     return ( [[dataSource representation] canProvideDocumentSource] );
 }
 
 wxString wxWebKitCtrl::GetPageSource(){
-    if ( !m_webView )
-        return wxT("");
-    
+
     if (CanGetPageSource()){
         WebDataSource* dataSource = [[m_webView mainFrame] dataSource];
         return wxStringWithNSString( [[dataSource representation] documentSource] );
     }
     if (CanGetPageSource()){
         WebDataSource* dataSource = [[m_webView mainFrame] dataSource];
         return wxStringWithNSString( [[dataSource representation] documentSource] );
     }
-    
+
+    return wxEmptyString;
 }
 
 void wxWebKitCtrl::SetPageSource(wxString& source, const wxString& baseUrl){
     if ( !m_webView )
         return;
 }
 
 void wxWebKitCtrl::SetPageSource(wxString& source, const wxString& baseUrl){
     if ( !m_webView )
         return;
-    
+
     if (CanGetPageSource()){
         [[m_webView mainFrame] loadHTMLString:(NSString*)wxNSStringWithWxString( source ) baseURL:[NSURL URLWithString:wxNSStringWithWxString( baseUrl )]];
     }
     if (CanGetPageSource()){
         [[m_webView mainFrame] loadHTMLString:(NSString*)wxNSStringWithWxString( source ) baseURL:[NSURL URLWithString:wxNSStringWithWxString( baseUrl )]];
     }
@@ -255,27 +256,65 @@ void wxWebKitCtrl::SetPageSource(wxString& source, const wxString& baseUrl){
 }
 
 void wxWebKitCtrl::OnSize(wxSizeEvent &event){
 }
 
 void wxWebKitCtrl::OnSize(wxSizeEvent &event){
+    // This is a nasty hack because WebKit seems to lose its position when it is embedded
+    // in a control that is not itself the content view for a TLW.
+
     wxWindow* parent = GetParent();
     wxWindow* parent = GetParent();
-    bool inNotebook = false;
-    int x, y; 
+    bool isParentTopLevel = true;
+    if (!parent->IsTopLevel())
+        isParentTopLevel = false;
+
+    int x = GetPosition().x;
+    // we must take into account the title bar size as well, which is 26 pixels
+    int y = GetPosition().y + 26;
+
+    NSRect bounds = [m_webView frame];
+    wxWindow* tlw = NULL;
+
     while(parent != NULL)
     {
     while(parent != NULL)
     {
-        if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) ){
-            NSRect bounds = [m_webView frame];
-            bounds.origin.x += parent->GetPosition().x;
-            bounds.origin.y += 18;
-            [m_webView setFrame:bounds];
-            break;
-            }
+        if (parent->IsTopLevel())
+            tlw = parent;
+
+        x += parent->GetPosition().x;
+        y += parent->GetPosition().y;
+
+        if ( parent->IsKindOf( CLASSINFO( wxNotebook ) )  ){
+            //manually account for the size the tabs take up
+            y += 14;
+        }
+
+        //if ( parent->GetClassInfo()->GetClassName() == wxT("wxSplitterWindow") ){
+        //    x += 3;
+        //}
+
         parent = parent->GetParent();
     }
         parent = parent->GetParent();
     }
-    
-    [m_webView display];
+
+    if (!isParentTopLevel){
+        if (tlw){
+            //x = tlw->GetSize().x - (GetSize().x + x);
+            y = tlw->GetSize().y - (GetSize().y + y);
+        }
+        NSRect bounds = [m_webView frame];
+        bounds.origin.x += x;
+        bounds.origin.y += y;
+        //leaving debug checks in until I know it works everywhere ;-)
+        //printf("Added to bounds x=%d, y=%d\n", x, y);
+        [m_webView setFrame:bounds];
+    }
+
+    //printf("Carbon position x=%d, y=%d\n", GetPosition().x, GetPosition().y);
+    if (IsShown())
+        [m_webView display];
     event.Skip();
 }
 
 void wxWebKitCtrl::MacVisibilityChanged(){
     event.Skip();
 }
 
 void wxWebKitCtrl::MacVisibilityChanged(){
-    bool isHidden = !IsControlVisible( (HIViewRef)m_macControl);
+    bool isHidden = !IsControlVisible( m_peer->GetControlRef());
+    if (!isHidden)
+        [m_webView display];
+
     [m_webView setHidden:isHidden];
 }
 
     [m_webView setHidden:isHidden];
 }
 
@@ -354,3 +393,5 @@ void wxWebKitCtrl::MacVisibilityChanged(){
     }
 }
 @end
     }
 }
 @end
+
+#endif //wxUSE_WEBKIT