X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2702ed5a3d9eaee3c7b7d072716c8405191043de..a967ef9dcefdb23a73ab389b5749fe1e17bedc5b:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index c785f4c165..2180a54210 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" @@ -72,9 +72,26 @@ static void wxConvertToMSWListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& tvItem, HWND getFullInfo = 0); // ---------------------------------------------------------------------------- -// macros +// events // ---------------------------------------------------------------------------- +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_RDRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_INSERT_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_ACTIVATED) + IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) @@ -130,6 +147,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; @@ -284,6 +302,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; } // ---------------------------------------------------------------------------- @@ -603,6 +625,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; @@ -909,21 +934,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 // ---------------------------------------------------------------------------- @@ -1056,8 +1098,10 @@ long wxListCtrl::FindItem(long start, const wxString& str, bool partial) // 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); + // inconsistent with the generic version - so we adjust the index + if (start != -1) + start --; + return ListView_FindItem(GetHwnd(), (int) start, &findInfo); } // Find an item whose data matches this data, starting from the item after 'start' @@ -1515,6 +1559,8 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { eventType = wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK; event.m_itemIndex = lvhti.iItem; + event.m_pointDrag.x = lvhti.pt.x; + event.m_pointDrag.y = lvhti.pt.y; } } } @@ -1712,7 +1758,6 @@ void wxListCtrl::OnPaint(wxPaintEvent& event) wxRect itemRect; int cy=0; - int lastH = 0; int itemCount = GetItemCount(); int i; for (i = 0; i < itemCount; i++) @@ -1723,13 +1768,12 @@ void wxListCtrl::OnPaint(wxPaintEvent& event) 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); - } + } + // Draw last line + if (i == (GetItemCount() - 1)) + { + cy = itemRect.GetBottom(); + dc.DrawLine(0, cy, clientSize.x, cy); } } }