X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4523ebb3f1c3576d687112d3a65141f7297ea02b..9d1b7527cd9713a521912045a3bd2bddbc31d841:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 01ab371bf0..915bfbd020 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -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")); @@ -1862,7 +1874,7 @@ void wxTreeCtrl::DoEndEditLabel(bool discardChanges) DeleteTextCtrl(); } -wxTreeItemId wxTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags) +wxTreeItemId wxTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags) const { TV_HITTESTINFO hitTestInfo; hitTestInfo.pt.x = (int)point.x; @@ -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;