X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/80a4659776396941bbf7b08615dd60d35dbc47b5..63e1921d0be4956ab729735189ccf637773a7e27:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 1251bd8dc3..0ac6f626c0 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -84,13 +84,21 @@ class TreeItemUnlocker { public: // unlock a single item - TreeItemUnlocker(HTREEITEM item) { ms_unlockedItem = item; } + TreeItemUnlocker(HTREEITEM item) + { + m_oldUnlockedItem = ms_unlockedItem; + ms_unlockedItem = item; + } // unlock all items, don't use unless absolutely necessary - TreeItemUnlocker() { ms_unlockedItem = (HTREEITEM)-1; } + TreeItemUnlocker() + { + m_oldUnlockedItem = ms_unlockedItem; + ms_unlockedItem = (HTREEITEM)-1; + } // lock everything back - ~TreeItemUnlocker() { ms_unlockedItem = NULL; } + ~TreeItemUnlocker() { ms_unlockedItem = m_oldUnlockedItem; } // check if the item state is currently locked @@ -99,6 +107,9 @@ public: private: static HTREEITEM ms_unlockedItem; + HTREEITEM m_oldUnlockedItem; + + wxDECLARE_NO_COPY_CLASS(TreeItemUnlocker); }; HTREEITEM TreeItemUnlocker::ms_unlockedItem = NULL; @@ -959,7 +970,7 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) return; wxTreeViewItem tvItem(item, TVIF_TEXT); - tvItem.pszText = (wxChar *)text.wx_str(); // conversion is ok + tvItem.pszText = wxMSW_CONV_LPTSTR(text); DoSetItem(&tvItem); // when setting the text of the item being edited, the text control should @@ -972,7 +983,7 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) { if ( item == m_idEdited ) { - ::SetWindowText(hwndEdit, text.wx_str()); + ::SetWindowText(hwndEdit, text.t_str()); } } } @@ -1476,7 +1487,7 @@ wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent, if ( !text.empty() ) { mask |= TVIF_TEXT; - tvIns.item.pszText = (wxChar *)text.wx_str(); // cast is ok + tvIns.item.pszText = wxMSW_CONV_LPTSTR(text); } else { @@ -2914,10 +2925,7 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // click if needed if ( processed ) { - int htFlags = 0; - wxTreeItemId item = HitTest(wxPoint(x, y), htFlags); - - if ( htFlags & wxTREE_HITTEST_ONITEMSTATEICON ) + if ( tvht.flags & TVHT_ONITEMSTATEICON ) { m_triggerStateImageClick = true; } @@ -3505,7 +3513,10 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { wxLoadedDLL dllComCtl32(wxT("comctl32.dll")); if ( dllComCtl32.IsLoaded() ) + { wxDL_INIT_FUNC(s_pfn, ImageList_Copy, dllComCtl32); + loaded = true; + } } if ( !s_pfnImageList_Copy ) @@ -3912,4 +3923,32 @@ void wxTreeCtrl::DoSetItemState(const wxTreeItemId& item, int state) DoSetItem(&tvItem); } +// ---------------------------------------------------------------------------- +// Update locking. +// ---------------------------------------------------------------------------- + +// Using WM_SETREDRAW with the native control is a bad idea as it's broken in +// some Windows versions (see http://support.microsoft.com/kb/130611) and +// doesn't seem to do anything in other ones (e.g. under Windows 7 the tree +// control keeps updating its scrollbars while the items are added to it, +// resulting in horrible flicker when adding even a couple of dozen items). +// So we hide it instead of freezing -- this still flickers, but actually not +// as badly as it would if we didn't do it. + +void wxTreeCtrl::DoFreeze() +{ + // Notice that we don't call wxWindow::Hide() here as we want the window to + // remain shown from wxWidgets point of view and also because + // wxWindowMSW::Show() calls Do{Freeze,Thaw}() itself, so we'd get into + // infinite recursion this way. + if ( IsShown() ) + ::ShowWindow(GetHwnd(), SW_HIDE); +} + +void wxTreeCtrl::DoThaw() +{ + if ( IsShown() ) + ::ShowWindow(GetHwnd(), SW_SHOW); +} + #endif // wxUSE_TREECTRL