]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmlwin.cpp
correcting CGImage handling to be always correctly initialized and freed on OSX build...
[wxWidgets.git] / src / html / htmlwin.cpp
index c89834231ecb937ef598ddf2c01be2aca7302d02..353f589c3aa1573b424e6821be66aec9cdd42e18 100644 (file)
@@ -7,12 +7,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "htmlwin.h"
-#pragma implementation "htmlproc.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #include "wx/defs.h"
 #include "wx/wxprec.h"
 
 #include "wx/defs.h"
@@ -141,10 +135,10 @@ private:
 //-----------------------------------------------------------------------------
 
 WX_DECLARE_OBJARRAY(wxHtmlHistoryItem, wxHtmlHistoryArray);
 //-----------------------------------------------------------------------------
 
 WX_DECLARE_OBJARRAY(wxHtmlHistoryItem, wxHtmlHistoryArray);
-WX_DEFINE_OBJARRAY(wxHtmlHistoryArray);
+WX_DEFINE_OBJARRAY(wxHtmlHistoryArray)
 
 WX_DECLARE_LIST(wxHtmlProcessor, wxHtmlProcessorList);
 
 WX_DECLARE_LIST(wxHtmlProcessor, wxHtmlProcessorList);
-WX_DEFINE_LIST(wxHtmlProcessorList);
+WX_DEFINE_LIST(wxHtmlProcessorList)
 
 //-----------------------------------------------------------------------------
 // wxHtmlWindow
 
 //-----------------------------------------------------------------------------
 // wxHtmlWindow
@@ -180,6 +174,8 @@ void wxHtmlWindow::Init()
     m_lastDoubleClick = 0;
 #endif // wxUSE_CLIPBOARD
     m_backBuffer = NULL;
     m_lastDoubleClick = 0;
 #endif // wxUSE_CLIPBOARD
     m_backBuffer = NULL;
+    m_eraseBgInOnPaint = false;
+    m_tmpSelFromCell = NULL;
 }
 
 bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
 }
 
 bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
@@ -239,7 +235,7 @@ void wxHtmlWindow::SetRelatedStatusBar(int bar)
 
 
 
 
 
 
-void wxHtmlWindow::SetFonts(wxString normal_face, wxString fixed_face, const int *sizes)
+void wxHtmlWindow::SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes)
 {
     wxString op = m_OpenedPage;
 
 {
     wxString op = m_OpenedPage;
 
@@ -270,6 +266,9 @@ bool wxHtmlWindow::SetPage(const wxString& source)
 
     wxDELETE(m_selection);
 
 
     wxDELETE(m_selection);
 
+    // we will soon delete all the cells, so clear pointers to them:
+    m_tmpSelFromCell = NULL;
+
     // pass HTML through registered processors:
     if (m_Processors || m_GlobalProcessors)
     {
     // pass HTML through registered processors:
     if (m_Processors || m_GlobalProcessors)
     {
@@ -307,6 +306,7 @@ bool wxHtmlWindow::SetPage(const wxString& source)
     wxClientDC *dc = new wxClientDC(this);
     dc->SetMapMode(wxMM_TEXT);
     SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF));
     wxClientDC *dc = new wxClientDC(this);
     dc->SetMapMode(wxMM_TEXT);
     SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF));
+    SetBackgroundImage(wxNullBitmap);
     m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString;
     m_Parser->SetDC(dc);
     if (m_Cell)
     m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString;
     m_Parser->SetDC(dc);
     if (m_Cell)
@@ -798,7 +798,7 @@ bool wxHtmlWindow::CopySelection(ClipboardType t)
 #if wxUSE_CLIPBOARD
     if ( m_selection )
     {
 #if wxUSE_CLIPBOARD
     if ( m_selection )
     {
-#ifdef __UNIX__
+#if defined(__UNIX__) && !defined(__WXMAC__)
         wxTheClipboard->UsePrimarySelection(t == Primary);
 #else // !__UNIX__
         // Primary selection exists only under X11, so don't do anything under
         wxTheClipboard->UsePrimarySelection(t == Primary);
 #else // !__UNIX__
         // Primary selection exists only under X11, so don't do anything under
@@ -820,6 +820,8 @@ bool wxHtmlWindow::CopySelection(ClipboardType t)
             return true;
         }
     }
             return true;
         }
     }
+#else
+    wxUnusedVar(t);
 #endif // wxUSE_CLIPBOARD
 
     return false;
 #endif // wxUSE_CLIPBOARD
 
     return false;
