wxTreeViewItem tvItem(item, TVIF_TEXT);
tvItem.pszText = (wxChar *)text.c_str(); // conversion is ok
DoSetItem(&tvItem);
+
+ // when setting the text of the item being edited, the text control should
+ // be updated to reflect the new text as well, otherwise calling
+ // SetItemText() in the OnBeginLabelEdit() handler doesn't have any effect
+ //
+ // don't use GetEditControl() here because m_textCtrl is not set yet
+ HWND hwndEdit = TreeView_GetEditControl(GetHwnd());
+ if ( hwndEdit )
+ {
+ if ( item == GetSelection() )
+ {
+ ::SetWindowText(hwndEdit, text);
+ }
+ }
}
int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
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
+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: