X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e02c72fa45b840601743e11bc6550481a36fa437..37ed592f7106e4ba483baa6fba91a9c481048bbc:/src/generic/htmllbox.cpp diff --git a/src/generic/htmllbox.cpp b/src/generic/htmllbox.cpp index 22e2722cec..62abb07171 100644 --- a/src/generic/htmllbox.cpp +++ b/src/generic/htmllbox.cpp @@ -165,12 +165,27 @@ 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: @@ -254,10 +269,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 @@ -356,6 +371,27 @@ 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); @@ -365,6 +401,22 @@ void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const wxHtmlRenderingInfo htmlRendInfo; + // 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); + 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 // entire cell @@ -464,7 +516,7 @@ wxPoint wxHtmlListBox::GetRootCellCoords(size_t n) const bool wxHtmlListBox::PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const { - int n = HitTest(pos); + int n = VirtualHitTest(pos.y); if ( n == wxNOT_FOUND ) return false; @@ -562,19 +614,19 @@ bool wxSimpleHtmlListBox::Create(wxWindow *parent, wxWindowID id, #if wxUSE_VALIDATORS SetValidator(validator); #endif - for (int i=0; i<n; i++) - Append(choices[i]); + + 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) + 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; @@ -582,60 +634,59 @@ bool wxSimpleHtmlListBox::Create(wxWindow *parent, wxWindowID id, #if wxUSE_VALIDATORS SetValidator(validator); #endif + Append(choices); return true; } wxSimpleHtmlListBox::~wxSimpleHtmlListBox() +{ + wxItemContainer::Clear(); +} + +void wxSimpleHtmlListBox::DoClear() { wxASSERT(m_items.GetCount() == m_HTMLclientData.GetCount()); - if (HasClientObjectData()) - { - // clear the array of client data objects - for (size_t i=0; i<m_items.GetCount(); i++) - delete DoGetItemClientObject(i); - } m_items.Clear(); m_HTMLclientData.Clear(); + + UpdateCount(); } void wxSimpleHtmlListBox::Clear() { - m_items.Clear(); - m_HTMLclientData.Clear(); - UpdateCount(); + DoClear(); } -void wxSimpleHtmlListBox::Delete(unsigned int n) +void wxSimpleHtmlListBox::DoDeleteOneItem(unsigned int n) { m_items.RemoveAt(n); + m_HTMLclientData.RemoveAt(n); - UpdateCount(); -} -void wxSimpleHtmlListBox::Append(const wxArrayString& strings) -{ - // append all given items at once - WX_APPEND_ARRAY(m_items, strings); - m_HTMLclientData.Add(NULL, strings.GetCount()); UpdateCount(); } -int wxSimpleHtmlListBox::DoAppend(const wxString& item) +int wxSimpleHtmlListBox::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) { - m_items.Add(item); - m_HTMLclientData.Add(NULL); - UpdateCount(); - return GetCount()-1; -} + 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); + } -int wxSimpleHtmlListBox::DoInsert(const wxString& item, unsigned int pos) -{ - m_items.Insert(item, pos); - m_HTMLclientData.Insert(NULL, pos); UpdateCount(); + return pos; } @@ -644,7 +695,7 @@ void wxSimpleHtmlListBox::SetString(unsigned int n, const wxString& s) wxCHECK_RET( IsValid(n), wxT("invalid index in wxSimpleHtmlListBox::SetString") ); - m_items[n]=s; + m_items[n]=s; RefreshRow(n); }