X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/de8e98f1331f46237083753cff470a4ff7ea855b..c13cace12594b37706e9520a6fbd602c949f8127:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 2353ebb54d..539992500b 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -40,8 +40,8 @@ #include "wx/textctrl.h" #include "wx/imaglist.h" - #include "wx/listctrl.h" +#include "wx/dcclient.h" #include "wx/msw/private.h" @@ -78,6 +78,10 @@ static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, L IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) +BEGIN_EVENT_TABLE(wxListCtrl, wxControl) + EVT_PAINT(wxListCtrl::OnPaint) +END_EVENT_TABLE() + // ============================================================================ // implementation // ============================================================================ @@ -126,6 +130,7 @@ void wxListCtrl::Init() m_imageListNormal = NULL; m_imageListSmall = NULL; m_imageListState = NULL; + m_ownsImageListNormal = m_ownsImageListSmall = m_ownsImageListState = FALSE; m_baseStyle = 0; m_colCount = 0; m_textCtrl = NULL; @@ -209,8 +214,7 @@ bool wxListCtrl::DoCreateControl(int x, int y, int w, int h) if ( !m_hWnd ) { - wxLogError(_("Can't create list control window, check " - "that comctl32.dll is installed.")); + wxLogError(_("Can't create list control window, check that comctl32.dll is installed.")); return FALSE; } @@ -281,6 +285,10 @@ wxListCtrl::~wxListCtrl() delete m_textCtrl; m_textCtrl = NULL; } + + if (m_ownsImageListNormal) delete m_imageListNormal; + if (m_ownsImageListSmall) delete m_imageListSmall; + if (m_ownsImageListState) delete m_imageListState; } // ---------------------------------------------------------------------------- @@ -600,6 +608,9 @@ bool wxListCtrl::GetItem(wxListItem& info) const if (info.m_mask & wxLIST_MASK_DATA) lvItem.mask |= LVIF_PARAM; + if (info.m_mask & wxLIST_MASK_IMAGE) + lvItem.mask |= LVIF_IMAGE; + if ( info.m_mask & wxLIST_MASK_STATE ) { lvItem.mask |= LVIF_STATE; @@ -633,7 +644,15 @@ bool wxListCtrl::SetItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { - m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); + + wxListItemAttr *attr; + attr = (wxListItemAttr*) m_attrs.Get(item.iItem); + + if (attr == NULL) + + m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); + + else *attr = *info.GetAttributes(); m_hasAnyAttr = TRUE; } @@ -777,7 +796,7 @@ bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const rect.x = rect2.left; rect.y = rect2.top; rect.width = rect2.right - rect2.left; - rect.height = rect2.bottom - rect2.left; + rect.height = rect2.bottom - rect2.top; return success; } @@ -898,21 +917,38 @@ void wxListCtrl::SetImageList(wxImageList *imageList, int which) if ( which == wxIMAGE_LIST_NORMAL ) { flags = LVSIL_NORMAL; + if (m_ownsImageListNormal) delete m_imageListNormal; m_imageListNormal = imageList; + m_ownsImageListNormal = FALSE; } else if ( which == wxIMAGE_LIST_SMALL ) { flags = LVSIL_SMALL; + if (m_ownsImageListSmall) delete m_imageListSmall; m_imageListSmall = imageList; + m_ownsImageListSmall = FALSE; } else if ( which == wxIMAGE_LIST_STATE ) { flags = LVSIL_STATE; + if (m_ownsImageListState) delete m_imageListState; m_imageListState = imageList; + m_ownsImageListState = FALSE; } ListView_SetImageList(GetHwnd(), (HIMAGELIST) imageList ? imageList->GetHIMAGELIST() : 0, flags); } +void wxListCtrl::AssignImageList(wxImageList *imageList, int which) +{ + SetImageList(imageList, which); + if ( which == wxIMAGE_LIST_NORMAL ) + m_ownsImageListNormal = TRUE; + else if ( which == wxIMAGE_LIST_SMALL ) + m_ownsImageListSmall = TRUE; + else if ( which == wxIMAGE_LIST_STATE ) + m_ownsImageListState = TRUE; +} + // ---------------------------------------------------------------------------- // Operations // ---------------------------------------------------------------------------- @@ -952,7 +988,7 @@ bool wxListCtrl::DeleteAllColumns() { if ( ListView_DeleteColumn(GetHwnd(), 0) == 0 ) { - wxLogLastError("ListView_DeleteColumn"); + wxLogLastError(wxT("ListView_DeleteColumn")); return FALSE; } @@ -1040,10 +1076,13 @@ long wxListCtrl::FindItem(long start, const wxString& str, bool partial) findInfo.flags = LVFI_STRING; if ( partial ) - findInfo.flags |= LVFI_STRING; - findInfo.psz = WXSTRINGCAST str; + findInfo.flags |= LVFI_PARTIAL; + findInfo.psz = str; - return ListView_FindItem(GetHwnd(), (int) start, & findInfo); + // ListView_FindItem() excludes the first item from search and to look + // through all the items you need to start from -1 which is unnatural and + // inconsitent with the generic version - so we adjust the index + return ListView_FindItem(GetHwnd(), (int) start - 1, &findInfo); } // Find an item whose data matches this data, starting from the item after 'start' @@ -1122,7 +1161,15 @@ long wxListCtrl::InsertItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { - m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); + + wxListItemAttr *attr; + attr = (wxListItemAttr*) m_attrs.Get(item.iItem); + + if (attr == NULL) + + m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); + + else *attr = *info.GetAttributes(); m_hasAnyAttr = TRUE; } @@ -1436,7 +1483,12 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_code = wxCharCodeMSWToWX(wVKey); } - event.m_item.m_data = GetItemData(lItem); + if ( lItem != -1 ) + { + // fill the other fields too + event.m_item.m_text = GetItemText(lItem); + event.m_item.m_data = GetItemData(lItem); + } } break; @@ -1458,6 +1510,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED; event.m_itemIndex = nmLV->iItem; + event.m_item.m_text = GetItemText(nmLV->iItem); event.m_item.m_data = GetItemData(nmLV->iItem); break; @@ -1658,6 +1711,72 @@ wxChar *wxListCtrl::AddPool(const wxString& str) return (wxChar *)node->Data(); } +// Necessary for drawing hrules and vrules, if specified +void wxListCtrl::OnPaint(wxPaintEvent& event) +{ + wxPaintDC dc(this); + + wxControl::OnPaint(event); + + // Reset the device origin since it may have been set + dc.SetDeviceOrigin(0, 0); + + bool drawHRules = ((GetWindowStyle() & wxLC_HRULES) != 0); + bool drawVRules = ((GetWindowStyle() & wxLC_VRULES) != 0); + + if (!drawHRules && !drawVRules) + return; + if ((GetWindowStyle() & wxLC_REPORT) == 0) + return; + + wxPen pen(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT), 1, wxSOLID); + dc.SetPen(pen); + dc.SetBrush(* wxTRANSPARENT_BRUSH); + + wxSize clientSize = GetClientSize(); + wxRect itemRect; + int cy=0; + + int itemCount = GetItemCount(); + int i; + for (i = 0; i < itemCount; i++) + { + if (GetItemRect(i, itemRect)) + { + cy = itemRect.GetTop(); + if (i != 0) // Don't draw the first one + { + dc.DrawLine(0, cy, clientSize.x, cy); + + // Draw last line + if (i == (GetItemCount() - 1)) + { + cy = itemRect.GetBottom(); + dc.DrawLine(0, cy, clientSize.x, cy); + } + } + } + } + i = (GetItemCount() - 1); + if (drawVRules && (i > -1)) + { + wxRect firstItemRect; + GetItemRect(0, firstItemRect); + + if (GetItemRect(i, itemRect)) + { + int col; + int x = itemRect.GetX(); + for (col = 0; col < GetColumnCount(); col++) + { + int colWidth = GetColumnWidth(col); + x += colWidth ; + dc.DrawLine(x, firstItemRect.GetY() - 2, x, itemRect.GetBottom()); + } + } + } +} + // ---------------------------------------------------------------------------- // wxListItem // ----------------------------------------------------------------------------