X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f461f8a0597bc6e301e2eba376eac385990abc3..c00fed0ef4d70c9b45d9b8405f636d30eadb7ea6:/src/html/htmlwin.cpp diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 70e85f8ed9..fc42f4cb5a 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -7,12 +7,6 @@ // 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" @@ -141,10 +135,10 @@ private: //----------------------------------------------------------------------------- WX_DECLARE_OBJARRAY(wxHtmlHistoryItem, wxHtmlHistoryArray); -WX_DEFINE_OBJARRAY(wxHtmlHistoryArray); +WX_DEFINE_OBJARRAY(wxHtmlHistoryArray) WX_DECLARE_LIST(wxHtmlProcessor, wxHtmlProcessorList); -WX_DEFINE_LIST(wxHtmlProcessorList); +WX_DEFINE_LIST(wxHtmlProcessorList) //----------------------------------------------------------------------------- // wxHtmlWindow @@ -180,6 +174,8 @@ void wxHtmlWindow::Init() m_lastDoubleClick = 0; #endif // wxUSE_CLIPBOARD m_backBuffer = NULL; + m_eraseBgInOnPaint = false; + m_tmpSelFromCell = NULL; } bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id, @@ -239,37 +235,39 @@ 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; - m_Parser->SetFonts(normal_face, fixed_face, sizes); - // fonts changed => contents invalid, so reload the page: - SetPage(wxT("")); - if (!op.empty()) - LoadPage(op); + + // re-layout the page after changing fonts: + DoSetPage(*(m_Parser->GetSource())); } void wxHtmlWindow::SetStandardFonts(int size, const wxString& normal_face, const wxString& fixed_face) { - wxString op = m_OpenedPage; - m_Parser->SetStandardFonts(size, normal_face, fixed_face); - // fonts changed => contents invalid, so reload the page: - SetPage(wxT("")); - if (!op.empty()) - LoadPage(op); -} + // re-layout the page after changing fonts: + DoSetPage(*(m_Parser->GetSource())); +} bool wxHtmlWindow::SetPage(const wxString& source) +{ + m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString; + return DoSetPage(source); +} + +bool wxHtmlWindow::DoSetPage(const wxString& source) { wxString newsrc(source); 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) { @@ -307,7 +305,8 @@ bool wxHtmlWindow::SetPage(const wxString& source) wxClientDC *dc = new wxClientDC(this); dc->SetMapMode(wxMM_TEXT); SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF)); - m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString; + SetBackgroundImage(wxNullBitmap); + m_Parser->SetDC(dc); if (m_Cell) { @@ -326,7 +325,7 @@ bool wxHtmlWindow::SetPage(const wxString& source) bool wxHtmlWindow::AppendToPage(const wxString& source) { - return SetPage(*(GetParser()->GetSource()) + source); + return DoSetPage(*(GetParser()->GetSource()) + source); } bool wxHtmlWindow::LoadPage(const wxString& location) @@ -798,7 +797,7 @@ bool wxHtmlWindow::CopySelection(ClipboardType t) #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 @@ -820,6 +819,8 @@ bool wxHtmlWindow::CopySelection(ClipboardType t) return true; } } +#else + wxUnusedVar(t); #endif // wxUSE_CLIPBOARD return false; @@ -850,18 +851,45 @@ 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() ) + { + // 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); - if (m_tmpCanDrawLocks > 0 || m_Cell == NULL) return; + if (m_tmpCanDrawLocks > 0 || m_Cell == NULL) + return; int x, y; GetViewStart(&x, &y); @@ -873,13 +901,23 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) m_backBuffer = new wxBitmap(sz.x, sz.y); dcm.SelectObject(*m_backBuffer); - // 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); @@ -984,6 +1022,8 @@ void wxHtmlWindow::OnMouseDown(wxMouseEvent& event) CaptureMouse(); } } +#else + wxUnusedVar(event); #endif // wxUSE_CLIPBOARD } @@ -1265,8 +1305,7 @@ void wxHtmlWindow::OnMouseLeave(wxMouseEvent& event) void wxHtmlWindow::OnKeyUp(wxKeyEvent& event) { - if ( IsSelectionEnabled() && - event.GetKeyCode() == 'C' && event.ControlDown() ) + if ( IsSelectionEnabled() && event.GetKeyCode() == 'C' && event.CmdDown() ) { (void) CopySelection(); }