X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b00bb1626a28272e58728633f431c0c2996cd2d..7d56fb8fcdb469bdef549319b2d81ab4b02b5a67:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 756a9bea2c..f38207bed6 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". @@ -61,15 +62,48 @@ static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, L // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) - IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) -#endif // USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) // ============================================================================ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wxListEvent +// ---------------------------------------------------------------------------- + +void wxListEvent::CopyObject(wxObject& object_dest) const +{ + wxListEvent *obj = (wxListEvent *)&object_dest; + + wxNotifyEvent::CopyObject(object_dest); + + obj->m_code = m_code; + obj->m_itemIndex = m_itemIndex; + obj->m_oldItemIndex = m_oldItemIndex; + obj->m_col = m_col; + obj->m_cancelled = m_cancelled; + obj->m_pointDrag = m_pointDrag; + obj->m_item.m_mask = m_item.m_mask; + obj->m_item.m_itemId = m_item.m_itemId; + obj->m_item.m_col = m_item.m_col; + obj->m_item.m_state = m_item.m_state; + obj->m_item.m_stateMask = m_item.m_stateMask; + obj->m_item.m_text = m_item.m_text; + obj->m_item.m_image = m_item.m_image; + obj->m_item.m_data = m_item.m_data; + obj->m_item.m_format = m_item.m_format; + obj->m_item.m_width = m_item.m_width; + + if ( m_item.HasAttributes() ) + { + obj->m_item.SetTextColour(m_item.GetTextColour()); + obj->m_item.SetBackgroundColour(m_item.GetBackgroundColour()); + obj->m_item.SetFont(m_item.GetFont()); + } +} + // ---------------------------------------------------------------------------- // wxListCtrl construction // ---------------------------------------------------------------------------- @@ -93,7 +127,10 @@ bool wxListCtrl::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { +#if wxUSE_VALIDATORS SetValidator(validator); +#endif // wxUSE_VALIDATORS + SetName(name); int x = pos.x; @@ -202,7 +239,7 @@ void wxListCtrl::UpdateStyle() } } -wxListCtrl::~wxListCtrl() +void wxListCtrl::FreeAllAttrs(bool dontRecreate) { if ( m_hasAnyAttr ) { @@ -210,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 ) { @@ -372,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; } @@ -1258,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: { @@ -1384,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; @@ -1438,7 +1502,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) break; #endif // 0 -#ifdef NM_CUSTOMDRAW +#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; @@ -1519,7 +1583,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } } break; -#endif // NM_CUSTOMDRAW +#endif // _WIN32_IE >= 0x300 default: return wxControl::MSWOnNotify(idCtrl, lParam, result); @@ -1539,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; @@ -1558,8 +1630,6 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) *result = event.IsAllowed(); return TRUE; } - default: - break; } *result = !event.IsAllowed();