X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05886ed3f2c96ea7bb736ee59ff7912ace1f4c17..716a5baa6ecd0d5d0c31914567e4da3165ca6ff0:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index cbedea6f73..9efd6f226b 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -78,7 +78,9 @@ static void wxConvertFromMSWListItem(HWND hwndListCtrl, /* const */ LV_ITEM& lvItem); // convert our wxListItem to LV_COLUMN -static void wxConvertToMSWListCol(int col, const wxListItem& item, +static void wxConvertToMSWListCol(HWND hwndList, + int col, + const wxListItem& item, LV_COLUMN& lvCol); // ---------------------------------------------------------------------------- @@ -666,7 +668,7 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const bool wxListCtrl::SetColumn(int col, const wxListItem& item) { LV_COLUMN lvCol; - wxConvertToMSWListCol(col, item, lvCol); + wxConvertToMSWListCol(GetHwnd(), col, item, lvCol); return ListView_SetColumn(GetHwnd(), col, &lvCol) != 0; } @@ -1370,11 +1372,25 @@ wxTextCtrl* wxListCtrl::EditLabel(long item, wxClassInfo* textControlClass) } // End label editing, optionally cancelling the edit -bool wxListCtrl::EndEditLabel(bool WXUNUSED(cancel)) +bool wxListCtrl::EndEditLabel(bool cancel) { - wxFAIL_MSG( _T("not implemented") ); - - return false; + // m_textCtrl is not always ready, ie. in EVT_LIST_BEGIN_LABEL_EDIT + HWND hwnd = ListView_GetEditControl(GetHwnd()); + bool b = (hwnd != NULL); + if (b) + { + if (cancel) + ::SetWindowText(hwnd, wxEmptyString); // dubious but better than nothing + if (m_textCtrl) + { + m_textCtrl->UnsubclassWin(); + m_textCtrl->SetHWND(0); + delete m_textCtrl; + m_textCtrl = NULL; + } + ::DestroyWindow(hwnd); + } + return b; } // Ensures this item is visible @@ -1569,7 +1585,7 @@ long wxListCtrl::InsertItem(long index, const wxString& label, int imageIndex) long wxListCtrl::InsertColumn(long col, const wxListItem& item) { LV_COLUMN lvCol; - wxConvertToMSWListCol(col, item, lvCol); + wxConvertToMSWListCol(GetHwnd(), col, item, lvCol); if ( !(lvCol.mask & LVCF_WIDTH) ) { @@ -2253,7 +2269,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) #ifdef NM_CUSTOMDRAW if ( lvi.mask & LVIF_IMAGE ) { - lvi.iImage = OnGetItemImage(item); + lvi.iImage = OnGetItemColumnImage(item, lvi.iSubItem); } #endif // NM_CUSTOMDRAW @@ -2475,13 +2491,23 @@ void wxListCtrl::OnPaint(wxPaintEvent& event) if (GetItemRect(i, itemRect)) { - int col; + // this is a fix for bug 673394: erase the pixels which we would + // otherwise leave on the screen + static const int gap = 2; + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(GetBackgroundColour())); + dc.DrawRectangle(0, firstItemRect.GetY() - gap, + clientSize.GetWidth(), gap); + + dc.SetPen(pen); + dc.SetBrush(*wxTRANSPARENT_BRUSH); int x = itemRect.GetX(); - for (col = 0; col < GetColumnCount(); col++) + for (int col = 0; col < GetColumnCount(); col++) { int colWidth = GetColumnWidth(col); x += colWidth ; - dc.DrawLine(x-1, firstItemRect.GetY() - 2, x-1, itemRect.GetBottom()); + dc.DrawLine(x-1, firstItemRect.GetY() - gap, + x-1, itemRect.GetBottom()); } } } @@ -2519,7 +2545,15 @@ int wxListCtrl::OnGetItemImage(long WXUNUSED(item)) const { wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), -1, - wxT("List control has an image list, OnGetItemImage should be overridden.")); + wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); + return -1; +} + +int wxListCtrl::OnGetItemColumnImage(long item, long column) const +{ + if (!column) + return OnGetItemImage(item); + return -1; } @@ -2778,7 +2812,9 @@ static void wxConvertToMSWListItem(const wxListCtrl *ctrl, lvItem.mask |= LVIF_IMAGE; } -static void wxConvertToMSWListCol(int WXUNUSED(col), const wxListItem& item, +static void wxConvertToMSWListCol(HWND hwndList, + int col, + const wxListItem& item, LV_COLUMN& lvCol) { wxZeroMemory(lvCol); @@ -2818,9 +2854,9 @@ static void wxConvertToMSWListCol(int WXUNUSED(col), const wxListItem& item, { if ( wxTheApp->GetComCtl32Version() >= 470 ) { - lvCol.mask |= LVCF_IMAGE | LVCF_FMT; + lvCol.mask |= LVCF_IMAGE; - // we use LVCFMT_BITMAP_ON_RIGHT because thei mages on the right + // we use LVCFMT_BITMAP_ON_RIGHT because the images on the right // seem to be generally nicer than on the left and the generic // version only draws them on the right (we don't have a flag to // specify the image location anyhow) @@ -2828,7 +2864,24 @@ static void wxConvertToMSWListCol(int WXUNUSED(col), const wxListItem& item, // we don't use LVCFMT_COL_HAS_IMAGES because it doesn't seem to // make any difference in my tests -- but maybe we should? if ( item.m_image != -1 ) + { + // as we're going to overwrite the format field, get its + // current value first -- unless we want to overwrite it anyhow + if ( !(lvCol.mask & LVCF_FMT) ) + { + LV_COLUMN lvColOld; + wxZeroMemory(lvColOld); + lvColOld.mask = LVCF_FMT; + if ( ListView_GetColumn(hwndList, col, &lvColOld) ) + { + lvCol.fmt = lvColOld.fmt; + } + + lvCol.mask |= LVCF_FMT; + } + lvCol.fmt |= LVCFMT_BITMAP_ON_RIGHT | LVCFMT_IMAGE; + } lvCol.iImage = item.m_image; }