]> git.saurik.com Git - wxWidgets.git/commitdiff
added support for background bitmap specified in background attribute of the HTML...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 13 Feb 2005 23:17:12 +0000 (23:17 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 13 Feb 2005 23:17:12 +0000 (23:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32021 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/html/htmlwin.h
src/html/htmlwin.cpp
src/html/m_layout.cpp

index 84b01f6e44fcbf4bbf67a50f7012ca02456e6f79..01a2089d0b19676943a55a52588c0fcee639f57a 100644 (file)
@@ -7,8 +7,8 @@ wxWidgets 2.5 Change Log - For more verbose changes, see the manual
 
 All:
 
-- wxEvent and its derivatives have their variable members nonpublic now.
-  Use the Get/Set accessors (Mart Raudsepp)
+- wxEvent and derived classes don't have public members any more, you must
+  use accessors methods now (Mart Raudsepp)
 - new classes for reading and writing ZIP files (M.J.Wetherell)
 - large files support for wxFFile (M.J.Wetherell)
 - classes in the manual are now cross-referenced (Zbigniew Zagórski)
@@ -57,6 +57,7 @@ All (GUI):
 
 - added wxMediaCtrl
 - added wxDatePickerCtrl
+- wxHtmlWindow now supports background images given in <body> tag
 - wxSplitterWindow now supports gravity parameter (Zbigniew Zagórski)
 - recursive wxSizer::GetItem returns item of given window, sizer or nth index
 - wxLayoutConstraints now use best size, not current size, for AsIs() condition
index fd0ea89b1a489994238ca5768fce5a7e0d6518b2..7ca29a31556b3f5b5c2d849b4017a29f63970f8f 100644 (file)
@@ -139,6 +139,10 @@ public:
     // Sets space between text and window borders.
     void SetBorders(int b) {m_Borders = b;}
 
+    // Sets the bitmap to use for background (currnetly it will be tiled,
+    // when/if we have CSS support we could add other possibilities...)
+    void SetBackgroundImage(const wxBitmap& bmpBg) { m_bmpBg = bmpBg; }
+
     // Saves custom settings into cfg config. it will use the path 'path'
     // if given, otherwise it will save info into currently selected path.
     // saved values : things set by SetFonts, SetBorders.
@@ -170,6 +174,7 @@ public:
     // Adds HTML processor to wxHtmlWindow class as whole:
     static void AddGlobalProcessor(wxHtmlProcessor *processor);
 
+
     // -- Callbacks --
 
     // Sets the title of the window
@@ -210,10 +215,7 @@ public:
 
     // Converts current page to text:
     wxString ToText();
-#endif
-
-    virtual void ApplyParentThemeBackground(const wxColour& WXUNUSED(bg))
-        { /* do nothing */ }
+#endif // wxUSE_CLIPBOARD
 
 protected:
     void Init();
@@ -323,6 +325,9 @@ private:
     // window content for double buffered rendering:
     wxBitmap *m_backBuffer;
 
+    // background image, may be invalid
+    wxBitmap m_bmpBg;
+
     // variables used when user is selecting text
     wxPoint     m_tmpSelFromPos;
     wxHtmlCell *m_tmpSelFromCell;
index 70e85f8ed947f60abaf0cecb7a9f0a318b3e096d..0dc11db54826a855e3533305c5cfe5f53fa3effa 100644 (file)
@@ -307,6 +307,7 @@ bool wxHtmlWindow::SetPage(const wxString& source)
     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)
@@ -850,11 +851,36 @@ void wxHtmlWindow::OnCellMouseHover(wxHtmlCell * WXUNUSED(cell),
 
 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() )
+    {
+        // we used to do nothing at all here but we do have to erase background
+        // now that we reuse it (instead of overwriting it) in OnPaint() below
+        event.Skip();
+
+        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))
index 0809130d4249d6fe9152498c07dd3a6ef8062096..2477eb76c67288ee1ee52e090be27b604da76147 100644 (file)
 
 #include "wx/wxprec.h"
 
-
 #include "wx/defs.h"
+
 #if wxUSE_HTML && wxUSE_STREAMS
+
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WXPRECOMP
 #endif
 
+#include "wx/image.h"
 
 #include "wx/html/forcelnk.h"
 #include "wx/html/m_templ.h"
@@ -330,6 +332,25 @@ TAG_HANDLER_BEGIN(BODY, "BODY")
         if (tag.GetParamAsColour(wxT("LINK"), &clr))
             m_WParser->SetLinkColor(clr);
 
+        if (tag.HasParam(wxT("BACKGROUND")))
+        {
+            wxFSFile *fileBgImage = m_WParser->OpenURL
+                                               (
+                                                wxHTML_URL_IMAGE,
+                                                tag.GetParam(wxT("BACKGROUND"))
+                                               );
+            if ( fileBgImage )
+            {
+                wxInputStream *is = fileBgImage->GetStream();
+                if ( is )
+                {
+                    wxImage image(*is);
+                    if ( image.Ok() )
+                        m_WParser->GetWindow()->SetBackgroundImage(image);
+                }
+            }
+        }
+
         if (tag.GetParamAsColour(wxT("BGCOLOR"), &clr))
         {
             m_WParser->GetContainer()->InsertCell(
@@ -337,6 +358,7 @@ TAG_HANDLER_BEGIN(BODY, "BODY")
             if (m_WParser->GetWindow() != NULL)
                 m_WParser->GetWindow()->SetBackgroundColour(clr);
         }
+
         return false;
     }