X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f3ef286feebe70940b7db95f89eae01eabeee749..4e15f6c57a5897f0e1e332100e4261fd84167ce0:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index e61d9cea80..e6a6f0f08e 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -497,11 +497,7 @@ wxTextCtrl* wxListCtrl::GetEditControl(void) const bool wxListCtrl::GetItem(wxListItem& info) const { LV_ITEM lvItem; -#ifdef __GNUWIN32__ - memset(&lvItem, 0, sizeof(lvItem)); -#else - ZeroMemory(&lvItem, sizeof(lvItem)); // must set all fields to 0 -#endif + wxZeroMemory(lvItem); lvItem.iItem = info.m_itemId; lvItem.iSubItem = info.m_col; @@ -1197,9 +1193,9 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) switch ( hdr1->code ) { case LVN_BEGINRDRAG: - eventType = wxEVT_COMMAND_LIST_BEGIN_RDRAG; + eventType = wxEVT_COMMAND_LIST_BEGIN_RDRAG; // fall through - + case LVN_BEGINDRAG: if ( eventType == wxEVT_NULL ) { @@ -1256,9 +1252,9 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT; LV_DISPINFO *info = (LV_DISPINFO *)lParam; - wxConvertFromMSWListItem(this, event.m_item, info->item, GetHwnd()); + wxConvertFromMSWListItem(this, event.m_item, info->item); if ( info->item.pszText == NULL || info->item.iItem == -1 ) - event.m_cancelled = TRUE; + return FALSE; break; } case LVN_GETDISPINFO: @@ -1341,62 +1337,65 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } // else translate it into wxEVT_COMMAND_LIST_ITEM_ACTIVATED event - eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED; + { + eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED; + NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam; + event.m_itemIndex = hdr->iItem; + } break; - - case NM_RCLICK: - /* TECH NOTE: NM_RCLICK isn't really good enough here. We want to - subclass and check for the actual WM_RBUTTONDOWN message, because - NM_RCLICK waits for the WM_RBUTTONUP message as well before firing off. - We want to have notify events for both down -and- up. */ - { - // if the user processes it in wxEVT_COMMAND_RIGHT_CLICK(), don't do - // anything else - if ( wxControl::MSWOnNotify(idCtrl, lParam, result) ) { - return TRUE; - } - - // else translate it into wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK event - LV_HITTESTINFO lvhti; -#ifdef __GNUWIN32__ - memset(&lvhti,0,sizeof(LV_HITTESTINFO)); -#else - ZeroMemory(&lvhti, sizeof(LV_HITTESTINFO)); // must set all fields to 0 -#endif - ::GetCursorPos(&(lvhti.pt)); - ::ScreenToClient(GetHwnd(),&(lvhti.pt)); + case NM_RCLICK: + /* TECH NOTE: NM_RCLICK isn't really good enough here. We want to + subclass and check for the actual WM_RBUTTONDOWN message, because + NM_RCLICK waits for the WM_RBUTTONUP message as well before firing off. + We want to have notify events for both down -and- up. */ + { + // if the user processes it in wxEVT_COMMAND_RIGHT_CLICK(), don't do + // anything else + if ( wxControl::MSWOnNotify(idCtrl, lParam, result) ) { + return TRUE; + } + + // else translate it into wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK event + LV_HITTESTINFO lvhti; + wxZeroMemory(lvhti); + + ::GetCursorPos(&(lvhti.pt)); + ::ScreenToClient(GetHwnd(),&(lvhti.pt)); + if ( ListView_HitTest(GetHwnd(),&lvhti) != -1 ) + { + // older headers don't have this symbol #ifndef LVHT_ONITEM -#define LVHT_ONITEM (LVHT_ONITEMICON|LVHT_ONITEMLABEL|LVHT_ONITEMSTATEICON) + #define LVHT_ONITEM \ + (LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON) #endif - - if(ListView_HitTest(GetHwnd(),&lvhti)!=-1) { - if(lvhti.flags & LVHT_ONITEM) { - eventType = wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK; - event.m_itemIndex = lvhti.iItem; - } + if ( lvhti.flags & LVHT_ONITEM ) + { + eventType = wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK; + event.m_itemIndex = lvhti.iItem; + } } - } - break; - - /* - case NM_MCLICK: // ***** THERE IS NO NM_MCLICK. Subclass anyone? ****** - { - // if the user processes it in wxEVT_COMMAND_MIDDLE_CLICK(), don't do - // anything else - if ( wxControl::MSWOnNotify(idCtrl, lParam, result) ) - { - return TRUE; - } - - // else translate it into wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK event - eventType = wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK; - NMITEMACTIVATE* hdr = (NMITEMACTIVATE*)lParam; - event.m_itemIndex = hdr->iItem; - } - break; - */ - + } + break; + + /* + case NM_MCLICK: // ***** THERE IS NO NM_MCLICK. Subclass anyone? ****** + { + // if the user processes it in wxEVT_COMMAND_MIDDLE_CLICK(), don't do + // anything else + if ( wxControl::MSWOnNotify(idCtrl, lParam, result) ) + { + return TRUE; + } + + // else translate it into wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK event + eventType = wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK; + NMITEMACTIVATE* hdr = (NMITEMACTIVATE*)lParam; + event.m_itemIndex = hdr->iItem; + } + break; + */ + case LVN_SETDISPINFO: { eventType = wxEVT_COMMAND_LIST_SET_INFO; @@ -1415,18 +1414,29 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( !GetEventHandler()->ProcessEvent(event) ) return FALSE; - if ( (int)hdr1->code == LVN_GETDISPINFO) + switch ((int)hdr1->code) { - LV_DISPINFO *info = (LV_DISPINFO *)lParam; - if ( info->item.mask & LVIF_TEXT ) - { - if ( !event.m_item.m_text.IsNull() ) + case LVN_GETDISPINFO: { - info->item.pszText = AddPool(event.m_item.m_text); - info->item.cchTextMax = wxStrlen(info->item.pszText) + 1; + LV_DISPINFO *info = (LV_DISPINFO *)lParam; + if ( info->item.mask & LVIF_TEXT ) + { + if ( !event.m_item.m_text.IsNull() ) + { + info->item.pszText = AddPool(event.m_item.m_text); + info->item.cchTextMax = wxStrlen(info->item.pszText) + 1; + } + } + // wxConvertToMSWListItem(this, event.m_item, info->item); + break; } - } - // wxConvertToMSWListItem(this, event.m_item, info->item); + case LVN_ENDLABELEDIT: + { + *result = event.IsAllowed(); + return TRUE; + } + default: + break; } *result = !event.IsAllowed();