@@ -850,18 +852,45 @@ void wxHtmlWindow::OnCellMouseHover(wxHtmlCell * WXUNUSED(cell),
 
 void wxHtmlWindow::OnEraseBackground(wxEraseEvent& event)
 {
 
 void wxHtmlWindow::OnEraseBackground(wxEraseEvent& event)
 {
-    // we do have to erase background now that we reuse it (instead of
-    // overwriting it) in OnPaint() below, but maybe we should set some flag if
-    // we get here as this would mean that user code doesn't paint background
-    // itself and then we wouldn't have to copy old bits to dcm below...
-    event.Skip();
+    if ( !m_bmpBg.Ok() )
+    {
+        // don't even skip the event, if we don't have a bg bitmap we're going
+        // to overwrite background in OnPaint() below anyhow, so letting the
+        // default handling take place would only result in flicker, just set a
+        // flag to erase the background below
+        m_eraseBgInOnPaint = true;
+        return;
+    }
+
+    wxDC& dc = *event.GetDC();
+
+    // if the image is not fully opaque, we have to erase the background before
+    // drawing it, however avoid doing it for opaque images as this would just
+    // result in extra flicker without any other effect as background is
+    // completely covered anyhow
+    if ( m_bmpBg.GetMask() )
+    {
+        dc.SetBackground(wxBrush(GetBackgroundColour(), wxSOLID));
+        dc.Clear();
+    }
+
+    const wxSize sizeWin(GetClientSize());
+    const wxSize sizeBmp(m_bmpBg.GetWidth(), m_bmpBg.GetHeight());
+    for ( wxCoord x = 0; x < sizeWin.x; x += sizeBmp.x )
+    {
+        for ( wxCoord y = 0; y < sizeWin.y; y += sizeBmp.y )
+        {
+            dc.DrawBitmap(m_bmpBg, x, y, true /* use mask */);
+        }
+    }
 }
 
 void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
 
 }
 
 void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
 
-    if (m_tmpCanDrawLocks > 0 || m_Cell == NULL) return;
+    if (m_tmpCanDrawLocks > 0 || m_Cell == NULL)
+        return;
 
     int x, y;
     GetViewStart(&x, &y);
 
     int x, y;
     GetViewStart(&x, &y);
@@ -872,16 +901,26 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
     if ( !m_backBuffer )
         m_backBuffer = new wxBitmap(sz.x, sz.y);
     dcm.SelectObject(*m_backBuffer);
     if ( !m_backBuffer )
         m_backBuffer = new wxBitmap(sz.x, sz.y);
     dcm.SelectObject(*m_backBuffer);
-    PrepareDC(dcm);
 
 
-    // preserve the existing background, otherwise we'd erase anything the user
-    // code had drawn in its EVT_ERASE_BACKGROUND handler when we do the Blit
-    // back below
-    dcm.Blit(0, rect.GetTop(),
-             sz.x, rect.GetBottom() - rect.GetTop() + 1,
-             &dc,
-             0, rect.GetTop());
+    if ( m_eraseBgInOnPaint )
+    {
+        dcm.SetBackground(wxBrush(GetBackgroundColour(), wxSOLID));
+        dcm.Clear();
+
+        m_eraseBgInOnPaint = false;
+    }
+    else // someone has already erased the background, keep it
+    {
+        // preserve the existing background, otherwise we'd erase anything the
+        // user code had drawn in its EVT_ERASE_BACKGROUND handler when we do
+        // the Blit back below
+        dcm.Blit(0, rect.GetTop(),
+                 sz.x, rect.GetBottom() - rect.GetTop() + 1,
+                 &dc,
+                 0, rect.GetTop());
+    }
 
 
+    PrepareDC(dcm);
     dcm.SetMapMode(wxMM_TEXT);
     dcm.SetBackgroundMode(wxTRANSPARENT);
 
     dcm.SetMapMode(wxMM_TEXT);
     dcm.SetBackgroundMode(wxTRANSPARENT);
 
@@ -984,6 +1023,8 @@ void wxHtmlWindow::OnMouseDown(wxMouseEvent& event)
             CaptureMouse();
         }
     }
             CaptureMouse();
         }
     }
+#else
+    wxUnusedVar(event);
 #endif // wxUSE_CLIPBOARD
 }
 
 #endif // wxUSE_CLIPBOARD
 }