X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c115835b39194fd6c6852c96f5a9cccd2cc9aaa..80a779275ae04443c568dca919adb26cf6f5002c:/src/html/htmlcell.cpp diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 114097e2fa..95d81d6abc 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: htmlcell.cpp +// Name: src/html/htmlcell.cpp // Purpose: wxHtmlCell - basic element of HTML output // Author: Vaclav Slavik // RCS-ID: $Id$ @@ -9,36 +9,26 @@ #include "wx/wxprec.h" -#include "wx/defs.h" - -#if wxUSE_HTML && wxUSE_STREAMS - #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_HTML && wxUSE_STREAMS + #ifndef WXPRECOMP + #include "wx/dynarray.h" #include "wx/brush.h" #include "wx/colour.h" #include "wx/dc.h" + #include "wx/settings.h" + #include "wx/module.h" #endif #include "wx/html/htmlcell.h" #include "wx/html/htmlwin.h" -#include "wx/settings.h" -#include "wx/module.h" -#include "wx/dynarray.h" #include -//----------------------------------------------------------------------------- -// Global variables -//----------------------------------------------------------------------------- - -static wxCursor *gs_cursorLink = NULL; -static wxCursor *gs_cursorText = NULL; - - //----------------------------------------------------------------------------- // Helper classes //----------------------------------------------------------------------------- @@ -117,36 +107,120 @@ void wxHtmlCell::SetScriptMode(wxHtmlScriptMode mode, long previousBase) m_Descent += m_ScriptBaseline; } -void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y, - const wxMouseEvent& event) +#if WXWIN_COMPATIBILITY_2_6 + +struct wxHtmlCellOnMouseClickCompatHelper; + +static wxHtmlCellOnMouseClickCompatHelper *gs_helperOnMouseClick = NULL; + +// helper for routing calls to new ProcessMouseClick() method to deprecated +// OnMouseClick() method +struct wxHtmlCellOnMouseClickCompatHelper { - wxHtmlLinkInfo *lnk = GetLink(x, y); - if (lnk != NULL) + wxHtmlCellOnMouseClickCompatHelper(wxHtmlWindowInterface *window_, + const wxPoint& pos_, + const wxMouseEvent& event_) + : window(window_), pos(pos_), event(event_), retval(false) + { + } + + bool CallOnMouseClick(wxHtmlCell *cell) + { + wxHtmlCellOnMouseClickCompatHelper *oldHelper = gs_helperOnMouseClick; + gs_helperOnMouseClick = this; + cell->OnMouseClick + ( + window ? window->GetHTMLWindow() : NULL, + pos.x, pos.y, + event + ); + gs_helperOnMouseClick = oldHelper; + return retval; + } + + wxHtmlWindowInterface *window; + const wxPoint& pos; + const wxMouseEvent& event; + bool retval; +}; +#endif // WXWIN_COMPATIBILITY_2_6 + +bool wxHtmlCell::ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event) +{ + wxCHECK_MSG( window, false, _T("window interface must be provided") ); + +#if WXWIN_COMPATIBILITY_2_6 + // NB: this hack puts the body of ProcessMouseClick() into OnMouseClick() + // (for which it has to pass the arguments and return value via a + // helper variable because these two methods have different + // signatures), so that old code overriding OnMouseClick will continue + // to work + wxHtmlCellOnMouseClickCompatHelper compat(window, pos, event); + return compat.CallOnMouseClick(this); +} + +void wxHtmlCell::OnMouseClick(wxWindow *, int, int, const wxMouseEvent& event) +{ + wxCHECK_RET( gs_helperOnMouseClick, _T("unexpected call to OnMouseClick") ); + wxHtmlWindowInterface *window = gs_helperOnMouseClick->window; + const wxPoint& pos = gs_helperOnMouseClick->pos; +#endif // WXWIN_COMPATIBILITY_2_6 + + wxHtmlLinkInfo *lnk = GetLink(pos.x, pos.y); + bool retval = false; + + if (lnk) { wxHtmlLinkInfo lnk2(*lnk); lnk2.SetEvent(&event); lnk2.SetHtmlCell(this); - // note : this cast is legal because parent is *always* wxHtmlWindow - wxStaticCast(parent, wxHtmlWindow)->OnLinkClicked(lnk2); + window->OnHTMLLinkClicked(lnk2); + retval = true; } -} +#if WXWIN_COMPATIBILITY_2_6 + gs_helperOnMouseClick->retval = retval; +#else + return retval; +#endif // WXWIN_COMPATIBILITY_2_6 +} +#if WXWIN_COMPATIBILITY_2_6 wxCursor wxHtmlCell::GetCursor() const { + return wxNullCursor; +} +#endif // WXWIN_COMPATIBILITY_2_6 + +wxCursor wxHtmlCell::GetMouseCursor(wxHtmlWindowInterface *window) const +{ +#if WXWIN_COMPATIBILITY_2_6 + // NB: Older versions of wx used GetCursor() virtual method in place of + // GetMouseCursor(interface). This code ensures that user code that + // overriden GetCursor() continues to work. The trick is that the base + // wxHtmlCell::GetCursor() method simply returns wxNullCursor, so we + // know that GetCursor() was overriden iff it returns valid cursor. + wxCursor cur = GetCursor(); + if (cur.Ok()) + return cur; +#endif // WXWIN_COMPATIBILITY_2_6 + if ( GetLink() ) { - if ( !gs_cursorLink ) - gs_cursorLink = new wxCursor(wxCURSOR_HAND); - return *gs_cursorLink; + return window->GetHTMLCursor(wxHtmlWindowInterface::HTMLCursor_Link); } else - return *wxSTANDARD_CURSOR; + { + return window->GetHTMLCursor(wxHtmlWindowInterface::HTMLCursor_Default); + } } -bool wxHtmlCell::AdjustPagebreak(int *pagebreak, int* WXUNUSED(known_pagebreaks), int WXUNUSED(number_of_pages)) const +bool wxHtmlCell::AdjustPagebreak(int *pagebreak, + wxArrayInt& WXUNUSED(known_pagebreaks)) const { if ((!m_CanLiveOnPagebreak) && m_PosY < *pagebreak && m_PosY + m_Height > *pagebreak) @@ -203,10 +277,11 @@ wxHtmlCell *wxHtmlCell::FindCellByPos(wxCoord x, wxCoord y, } -wxPoint wxHtmlCell::GetAbsPos() const +wxPoint wxHtmlCell::GetAbsPos(wxHtmlCell *rootCell) const { wxPoint p(m_PosX, m_PosY); - for (wxHtmlCell *parent = m_Parent; parent; parent = parent->m_Parent) + for (wxHtmlCell *parent = m_Parent; parent && parent != rootCell; + parent = parent->m_Parent) { p.x += parent->m_PosX; p.y += parent->m_PosY; @@ -214,6 +289,14 @@ wxPoint wxHtmlCell::GetAbsPos() const return p; } +wxHtmlCell *wxHtmlCell::GetRootCell() const +{ + wxHtmlCell *c = wxConstCast(this, wxHtmlCell); + while ( c->m_Parent ) + c = c->m_Parent; + return c; +} + unsigned wxHtmlCell::GetDepth() const { unsigned d = 0; @@ -532,16 +615,16 @@ wxString wxHtmlWordCell::ConvertToText(wxHtmlSelection *s) const return m_Word; } -wxCursor wxHtmlWordCell::GetCursor() const +wxCursor wxHtmlWordCell::GetMouseCursor(wxHtmlWindowInterface *window) const { if ( !GetLink() ) { - if ( !gs_cursorText ) - gs_cursorText = new wxCursor(wxCURSOR_IBEAM); - return *gs_cursorText; + return window->GetHTMLCursor(wxHtmlWindowInterface::HTMLCursor_Text); } else - return wxHtmlCell::GetCursor(); + { + return wxHtmlCell::GetMouseCursor(window); + } } @@ -617,32 +700,28 @@ int wxHtmlContainerCell::GetIndentUnits(int ind) const } - -bool wxHtmlContainerCell::AdjustPagebreak(int *pagebreak, int* known_pagebreaks, int number_of_pages) const +bool wxHtmlContainerCell::AdjustPagebreak(int *pagebreak, + wxArrayInt& known_pagebreaks) const { if (!m_CanLiveOnPagebreak) - return wxHtmlCell::AdjustPagebreak(pagebreak, known_pagebreaks, number_of_pages); + return wxHtmlCell::AdjustPagebreak(pagebreak, known_pagebreaks); - else - { - wxHtmlCell *c = GetFirstChild(); - bool rt = false; - int pbrk = *pagebreak - m_PosY; + wxHtmlCell *c = GetFirstChild(); + bool rt = false; + int pbrk = *pagebreak - m_PosY; - while (c) - { - if (c->AdjustPagebreak(&pbrk, known_pagebreaks, number_of_pages)) - rt = true; - c = c->GetNext(); - } - if (rt) - *pagebreak = pbrk + m_PosY; - return rt; + while (c) + { + if (c->AdjustPagebreak(&pbrk, known_pagebreaks)) + rt = true; + c = c->GetNext(); } + if (rt) + *pagebreak = pbrk + m_PosY; + return rt; } - void wxHtmlContainerCell::Layout(int w) { wxHtmlCell::Layout(w); @@ -1065,7 +1144,7 @@ void wxHtmlContainerCell::SetWidthFloat(const wxHtmlTag& tag, double pixel_scale int wdi; wxString wd = tag.GetParam(wxT("WIDTH")); - if (wd[wd.Length()-1] == wxT('%')) + if (wd[wd.length()-1] == wxT('%')) { wxSscanf(wd.c_str(), wxT("%i%%"), &wdi); SetWidthFloat(wdi, wxHTML_UNITS_PERCENT); @@ -1150,13 +1229,34 @@ wxHtmlCell *wxHtmlContainerCell::FindCellByPos(wxCoord x, wxCoord y, } -void wxHtmlContainerCell::OnMouseClick(wxWindow *parent, int x, int y, const wxMouseEvent& event) +bool wxHtmlContainerCell::ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event) { - wxHtmlCell *cell = FindCellByPos(x, y); - if ( cell ) - cell->OnMouseClick(parent, x, y, event); +#if WXWIN_COMPATIBILITY_2_6 + wxHtmlCellOnMouseClickCompatHelper compat(window, pos, event); + return compat.CallOnMouseClick(this); } +void wxHtmlContainerCell::OnMouseClick(wxWindow*, + int, int, const wxMouseEvent& event) +{ + wxCHECK_RET( gs_helperOnMouseClick, _T("unexpected call to OnMouseClick") ); + wxHtmlWindowInterface *window = gs_helperOnMouseClick->window; + const wxPoint& pos = gs_helperOnMouseClick->pos; +#endif // WXWIN_COMPATIBILITY_2_6 + + bool retval = false; + wxHtmlCell *cell = FindCellByPos(pos.x, pos.y); + if ( cell ) + retval = cell->ProcessMouseClick(window, pos, event); + +#if WXWIN_COMPATIBILITY_2_6 + gs_helperOnMouseClick->retval = retval; +#else + return retval; +#endif // WXWIN_COMPATIBILITY_2_6 +} wxHtmlCell *wxHtmlContainerCell::GetFirstTerminal() const @@ -1462,29 +1562,4 @@ const wxHtmlCell* wxHtmlTerminalCellsInterator::operator++() return m_pos; } - - - - - - -//----------------------------------------------------------------------------- -// Cleanup -//----------------------------------------------------------------------------- - -class wxHtmlCellModule: public wxModule -{ -DECLARE_DYNAMIC_CLASS(wxHtmlCellModule) -public: - wxHtmlCellModule() : wxModule() {} - bool OnInit() { return true; } - void OnExit() - { - wxDELETE(gs_cursorLink); - wxDELETE(gs_cursorText); - } -}; - -IMPLEMENT_DYNAMIC_CLASS(wxHtmlCellModule, wxModule) - #endif