#include "wx/dynarray.h"
#include "wx/log.h"
#include "wx/app.h"
+ #include "wx/settings.h"
#endif
#include "wx/msw/private.h"
#define wxUSE_COMCTL32_SAFELY 0
#include "wx/imaglist.h"
-#include "wx/settings.h"
#include "wx/msw/dragimag.h"
// macros to hide the cast ugliness
// 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
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,
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
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"));
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() )
// 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() )
// 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;
wxTreeItemId item = event.m_item;
TV_DISPINFO *info = (TV_DISPINFO *)lParam;
- wxTreeItemParam *param = GetItemParam(item);
+ const wxTreeItemParam * const param = GetItemParam(item);
if ( !param )
break;