// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "treectrl.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
int x = GET_X_LPARAM(lParam),
y = GET_Y_LPARAM(lParam);
HTREEITEM htItem = GetItemFromPoint(GetHwnd(), x, y);
+
+ TV_HITTESTINFO tvht;
+ tvht.pt.x = x;
+ tvht.pt.y = y;
+
+ TreeView_HitTest(GetHwnd(), &tvht);
switch ( nMsg )
{
#if !wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE
case WM_LBUTTONDOWN:
- if ( htItem && isMultiple )
+ if ( htItem && isMultiple && (tvht.flags & TVHT_ONITEM) != 0 )
{
+ m_htClickedItem = (WXHTREEITEM) htItem;
+ m_ptClick = wxPoint(x, y);
+
if ( wParam & MK_CONTROL )
{
SetFocus();
m_htSelStart = TreeView_GetSelection(GetHwnd());
}
- SelectRange(GetHwnd(), HITEM(m_htSelStart), htItem,
+ if ( m_htSelStart )
+ SelectRange(GetHwnd(), HITEM(m_htSelStart), htItem,
!(wParam & MK_CONTROL));
+ else
+ ::SelectItem(GetHwnd(), htItem);
::SetFocus(GetHwnd(), htItem);
{
// avoid doing anything if we click on the only
// currently selected item
+
+ SetFocus();
wxArrayTreeItemIds selections;
size_t count = GetSelections(selections);
// otherwise, perform the deselection on mouse-up.
// this allows multiple drag and drop to work.
- if (IsItemSelected(GetHwnd(), htItem))
- {
- ::SetFocus(GetHwnd(), htItem);
- }
- else
+ if (!IsItemSelected(GetHwnd(), htItem))
{
UnselectAll();
TreeView_SelectItem(GetHwnd(), 0);
::SelectItem(GetHwnd(), htItem);
}
+ ::SetFocus(GetHwnd(), htItem);
+ processed = true;
}
// reset on any click without Shift
#endif // wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE
case WM_MOUSEMOVE:
+#ifndef __WXWINCE__
+ if ( m_htClickedItem )
+ {
+ int cx = abs(m_ptClick.x - x);
+ int cy = abs(m_ptClick.y - y);
+
+ if ( cx > GetSystemMetrics( SM_CXDRAG ) || cy > GetSystemMetrics( SM_CYDRAG ) )
+ {
+ HWND pWnd = ::GetParent( GetHwnd() );
+ if ( pWnd )
+ {
+ NM_TREEVIEW tv;
+
+ tv.hdr.hwndFrom = GetHwnd();
+ tv.hdr.idFrom = ::GetWindowLong( GetHwnd(), GWL_ID );
+ tv.hdr.code = TVN_BEGINDRAG;
+
+ tv.itemNew.hItem = HITEM(m_htClickedItem);
+
+ TVITEM tviAux;
+ ZeroMemory(&tviAux, sizeof(tviAux));
+ tviAux.hItem = HITEM(m_htClickedItem);
+ tviAux.mask = TVIF_STATE | TVIF_PARAM;
+ tviAux.stateMask = 0xffffffff;
+ TreeView_GetItem( GetHwnd(), &tviAux );
+
+ tv.itemNew.state = tviAux.state;
+ tv.itemNew.lParam = tviAux.lParam;
+
+ tv.ptDrag.x = x;
+ tv.ptDrag.y = y;
+
+ ::SendMessage( pWnd, WM_NOTIFY, tv.hdr.idFrom, (LPARAM)&tv );
+ }
+ m_htClickedItem.Unset();
+ }
+ }
+#endif // __WXWINCE__
+
if ( m_dragImage )
{
m_dragImage->Move(wxPoint(x, y));
{
UnselectAll();
TreeView_SelectItem(GetHwnd(), htItem);
+ ::SelectItem(GetHwnd(), htItem);
+ ::SetFocus(GetHwnd(), htItem);
}
+ m_htClickedItem.Unset();
}
// fall through
// fabricate the lParam and wParam parameters sufficiently
// similar to the ones from a "real" WM_KEYDOWN so that
// CreateKeyEvent() works correctly
- WXLPARAM lParam =
- (::GetKeyState(VK_MENU) < 0 ? KF_ALTDOWN : 0) << 16;
+ const bool isAltDown = ::GetKeyState(VK_MENU) < 0;
+ WXLPARAM lParam = (isAltDown ? KF_ALTDOWN : 0) << 16;
WXWPARAM wParam = info->wVKey;
wParam);
// a separate event for Space/Return
- if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
+ if ( !wxIsCtrlDown() && !wxIsShiftDown() && !isAltDown &&
((info->wVKey == VK_SPACE) || (info->wVKey == VK_RETURN)) )
{
wxTreeEvent event2(wxEVT_COMMAND_TREE_ITEM_ACTIVATED,