]> git.saurik.com Git - wxWidgets.git/commitdiff
missing functions implemented in wxMSW tree ctrl (custom sorting,
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Dec 1998 00:34:52 +0000 (00:34 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Dec 1998 00:34:52 +0000 (00:34 +0000)
GetChildrenCount(), DeleteChildren()).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1246 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/treectrl/treetest.cpp
samples/treectrl/treetest.h
samples/treectrl/treetest.rc
src/msw/treectrl.cpp

index b4f107e7967727e165394d825fc043d05c1f3855..8ae99c17cc92cedaed2222aa4c73145555ac041b 100644 (file)
@@ -265,6 +265,8 @@ void MyFrame::OnRecreate(wxCommandEvent& event)
 }
 
 // MyTreeCtrl implementation
+IMPLEMENT_DYNAMIC_CLASS(MyTreeCtrl, wxTreeCtrl)
+
 MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
                        const wxPoint& pos, const wxSize& size,
                        long style)
index b08a795631eca5d4216f6fc74214402bdfefcc1d..e0299c00459a7d3105a82d81fa42c7ec39aebe47 100644 (file)
@@ -36,6 +36,7 @@ public:
     TreeCtrlIcon_Folder
   };
 
+  MyTreeCtrl() { }
   MyTreeCtrl(wxWindow *parent, const wxWindowID id,
              const wxPoint& pos, const wxSize& size,
              long style);
@@ -78,6 +79,11 @@ private:
   wxImageList *m_imageListNormal;
   bool         m_reverseSort;           // flag for OnCompareItems
 
+  // NB: due to an ugly wxMSW hack you _must_ use DECLARE_DYNAMIC_CLASS()
+  //     if you want your overloaded OnCompareItems() to be called.
+  //     OTOH, if you don't want it you may omit the next line - this will
+  //     make default (alphabetical) sorting much faster under wxMSW.
+  DECLARE_DYNAMIC_CLASS(MyTreeCtrl)
   DECLARE_EVENT_TABLE()
 };
 
@@ -131,10 +137,4 @@ enum
   TreeTest_DeleteAll,
   TreeTest_Recreate,
   TreeTest_Ctrl = 100
-};
-
-enum
-{
-  TreeCtrlIcon_File,
-  TreeCtrlIcon_Folder
-};
+};
\ No newline at end of file
index 9a8ec911884d3fea02b1ada50e209c575643d912..c1a90c77247267bb88a2583dee4da899042129d0 100644 (file)
@@ -2,6 +2,6 @@ mondrian ICON "mondrian.ico"
 aaaa     ICON "mondrian.ico"
 #include "wx/msw/wx.rc"
 
-icon1   ICON "bitmaps\\folder1.ico"
-icon2   ICON "bitmaps\\file1.ico"
+icon1   ICON "bitmaps\\file1.ico"
+icon2   ICON "bitmaps\\folder1.ico"
 
index 42dd352347710e1b9859aaea4150c941228a140e..02f7e0ad92d82c48dc524d2366fab85073dbd1b3 100644 (file)
@@ -254,6 +254,31 @@ void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
     SetAnyImageList(m_imageListState = imageList, TVSIL_STATE);
 }
 
+size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item, bool recursively)
+{
+    long cookie;
+
+    size_t result = 0;
+
+    wxArrayLong children;
+    wxTreeItemId child = GetFirstChild(item, cookie);
+    while ( child.IsOk() )
+    {
+        if ( recursively )
+        {
+            // recursive call
+            result += GetChildrenCount(child, TRUE);
+        }
+
+        // add the child to the result in any case
+        result++;
+
+        child = GetNextChild(item, cookie);
+    }
+
+    return result;
+}
+
 // ----------------------------------------------------------------------------
 // Item access
 // ----------------------------------------------------------------------------
