]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
Use the data scheme to load resources in the WebKitGTK+ implementation, rather than...
[wxWidgets.git] / src / msw / treectrl.cpp
index 4fd9657d16d5814f2ef7d31fa24819e95cb36230..c00ead4cf3304d5d58e7015bcb168952baaecee1 100644 (file)
@@ -42,6 +42,7 @@
 
 #include "wx/imaglist.h"
 #include "wx/msw/dragimag.h"
+#include "wx/msw/uxtheme.h"
 
 // macros to hide the cast ugliness
 // --------------------------------
@@ -76,7 +77,7 @@ typedef struct tagNMTVITEMCHANGE
 // The vista tree control includes some new code that originally broke the
 // multi-selection tree, causing seemingly spurious item selection state changes
 // during Shift or Ctrl-click item selection. (To witness the original broken
-// behavior, simply make IsLocked() below always return false). This problem was
+// behaviour, simply make IsLocked() below always return false). This problem was
 // solved by using the following class to 'unlock' an item's selection state.
 
 class TreeItemUnlocker
@@ -130,6 +131,32 @@ private:
 // private functions
 // ----------------------------------------------------------------------------
 
+namespace
+{
+
+// Work around a problem with TreeView_GetItemRect() when using MinGW/Cygwin:
+// it results in warnings about breaking strict aliasing rules because HITEM is
+// passed via a RECT pointer, so use a union to avoid them and define our own
+// version of the standard macro using it.
+union TVGetItemRectParam
+{
+    RECT rect;
+    HTREEITEM hItem;
+};
+
+inline bool
+wxTreeView_GetItemRect(HWND hwnd,
+                       HTREEITEM hItem,
+                       TVGetItemRectParam& param,
+                       BOOL fItemRect)
+{
+    param.hItem = hItem;
+    return ::SendMessage(hwnd, TVM_GETITEMRECT, fItemRect,
+                        (LPARAM)&param) == TRUE;
+}
+
+} // anonymous namespace
+
 // wrappers for TreeView_GetItem/TreeView_SetItem
 static bool IsItemSelected(HWND hwndTV, HTREEITEM hItem)
 {
@@ -741,6 +768,20 @@ bool wxTreeCtrl::Create(wxWindow *parent,
 
     wxSetCCUnicodeFormat(GetHwnd());
 
+    if ( m_windowStyle & wxTR_TWIST_BUTTONS )
+    {
+        // Under Vista and later Explorer uses rotating ("twist") buttons
+        // instead of the default "+/-" ones so apply its theme to the tree
+        // control to implement this style.
+        if ( wxGetWinVersion() >= wxWinVersion_Vista )
+        {
+            if ( wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive() )
+            {
+                theme->SetWindowTheme(GetHwnd(), L"EXPLORER", NULL);
+            }
+        }
+    }
+
     return true;
 }
 
@@ -1183,14 +1224,10 @@ bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
     }
 
     // Bug in Gnu-Win32 headers, so don't use the macro TreeView_GetItemRect
-    RECT rect;
-
-    // this ugliness comes directly from MSDN - it *is* the correct way to pass
-    // the HTREEITEM with TVM_GETITEMRECT
-    *(HTREEITEM *)&rect = HITEM(item);
+    TVGetItemRectParam param;
 
     // true means to get rect for just the text, not the whole line
-    if ( !::SendMessage(GetHwnd(), TVM_GETITEMRECT, true, (LPARAM)&rect) )
+    if ( !wxTreeView_GetItemRect(GetHwnd(), HITEM(item), param, TRUE) )
     {
         // if TVM_GETITEMRECT returned false, then the item is definitely not
         // visible (because its parent is not expanded)
@@ -1200,7 +1237,7 @@ bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
     // however if it returned true, the item might still be outside the
     // currently visible part of the tree, test for it (notice that partly
     // visible means visible here)
-    return rect.bottom > 0 && rect.top < GetClientSize().y;
+    return param.rect.bottom > 0 && param.rect.top < GetClientSize().y;
 }
 
 bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
@@ -1473,9 +1510,10 @@ wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent,
     // need this to make the "[+]" appear
     if ( firstChild )
     {
-        RECT rect;
-        TreeView_GetItemRect(GetHwnd(), HITEM(parent), &rect, FALSE);
-        ::InvalidateRect(GetHwnd(), &rect, FALSE);
+        TVGetItemRectParam param;
+
+        wxTreeView_GetItemRect(GetHwnd(), HITEM(parent), param, FALSE);
+        ::InvalidateRect(GetHwnd(), &param.rect, FALSE);
     }
 
     // associate the application tree item with Win32 tree item handle
@@ -2015,18 +2053,18 @@ bool wxTreeCtrl::GetBoundingRect(const wxTreeItemId& item,
                                  wxRect& rect,
                                  bool textOnly) const
 {
-    RECT rc;
-
     // Virtual root items have no bounding rectangle
     if ( IS_VIRTUAL_ROOT(item) )
     {
         return false;
     }
 
-    if ( TreeView_GetItemRect(GetHwnd(), HITEM(item),
-                              &rc, textOnly) )
+    TVGetItemRectParam param;
+
+    if ( wxTreeView_GetItemRect(GetHwnd(), HITEM(item), param, textOnly) )
     {
-        rect = wxRect(wxPoint(rc.left, rc.top), wxPoint(rc.right, rc.bottom));
+        rect = wxRect(wxPoint(param.rect.left, param.rect.top),
+                      wxPoint(param.rect.right, param.rect.bottom));
 
         return true;
     }
@@ -3078,16 +3116,16 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
             // do it for the other items itself - help it
             wxArrayTreeItemIds selections;
             size_t count = GetSelections(selections);
-            RECT rect;
+            TVGetItemRectParam param;
 
             for ( size_t n = 0; n < count; n++ )
             {
                 // TreeView_GetItemRect() will return false if item is not
                 // visible, which may happen perfectly well
-                if ( TreeView_GetItemRect(GetHwnd(), HITEM(selections[n]),
-                                          &rect, TRUE) )
+                if ( wxTreeView_GetItemRect(GetHwnd(), HITEM(selections[n]),
+                                            param, TRUE) )
                 {
-                    ::InvalidateRect(GetHwnd(), &rect, FALSE);
+                    ::InvalidateRect(GetHwnd(), &param.rect, FALSE);
                 }
             }
         }
@@ -3356,7 +3394,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         // the wrong items are deselected.
 
         // Fortunately, Vista provides a new notification, TVN_ITEMCHANGING
-        // that can be used to regulate this incorrect behavior.  The
+        // that can be used to regulate this incorrect behaviour.  The
         // following messages will allow only the unlocked item's selection
         // state to change