return correct item and position from wxTreeEvent::GetItem/Point() (patch 1622166)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44118 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1084,8 +1084,12 @@ void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event)
|
|||||||
{
|
{
|
||||||
m_draggedItem = event.GetItem();
|
m_draggedItem = event.GetItem();
|
||||||
|
|
||||||
wxLogMessage(wxT("OnBeginDrag: started dragging %s"),
|
wxPoint clientpt = event.GetPoint();
|
||||||
GetItemText(m_draggedItem).c_str());
|
wxPoint screenpt = ClientToScreen(clientpt);
|
||||||
|
|
||||||
|
wxLogMessage(wxT("OnBeginDrag: started dragging %s at screen coords (%i,%i)"),
|
||||||
|
GetItemText(m_draggedItem).c_str(),
|
||||||
|
screenpt.x, screenpt.y);
|
||||||
|
|
||||||
event.Allow();
|
event.Allow();
|
||||||
}
|
}
|
||||||
@@ -1195,45 +1199,21 @@ void MyTreeCtrl::OnItemMenu(wxTreeEvent& event)
|
|||||||
wxTreeItemId itemId = event.GetItem();
|
wxTreeItemId itemId = event.GetItem();
|
||||||
MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId)
|
MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId)
|
||||||
: NULL;
|
: NULL;
|
||||||
|
wxPoint clientpt = event.GetPoint();
|
||||||
|
wxPoint screenpt = ClientToScreen(clientpt);
|
||||||
|
|
||||||
wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()
|
wxLogMessage(wxT("OnItemMenu for item \"%s\" at screen coords (%i, %i)"),
|
||||||
: _T(""));
|
item ? item->GetDesc() : _T(""), screenpt.x, screenpt.y);
|
||||||
|
|
||||||
|
ShowMenu(itemId, clientpt);
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyTreeCtrl::OnContextMenu(wxContextMenuEvent& event)
|
void MyTreeCtrl::OnContextMenu(wxContextMenuEvent& event)
|
||||||
{
|
{
|
||||||
wxPoint pt = event.GetPosition();
|
wxPoint pt = event.GetPosition();
|
||||||
wxTreeItemId item;
|
|
||||||
wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);
|
wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);
|
||||||
|
|
||||||
// check if event was generated by keyboard (MSW-specific?)
|
|
||||||
if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)
|
|
||||||
{
|
|
||||||
if ( !HasFlag(wxTR_MULTIPLE) )
|
|
||||||
item = GetSelection();
|
|
||||||
|
|
||||||
// attempt to guess where to show the menu
|
|
||||||
if ( item.IsOk() )
|
|
||||||
{
|
|
||||||
// if an item was clicked, show menu to the right of it
|
|
||||||
wxRect rect;
|
|
||||||
GetBoundingRect(item, rect, true /* only the label */);
|
|
||||||
pt = wxPoint(rect.GetRight(), rect.GetTop());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pt = wxPoint(0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // event was generated by mouse, use supplied coords
|
|
||||||
{
|
|
||||||
pt = ScreenToClient(pt);
|
|
||||||
item = HitTest(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
ShowMenu(item, pt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt)
|
void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt)
|
||||||
|
@@ -2009,31 +2009,46 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara
|
|||||||
{
|
{
|
||||||
int x = GET_X_LPARAM(lParam),
|
int x = GET_X_LPARAM(lParam),
|
||||||
y = GET_Y_LPARAM(lParam);
|
y = GET_Y_LPARAM(lParam);
|
||||||
// Convert the screen point to a client point
|
|
||||||
wxPoint MenuPoint = ScreenToClient(wxPoint(x, y));
|
|
||||||
|
|
||||||
// can't use GetSelection() here as it would assert in multiselect mode
|
// the item for which the menu should be shown
|
||||||
wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this,
|
wxTreeItemId item;
|
||||||
wxTreeItemId(TreeView_GetSelection(GetHwnd())));
|
|
||||||
|
|
||||||
// Get the bounding rectangle for the item, including the non-text areas
|
// the position where the menu should be shown in client coordinates
|
||||||
wxRect ItemRect;
|
// (so that it can be passed directly to PopupMenu())
|
||||||
GetBoundingRect(event.m_item, ItemRect, false);
|
wxPoint pt;
|
||||||
// If the point is inside the bounding rectangle, use it as the click position.
|
|
||||||
// This should be the case for WM_CONTEXTMENU as the result of a right-click
|
if ( x == -1 || y == -1 )
|
||||||
if (ItemRect.Contains(MenuPoint))
|
|
||||||
{
|
{
|
||||||
event.m_pointDrag = MenuPoint;
|
// this means that the event was generated from keyboard (e.g. with
|
||||||
|
// Shift-F10 or special Windows menu key)
|
||||||
|
//
|
||||||
|
// use the Explorer standard of putting the menu at the left edge
|
||||||
|
// of the text, in the vertical middle of the text
|
||||||
|
item = wxTreeItemId(TreeView_GetSelection(GetHwnd()));
|
||||||
|
if ( item.IsOk() )
|
||||||
|
{
|
||||||
|
// Use the bounding rectangle of only the text part
|
||||||
|
wxRect rect;
|
||||||
|
GetBoundingRect(item, rect, true);
|
||||||
|
pt = wxPoint(rect.GetX(), rect.GetY() + rect.GetHeight() / 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Use the Explorer standard of putting the menu at the left edge of the text,
|
else // event from mouse, use mouse position
|
||||||
// in the vertical middle of the text. Should be the case for the "menu" key
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// Use the bounding rectangle of only the text part
|
pt = ScreenToClient(wxPoint(x, y));
|
||||||
GetBoundingRect(event.m_item, ItemRect, true);
|
|
||||||
event.m_pointDrag = wxPoint(ItemRect.GetX(), ItemRect.GetY() + ItemRect.GetHeight() / 2);
|
TV_HITTESTINFO tvhti;
|
||||||
|
tvhti.pt.x = pt.x;
|
||||||
|
tvhti.pt.y = pt.y;
|
||||||
|
if ( TreeView_HitTest(GetHwnd(), &tvhti) )
|
||||||
|
item = wxTreeItemId(tvhti.hItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create the event
|
||||||
|
wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, item);
|
||||||
|
|
||||||
|
event.m_pointDrag = pt;
|
||||||
|
|
||||||
if ( GetEventHandler()->ProcessEvent(event) )
|
if ( GetEventHandler()->ProcessEvent(event) )
|
||||||
processed = true;
|
processed = true;
|
||||||
//else: continue with generating wxEVT_CONTEXT_MENU in base class code
|
//else: continue with generating wxEVT_CONTEXT_MENU in base class code
|
||||||
|
Reference in New Issue
Block a user