]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/listctrl.cpp
1552971 ] Add flag for wxODComboBox::OnDrawItem to indicate selection
[wxWidgets.git] / src / msw / listctrl.cpp
index 64051935b0a50c57b0c9e2cc2c221768a87c585f..d3adde8fd179e63c7794b4e11b07b84636c247ad 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        src/msw/listctrl.cpp
 // Purpose:     wxListCtrl
 // Author:      Julian Smart
 // Name:        src/msw/listctrl.cpp
 // Purpose:     wxListCtrl
 // Author:      Julian Smart
-// Modified by:
+// Modified by: Agron Selimaj
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 #if wxUSE_LISTCTRL
 
 #ifndef WX_PRECOMP
 #if wxUSE_LISTCTRL
 
 #ifndef WX_PRECOMP
+    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
     #include "wx/app.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/settings.h"
     #include "wx/app.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/settings.h"
+    #include "wx/dcclient.h"
+    #include "wx/textctrl.h"
 #endif
 
 #endif
 
-#include "wx/textctrl.h"
 #include "wx/imaglist.h"
 #include "wx/listctrl.h"
 #include "wx/imaglist.h"
 #include "wx/listctrl.h"
-#include "wx/dcclient.h"
 
 #include "wx/msw/private.h"
 
 
 #include "wx/msw/private.h"
 
@@ -48,9 +49,6 @@
   #endif
 #endif
 
   #endif
 #endif
 
-// include <commctrl.h> "properly"
-#include "wx/msw/wrapcctl.h"
-
 // Currently gcc and watcom don't define NMLVFINDITEM, and DMC only defines
 // it by its old name NM_FINDTIEM.
 //
 // Currently gcc and watcom don't define NMLVFINDITEM, and DMC only defines
 // it by its old name NM_FINDTIEM.
 //
@@ -218,35 +216,6 @@ static wxListItemAttr *wxGetInternalDataAttr(const wxListCtrl *ctl, long itemId)
 static void wxDeleteInternalData(wxListCtrl* ctl, long itemId);
 
 
 static void wxDeleteInternalData(wxListCtrl* ctl, long itemId);
 
 
-// ----------------------------------------------------------------------------
-// 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)
-#if WXWIN_COMPATIBILITY_2_4
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO)
-#endif
-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_COL_RIGHT_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_DRAGGING)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_END_DRAG)
-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)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_FOCUSED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT)
-
 #if wxUSE_EXTENDED_RTTI
 WX_DEFINE_FLAGS( wxListCtrlStyle )
 
 #if wxUSE_EXTENDED_RTTI
 WX_DEFINE_FLAGS( wxListCtrlStyle )
 
