]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
remove incorrect cast of wxString to char* (unnecessary and breaks wxUSE_STL build)
[wxWidgets.git] / src / msw / treectrl.cpp
index 14246836db7a631aaf4e5d1031ae7f8872d45b00..adde05b475d3e06b9d8780b7b6264945e71b4173 100644 (file)
@@ -37,6 +37,7 @@
     #include "wx/settings.h"
 #endif
 
+#include "wx/dynlib.h"
 #include "wx/msw/private.h"
 
 // Set this to 1 to be _absolutely_ sure that repainting will work for all
@@ -1213,6 +1214,12 @@ bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
 {
     wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
 
+    if ( IS_VIRTUAL_ROOT(item) )
+    {
+        wxTreeItemIdValue cookie;
+        return GetFirstChild(item, cookie).IsOk();
+    }
+
     wxTreeViewItem tvItem(item, TVIF_CHILDREN);
     DoGetItem(&tvItem);
 
@@ -2691,6 +2698,68 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                         // notify us before painting each item
                         *result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW
                                                : CDRF_DODEFAULT;
+
+                        // windows in TreeCtrl use one-based index for item state images,
+                        // 0 indexed image is not being used, we're using zero-based index,
+                        // so we have to add temp image (of zero index) to state image list
+                        // before we draw any item, then after items are drawn we have to
+                        // delete it (in POSTPAINT notify)
+                        if (m_imageListState && m_imageListState->GetImageCount() > 0)
+                        {
+                            typedef BOOL (*ImageList_Copy_t)
+                                (HIMAGELIST, int, HIMAGELIST, int, UINT);
+                            static ImageList_Copy_t s_pfnImageList_Copy = NULL;
+                            static bool loaded = false;
+
+                            if ( !loaded )
+                            {
+                                wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
+                                if ( dllComCtl32.IsLoaded() )
+                                    wxDL_INIT_FUNC(s_pfn, ImageList_Copy, dllComCtl32);
+                            }
+
+                            if ( !s_pfnImageList_Copy )
+                            {
+                                // this code is broken with ImageList_Copy()
+                                // but I don't care enough about Win95 support
+                                // to write it now -- if anybody does, please
+                                // do it
+                                wxFAIL_MSG("TODO: implement this for Win95");
+                                break;
+                            }
+
+                            const HIMAGELIST
+                                hImageList = GetHimagelistOf(m_imageListState);
+
+                            // add temporary image
+                            int width, height;
+                            m_imageListState->GetSize(0, width, height);
+
+                            HBITMAP hbmpTemp = ::CreateBitmap(width, height, 1, 1, NULL);
+                            int index = ::ImageList_Add(hImageList, hbmpTemp, hbmpTemp);
+                            ::DeleteObject(hbmpTemp);
+
+                            if ( index != -1 )
+                            {
+                                // move images to right
+                                for ( int i = index; i > 0; i-- )
+                                {
+                                    (*s_pfnImageList_Copy)(hImageList, i,
+                                                           hImageList, i-1,
+                                                           ILCF_MOVE);
+                                }
+
+                                // we must remove the image in POSTPAINT notify
+                                *result |= CDRF_NOTIFYPOSTPAINT;
+                            }
+                        }
+                        break;
+
+                    case CDDS_POSTPAINT:
+                        // we are deleting temp image of 0 index, which was
+                        // added before items were drawn (in PREPAINT notify)
+                        if (m_imageListState && m_imageListState->GetImageCount() > 0)
+                            m_imageListState->Remove(0);
                         break;
 
                     case CDDS_ITEMPREPAINT:
@@ -2821,11 +2890,12 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
     switch ( hdr->code )
     {
         case NM_DBLCLK:
-            // we translate NM_DBLCLK into ACTIVATED event, so don't interpret
-            // the return code of this event handler as the return value for
-            // NM_DBLCLK - otherwise, double clicking the item to toggle its
-            // expanded status would never work
-            *result = false;
+            // we translate NM_DBLCLK into ACTIVATED event and if the user
+            // handled the activation of the item we shouldn't proceed with
+            // also using the same double click for toggling the item expanded
+            // state -- but OTOH do let the user to expand/collapse the item by
+            // double clicking on it if the activation is not handled specially
+            *result = processed;
             break;
 
         case NM_RCLICK: