X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df63b2a48fe633850f62bb87bc87a395444b2d5a..e216f7c8cfb235fbf6a3ba6301eb4b17c5528aae:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 024af8d6eb..f314a7a873 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -56,16 +56,6 @@ // private functions // ---------------------------------------------------------------------------- -// wrapper for TreeView_HitTest -static HTREEITEM GetItemFromPoint(HWND hwndTV, int x, int y) -{ - TV_HITTESTINFO tvht; - tvht.pt.x = x; - tvht.pt.y = y; - - return (HTREEITEM)TreeView_HitTest(hwndTV, &tvht); -} - // wrappers for TreeView_GetItem/TreeView_SetItem static bool IsItemSelected(HWND hwndTV, HTREEITEM hItem) { @@ -659,7 +649,7 @@ bool wxTreeCtrl::Create(wxWindow *parent, if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; - DWORD exStyle = 0; + WXDWORD exStyle = 0; DWORD wstyle = MSWGetStyle(m_windowStyle, & exStyle); wstyle |= WS_TABSTOP | TVS_SHOWSELALWAYS; @@ -1172,6 +1162,10 @@ void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font) attr->SetFont(font); + // Reset the item's text to ensure that the bounding rect will be adjusted + // for the new font. + SetItemText(item, GetItemText(item)); + RefreshItem(item); } @@ -2005,31 +1999,46 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara { int x = GET_X_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 - wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, - wxTreeItemId(TreeView_GetSelection(GetHwnd()))); - - // Get the bounding rectangle for the item, including the non-text areas - wxRect ItemRect; - GetBoundingRect(event.m_item, ItemRect, false); - // 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 (ItemRect.Contains(MenuPoint)) + + // the item for which the menu should be shown + wxTreeItemId item; + + // the position where the menu should be shown in client coordinates + // (so that it can be passed directly to PopupMenu()) + wxPoint pt; + + if ( x == -1 || y == -1 ) { - 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, - // in the vertical middle of the text. Should be the case for the "menu" key - else + else // event from mouse, use mouse position { - // Use the bounding rectangle of only the text part - GetBoundingRect(event.m_item, ItemRect, true); - event.m_pointDrag = wxPoint(ItemRect.GetX(), ItemRect.GetY() + ItemRect.GetHeight() / 2); + pt = ScreenToClient(wxPoint(x, y)); + + 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) ) processed = true; //else: continue with generating wxEVT_CONTEXT_MENU in base class code @@ -2040,13 +2049,12 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara // same meaning for all of them 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; - (void) TreeView_HitTest(GetHwnd(), &tvht); + HTREEITEM htItem = TreeView_HitTest(GetHwnd(), &tvht); switch ( nMsg ) { @@ -2216,6 +2224,8 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara // generate the drag end event wxTreeEvent event(wxEVT_COMMAND_TREE_END_DRAG, this, htItem); + event.m_pointDrag = wxPoint(x, y); + (void)GetEventHandler()->ProcessEvent(event); // if we don't do it, the tree seems to think that 2 items