X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd6bd27059034bbde94e8ddcd68794b54285412d..11a2ce5ad289cb21b35cc21131b46f75dd4af060:/src/msw/treectrl.cpp?ds=sidebyside diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 84a8b01c20..97348c58ff 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -891,6 +891,20 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) 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, @@ -1761,7 +1775,7 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item) } } -wxTextCtrl* wxTreeCtrl::GetEditControl() const +wxTextCtrl *wxTreeCtrl::GetEditControl() const { return m_textCtrl; } @@ -1976,6 +1990,21 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) switch ( nMsg ) { + case WM_RBUTTONDOWN: + // if the item we are about to right click on + // is not already select, remove the entire + // previous selection + if (!::IsItemSelected(GetHwnd(), htItem)) + { + UnselectAll(); + } + + // select item and set the focus to the + // newly selected item + ::SelectItem(GetHwnd(), htItem); + ::SetFocus(GetHwnd(), htItem); + break; + #if !wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE case WM_LBUTTONDOWN: if ( htItem && isMultiple ) @@ -2199,6 +2228,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_item = (WXHTREEITEM) info->item.hItem; event.m_label = info->item.pszText; + event.m_editCancelled = FALSE; } break; @@ -2225,7 +2255,13 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_item = (WXHTREEITEM)info->item.hItem; event.m_label = info->item.pszText; if (info->item.pszText == NULL) - return FALSE; + { + event.m_editCancelled = TRUE; + } + else + { + event.m_editCancelled = FALSE; + } break; } @@ -2280,12 +2316,26 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) eventType = wxEVT_COMMAND_TREE_KEY_DOWN; TV_KEYDOWN *info = (TV_KEYDOWN *)lParam; - // 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 + // fabricate the lParam and wParam parameters sufficiently + // similar to the ones from a "real" WM_KEYDOWN so that + // CreateKeyEvent() works correctly + WXLPARAM lParam = + (::GetKeyState(VK_MENU) & 0x100 ? KF_ALTDOWN : 0) << 16; + + WXWPARAM wParam = info->wVKey; + + int keyCode = wxCharCodeMSWToWX(info->wVKey); + if ( !keyCode ) + { + // wxCharCodeMSWToWX() returns 0 to indicate that this is a + // simple ASCII key + keyCode = wParam; + } + event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, - wxCharCodeMSWToWX(info->wVKey)); + keyCode, + lParam, + wParam); // a separate event for Space/Return if ( !wxIsCtrlDown() && !wxIsShiftDown() && @@ -2349,17 +2399,16 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } HFONT hFont; - wxColour colText, colBack; if ( attr->HasFont() ) { - wxFont font = attr->GetFont(); - hFont = (HFONT)font.GetResourceHandle(); + hFont = GetHfontOf(attr->GetFont()); } else { hFont = 0; } + wxColour colText; if ( attr->HasTextColour() ) { colText = attr->GetTextColour(); @@ -2372,16 +2421,14 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // selection colours should override ours if ( nmcd.uItemState & CDIS_SELECTED ) { - DWORD clrBk = ::GetSysColor(COLOR_HIGHLIGHT); - lptvcd->clrTextBk = clrBk; - - // try to make the text visible - lptvcd->clrText = wxColourToRGB(colText); - lptvcd->clrText |= ~clrBk; - lptvcd->clrText &= 0x00ffffff; + lptvcd->clrTextBk = + ::GetSysColor(COLOR_HIGHLIGHT); + lptvcd->clrText = + ::GetSysColor(COLOR_HIGHLIGHTTEXT); } - else + else // !selected { + wxColour colBack; if ( attr->HasBackgroundColour() ) { colBack = attr->GetBackgroundColour(); @@ -2558,16 +2605,13 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // an image depending on the expanded/collapsed state - bug in // comctl32.dll or our code? { - NM_TREEVIEW* tv = (NM_TREEVIEW*)lParam; - if ( tv->action == TVE_EXPAND ) - { - wxTreeItemId id = (WXHTREEITEM)tv->itemNew.hItem; + NM_TREEVIEW* tv = (NM_TREEVIEW *)lParam; + wxTreeItemId id = (WXHTREEITEM)tv->itemNew.hItem; - int image = GetItemImage(id, wxTreeItemIcon_Expanded); - if ( image != -1 ) - { - RefreshItem(id); - } + int image = GetItemImage(id, wxTreeItemIcon_Expanded); + if ( image != -1 ) + { + RefreshItem(id); } } break; @@ -2575,7 +2619,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) case TVN_GETDISPINFO: // NB: so far the user can't set the image himself anyhow, so do it // anyway - but this may change later -// if ( /* !processed && */ 1 ) + //if ( /* !processed && */ 1 ) { wxTreeItemId item = event.m_item; TV_DISPINFO *info = (TV_DISPINFO *)lParam;