]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / msw / treectrl.cpp
index 7963ab43310e628a4e826966fc7d5a74922af3e1..0ac6f626c0ccec0da55434dc010c097c2f6d5ea8 100644 (file)
@@ -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;
@@ -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