X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc55e31bdc7fbf6f1006f298ed8310e7972984e9..062dfc9a96dc9e796c53544f41ff92dc47f26e82:/src/generic/htmllbox.cpp diff --git a/src/generic/htmllbox.cpp b/src/generic/htmllbox.cpp index c70d7b85f4..af7666efe3 100644 --- a/src/generic/htmllbox.cpp +++ b/src/generic/htmllbox.cpp @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: generic/htmllbox.cpp +// Name: src/generic/htmllbox.cpp // Purpose: implementation of wxHtmlListBox // Author: Vadim Zeitlin // Modified by: // Created: 31.05.03 // RCS-ID: $Id$ // Copyright: (c) 2003 Vadim Zeitlin -// License: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -46,6 +46,9 @@ FORCE_WXHTML_MODULES() // small border always added to the cells: static const wxCoord CELL_BORDER = 2; +const char wxHtmlListBoxNameStr[] = "htmlListBox"; +const char wxSimpleHtmlListBoxNameStr[] = "simpleHtmlListBox"; + // ============================================================================ // private classes // ============================================================================ @@ -63,8 +66,7 @@ private: void InvalidateItem(size_t n) { m_items[n] = (size_t)-1; - delete m_cells[n]; - m_cells[n] = NULL; + wxDELETE(m_cells[n]); } public: @@ -162,18 +164,33 @@ public: virtual wxColour GetSelectedTextColour(const wxColour& colFg) { - return m_hlbox.GetSelectedTextColour(colFg); + // by default wxHtmlListBox doesn't implement GetSelectedTextColour() + // and returns wxNullColour from it, so use the default HTML colour for + // selection + wxColour col = m_hlbox.GetSelectedTextColour(colFg); + if ( !col.IsOk() ) + { + col = wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg); + } + + return col; } virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) { - return m_hlbox.GetSelectedTextBgColour(colBg); + wxColour col = m_hlbox.GetSelectedTextBgColour(colBg); + if ( !col.IsOk() ) + { + col = wxDefaultHtmlRenderingStyle::GetSelectedTextBgColour(colBg); + } + + return col; } private: const wxHtmlListBox& m_hlbox; - DECLARE_NO_COPY_CLASS(wxHtmlListBoxStyle) + wxDECLARE_NO_COPY_CLASS(wxHtmlListBoxStyle); }; // ---------------------------------------------------------------------------- @@ -251,10 +268,10 @@ wxHtmlListBox::~wxHtmlListBox() // wxHtmlListBox appearance // ---------------------------------------------------------------------------- -wxColour wxHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const +wxColour +wxHtmlListBox::GetSelectedTextColour(const wxColour& WXUNUSED(colFg)) const { - return m_htmlRendStyle-> - wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg); + return wxNullColour; } wxColour @@ -290,18 +307,21 @@ void wxHtmlListBox::CacheItem(size_t n) const self->m_htmlParser = new wxHtmlWinParser(self); m_htmlParser->SetDC(new wxClientDC(self)); m_htmlParser->SetFS(&self->m_filesystem); - +#if !wxUSE_UNICODE + if (GetFont().IsOk()) + m_htmlParser->SetInputEncoding(GetFont().GetEncoding()); +#endif // use system's default GUI font by default: m_htmlParser->SetStandardFonts(); } wxHtmlContainerCell *cell = (wxHtmlContainerCell *)m_htmlParser-> Parse(OnGetItemMarkup(n)); - wxCHECK_RET( cell, _T("wxHtmlParser::Parse() returned NULL?") ); + wxCHECK_RET( cell, wxT("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->SetId(wxString::Format(wxT("%lu"), (unsigned long)n)); cell->Layout(GetClientSize().x - 2*GetMargins().x); @@ -317,18 +337,18 @@ void wxHtmlListBox::OnSize(wxSizeEvent& event) event.Skip(); } -void wxHtmlListBox::RefreshLine(size_t line) +void wxHtmlListBox::RefreshRow(size_t line) { m_cache->InvalidateRange(line, line); - wxVListBox::RefreshLine(line); + wxVListBox::RefreshRow(line); } -void wxHtmlListBox::RefreshLines(size_t from, size_t to) +void wxHtmlListBox::RefreshRows(size_t from, size_t to) { m_cache->InvalidateRange(from, to); - wxVListBox::RefreshLines(from, to); + wxVListBox::RefreshRows(from, to); } void wxHtmlListBox::RefreshAll() @@ -350,25 +370,51 @@ void wxHtmlListBox::SetItemCount(size_t count) // wxHtmlListBox implementation of wxVListBox pure virtuals // ---------------------------------------------------------------------------- +void +wxHtmlListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const +{ + if ( IsSelected(n) ) + { + if ( DoDrawSolidBackground + ( + GetSelectedTextBgColour(GetBackgroundColour()), + dc, + rect, + n + ) ) + { + return; + } + //else: no custom selection background colour, use base class version + } + + wxVListBox::OnDrawBackground(dc, rect, n); +} + void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const { CacheItem(n); wxHtmlCell *cell = m_cache->Get(n); - wxCHECK_RET( cell, _T("this cell should be cached!") ); + wxCHECK_RET( cell, wxT("this cell should be cached!") ); wxHtmlRenderingInfo htmlRendInfo; - // draw the selected cell in selected state - if ( IsSelected(n) ) + // draw the selected cell in selected state ourselves if we're using custom + // colours (to test for this, check the callbacks by passing them any dummy + // (but valid, to avoid asserts) colour): + if ( IsSelected(n) && + (GetSelectedTextColour(*wxBLACK).IsOk() || + GetSelectedTextBgColour(*wxWHITE).IsOk()) ) { wxHtmlSelection htmlSel; htmlSel.Set(wxPoint(0,0), cell, wxPoint(INT_MAX, INT_MAX), cell); htmlRendInfo.SetSelection(&htmlSel); - if ( m_htmlRendStyle ) - htmlRendInfo.SetStyle(m_htmlRendStyle); + htmlRendInfo.SetStyle(m_htmlRendStyle); htmlRendInfo.GetState().SetSelectionState(wxHTML_SEL_IN); } + //else: normal item or selected item with default colours, its background + // was already taken care of in the base class // 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 @@ -383,7 +429,7 @@ wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const CacheItem(n); wxHtmlCell *cell = m_cache->Get(n); - wxCHECK_MSG( cell, 0, _T("this cell should be cached!") ); + wxCHECK_MSG( cell, 0, wxT("this cell should be cached!") ); return cell->GetHeight() + cell->GetDescent() + 4; } @@ -402,6 +448,13 @@ void wxHtmlListBox::OnHTMLLinkClicked(const wxHtmlLinkInfo& link) OnLinkClicked(GetItemForCell(link.GetHtmlCell()), link); } +void wxHtmlListBox::OnLinkClicked(size_t WXUNUSED(n), + const wxHtmlLinkInfo& link) +{ + wxHtmlLinkEvent event(GetId(), link); + GetEventHandler()->ProcessEvent(event); +} + wxHtmlOpeningStatus wxHtmlListBox::OnHTMLOpeningURL(wxHtmlURLType WXUNUSED(type), const wxString& WXUNUSED(url), @@ -438,6 +491,16 @@ void wxHtmlListBox::SetHTMLStatusText(const wxString& WXUNUSED(text)) // nothing to do } +wxCursor wxHtmlListBox::GetHTMLCursor(HTMLCursor type) const +{ + // we don't want to show text selection cursor in listboxes + if (type == HTMLCursor_Text) + return wxHtmlWindow::GetDefaultHTMLCursor(HTMLCursor_Default); + + // in all other cases, use the same cursor as wxHtmlWindow: + return wxHtmlWindow::GetDefaultHTMLCursor(type); +} + // ---------------------------------------------------------------------------- // wxHtmlListBox handling of HTML links // ---------------------------------------------------------------------------- @@ -446,13 +509,13 @@ wxPoint wxHtmlListBox::GetRootCellCoords(size_t n) const { wxPoint pos(CELL_BORDER, CELL_BORDER); pos += GetMargins(); - pos.y += GetLinesHeight(GetFirstVisibleLine(), n); + pos.y += GetRowsHeight(GetVisibleBegin(), n); return pos; } bool wxHtmlListBox::PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const { - int n = HitTest(pos); + int n = VirtualHitTest(pos.y); if ( n == wxNOT_FOUND ) return false; @@ -467,17 +530,17 @@ bool wxHtmlListBox::PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const size_t wxHtmlListBox::GetItemForCell(const wxHtmlCell *cell) const { - wxCHECK_MSG( cell, 0, _T("no cell") ); + wxCHECK_MSG( cell, 0, wxT("no cell") ); cell = cell->GetRootCell(); - wxCHECK_MSG( cell, 0, _T("no root cell") ); + wxCHECK_MSG( cell, 0, wxT("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") ); + wxFAIL_MSG( wxT("unexpected root cell's ID") ); return 0; } @@ -531,4 +594,131 @@ void wxHtmlListBox::OnLeftDown(wxMouseEvent& event) } } + +// ---------------------------------------------------------------------------- +// wxSimpleHtmlListBox +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxSimpleHtmlListBox, wxHtmlListBox) + + +bool wxSimpleHtmlListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + if (!wxHtmlListBox::Create(parent, id, pos, size, style, name)) + return false; + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif + + Append(n, choices); + + return true; +} + +bool wxSimpleHtmlListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + if (!wxHtmlListBox::Create(parent, id, pos, size, style, name)) + return false; + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif + + Append(choices); + + return true; +} + +wxSimpleHtmlListBox::~wxSimpleHtmlListBox() +{ + wxItemContainer::Clear(); +} + +void wxSimpleHtmlListBox::DoClear() +{ + wxASSERT(m_items.GetCount() == m_HTMLclientData.GetCount()); + + m_items.Clear(); + m_HTMLclientData.Clear(); + + UpdateCount(); +} + +void wxSimpleHtmlListBox::Clear() +{ + DoClear(); +} + +void wxSimpleHtmlListBox::DoDeleteOneItem(unsigned int n) +{ + m_items.RemoveAt(n); + + m_HTMLclientData.RemoveAt(n); + + UpdateCount(); +} + +int wxSimpleHtmlListBox::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) +{ + const unsigned int count = items.GetCount(); + + m_items.Insert(wxEmptyString, pos, count); + m_HTMLclientData.Insert(NULL, pos, count); + + for ( unsigned int i = 0; i < count; ++i, ++pos ) + { + m_items[pos] = items[i]; + AssignNewItemClientData(pos, clientData, i, type); + } + + UpdateCount(); + + return pos - 1; +} + +void wxSimpleHtmlListBox::SetString(unsigned int n, const wxString& s) +{ + wxCHECK_RET( IsValid(n), + wxT("invalid index in wxSimpleHtmlListBox::SetString") ); + + m_items[n]=s; + RefreshRow(n); +} + +wxString wxSimpleHtmlListBox::GetString(unsigned int n) const +{ + wxCHECK_MSG( IsValid(n), wxEmptyString, + wxT("invalid index in wxSimpleHtmlListBox::GetString") ); + + return m_items[n]; +} + +void wxSimpleHtmlListBox::UpdateCount() +{ + wxASSERT(m_items.GetCount() == m_HTMLclientData.GetCount()); + wxHtmlListBox::SetItemCount(m_items.GetCount()); + + // very small optimization: if you need to add lot of items to + // a wxSimpleHtmlListBox be sure to use the + // wxSimpleHtmlListBox::Append(const wxArrayString&) method instead! + if (!this->IsFrozen()) + RefreshAll(); +} + #endif // wxUSE_HTML