X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/227c63bac98c6f40f17f1ee188f22e7ac11f563d..18d2e17080a0bea4b85e0ad7223cfc6bcdab0e1e:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 15d33a55c1..f747968d69 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -40,7 +40,7 @@ #include "wx/msw/private.h" -#if defined(__GNUWIN32__) && !defined(wxUSE_NORLANDER_HEADERS) +#ifdef __GNUWIN32_OLD__ #include "wx/msw/gnuwin32/extra.h" #else #include @@ -239,7 +239,7 @@ void wxListCtrl::UpdateStyle() } } -wxListCtrl::~wxListCtrl() +void wxListCtrl::FreeAllAttrs(bool dontRecreate) { if ( m_hasAnyAttr ) { @@ -247,7 +247,20 @@ wxListCtrl::~wxListCtrl() { delete (wxListItemAttr *)node->Data(); } + + m_attrs.Destroy(); + if ( !dontRecreate ) + { + m_attrs.Create(wxKEY_INTEGER, 1000); // just as def ctor + } + + m_hasAnyAttr = FALSE; } +} + +wxListCtrl::~wxListCtrl() +{ + FreeAllAttrs(TRUE /* no need to recreate hash any more */); if ( m_textCtrl ) { @@ -409,14 +422,28 @@ long wxListCtrl::ConvertToMSWStyle(long& oldStyle, long style) const // accessors // ---------------------------------------------------------------------------- -// Sets the background colour (GetBackgroundColour already implicit in -// wxWindow class) +// Sets the foreground, i.e. text, colour +bool wxListCtrl::SetForegroundColour(const wxColour& col) +{ + if ( !wxWindow::SetForegroundColour(col) ) + return FALSE; + + ListView_SetTextColor(GetHwnd(), wxColourToRGB(col)); + + return TRUE; +} + +// Sets the background colour bool wxListCtrl::SetBackgroundColour(const wxColour& col) { if ( !wxWindow::SetBackgroundColour(col) ) return FALSE; - ListView_SetBkColor(GetHwnd(), PALETTERGB(col.Red(), col.Green(), col.Blue())); + // we set the same colour for both the "empty" background and the items + // background + COLORREF color = wxColourToRGB(col); + ListView_SetBkColor(GetHwnd(), color); + ListView_SetTextBkColor(GetHwnd(), color); return TRUE; } @@ -527,13 +554,13 @@ bool wxListCtrl::SetColumnWidth(int col, int width) // visible area of the list control (list or report view) // or the total number of items in the list control (icon // or small icon view) -int wxListCtrl::GetCountPerPage(void) const +int wxListCtrl::GetCountPerPage() const { return ListView_GetCountPerPage(GetHwnd()); } // Gets the edit control for editing labels. -wxTextCtrl* wxListCtrl::GetEditControl(void) const +wxTextCtrl* wxListCtrl::GetEditControl() const { return m_textCtrl; } @@ -760,7 +787,7 @@ bool wxListCtrl::SetItemPosition(long item, const wxPoint& pos) } // Gets the number of items in the list control -int wxListCtrl::GetItemCount(void) const +int wxListCtrl::GetItemCount() const { return ListView_GetItemCount(GetHwnd()); } @@ -774,13 +801,13 @@ int wxListCtrl::GetItemSpacing(bool isSmall) const } // Gets the number of selected items in the list control -int wxListCtrl::GetSelectedItemCount(void) const +int wxListCtrl::GetSelectedItemCount() const { return ListView_GetSelectedCount(GetHwnd()); } // Gets the text colour of the listview -wxColour wxListCtrl::GetTextColour(void) const +wxColour wxListCtrl::GetTextColour() const { COLORREF ref = ListView_GetTextColor(GetHwnd()); wxColour col(GetRValue(ref), GetGValue(ref), GetBValue(ref)); @@ -795,7 +822,7 @@ void wxListCtrl::SetTextColour(const wxColour& col) // Gets the index of the topmost visible item when in // list or report view -long wxListCtrl::GetTopItem(void) const +long wxListCtrl::GetTopItem() const { return (long) ListView_GetTopIndex(GetHwnd()); } @@ -1295,20 +1322,12 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } case LVN_DELETEALLITEMS: - // What's the sense of generating a wxWin event for this when - // it's absolutely not portable? - // This is perfectly portable, RR -#if 1 - eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS; + eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS; event.m_itemIndex = -1; -#endif // 1 - // return TRUE to suppress all additional LVN_DELETEITEM - // notifications - this makes deleting all items from a list ctrl - // much faster - *result = TRUE; + FreeAllAttrs(); - break; + break; case LVN_DELETEITEM: { @@ -1579,19 +1598,19 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( !GetEventHandler()->ProcessEvent(event) ) return FALSE; - if (eventType == wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS) - { - // No postprocessing, because we want *return to - // be TRUE so that no further DeleteItem events - // are sent, RR. - return TRUE; - } - // post processing // --------------- switch ( (int)nmhdr->code ) { + case LVN_DELETEALLITEMS: + // always return TRUE to suppress all additional LVN_DELETEITEM + // notifications - this makes deleting all items from a list ctrl + // much faster + *result = TRUE; + + return TRUE; + case LVN_GETDISPINFO: { LV_DISPINFO *info = (LV_DISPINFO *)lParam; @@ -1611,8 +1630,6 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) *result = event.IsAllowed(); return TRUE; } - default: - break; } *result = !event.IsAllowed();