1. added abstract interface to wxHtmlWindow for use by wxHtmlWinParser and implemented it for wxHtmlListBox
2. used the above to implement clickable links support in wxHtmlListBox git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38701 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -39,6 +39,13 @@
|
||||
#include "wx/html/forcelnk.h"
|
||||
FORCE_WXHTML_MODULES()
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// small border always added to the cells:
|
||||
static const wxCoord CELL_BORDER = 2;
|
||||
|
||||
// ============================================================================
|
||||
// private classes
|
||||
// ============================================================================
|
||||
@@ -169,13 +176,14 @@ private:
|
||||
DECLARE_NO_COPY_CLASS(wxHtmlListBoxStyle)
|
||||
};
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
BEGIN_EVENT_TABLE(wxHtmlListBox, wxVListBox)
|
||||
EVT_SIZE(wxHtmlListBox::OnSize)
|
||||
EVT_MOTION(wxHtmlListBox::OnMouseMove)
|
||||
EVT_LEFT_DOWN(wxHtmlListBox::OnLeftDown)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// ============================================================================
|
||||
@@ -189,6 +197,26 @@ IMPLEMENT_ABSTRACT_CLASS(wxHtmlListBox, wxVListBox)
|
||||
// wxHtmlListBox creation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlListBox::wxHtmlListBox()
|
||||
: wxHtmlWindowMouseHelper(this)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
// normal constructor which calls Create() internally
|
||||
wxHtmlListBox::wxHtmlListBox(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size,
|
||||
long style,
|
||||
const wxString& name)
|
||||
: wxHtmlWindowMouseHelper(this)
|
||||
{
|
||||
Init();
|
||||
|
||||
(void)Create(parent, id, pos, size, style, name);
|
||||
}
|
||||
|
||||
void wxHtmlListBox::Init()
|
||||
{
|
||||
m_htmlParser = NULL;
|
||||
@@ -259,7 +287,7 @@ void wxHtmlListBox::CacheItem(size_t n) const
|
||||
{
|
||||
wxHtmlListBox *self = wxConstCast(this, wxHtmlListBox);
|
||||
|
||||
self->m_htmlParser = new wxHtmlWinParser;
|
||||
self->m_htmlParser = new wxHtmlWinParser(self);
|
||||
m_htmlParser->SetDC(new wxClientDC(self));
|
||||
m_htmlParser->SetFS(&self->m_filesystem);
|
||||
|
||||
@@ -271,6 +299,10 @@ void wxHtmlListBox::CacheItem(size_t n) const
|
||||
Parse(OnGetItemMarkup(n));
|
||||
wxCHECK_RET( cell, _T("wxHtmlParser::Parse() returned NULL?") );
|
||||
|
||||
// set the cell's ID to item's index so that CellCoordsToPhysical()
|
||||
// can quickly find the item:
|
||||
cell->SetId(wxString::Format(_T("%u"), n));
|
||||
|
||||
cell->Layout(GetClientSize().x - 2*GetMargins().x);
|
||||
|
||||
m_cache->Store(n, cell);
|
||||
@@ -341,7 +373,9 @@ void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
|
||||
// note that we can't stop drawing exactly at the window boundary as then
|
||||
// even the visible cells part could be not drawn, so always draw the
|
||||
// entire cell
|
||||
cell->Draw(dc, rect.x+2, rect.y+2, 0, INT_MAX, htmlRendInfo);
|
||||
cell->Draw(dc,
|
||||
rect.x + CELL_BORDER, rect.y + CELL_BORDER,
|
||||
0, INT_MAX, htmlRendInfo);
|
||||
}
|
||||
|
||||
wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const
|
||||
@@ -354,5 +388,147 @@ wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const
|
||||
return cell->GetHeight() + cell->GetDescent() + 4;
|
||||
}
|
||||
|
||||
#endif // wxUSE_HTML
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxHtmlListBox implementation of wxHtmlListBoxWinInterface
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxHtmlListBox::SetHTMLWindowTitle(const wxString& WXUNUSED(title))
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
void wxHtmlListBox::OnHTMLLinkClicked(const wxHtmlLinkInfo& link)
|
||||
{
|
||||
OnLinkClicked(GetItemForCell(link.GetHtmlCell()), link);
|
||||
}
|
||||
|
||||
wxHtmlOpeningStatus
|
||||
wxHtmlListBox::OnHTMLOpeningURL(wxHtmlURLType WXUNUSED(type),
|
||||
const wxString& WXUNUSED(url),
|
||||
wxString *WXUNUSED(redirect)) const
|
||||
{
|
||||
return wxHTML_OPEN;
|
||||
}
|
||||
|
||||
wxPoint wxHtmlListBox::HTMLCoordsToWindow(wxHtmlCell *cell,
|
||||
const wxPoint& pos) const
|
||||
{
|
||||
return CellCoordsToPhysical(pos, cell);
|
||||
}
|
||||
|
||||
wxWindow* wxHtmlListBox::GetHTMLWindow() { return this; }
|
||||
|
||||
wxColour wxHtmlListBox::GetHTMLBackgroundColour() const
|
||||
{
|
||||
return GetBackgroundColour();
|
||||
}
|
||||
|
||||
void wxHtmlListBox::SetHTMLBackgroundColour(const wxColour& WXUNUSED(clr))
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
void wxHtmlListBox::SetHTMLBackgroundImage(const wxBitmap& WXUNUSED(bmpBg))
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
void wxHtmlListBox::SetHTMLStatusText(const wxString& WXUNUSED(text))
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxHtmlListBox handling of HTML links
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxPoint wxHtmlListBox::GetRootCellCoords(size_t n) const
|
||||
{
|
||||
wxPoint pos(CELL_BORDER, CELL_BORDER);
|
||||
pos += GetMargins();
|
||||
pos.y += GetLinesHeight(GetFirstVisibleLine(), n);
|
||||
return pos;
|
||||
}
|
||||
|
||||
bool wxHtmlListBox::PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const
|
||||
{
|
||||
int n = HitTest(pos);
|
||||
if ( n == wxNOT_FOUND )
|
||||
return false;
|
||||
|
||||
// convert mouse coordinates to coords relative to item's wxHtmlCell:
|
||||
pos -= GetRootCellCoords(n);
|
||||
|
||||
CacheItem(n);
|
||||
cell = m_cache->Get(n);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t wxHtmlListBox::GetItemForCell(const wxHtmlCell *cell) const
|
||||
{
|
||||
wxCHECK_MSG( cell, 0, _T("no cell") );
|
||||
|
||||
cell = cell->GetRootCell();
|
||||
|
||||
wxCHECK_MSG( cell, 0, _T("no root cell") );
|
||||
|
||||
// the cell's ID contains item index, see CacheItem():
|
||||
unsigned long n;
|
||||
if ( !cell->GetId().ToULong(&n) )
|
||||
{
|
||||
wxFAIL_MSG( _T("unexpected root cell's ID") );
|
||||
return 0;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
wxPoint
|
||||
wxHtmlListBox::CellCoordsToPhysical(const wxPoint& pos, wxHtmlCell *cell) const
|
||||
{
|
||||
return pos + GetRootCellCoords(GetItemForCell(cell));
|
||||
}
|
||||
|
||||
void wxHtmlListBox::OnInternalIdle()
|
||||
{
|
||||
wxVListBox::OnInternalIdle();
|
||||
|
||||
if ( wxHtmlWindowMouseHelper::DidMouseMove() )
|
||||
{
|
||||
wxPoint pos = ScreenToClient(wxGetMousePosition());
|
||||
wxHtmlCell *cell;
|
||||
|
||||
if ( !PhysicalCoordsToCell(pos, cell) )
|
||||
return;
|
||||
|
||||
wxHtmlWindowMouseHelper::HandleIdle(cell, pos);
|
||||
}
|
||||
}
|
||||
|
||||
void wxHtmlListBox::OnMouseMove(wxMouseEvent& event)
|
||||
{
|
||||
wxHtmlWindowMouseHelper::HandleMouseMoved();
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void wxHtmlListBox::OnLeftDown(wxMouseEvent& event)
|
||||
{
|
||||
wxPoint pos = event.GetPosition();
|
||||
wxHtmlCell *cell;
|
||||
|
||||
if ( !PhysicalCoordsToCell(pos, cell) )
|
||||
{
|
||||
event.Skip();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !wxHtmlWindowMouseHelper::HandleMouseClick(cell, pos, event) )
|
||||
{
|
||||
// no link was clicked, so let the listbox code handle the click (e.g.
|
||||
// by selecting another item in the list):
|
||||
event.Skip();
|
||||
}
|
||||
}
|
||||
|
||||
#endif // wxUSE_HTML
|
||||
|
Reference in New Issue
Block a user