X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/289532452089421ddadbd4726a8469511a19ab76..cb6b81bc94108bcb0a702ac5fdaf4944fa7706a0:/src/html/htmlwin.cpp diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 058499e481..4410fa73c3 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -2,7 +2,6 @@ // Name: src/html/htmlwin.cpp // Purpose: wxHtmlWindow class for parsing & displaying HTML (implementation) // Author: Vaclav Slavik -// RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -43,9 +42,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxHtmlLinkEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxHtmlCellEvent, wxCommandEvent) -wxDEFINE_EVENT( wxEVT_COMMAND_HTML_CELL_CLICKED, wxHtmlCellEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_HTML_CELL_HOVER, wxHtmlCellEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_HTML_LINK_CLICKED, wxHtmlLinkEvent ); +wxDEFINE_EVENT( wxEVT_HTML_CELL_CLICKED, wxHtmlCellEvent ); +wxDEFINE_EVENT( wxEVT_HTML_CELL_HOVER, wxHtmlCellEvent ); +wxDEFINE_EVENT( wxEVT_HTML_LINK_CLICKED, wxHtmlLinkEvent ); #if wxUSE_CLIPBOARD @@ -206,7 +205,7 @@ void wxHtmlWindowMouseHelper::HandleIdle(wxHtmlCell *rootCell, wxCursor cur; if (cell) - cur = cell->GetMouseCursor(m_interface); + cur = cell->GetMouseCursorAt(m_interface, pos); else cur = m_interface->GetHTMLCursor( wxHtmlWindowInterface::HTMLCursor_Default); @@ -229,6 +228,11 @@ void wxHtmlWindowMouseHelper::HandleIdle(wxHtmlCell *rootCell, { if ( cell ) { + // A single cell can have different cursors for different positions, + // so update cursor for this case as well. + wxCursor cur = cell->GetMouseCursorAt(m_interface, pos); + m_interface->GetHTMLWindow()->SetCursor(cur); + OnCellMouseHover(cell, pos.x, pos.y); } } @@ -240,7 +244,7 @@ bool wxHtmlWindowMouseHelper::OnCellClicked(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& event) { - wxHtmlCellEvent ev(wxEVT_COMMAND_HTML_CELL_CLICKED, + wxHtmlCellEvent ev(wxEVT_HTML_CELL_CLICKED, m_interface->GetHTMLWindow()->GetId(), cell, wxPoint(x,y), event); @@ -261,7 +265,7 @@ void wxHtmlWindowMouseHelper::OnCellMouseHover(wxHtmlCell * cell, wxCoord x, wxCoord y) { - wxHtmlCellEvent ev(wxEVT_COMMAND_HTML_CELL_HOVER, + wxHtmlCellEvent ev(wxEVT_HTML_CELL_HOVER, m_interface->GetHTMLWindow()->GetId(), cell, wxPoint(x,y), wxMouseEvent()); m_interface->GetHTMLWindow()->GetEventHandler()->ProcessEvent(ev); @@ -1090,7 +1094,7 @@ void wxHtmlWindow::DoEraseBackground(wxDC& dc) if ( m_bmpBg.IsOk() ) { // draw the background bitmap tiling it over the entire window area - const wxSize sz = GetClientSize(); + const wxSize sz = GetVirtualSize(); const wxSize sizeBmp(m_bmpBg.GetWidth(), m_bmpBg.GetHeight()); for ( wxCoord x = 0; x < sz.x; x += sizeBmp.x ) { @@ -1102,6 +1106,19 @@ void wxHtmlWindow::DoEraseBackground(wxDC& dc) } } +void wxHtmlWindow::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) +{ + // We never get real erase background events as we changed our background + // style to wxBG_STYLE_PAINT in our ctor so the only time when we get here + // is when an artificial wxEraseEvent is generated by our own OnPaint() + // below. This handler only exists to stop the event from propagating + // downwards to wxWindow which may erase the background itself when it gets + // it in some ports (currently this happens in wxUniv), so we simply stop + // processing here and set a special flag allowing OnPaint() to see that + // the event hadn't been really processed. + m_isBgReallyErased = false; +} + void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dcPaint(this); @@ -1134,11 +1151,17 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) PrepareDC(*dc); - // erase the background: for compatibility, we must generate the event to - // allow the user-defined handlers to do it + // Erase the background: for compatibility, we must generate the event to + // allow the user-defined handlers to do it, hence this hack with sending + // an artificial wxEraseEvent to trigger the execution of such handlers. wxEraseEvent eraseEvent(GetId(), dc); eraseEvent.SetEventObject(this); - if ( !ProcessWindowEvent(eraseEvent) ) + + // Hack inside a hack: the background wasn't really erased if our own + // OnEraseBackground() was executed, so we need to check for the flag set + // by it whenever it's called. + m_isBgReallyErased = true; // Initially assume it wasn't. + if ( !ProcessWindowEvent(eraseEvent) || !m_isBgReallyErased ) { // erase background ourselves DoEraseBackground(*dc); @@ -1148,7 +1171,7 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) // draw the HTML window contents dc->SetMapMode(wxMM_TEXT); - dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); + dc->SetBackgroundMode(wxTRANSPARENT); dc->SetLayoutDirection(GetLayoutDirection()); wxHtmlRenderingInfo rinfo; @@ -1214,7 +1237,7 @@ void wxHtmlWindow::OnSize(wxSizeEvent& event) { m_selection->Set(m_selection->GetFromCell(), m_selection->GetToCell()); - m_selection->ClearPrivPos(); + m_selection->ClearFromToCharacterPos(); } Refresh(); @@ -1282,7 +1305,8 @@ void wxHtmlWindow::OnMouseUp(wxMouseEvent& event) #endif // wxUSE_CLIPBOARD wxPoint pos = CalcUnscrolledPosition(event.GetPosition()); - wxHtmlWindowMouseHelper::HandleMouseClick(m_Cell, pos, event); + if ( !wxHtmlWindowMouseHelper::HandleMouseClick(m_Cell, pos, event) ) + event.Skip(); } #if wxUSE_CLIPBOARD @@ -1415,7 +1439,7 @@ void wxHtmlWindow::OnInternalIdle() m_selection->Set(wxPoint(x,y), selcell, m_tmpSelFromPos, m_tmpSelFromCell); } - m_selection->ClearPrivPos(); + m_selection->ClearFromToCharacterPos(); Refresh(); } } @@ -1518,12 +1542,16 @@ void wxHtmlWindow::OnKeyUp(wxKeyEvent& event) if ( IsSelectionEnabled() && (event.GetKeyCode() == 'C' && event.CmdDown()) ) { - wxClipboardTextEvent evt(wxEVT_COMMAND_TEXT_COPY, GetId()); + wxClipboardTextEvent evt(wxEVT_TEXT_COPY, GetId()); evt.SetEventObject(this); GetEventHandler()->ProcessEvent(evt); } + else + { + event.Skip(); + } } void wxHtmlWindow::OnCopy(wxCommandEvent& WXUNUSED(event)) @@ -1576,7 +1604,7 @@ void wxHtmlWindow::SelectLine(const wxPoint& pos) { // We use following heuristic to find a "line": let the line be all // cells in same container as the cell under mouse cursor that are - // neither completely above nor completely bellow the clicked cell + // neither completely above nor completely below the clicked cell // (i.e. are likely to be words positioned on same line of text). int y1 = cell->GetAbsPos().y; @@ -1664,6 +1692,7 @@ BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow) EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp) EVT_MOTION(wxHtmlWindow::OnMouseMove) EVT_PAINT(wxHtmlWindow::OnPaint) + EVT_ERASE_BACKGROUND(wxHtmlWindow::OnEraseBackground) #if wxUSE_CLIPBOARD EVT_LEFT_DCLICK(wxHtmlWindow::OnDoubleClick) EVT_ENTER_WINDOW(wxHtmlWindow::OnMouseEnter)