From 09f277d6838930b81f99a60afe55d408d9b5bc54 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 27 Jun 2006 14:58:46 +0000 Subject: [PATCH] added a wxTreeEvent ctor taking the associated wxTreeCtrl and optional wxTreeItemId; this reduces code duplication and also allows us to easily ensure that client data pointer is set properly for all events (it was never initialized before) (replaces patch 1503531) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39852 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/treebase.cpp | 15 ++++++--- src/generic/treectlg.cpp | 68 +++++++++++----------------------------- src/msw/treectrl.cpp | 52 +++++++++++------------------- 3 files changed, 48 insertions(+), 87 deletions(-) diff --git a/src/common/treebase.cpp b/src/common/treebase.cpp index e38866e7d1..252415eae4 100644 --- a/src/common/treebase.cpp +++ b/src/common/treebase.cpp @@ -59,14 +59,21 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU) // Tree event // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxNotifyEvent) +IMPLEMENT_ABSTRACT_CLASS(wxTreeEvent, wxNotifyEvent) -wxTreeEvent::wxTreeEvent(wxEventType commandType, int id) - : wxNotifyEvent(commandType, id) +wxTreeEvent::wxTreeEvent(wxEventType commandType, + wxTreeCtrlBase *tree, + const wxTreeItemId& item) + : wxNotifyEvent(commandType, tree->GetId()), + m_item(item) { - m_itemOld = 0l; m_editCancelled = false; + + SetEventObject(tree); + + if ( item.IsOk() ) + SetClientObject(tree->GetItemData(item)); } wxTreeEvent::wxTreeEvent(const wxTreeEvent & event) diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index c0b0ca5d1a..f968f6a9b8 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -1493,9 +1493,7 @@ wxTreeItemId wxGenericTreeCtrl::DoInsertAfter(const wxTreeItemId& parentId, void wxGenericTreeCtrl::SendDeleteEvent(wxGenericTreeItem *item) { - wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_DELETE_ITEM, this, item); ProcessEvent( event ); } @@ -1613,9 +1611,7 @@ void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) if ( item->IsExpanded() ) return; - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDING, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_EXPANDING, this, item); if ( ProcessEvent( event ) && !event.IsAllowed() ) { @@ -1661,9 +1657,7 @@ void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) if ( !item->IsExpanded() ) return; - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, this, item); if ( ProcessEvent( event ) && !event.IsAllowed() ) { // cancelled by program @@ -1843,10 +1837,8 @@ void wxGenericTreeCtrl::DoSelectItem(const wxTreeItemId& itemId, return; } - wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, GetId() ); - event.m_item = item; + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); event.m_itemOld = m_current; - event.SetEventObject( this ); // TODO : Here we don't send any selection mode yet ! if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) @@ -2580,9 +2572,8 @@ void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &event ) void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) { - wxTreeEvent te( wxEVT_COMMAND_TREE_KEY_DOWN, GetId() ); + wxTreeEvent te( wxEVT_COMMAND_TREE_KEY_DOWN, this); te.m_evtKey = event; - te.SetEventObject( this ); if ( GetEventHandler()->ProcessEvent( te ) ) { // intercepted by the user code @@ -2648,22 +2639,19 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) wxRect ItemRect; GetBoundingRect(m_current, ItemRect, true); - wxTreeEvent eventMenu( wxEVT_COMMAND_TREE_ITEM_MENU, GetId() ); - eventMenu.m_item = m_current; + wxTreeEvent eventMenu(wxEVT_COMMAND_TREE_ITEM_MENU, this, m_current); // Use the left edge, vertical middle eventMenu.m_pointDrag = wxPoint(ItemRect.GetX(), ItemRect.GetY() + ItemRect.GetHeight() / 2); - eventMenu.SetEventObject( this ); GetEventHandler()->ProcessEvent( eventMenu ); - break; } + break; + case ' ': case WXK_RETURN: if ( !event.HasModifiers() ) { - wxTreeEvent eventAct( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, GetId() ); - eventAct.m_item = m_current; - eventAct.SetEventObject( this ); + wxTreeEvent eventAct(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, m_current); GetEventHandler()->ProcessEvent( eventAct ); } @@ -2923,9 +2911,7 @@ wxTextCtrl *wxGenericTreeCtrl::EditLabel(const wxTreeItemId& item, wxGenericTreeItem *itemEdit = (wxGenericTreeItem *)item.m_pItem; - wxTreeEvent te( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, GetId() ); - te.m_item = itemEdit; - te.SetEventObject( this ); + wxTreeEvent te(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, this, itemEdit); if ( GetEventHandler()->ProcessEvent( te ) && !te.IsAllowed() ) { // vetoed by user @@ -2969,9 +2955,7 @@ void wxGenericTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool wxGenericTreeCtrl::OnRenameAccept(wxGenericTreeItem *item, const wxString& value) { - wxTreeEvent le( wxEVT_COMMAND_TREE_END_LABEL_EDIT, GetId() ); - le.m_item = item; - le.SetEventObject( this ); + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); le.m_label = value; le.m_editCancelled = false; @@ -2981,9 +2965,7 @@ bool wxGenericTreeCtrl::OnRenameAccept(wxGenericTreeItem *item, void wxGenericTreeCtrl::OnRenameCancelled(wxGenericTreeItem *item) { // let owner know that the edit was cancelled - wxTreeEvent le( wxEVT_COMMAND_TREE_END_LABEL_EDIT, GetId() ); - le.m_item = item; - le.SetEventObject( this ); + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); le.m_label = wxEmptyString; le.m_editCancelled = true; @@ -2997,7 +2979,7 @@ void wxGenericTreeCtrl::OnRenameTimer() void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) { - if ( !m_anchor ) return; + if ( !m_anchor )return; wxPoint pt = CalcUnscrolledPosition(event.GetPosition()); @@ -3044,9 +3026,7 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) if (underMouseChanged && hoverItem.IsOk() && !m_isDragging && (!m_renameTimer || !m_renameTimer->IsRunning())) { // Ask the tree control what tooltip (if any) should be shown - wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, GetId()); - hevent.m_item = hoverItem; - hevent.SetEventObject(this); + wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, this, hoverItem); if ( GetEventHandler()->ProcessEvent(hevent) && hevent.IsAllowed() ) { @@ -3091,9 +3071,7 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) ? wxEVT_COMMAND_TREE_BEGIN_RDRAG : wxEVT_COMMAND_TREE_BEGIN_DRAG; - wxTreeEvent nevent( command, GetId() ); - nevent.m_item = m_current; - nevent.SetEventObject(this); + wxTreeEvent nevent(command, this, m_current); nevent.SetPoint(CalcScrolledPosition(pt)); // by default the dragging is not supported, the user code must @@ -3158,11 +3136,9 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } // generate the drag end event - wxTreeEvent eventEndDrag(wxEVT_COMMAND_TREE_END_DRAG, GetId()); + wxTreeEvent eventEndDrag(wxEVT_COMMAND_TREE_END_DRAG, this, item); - eventEndDrag.m_item = item; eventEndDrag.m_pointDrag = CalcScrolledPosition(pt); - eventEndDrag.SetEventObject(this); (void)GetEventHandler()->ProcessEvent(eventEndDrag); @@ -3204,18 +3180,14 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) DoSelectItem(item, true, false); } - wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, GetId()); - nevent.m_item = item; + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, this, item); nevent.m_pointDrag = CalcScrolledPosition(pt); - nevent.SetEventObject(this); event.Skip(!GetEventHandler()->ProcessEvent(nevent)); // Consistent with MSW (for now), send the ITEM_MENU *after* // the RIGHT_CLICK event. TODO: This behavior may change. - wxTreeEvent nevent2(wxEVT_COMMAND_TREE_ITEM_MENU, GetId()); - nevent2.m_item = item; + wxTreeEvent nevent2(wxEVT_COMMAND_TREE_ITEM_MENU, this, item); nevent2.m_pointDrag = CalcScrolledPosition(pt); - nevent2.SetEventObject(this); GetEventHandler()->ProcessEvent(nevent2); } else if ( event.LeftUp() ) @@ -3307,10 +3279,8 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) m_lastOnSame = false; // send activate event first - wxTreeEvent nevent( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, GetId() ); - nevent.m_item = item; + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, item); nevent.m_pointDrag = CalcScrolledPosition(pt); - nevent.SetEventObject( this ); if ( !GetEventHandler()->ProcessEvent( nevent ) ) { // if the user code didn't process the activate event, diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 915bfbd020..69c09c7d54 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -1684,16 +1684,12 @@ void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag) if ( TreeView_Expand(GetHwnd(), HITEM(item), flag) != 0 ) { - wxTreeEvent event(wxEVT_NULL, m_windowId); - event.m_item = item; - event.SetEventObject(this); - // note that the {EXPAND|COLLAPS}ING event is sent by TreeView_Expand() // itself - event.SetEventType(gs_expandEvents[IsExpanded(item) ? IDX_EXPAND - : IDX_COLLAPSE] - [IDX_DONE]); - + wxTreeEvent event(gs_expandEvents[IsExpanded(item) ? IDX_EXPAND + : IDX_COLLAPSE] + [IDX_DONE], + this, item); (void)GetEventHandler()->ProcessEvent(event); } //else: change didn't took place, so do nothing at all @@ -1781,11 +1777,7 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select) // the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so // send them ourselves - wxTreeEvent event(wxEVT_NULL, m_windowId); - event.m_item = item; - event.SetEventObject(this); - - event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGING); + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) { if ( !TreeView_SelectItem(GetHwnd(), HITEM(item)) ) @@ -2033,11 +2025,9 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara // Convert the screen point to a client point wxPoint MenuPoint = ScreenToClient(wxPoint(x, y)); - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_MENU, GetId() ); - // can't use GetSelection() here as it would assert in multiselect mode - event.m_item = wxTreeItemId(TreeView_GetSelection(GetHwnd())); - event.SetEventObject( this ); + 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; @@ -2259,12 +2249,7 @@ WXLRESULT wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara m_dragImage = NULL; // generate the drag end event - wxTreeEvent event(wxEVT_COMMAND_TREE_END_DRAG, m_windowId); - - event.m_item = htItem; - event.m_pointDrag = wxPoint(x, y); - event.SetEventObject(this); - + wxTreeEvent event(wxEVT_COMMAND_TREE_END_DRAG, this, htItem); (void)GetEventHandler()->ProcessEvent(event); // if we don't do it, the tree seems to think that 2 items @@ -2443,7 +2428,7 @@ wxTreeCtrl::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // process WM_NOTIFY Windows message bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { - wxTreeEvent event(wxEVT_NULL, m_windowId); + wxTreeEvent event(wxEVT_NULL, this); wxEventType eventType = wxEVT_NULL; NMHDR *hdr = (NMHDR *)lParam; @@ -2618,16 +2603,13 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( !wxIsCtrlDown() && !wxIsShiftDown() && !isAltDown && ((info->wVKey == VK_SPACE) || (info->wVKey == VK_RETURN)) ) { - wxTreeEvent event2(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, - m_windowId); - event2.SetEventObject(this); - if ( !(GetWindowStyle() & wxTR_MULTIPLE) ) - { - event2.m_item = GetSelection(); - } - //else: don't know how to get it + wxTreeItemId item; + if ( !HasFlag(wxTR_MULTIPLE) ) + item = GetSelection(); - (void)GetEventHandler()->ProcessEvent(event2); + wxTreeEvent event2(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, + this, item); + (void)GetEventHandler()->ProcessEvent(event2); } } break; @@ -2796,9 +2778,11 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) return wxControl::MSWOnNotify(idCtrl, lParam, result); } - event.SetEventObject(this); event.SetEventType(eventType); + if ( event.m_item.IsOk() ) + event.SetClientObject(GetItemData(event.m_item)); + bool processed = GetEventHandler()->ProcessEvent(event); // post processing -- 2.45.2