X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3a5a2f56f25522d5e6662022fb05cf4539a70e91..6bc5e910c42d8212272a350b20841ab9d8a87719:/src/msw/treectrl.cpp?ds=inline diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index b129018649..7a5c6af4f2 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -407,8 +407,10 @@ wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item), long& _cookie) const { - return wxTreeItemId((WXHTREEITEM) TreeView_GetNextSibling(wxhWnd, - (HTREEITEM) (WXHTREEITEM)_cookie)); + wxTreeItemId l=wxTreeItemId((WXHTREEITEM) TreeView_GetNextSibling(wxhWnd, + (HTREEITEM) (WXHTREEITEM)_cookie)); + _cookie=(long)l; + return l; } wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const @@ -467,7 +469,7 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent, mask |= TVIF_IMAGE; tvIns.item.iImage = image; - if ( selectedImage = -1 ) + if ( selectedImage == -1 ) { // take the same image for selected icon if not specified selectedImage = image; @@ -488,12 +490,18 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent, tvIns.item.mask = mask; - HTREEITEM id = (HTREEITEM) TreeView_InsertItem(wxhWnd, &tvIns); + HTREEITEM id = TreeView_InsertItem(wxhWnd, &tvIns); if ( id == 0 ) { wxLogLastError("TreeView_InsertItem"); } + if ( data != NULL ) + { + // associate the application tree item with Win32 tree item handle + data->SetId((WXHTREEITEM)id); + } + return wxTreeItemId((WXHTREEITEM)id); } @@ -545,7 +553,8 @@ wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent, void wxTreeCtrl::Delete(const wxTreeItemId& item) { wxTreeItemData *data = GetItemData(item); - delete data; // may be NULL, ok + if(data!=NULL) + delete data; // may be NULL, ok if ( !TreeView_DeleteItem(wxhWnd, (HTREEITEM)(WXHTREEITEM)item) ) { @@ -612,6 +621,11 @@ void wxTreeCtrl::Toggle(const wxTreeItemId& item) DoExpand(item, TVE_TOGGLE); } +void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) +{ + DoExpand(item, action); +} + void wxTreeCtrl::Unselect() { SelectItem(wxTreeItemId((WXHTREEITEM) 0)); @@ -755,7 +769,7 @@ bool wxTreeCtrl::MSWCommand(WXUINT cmd, WXWORD id) } // process WM_NOTIFY Windows message -bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) +bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM *result) { wxTreeEvent event(wxEVT_NULL, m_windowId); wxEventType eventType = wxEVT_NULL; @@ -881,36 +895,28 @@ bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) } default: - return wxControl::MSWNotify(wParam, lParam); + return wxControl::MSWNotify(wParam, lParam, result); } event.SetEventObject(this); event.SetEventType(eventType); - bool rc = GetEventHandler()->ProcessEvent(event); + bool processed = GetEventHandler()->ProcessEvent(event); // post processing - switch ( hdr->code ) + if ( hdr->code == TVN_DELETEITEM ) { // NB: we might process this message using wxWindows event tables, but // due to overhead of wxWin event system we prefer to do it here // (otherwise deleting a tree with many items is just too slow) - case TVN_DELETEITEM: - { - NM_TREEVIEW* tv = (NM_TREEVIEW *)lParam; - wxTreeItemData *data = (wxTreeItemData *)tv->itemOld.lParam; - delete data; // may be NULL, ok - } - break; - - case TVN_ITEMEXPANDING: - // if user called Veto(), don't allow expansion/collapse by - // returning TRUE from here - rc = event.m_code != 0; - break; + NM_TREEVIEW* tv = (NM_TREEVIEW *)lParam; + wxTreeItemData *data = (wxTreeItemData *)tv->itemOld.lParam; + delete data; // may be NULL, ok } - return rc; + *result = !event.IsAllowed(); + + return processed; } // ---------------------------------------------------------------------------- @@ -920,7 +926,7 @@ bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent) wxTreeEvent::wxTreeEvent(wxEventType commandType, int id) - : wxCommandEvent(commandType, id) + : wxNotifyEvent(commandType, id) { m_code = 0; m_itemOld = 0;