break;
default:
- wxFAIL_MSG( _T("unsupported wxTreeItemIcon value") );
+ wxFAIL_MSG( wxT("unsupported wxTreeItemIcon value") );
}
}
m_focusLost = true;
m_changingSelection = false;
m_triggerStateImageClick = false;
+ m_mouseUpDeselect = false;
// initialize the global array of events now as it can't be done statically
// with the wxEVT_XXX values being allocated during run-time only
bool wxTreeCtrl::DoGetItem(wxTreeViewItem *tvItem) const
{
wxCHECK_MSG( tvItem->hItem != TVI_ROOT, false,
- _T("can't retrieve virtual root item") );
+ wxT("can't retrieve virtual root item") );
if ( !TreeView_GetItem(GetHwnd(), tvItem) )
{
wxCHECK_MSG( !HasFlag(wxTR_MULTIPLE), wxTreeItemId(),
wxT("this only works with single selection controls") );
+ return GetFocusedItem();
+}
+
+wxTreeItemId wxTreeCtrl::GetFocusedItem() const
+{
return wxTreeItemId(TreeView_GetSelection(GetHwnd()));
}
{
wxCHECK_MSG( parent.IsOk() || !TreeView_GetRoot(GetHwnd()),
wxTreeItemId(),
- _T("can't have more than one root in the tree") );
+ wxT("can't have more than one root in the tree") );
TV_INSERTSTRUCT tvIns;
tvIns.hParent = HITEM(parent);
{
if ( HasFlag(wxTR_HIDE_ROOT) )
{
- wxASSERT_MSG( !m_pVirtualRoot, _T("tree can have only a single root") );
+ wxASSERT_MSG( !m_pVirtualRoot, wxT("tree can have only a single root") );
// create a virtual root item, the parent for all the others
wxTreeItemParam *param = new wxTreeItemParam;
// assert, not check: if the index is invalid, we will append the item
// to the end
- wxASSERT_MSG( index == 0, _T("bad index in wxTreeCtrl::InsertItem") );
+ wxASSERT_MSG( index == 0, wxT("bad index in wxTreeCtrl::InsertItem") );
}
return DoInsertAfter(parent, idPrev, text, image, selectedImage, data);
void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
{
- wxCHECK_RET( !IsHiddenRoot(item), _T("can't select hidden root item") );
+ wxCHECK_RET( !IsHiddenRoot(item), wxT("can't select hidden root item") );
- if ( IsSelected(item) == select )
+ if ( select == IsSelected(item) )
{
+ // nothing to do, the item is already in the requested state
return;
}
(void)HandleTreeEvent(changedEvent);
}
}
- else
+ else // single selection
{
- wxASSERT_MSG( select,
- _T("SelectItem(false) works only for multiselect") );
+ wxTreeItemId itemOld, itemNew;
+ if ( select )
+ {
+ itemOld = GetSelection();
+ itemNew = item;
+ }
+ else // deselecting the currently selected item
+ {
+ itemOld = item;
+ // leave itemNew invalid
+ }
// in spite of the docs (MSDN Jan 99 edition), we don't seem to receive
// the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so
// send them ourselves
- wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item);
+ wxTreeEvent
+ changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, itemNew);
+ changingEvent.SetOldItem(itemOld);
if ( IsTreeEventAllowed(changingEvent) )
{
- if ( !TreeView_SelectItem(GetHwnd(), HITEM(item)) )
+ if ( !TreeView_SelectItem(GetHwnd(), HITEM(itemNew)) )
{
wxLogLastError(wxT("TreeView_SelectItem"));
}
SetFocusedItem(item);
wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
- this, item);
+ this, itemNew);
+ changedEvent.SetOldItem(itemOld);
(void)HandleTreeEvent(changedEvent);
}
}
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
{
- wxCHECK_RET( !IsHiddenRoot(item), _T("can't show hidden root item") );
+ wxCHECK_RET( !IsHiddenRoot(item), wxT("can't show hidden root item") );
// no error return
TreeView_EnsureVisible(GetHwnd(), HITEM(item));
if ( !(tvht.flags & TVHT_ONITEM) )
{
- if ( !HandleMouseEvent(nMsg, x, y, wParam) )
+ if ( tvht.flags & TVHT_ONITEMBUTTON )
{
- if ( tvht.flags & TVHT_ONITEMBUTTON )
+ // either it's going to be handled by user code or
+ // we're going to use it ourselves to toggle the
+ // branch, in either case don't pass it to the base
+ // class which would generate another mouse click event
+ // for it even though it's already handled here
+ processed = true;
+ SetFocus();
+
+ if ( !HandleMouseEvent(nMsg, x, y, wParam) )
{
if ( !IsExpanded(htItem) )
{
Collapse(htItem);
}
}
-
- processed = true;
}
m_focusLost = false;
else
{
SetFocusedItem(wxTreeItemId(htItem));
+ m_mouseUpDeselect = true;
}
}
else // click on a single selected item
case WM_LBUTTONUP:
if ( isMultiple )
{
- // deselect other items if multiple items selected
+ // deselect other items if needed
if ( htItem )
{
- wxArrayTreeItemIds selections;
- size_t count = GetSelections(selections);
-
- if ( count > 1 &&
- !(wParam & MK_CONTROL) &&
- !(wParam & MK_SHIFT) )
+ if ( m_mouseUpDeselect )
{
+ m_mouseUpDeselect = false;
+
wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING,
this, htItem);
changingEvent.m_itemOld = htOldItem;
return MSWHandleTreeKeyDownEvent(
info->wVKey, (wxIsAltDown() ? KF_ALTDOWN : 0) << 16);
}
- break;
// Vista's tree control has introduced some problems with our
if ( !loaded )
{
- wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
+ wxLoadedDLL dllComCtl32(wxT("comctl32.dll"));
if ( dllComCtl32.IsLoaded() )
wxDL_INIT_FUNC(s_pfn, ImageList_Copy, dllComCtl32);
}
{
// normally this is impossible because the m_dragImage is
// deleted once the drag operation is over
- wxASSERT_MSG( !m_dragImage, _T("starting to drag once again?") );
+ wxASSERT_MSG( !m_dragImage, wxT("starting to drag once again?") );
m_dragImage = new wxDragImage(*this, event.m_item);
m_dragImage->BeginDrag(wxPoint(0,0), this);