@@ -421,9 +446,10 @@ wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
 wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
                                       long& _cookie) const
 {
-    wxTreeItemId l=wxTreeItemId((WXHTREEITEM) TreeView_GetNextSibling(wxhWnd,
-                (HTREEITEM) (WXHTREEITEM)_cookie));
-    _cookie=(long)l;
+    wxTreeItemId l = wxTreeItemId((WXHTREEITEM)TreeView_GetNextSibling(wxhWnd,
+                                   (HTREEITEM)(WXHTREEITEM)_cookie));
+    _cookie = (long)l;
+
     return l;
 }
 
@@ -572,6 +598,30 @@ void wxTreeCtrl::Delete(const wxTreeItemId& item)
     }
 }
 
+// delete all children (but don't delete the item itself)
+void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
+{
+    long cookie;
+
+    wxArrayLong children;
+    wxTreeItemId child = GetFirstChild(item, cookie);
+    while ( child.IsOk() )
+    {
+        children.Add((long)(WXHTREEITEM)child);
+
+        child = GetNextChild(item, cookie);
+    }
+
+    size_t nCount = children.Count();
+    for ( size_t n = 0; n < nCount; n++ )
+    {
+        if ( !TreeView_DeleteItem(wxhWnd, (HTREEITEM)children[n]) )
+        {
+            wxLogLastError("TreeView_DeleteItem");
+        }
+    }
+}
+
 void wxTreeCtrl::DeleteAllItems()
 {
     if ( !TreeView_DeleteAllItems(wxhWnd) )
@@ -736,6 +786,16 @@ wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
     return wxTreeItemId((WXHTREEITEM) hitTestInfo.hItem);
 }
 
+// ----------------------------------------------------------------------------
+// sorting stuff
+// ----------------------------------------------------------------------------
+static int CALLBACK TreeView_CompareCallback(wxTreeItemData *pItem1,
+                                             wxTreeItemData *pItem2,
+                                             wxTreeCtrl *tree)
+{
+    return tree->OnCompareItems(pItem1->GetId(), pItem2->GetId());
+}
+
 int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
                                const wxTreeItemId& item2)
 {
@@ -745,34 +805,22 @@ int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
 void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
 {
     // rely on the fact that TreeView_SortChildren does the same thing as our
-    // default behaviour, i.e. sorts items alphabetically
-    if ( wxIS_KIND_OF(this, wxTreeCtrl) )
+    // default behaviour, i.e. sorts items alphabetically and so call it
+    // directly if we're not in derived class (much more efficient!)
+    if ( GetClassInfo() == CLASSINFO(wxTreeCtrl) )
     {
-        TreeView_SortChildren(wxhWnd, (HTREEITEM) (WXHTREEITEM) item, 0);
+        TreeView_SortChildren(wxhWnd, (HTREEITEM)(WXHTREEITEM)item, 0);
     }
     else
     {
-        // TODO: use TreeView_SortChildrenCB
-        wxFAIL_MSG("wxTreeCtrl::SortChildren not implemented");
+        TVSORTCB tvSort;
+        tvSort.hParent = (HTREEITEM)(WXHTREEITEM)item;
+        tvSort.lpfnCompare = (PFNTVCOMPARE)TreeView_CompareCallback;
+        tvSort.lParam = (LPARAM)this;
+        TreeView_SortChildrenCB(wxhWnd, &tvSort, 0 /* reserved */);
     }
 }
 
-size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item, bool recursively)
-{
-    // TODO
-    wxFAIL_MSG("wxTreeCtrl::GetChildrenCount not implemented");
-
-    return 0;
-}
-
-// delete all children (but don't delete the item itself)
-// NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
-void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
-{
-    // TODO
-    wxFAIL_MSG("wxTreeCtrl::DeleteChildren not implemented");
-}
-
 // ----------------------------------------------------------------------------
 // implementation
 // ----------------------------------------------------------------------------
@@ -907,6 +955,16 @@ bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM *result)
                 TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
 
                 event.m_code = wxCharCodeMSWToWX(info->wVKey);
+
+                // a separate event for this case
+                if ( info->wVKey == VK_SPACE || info->wVKey == VK_RETURN )
+                {
+                    wxTreeEvent event2(wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
+                                       m_windowId);
+                    event2.SetEventObject(this);
+
+                    GetEventHandler()->ProcessEvent(event2);
+                }
                 break;
             }