@@ -761,6 +730,10 @@ bool wxListCtrl::GetItem(wxListItem& info) const
 // Sets information about the item
 bool wxListCtrl::SetItem(wxListItem& info)
 {
 // Sets information about the item
 bool wxListCtrl::SetItem(wxListItem& info)
 {
+    const long id = info.GetId();
+    wxCHECK_MSG( id >= 0 && id < GetItemCount(), false,
+                 _T("invalid item index in SetItem") );
+
     LV_ITEM item;
     wxConvertToMSWListItem(this, info, item);
 
     LV_ITEM item;
     wxConvertToMSWListItem(this, info, item);
 
@@ -773,7 +746,7 @@ bool wxListCtrl::SetItem(wxListItem& info)
     {
         // get internal item data
         // perhaps a cache here ?
     {
         // get internal item data
         // perhaps a cache here ?
-        wxListItemInternalData *data = wxGetInternalData(this, info.m_itemId);
+        wxListItemInternalData *data = wxGetInternalData(this, id);
 
         if (! data)
         {
 
         if (! data)
         {
@@ -1006,6 +979,24 @@ wxRect wxListCtrl::GetViewRect() const
 
 // Gets the item rectangle
 bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const
 
 // Gets the item rectangle
 bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const
+{
+    return GetSubItemRect( item, wxLIST_GETSUBITEMRECT_WHOLEITEM, rect, code) ;
+}
+
+/*!
+ * Retrieve coordinates and size of a specified subitem of a listview control.
+ * This function only works if the listview control is in the report mode.
+ *
+ * @param item : Item number
+ * @param subItem : Subitem or column number, use -1 for the whole row including
+ *                  all columns or subitems
+ * @param rect : A pointer to an allocated wxRect object
+ * @param code : Specify the part of the subitem coordinates you need. Choices are
+ *               wxLIST_RECT_BOUNDS, wxLIST_RECT_ICON, wxLIST_RECT_LABEL
+ *
+ * @return bool  : True if successful.
+ */
+bool wxListCtrl::GetSubItemRect(long item, long subItem, wxRect& rect, int code) const
 {
     RECT rectWin;
 
 {
     RECT rectWin;
 
@@ -1018,12 +1009,24 @@ bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const
         codeWin = LVIR_LABEL;
     else
     {
         codeWin = LVIR_LABEL;
     else
     {
-        wxFAIL_MSG( _T("incorrect code in GetItemRect()") );
-
+        wxFAIL_MSG( _T("incorrect code in GetItemRect() / GetSubItemRect()") );
         codeWin = LVIR_BOUNDS;
     }
 
         codeWin = LVIR_BOUNDS;
     }
 
-    bool success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0;
+    bool success;
+    if( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM)
+    {
+      success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0;
+    }
+    else if( subItem >= 0)
+    {
+      success = ListView_GetSubItemRect( GetHwnd(), (int) item, (int) subItem, codeWin, &rectWin) != 0;
+    }
+    else
+    {
+      wxFAIL_MSG( _T("incorrect subItem number in GetSubItemRect()") );
+      return false;
+    }
 
     rect.x = rectWin.left;
     rect.y = rectWin.top;
 
     rect.x = rectWin.left;
     rect.y = rectWin.top;
@@ -1033,6 +1036,9 @@ bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const
     return success;
 }
 
     return success;
 }
 
+
+
+
 // Gets the item position
 bool wxListCtrl::GetItemPosition(long item, wxPoint& pos) const
 {
 // Gets the item position
 bool wxListCtrl::GetItemPosition(long item, wxPoint& pos) const
 {
@@ -1474,13 +1480,25 @@ long wxListCtrl::FindItem(long start, const wxPoint& pt, int direction)
 
 // Determines which item (if any) is at the specified point,
 // giving details in 'flags' (see wxLIST_HITTEST_... flags above)
 
 // Determines which item (if any) is at the specified point,
 // giving details in 'flags' (see wxLIST_HITTEST_... flags above)
-long wxListCtrl::HitTest(const wxPoint& point, int& flags)
+long
+wxListCtrl::HitTest(const wxPoint& point, int& flags, long *ptrSubItem) const
 {
     LV_HITTESTINFO hitTestInfo;
     hitTestInfo.pt.x = (int) point.x;
     hitTestInfo.pt.y = (int) point.y;
 
 {
     LV_HITTESTINFO hitTestInfo;
     hitTestInfo.pt.x = (int) point.x;
     hitTestInfo.pt.y = (int) point.y;
 
-    ListView_HitTest(GetHwnd(), & hitTestInfo);
+    long item;
+#ifdef LVM_SUBITEMHITTEST
+    if ( ptrSubItem && wxApp::GetComCtl32Version() >= 470 )
+    {
+        item = ListView_SubItemHitTest(GetHwnd(), &hitTestInfo);
+        *ptrSubItem = hitTestInfo.iSubItem;
+    }
+    else
+#endif // LVM_SUBITEMHITTEST
+    {
+        item = ListView_HitTest(GetHwnd(), &hitTestInfo);
+    }
 
     flags = 0;
 
 
     flags = 0;
 
@@ -1515,9 +1533,10 @@ long wxListCtrl::HitTest(const wxPoint& point, int& flags)
             flags |= wxLIST_HITTEST_ONITEMSTATEICON;
     }
 
             flags |= wxLIST_HITTEST_ONITEMSTATEICON;
     }
 
-    return (long) hitTestInfo.iItem;
+    return item;
 }
 
 }
 
+
 // Inserts an item, returning the index of the new item if successful,
 // -1 otherwise.
 long wxListCtrl::InsertItem(const wxListItem& info)
 // Inserts an item, returning the index of the new item if successful,
 // -1 otherwise.
 long wxListCtrl::InsertItem(const wxListItem& info)
@@ -1713,6 +1732,20 @@ bool wxListCtrl::SortItems(wxListCtrlCompare fn, long data)
 // message processing
 // ----------------------------------------------------------------------------
 
 // message processing
 // ----------------------------------------------------------------------------
 
+bool wxListCtrl::MSWShouldPreProcessMessage(WXMSG* msg)
+{
+    if ( msg->message == WM_KEYDOWN )
+    {
+        if ( msg->wParam == VK_RETURN )
+        {
+            // we need VK_RETURN to generate wxEVT_COMMAND_LIST_ITEM_ACTIVATED
+            return false;
+        }
+    }
+
+    return wxControl::MSWShouldPreProcessMessage(msg);
+}
+
 bool wxListCtrl::MSWCommand(WXUINT cmd, WXWORD id)
 {
     if (cmd == EN_UPDATE)
 bool wxListCtrl::MSWCommand(WXUINT cmd, WXWORD id)
 {
     if (cmd == EN_UPDATE)
@@ -3053,7 +3086,7 @@ static void wxConvertToMSWListCol(HWND hwndList,
 #ifdef NM_CUSTOMDRAW // _WIN32_IE >= 0x0300
     if ( item.m_mask & wxLIST_MASK_IMAGE )
     {
 #ifdef NM_CUSTOMDRAW // _WIN32_IE >= 0x0300
     if ( item.m_mask & wxLIST_MASK_IMAGE )
     {
-        if ( wxTheApp->GetComCtl32Version() >= 470 )
+        if ( wxApp::GetComCtl32Version() >= 470 )
         {
             lvCol.mask |= LVCF_IMAGE;
 
         {
             lvCol.mask |= LVCF_IMAGE;