X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11b6a93b1e078fea5bf49ed9e6628a19849c11b3..18d2e17080a0bea4b85e0ad7223cfc6bcdab0e1e:/src/msw/listctrl.cpp?ds=sidebyside diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index b74816ce5b..f747968d69 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -19,6 +19,7 @@ #ifdef __GNUG__ #pragma implementation "listctrl.h" + #pragma implementation "listctrlbase.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -39,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 @@ -238,7 +239,7 @@ void wxListCtrl::UpdateStyle() } } -wxListCtrl::~wxListCtrl() +void wxListCtrl::FreeAllAttrs(bool dontRecreate) { if ( m_hasAnyAttr ) { @@ -246,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 ) { @@ -408,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; } @@ -526,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; } @@ -759,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()); } @@ -773,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)); @@ -794,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()); } @@ -1294,19 +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? -#if 0 eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS; event.m_itemIndex = -1; -#endif // 0 - // return TRUE to suppress all additional LVN_DELETEITEM - // notifications - this makes deleting all items from a list ctrl - // much faster - *result = TRUE; + FreeAllAttrs(); - return TRUE; + break; case LVN_DELETEITEM: { @@ -1420,9 +1441,16 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } // else translate it into wxEVT_COMMAND_LIST_ITEM_ACTIVATED event + // if it happened on an item (and not on empty place) { - eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED; NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam; + if ( hdr->iItem == -1 ) + { + // not on item + return FALSE; + } + + eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED; event.m_itemIndex = hdr->iItem; } break; @@ -1575,6 +1603,14 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) 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; @@ -1594,8 +1630,6 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) *result = event.IsAllowed(); return TRUE; } - default: - break; } *result = !event.IsAllowed();