return;
}
+ if ( item == m_htSelStart )
+ m_htSelStart.Unset();
+
+ if ( item == m_htClickedItem )
+ m_htClickedItem.Unset();
+
if ( next.IsOk() )
{
wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, next);
// unlock tree selections on vista for the duration of this call
TreeItemUnlocker unlock_all;
+ // invalidate all the items we store as they're going to become invalid
+ m_htSelStart =
+ m_htClickedItem = wxTreeItemId();
+
// delete the "virtual" root item.
if ( GET_VIRTUAL_ROOT() )
{
}
}
+void wxTreeCtrl::DoSelectChildren(const wxTreeItemId& parent)
+{
+ DoUnselectAll();
+
+ wxTreeItemIdValue cookie;
+ wxTreeItemId child = GetFirstChild(parent, cookie);
+ while ( child.IsOk() )
+ {
+ DoSelectItem(child, true);
+ child = GetNextChild(child, cookie);
+ }
+}
+
+void wxTreeCtrl::SelectChildren(const wxTreeItemId& parent)
+{
+ wxCHECK_RET( HasFlag(wxTR_MULTIPLE),
+ "this only works with multiple selection controls" );
+
+ HTREEITEM htFocus = (HTREEITEM)TreeView_GetSelection(GetHwnd());
+
+ wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this);
+ changingEvent.m_itemOld = htFocus;
+
+ if ( IsTreeEventAllowed(changingEvent) )
+ {
+ DoSelectChildren(parent);
+
+ wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED, this);
+ changedEvent.m_itemOld = htFocus;
+ (void)HandleTreeEvent(changedEvent);
+ }
+}
+
void wxTreeCtrl::DoSelectItem(const wxTreeItemId& item, bool select)
{
TempSetter set(m_changingSelection);
return true;
}
+bool wxTreeCtrl::MSWIsOnItem(unsigned flags) const
+{
+ unsigned mask = TVHT_ONITEM;
+ if ( HasFlag(wxTR_FULL_ROW_HIGHLIGHT) )
+ mask |= TVHT_ONITEMINDENT | TVHT_ONITEMRIGHT;
+
+ return (flags & mask) != 0;
+}
+
bool wxTreeCtrl::MSWHandleSelectionKey(unsigned vkey)
{
const bool bCtrl = wxIsCtrlDown();
m_htClickedItem.Unset();
- if ( !(tvht.flags & TVHT_ONITEM) )
+ if ( !MSWIsOnItem(tvht.flags) )
{
if ( tvht.flags & TVHT_ONITEMBUTTON )
{
}
}
- if ( !m_dragStarted &&
- (tvht.flags & TVHT_ONITEMSTATEICON ||
- tvht.flags & TVHT_ONITEMICON ||
- tvht.flags & TVHT_ONITEM) )
+ if ( !m_dragStarted && MSWIsOnItem(tvht.flags) )
{
processed = true;
}
case VK_END:
case VK_PRIOR:
case VK_NEXT:
- if ( !MSWHandleTreeKeyDownEvent(wParam, lParam) )
+ if ( !HandleKeyDown(wParam, lParam) &&
+ !MSWHandleTreeKeyDownEvent(wParam, lParam) )
{
// use the key to update the selection if it was left
// unprocessed
::ScreenToClient(GetHwnd(), &tvhti.pt);
if ( TreeView_HitTest(GetHwnd(), &tvhti) )
{
- if ( tvhti.flags & TVHT_ONITEM )
+ if ( MSWIsOnItem(tvhti.flags) )
{
event.m_item = tvhti.hItem;
eventType = (int)hdr->code == NM_DBLCLK