X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a9b4940a1f8eef8eb3e7ff65ed45f1daf14c2d9..21bd196564d8483879a57c40ec1eea64114f9bd4:/src/generic/htmllbox.cpp diff --git a/src/generic/htmllbox.cpp b/src/generic/htmllbox.cpp index a9d2f468c3..80d4442fb6 100644 --- a/src/generic/htmllbox.cpp +++ b/src/generic/htmllbox.cpp @@ -28,6 +28,8 @@ #include "wx/dcclient.h" #endif //WX_PRECOMP +#if wxUSE_HTML + #include "wx/htmllbox.h" #include "wx/html/htmlcell.h" @@ -49,6 +51,15 @@ FORCE_WXHTML_MODULES() // the items to avoid doing it anew each time an item must be drawn class wxHtmlListBoxCache { +private: + // invalidate a single item, used by Clear() and InvalidateRange() + void InvalidateItem(size_t n) + { + m_items[n] = (size_t)-1; + delete m_cells[n]; + m_cells[n] = NULL; + } + public: wxHtmlListBoxCache() { @@ -74,9 +85,7 @@ public: { for ( size_t n = 0; n < SIZE; n++ ) { - m_items[n] = (size_t)-1; - delete m_cells[n]; - m_cells[n] = NULL; + InvalidateItem(n); } } @@ -107,6 +116,18 @@ public: m_next = 0; } + // forget the cached value of the item(s) between the given ones (inclusive) + void InvalidateRange(size_t from, size_t to) + { + for ( size_t n = 0; n < SIZE; n++ ) + { + if ( m_items[n] >= from && m_items[n] <= to ) + { + InvalidateItem(n); + } + } + } + private: // the max number of the items we cache enum { SIZE = 50 }; @@ -144,6 +165,8 @@ public: private: const wxHtmlListBox& m_hlbox; + + DECLARE_NO_COPY_CLASS(wxHtmlListBoxStyle) }; @@ -159,6 +182,9 @@ END_EVENT_TABLE() // implementation // ============================================================================ +IMPLEMENT_ABSTRACT_CLASS(wxHtmlListBox, wxVListBox) + + // ---------------------------------------------------------------------------- // wxHtmlListBox creation // ---------------------------------------------------------------------------- @@ -235,6 +261,10 @@ void wxHtmlListBox::CacheItem(size_t n) const self->m_htmlParser = new wxHtmlWinParser; m_htmlParser->SetDC(new wxClientDC(self)); + m_htmlParser->SetFS(&self->m_filesystem); + + // use system's default GUI font by default: + m_htmlParser->SetStandardFonts(); } wxHtmlContainerCell *cell = (wxHtmlContainerCell *)m_htmlParser-> @@ -255,6 +285,20 @@ void wxHtmlListBox::OnSize(wxSizeEvent& event) event.Skip(); } +void wxHtmlListBox::RefreshLine(size_t line) +{ + m_cache->InvalidateRange(line, line); + + wxVListBox::RefreshLine(line); +} + +void wxHtmlListBox::RefreshLines(size_t from, size_t to) +{ + m_cache->InvalidateRange(from, to); + + wxVListBox::RefreshLines(from, to); +} + void wxHtmlListBox::RefreshAll() { m_cache->Clear(); @@ -262,6 +306,14 @@ void wxHtmlListBox::RefreshAll() wxVListBox::RefreshAll(); } +void wxHtmlListBox::SetItemCount(size_t count) +{ + // the items are going to change, forget the old ones + m_cache->Clear(); + + wxVListBox::SetItemCount(count); +} + // ---------------------------------------------------------------------------- // wxHtmlListBox implementation of wxVListBox pure virtuals // ---------------------------------------------------------------------------- @@ -279,7 +331,7 @@ void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const if ( IsSelected(n) ) { wxHtmlSelection htmlSel; - htmlSel.Set(wxPoint(0, 0), cell, wxPoint(INT_MAX, INT_MAX), cell); + htmlSel.Set(wxPoint(0,0), cell, wxPoint(INT_MAX, INT_MAX), cell); htmlRendInfo.SetSelection(&htmlSel); if ( m_htmlRendStyle ) htmlRendInfo.SetStyle(m_htmlRendStyle); @@ -289,7 +341,7 @@ 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, rect.y, 0, INT_MAX, htmlRendInfo); + cell->Draw(dc, rect.x+2, rect.y+2, 0, INT_MAX, htmlRendInfo); } wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const @@ -299,6 +351,8 @@ wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const wxHtmlCell *cell = m_cache->Get(n); wxCHECK_MSG( cell, 0, _T("this cell should be cached!") ); - return cell->GetHeight() + cell->GetDescent(); + return cell->GetHeight() + cell->GetDescent() + 4; } +#endif // wxUSE_HTML +