// wxVirutalNode is used in place of a single root when 'hidden' root is
// specified.
-class wxVirtualNode
+class wxVirtualNode : public wxTreeViewItem
{
public:
wxVirtualNode(wxTreeItemData *data)
+ : wxTreeViewItem(TVI_ROOT, 0)
{
m_data = data;
-
- m_tvItem = new wxTreeViewItem(TVI_ROOT, 0);
}
~wxVirtualNode()
{
delete m_data;
- delete m_tvItem;
}
wxTreeItemData *GetData() const { return m_data; }
void SetData(wxTreeItemData *data) { delete m_data; m_data = data; }
private:
- wxTreeViewItem *m_tvItem;
wxTreeItemData *m_data;
};
return TVI_ROOT;
}
- return DoInsertItem(wxTreeItemId((WXHTREEITEM) 0), (WXHTREEITEM) 0,
+ return DoInsertItem(wxTreeItemId((long)(WXHTREEITEM) 0), (long)(WXHTREEITEM) 0,
text, image, selectedImage, data);
}
wxT("Unknown flag in wxTreeCtrl::DoExpand") );
// A hidden root can be neither expanded nor collapsed.
- if ( (HITEM(item) == TVI_ROOT) && (m_windowStyle & wxTR_HIDE_ROOT) )
- {
- // No action will be taken.
- return;
- }
+ wxCHECK_RET( !(m_windowStyle & wxTR_HIDE_ROOT) || (HITEM(item) != TVI_ROOT),
+ wxT("Can't expand/collapse hidden root node!") )
// TreeView_Expand doesn't send TVN_ITEMEXPAND(ING) messages, so we must
// emulate them. This behaviour has changed slightly with comctl32.dll
wxTextCtrl* wxTreeCtrl::GetEditControl() const
{
- // normally, we could try to do something like this to return something
- // even when the editing was started by the user and not by calling
- // EditLabel() - but as nobody has asked for this so far and there might be
- // problems in the code below, I leave it disabled for now (VZ)
-#if 0
- if ( !m_textCtrl )
- {
- HWND hwndText = TreeView_GetEditControl(GetHwnd());
- if ( hwndText )
- {
- m_textCtrl = new wxTextCtrl(this, -1);
- m_textCtrl->Hide();
- m_textCtrl->SetHWND((WXHWND)hwndText);
- }
- //else: not editing label right now
- }
-#endif // 0
-
return m_textCtrl;
}
DeleteTextCtrl();
+ m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
HWND hWnd = (HWND) TreeView_EditLabel(GetHwnd(), HITEM(item));
// this is not an error - the TVN_BEGINLABELEDIT handler might have
// returned FALSE
if ( !hWnd )
{
+ delete m_textCtrl;
+ m_textCtrl = NULL;
return NULL;
}
- m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
- m_textCtrl->SetParent(this);
- m_textCtrl->SetHWND((WXHWND)hWnd);
- m_textCtrl->SubclassWin((WXHWND)hWnd);
-
+ // textctrl is subclassed in MSWOnNotify
return m_textCtrl;
}
eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
- // we pass 0 as last CreateKeyEvent() parameter because we
+ // we pass 0 as 2 last CreateKeyEvent() parameters because we
// don't have access to the real key press flags here - but as
// it is only used to determin wxKeyEvent::m_altDown flag it's
// not too bad
event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
- wxCharCodeMSWToWX(info->wVKey),
- 0);
+ wxCharCodeMSWToWX(info->wVKey));
// a separate event for Space/Return
if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
case TVN_BEGINLABELEDIT:
// return TRUE to cancel label editing
*result = !event.IsAllowed();
+ // set ES_WANTRETURN ( like we do in BeginLabelEdit )
+ if(event.IsAllowed())
+ {
+ HWND hText = TreeView_GetEditControl(GetHwnd());
+ if(hText != NULL)
+ {
+ // MBN: if m_textCtrl already has an HWND, it is a stale
+ // pointer from a previous edit (because the user
+ // didn't modify the label before dismissing the control,
+ // and TVN_ENDLABELEDIT was not sent), so delete it
+ if(m_textCtrl && m_textCtrl->GetHWND() != 0)
+ DeleteTextCtrl();
+ if(!m_textCtrl)
+ m_textCtrl = new wxTextCtrl();
+ m_textCtrl->SetParent(this);
+ m_textCtrl->SetHWND((WXHWND)hText);
+ m_textCtrl->SubclassWin((WXHWND)hText);
+
+ // set wxTE_PROCESS_ENTER style for the text control to
+ // force it to process the Enter presses itself, otherwise
+ // they could be stolen from it by the dialog
+ // navigation code
+ m_textCtrl->SetWindowStyle(m_textCtrl->GetWindowStyle()
+ | wxTE_PROCESS_ENTER);
+ }
+ }
break;
case TVN_ENDLABELEDIT: