X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14090241ce378722f8fe50457ccc21a7579b6a5b..da00a8bb164dd1f58dd0bb211475538a375867b4:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 219ca955d7..78c257665e 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -79,7 +79,7 @@ static void wxConvertToMSWListCol(int col, const wxListItem& item, // We have to handle both fooW and fooA notifications in several cases // because of broken commctl.dll and/or unicows.dll. This class is used to -// convert LV_ITEMA and LV_ITEMW to LV_ITEM (which is either LV_ITEMA or +// convert LV_ITEMA and LV_ITEMW to LV_ITEM (which is either LV_ITEMA or // LV_ITEMW depending on wxUSE_UNICODE setting), so that it can be processed // by wxConvertToMSWListItem(). class wxLV_ITEM @@ -100,7 +100,7 @@ public: } else m_buf = NULL; - } + } private: wxMB2WXbuf *m_buf; @@ -115,7 +115,7 @@ private: } else m_buf = NULL; - } + } wxLV_ITEM(LV_ITEMA &item) : m_buf(NULL), m_item(&item) {} private: wxWC2WXbuf *m_buf; @@ -126,32 +126,32 @@ private: /////////////////////////////////////////////////////// // Problem: -// The MSW version had problems with SetTextColour() et -// al as the wxListItemAttr's were stored keyed on the -// item index. If a item was inserted anywhere but the end -// of the list the the text attributes (colour etc) for +// The MSW version had problems with SetTextColour() et +// al as the wxListItemAttr's were stored keyed on the +// item index. If a item was inserted anywhere but the end +// of the list the the text attributes (colour etc) for // the following items were out of sync. -// +// // Solution: -// Under MSW the only way to associate data with a List -// item independant of its position in the list is to -// store a pointer to it in its lParam attribute. However -// user programs are already using this (via the +// Under MSW the only way to associate data with a List +// item independant of its position in the list is to +// store a pointer to it in its lParam attribute. However +// user programs are already using this (via the // SetItemData() GetItemData() calls). -// -// However what we can do is store a pointer to a -// structure which contains the attributes we want *and* +// +// However what we can do is store a pointer to a +// structure which contains the attributes we want *and* // a lParam for the users data, e.g. -// +// // class wxListItemInternalData // { // public: -// wxListItemAttr *attr; +// wxListItemAttr *attr; // long lParam; // user data // }; -// -// To conserve memory, a wxListItemInternalData is -// only allocated for a LV_ITEM if text attributes or +// +// To conserve memory, a wxListItemInternalData is +// only allocated for a LV_ITEM if text attributes or // user data(lparam) are being set. @@ -159,7 +159,7 @@ private: class wxListItemInternalData { public: - wxListItemAttr *attr; + wxListItemAttr *attr; LPARAM lParam; // user data wxListItemInternalData() : attr(NULL), lParam(0) {} @@ -171,9 +171,10 @@ public: }; // Get the internal data structure -static wxListItemInternalData *GetInternalData(HWND hwnd, long itemId); -static wxListItemInternalData *GetInternalData(wxListCtrl *ctl, long itemId); -static wxListItemAttr *GetInternalDataAttr(wxListCtrl *ctl, long itemId); +static wxListItemInternalData *wxGetInternalData(HWND hwnd, long itemId); +static wxListItemInternalData *wxGetInternalData(wxListCtrl *ctl, long itemId); +static wxListItemAttr *wxGetInternalDataAttr(wxListCtrl *ctl, long itemId); +static void wxDeleteInternalData(wxListCtrl* ctl, long itemId); // ---------------------------------------------------------------------------- @@ -359,17 +360,15 @@ void wxListCtrl::UpdateStyle() void wxListCtrl::FreeAllInternalData() { if (m_AnyInternalData) - { + { int n = GetItemCount(); int i = 0; for (i = 0; i < n; i++) - { - wxListItemInternalData *data = GetInternalData(this, i); - if (data) - delete data; - }; - }; + wxDeleteInternalData(this, i); + + m_AnyInternalData = FALSE; + } } wxListCtrl::~wxListCtrl() @@ -580,6 +579,8 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const LV_COLUMN lvCol; wxZeroMemory(lvCol); + lvCol.mask = LVCF_WIDTH; + if ( item.m_mask & wxLIST_MASK_TEXT ) { lvCol.mask |= LVCF_TEXT; @@ -587,6 +588,16 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const lvCol.cchTextMax = 512; } + if ( item.m_mask & wxLIST_MASK_FORMAT ) + { + lvCol.mask |= LVCF_FMT; + } + + if ( item.m_mask & wxLIST_MASK_IMAGE ) + { + lvCol.mask |= LVCF_IMAGE; + } + bool success = ListView_GetColumn(GetHwnd(), col, & lvCol) != 0; // item.m_subItem = lvCol.iSubItem; @@ -608,6 +619,13 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const item.m_format = wxLIST_FORMAT_CENTRE; } +#if _WIN32_IE >= 0x0300 + if ( item.m_mask & wxLIST_MASK_IMAGE ) + { + item.m_image = lvCol.iImage; + } +#endif + return success; } @@ -723,8 +741,8 @@ bool wxListCtrl::SetItem(wxListItem& info) { // get internal item data // perhaps a cache here ? - wxListItemInternalData *data = GetInternalData(this, info.m_itemId); - + wxListItemInternalData *data = wxGetInternalData(this, info.m_itemId); + if (! data) { // need to set it @@ -1241,21 +1259,21 @@ wxTextCtrl* wxListCtrl::EditLabel(long item, wxClassInfo* textControlClass) { wxASSERT( (textControlClass->IsKindOf(CLASSINFO(wxTextCtrl))) ); - // VS: ListView_EditLabel requires that the list has focus. + // ListView_EditLabel requires that the list has focus. SetFocus(); - HWND hWnd = (HWND) ListView_EditLabel(GetHwnd(), item); + WXHWND hWnd = (WXHWND) ListView_EditLabel(GetHwnd(), item); if (m_textCtrl) { m_textCtrl->SetHWND(0); m_textCtrl->UnsubclassWin(); delete m_textCtrl; - m_textCtrl = NULL; } m_textCtrl = (wxTextCtrl*) textControlClass->CreateObject(); - m_textCtrl->SetHWND((WXHWND) hWnd); - m_textCtrl->SubclassWin((WXHWND) hWnd); + m_textCtrl->SetHWND(hWnd); + m_textCtrl->SubclassWin(hWnd); + m_textCtrl->SetParent(this); return m_textCtrl; } @@ -1728,7 +1746,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT; wxLV_ITEM item(((LV_DISPINFOA *)lParam)->item); wxConvertFromMSWListItem(NULL, event.m_item, item); - if ( ((LV_ITEM)item).pszText == NULL || + if ( ((LV_ITEM)item).pszText == NULL || ((LV_ITEM)item).iItem == -1 ) return FALSE; @@ -1740,7 +1758,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT; wxLV_ITEM item(((LV_DISPINFOW *)lParam)->item); wxConvertFromMSWListItem(NULL, event.m_item, item); - if ( ((LV_ITEM)item).pszText == NULL || + if ( ((LV_ITEM)item).pszText == NULL || ((LV_ITEM)item).iItem == -1 ) return FALSE; @@ -1762,14 +1780,8 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) case LVN_DELETEITEM: eventType = wxEVT_COMMAND_LIST_DELETE_ITEM; event.m_itemIndex = nmLV->iItem; - // delete the assoicated internal data - { - wxListItemInternalData *data = - GetInternalData(this, nmLV->iItem); - if (data) - delete data; - }; + wxDeleteInternalData(this, nmLV->iItem); break; case LVN_SETDISPINFO: @@ -2060,7 +2072,7 @@ WXLPARAM wxListCtrl::OnCustomDraw(WXLPARAM lParam) wxListItemAttr *attr = IsVirtual() ? OnGetItemAttr(item) - : GetInternalDataAttr(this, item); + : wxGetInternalDataAttr(this, item); if ( !attr ) { @@ -2257,7 +2269,7 @@ void wxListCtrl::RefreshItems(long itemFrom, long itemTo) RefreshRect(rect); } -static wxListItemInternalData *GetInternalData(HWND hwnd, long itemId) +static wxListItemInternalData *wxGetInternalData(HWND hwnd, long itemId) { LV_ITEM it; it.mask = LVIF_PARAM; @@ -2270,26 +2282,40 @@ static wxListItemInternalData *GetInternalData(HWND hwnd, long itemId) return NULL; }; -static wxListItemInternalData *GetInternalData(wxListCtrl *ctl, long itemId) +static wxListItemInternalData *wxGetInternalData(wxListCtrl *ctl, long itemId) { - return GetInternalData((HWND) ctl->GetHWND(), itemId); + return wxGetInternalData((HWND) ctl->GetHWND(), itemId); }; -static wxListItemAttr *GetInternalDataAttr(wxListCtrl *ctl, long itemId) +static wxListItemAttr *wxGetInternalDataAttr(wxListCtrl *ctl, long itemId) { - wxListItemInternalData *data = GetInternalData(ctl, itemId); + wxListItemInternalData *data = wxGetInternalData(ctl, itemId); if (data) return data->attr; else return NULL; }; +static void wxDeleteInternalData(wxListCtrl* ctl, long itemId) +{ + wxListItemInternalData *data = wxGetInternalData(ctl, itemId); + if (data) + { + delete data; + LV_ITEM item; + memset(&item, 0, sizeof(item)); + item.iItem = itemId; + item.mask = LVIF_PARAM; + item.lParam = (LPARAM) 0; + ListView_SetItem((HWND)ctl->GetHWND(), &item); + } +} static void wxConvertFromMSWListItem(HWND hwndListCtrl, wxListItem& info, LV_ITEM& lvItem) { - wxListItemInternalData *internaldata = + wxListItemInternalData *internaldata = (wxListItemInternalData *) lvItem.lParam; if (internaldata)