MsgProcResult TreeView::OnNotify(LPNMHDR lpnmhdr) { switch(lpnmhdr->code) { case TVN_SELCHANGED: { LPNMTREEVIEW lpnmtv = reinterpret_cast<LPNMTREEVIEW>(lpnmhdr); TreeNode* newNode = reinterpret_cast<TreeNode*>(lpnmtv->itemNew.lParam); TreeNode* oldNode = reinterpret_cast<TreeNode*>(lpnmtv->itemOld.lParam); SignalSelChanged.emit(newNode, oldNode); OnSelChanged(newNode, oldNode); } break; case NM_DBLCLK: case NM_RDBLCLK: case NM_CLICK: case NM_RCLICK: { POINT pt = GetMessageClientPos(); TreeNode* node = HitTest(pt); if(node) { // Select item in case of a right click, otherwise windows jumps back to the previous item if(lpnmhdr->code == NM_RDBLCLK || lpnmhdr->code == NM_RCLICK) TreeView_SelectItem(mhWnd, node->GetHandle()); MouseEvent ev(this, pt, lpnmhdr->code == NM_DBLCLK ? 2 : 1, 0, lpnmhdr->code == NM_DBLCLK || lpnmhdr->code == NM_CLICK ? MouseButton::Left : MouseButton::Right); SignalItemClick.emit(node, ev); } } break; case TVN_BEGINLABELEDIT: { LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lpnmhdr; TreeNode* node = reinterpret_cast<TreeNode*>(ptvdi->item.lParam); HWND edit = TreeView_GetEditControl(mhWnd); std::string text = ptvdi->item.pszText; SignalBeginLabelEdit.emit(node, text); Edit_SetText(edit, text.c_str()); } break; case TVN_ENDLABELEDIT: { LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lpnmhdr; if(ptvdi->item.pszText == nullptr) break; TreeNode* node = reinterpret_cast<TreeNode*>(ptvdi->item.lParam); std::string text = ptvdi->item.pszText; if(SignalEndLabelEdit.emit(node, text)) node->SetText(text); return MsgProcResult(false); } break; } return MsgProcResult::Default; }
TreeNode* TreeNode::AddNode( const UnicodeString& strLabel ) { TreeNode* node = new TreeNode( this ); node->SetText( strLabel ); node->Dock( Pos::Top ); node->SetRoot( gwen_cast<TreeControl>( this ) != NULL ); node->SetTreeControl( m_TreeControl ); if ( m_TreeControl ) { m_TreeControl->OnNodeAdded( node ); } return node; }
TreeNode* TreeNode::AddNode( const UnicodeString& strLabel ) { // int sz = sizeof(TreeNode); TreeNode* node = new TreeNode( this ); node->SetText( strLabel ); node->Dock( Pos::Top ); node->SetRoot( this->DynamicCastTreeControl() != NULL ); node->SetTreeControl( m_TreeControl ); if ( m_TreeControl ) { m_TreeControl->OnNodeAdded( node ); } return node; }