]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
make it possible to associate context help text with individual radiobox items
[wxWidgets.git] / src / msw / treectrl.cpp
index 01ab371bf02d5fe557cf8d9b021a8502830c342f..dfd2f6ebecf416666e0b24238c9a22f5f84d5c77 100644 (file)
@@ -32,6 +32,7 @@
     #include "wx/dynarray.h"
     #include "wx/log.h"
     #include "wx/app.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/msw/private.h"
@@ -46,7 +47,6 @@
 #define wxUSE_COMCTL32_SAFELY 0
 
 #include "wx/imaglist.h"
-#include "wx/settings.h"
 #include "wx/msw/dragimag.h"
 
 // macros to hide the cast ugliness
@@ -313,9 +313,38 @@ public:
 
         // do we have such image?
     bool HasImage(wxTreeItemIcon which) const { return m_images[which] != -1; }
-        // get image
-    int GetImage(wxTreeItemIcon which) const { return m_images[which]; }
-        // change it
+        // get image, falling back to the other images if this one is not
+        // specified
+    int GetImage(wxTreeItemIcon which) const
+    {
+        int image = m_images[which];
+        if ( image == -1 )
+        {
+            switch ( which )
+            {
+                case wxTreeItemIcon_SelectedExpanded:
+                    image = GetImage(wxTreeItemIcon_Expanded);
+                    if ( image != -1 )
+                        break;
+                    //else: fall through
+
+                case wxTreeItemIcon_Selected:
+                case wxTreeItemIcon_Expanded:
+                    image = GetImage(wxTreeItemIcon_Normal);
+                    break;
+
+                case wxTreeItemIcon_Normal:
+                    // no fallback
+                    break;
+
+                default:
+                    wxFAIL_MSG( _T("unsupported wxTreeItemIcon value") );
+            }
+        }
+
+        return image;
+    }
+        // change the given image
     void SetImage(int image, wxTreeItemIcon which) { m_images[which] = image; }
 
         // get item
@@ -961,7 +990,7 @@ int wxTreeCtrl::GetItemImage(const wxTreeItemId& item,
 
     wxTreeItemParam *param = GetItemParam(item);
 
-    return param ? param->GetImage(which) : -1;
+    return param && param->HasImage(which) ? param->GetImage(which) : -1;
 }
 
 void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image,
@@ -984,19 +1013,6 @@ void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image,
         return;
 
     data->SetImage(image, which);
-
-    // make sure that we have selected images as well
-    if ( which == wxTreeItemIcon_Normal &&
-         !data->HasImage(wxTreeItemIcon_Selected) )
-    {
-        data->SetImage(image, wxTreeItemIcon_Selected);
-    }
-
-    if ( which == wxTreeItemIcon_Expanded &&
-         !data->HasImage(wxTreeItemIcon_SelectedExpanded) )
-    {
-        data->SetImage(image, wxTreeItemIcon_SelectedExpanded);
-    }
 }
 
 wxTreeItemParam *wxTreeCtrl::GetItemParam(const wxTreeItemId& item) const
@@ -1486,27 +1502,23 @@ wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent,
         tvIns.item.cchTextMax = 0;
     }
 
-    // we use the wxTreeItemParam of the LPARAM to return the image
+    // create the param which will store the other item parameters
+    wxTreeItemParam *param = new wxTreeItemParam;
+
+    // we return the images on demand as they depend on whether the item is
+    // expanded or collapsed too in our case
     mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
     tvIns.item.iImage = I_IMAGECALLBACK;
     tvIns.item.iSelectedImage = I_IMAGECALLBACK;
 
-    // create the param and setup the initial image numbers
-    wxTreeItemParam *param = new wxTreeItemParam;
-
     param->SetImage(image, wxTreeItemIcon_Normal);
-
-    // take the same image for selected icon if not specified
-    if ( selectedImage == -1 )
-        param->SetImage(image, wxTreeItemIcon_Selected);
-    else
-        param->SetImage(selectedImage, wxTreeItemIcon_Selected);
+    param->SetImage(selectedImage, wxTreeItemIcon_Selected);
 
     mask |= TVIF_PARAM;
     tvIns.item.lParam = (LPARAM)param;
     tvIns.item.mask = mask;
 
-    HTREEITEM id = (HTREEITEM) TreeView_InsertItem(GetHwnd(), &tvIns);
+    HTREEITEM id = TreeView_InsertItem(GetHwnd(), &tvIns);
     if ( id == 0 )
     {
         wxLogLastError(wxT("TreeView_InsertItem"));
@@ -2681,9 +2693,15 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
                             wxTreeItemAttr * const attr = it->second;
 
+                            wxTreeViewItem tvItem((void *)nmcd.dwItemSpec,
+                                                  TVIF_STATE, TVIS_DROPHILITED);
+                            DoGetItem(&tvItem);
+                            const UINT tvItemState = tvItem.state;
+
                             // selection colours should override ours,
-                            // otherwise it is too confusing ot the user
-                            if ( !(nmcd.uItemState & CDIS_SELECTED) )
+                            // otherwise it is too confusing to the user
+                            if ( !(nmcd.uItemState & CDIS_SELECTED) &&
+                                 !(tvItemState & TVIS_DROPHILITED) )
                             {
                                 wxColour colBack;
                                 if ( attr->HasBackgroundColour() )
@@ -2697,8 +2715,9 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                             // colour when we don't have focus (we can't keep
                             // it when we do, it would usually be unreadable on
                             // the almost inverted bg colour...)
-                            if ( !(nmcd.uItemState & CDIS_SELECTED) ||
-                                    FindFocus() != this )
+                            if ( ( !(nmcd.uItemState & CDIS_SELECTED) ||
+                                    FindFocus() != this ) &&
+                                 !(tvItemState & TVIS_DROPHILITED) )
                             {
                                 wxColour colText;
                                 if ( attr->HasTextColour() )
@@ -2815,8 +2834,6 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                 //     with many items is just too slow)
                 NM_TREEVIEW *tv = (NM_TREEVIEW *)lParam;
 
-                wxTreeItemId item = event.m_item;
-
                 wxTreeItemParam *param =
                         (wxTreeItemParam *)tv->itemOld.lParam;
                 delete param;
@@ -2918,7 +2935,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                 wxTreeItemId item = event.m_item;
                 TV_DISPINFO *info = (TV_DISPINFO *)lParam;
 
-                wxTreeItemParam *param = GetItemParam(item);
+                const wxTreeItemParam * const param = GetItemParam(item);
                 if ( !param )
                     break;