X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c115835b39194fd6c6852c96f5a9cccd2cc9aaa..959b1a338e3b7c0e237b53ef3d7c9b51f4063eb6:/src/html/htmlcell.cpp diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 114097e2fa..d56483bf6e 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -31,14 +31,6 @@ #include -//----------------------------------------------------------------------------- -// Global variables -//----------------------------------------------------------------------------- - -static wxCursor *gs_cursorLink = NULL; -static wxCursor *gs_cursorText = NULL; - - //----------------------------------------------------------------------------- // Helper classes //----------------------------------------------------------------------------- @@ -117,32 +109,115 @@ 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); + } } @@ -203,10 +278,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 +290,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 +616,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); + } } @@ -1150,13 +1234,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 +1567,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