GetChildrenCount(), DeleteChildren()).
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1246
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
}
// MyTreeCtrl implementation
}
// MyTreeCtrl implementation
+IMPLEMENT_DYNAMIC_CLASS(MyTreeCtrl, wxTreeCtrl)
+
MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size,
long style)
MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size,
long style)
MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size,
long style);
MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size,
long style);
wxImageList *m_imageListNormal;
bool m_reverseSort; // flag for OnCompareItems
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)
TreeTest_DeleteAll,
TreeTest_Recreate,
TreeTest_Ctrl = 100
TreeTest_DeleteAll,
TreeTest_Recreate,
TreeTest_Ctrl = 100
-};
-
-enum
-{
- TreeCtrlIcon_File,
- TreeCtrlIcon_Folder
-};
+};
\ No newline at end of file
aaaa ICON "mondrian.ico"
#include "wx/msw/wx.rc"
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"
SetAnyImageList(m_imageListState = imageList, TVSIL_STATE);
}
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
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Item access
// ----------------------------------------------------------------------------
wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
long& _cookie) const
{
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;
+
+// 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) )
void wxTreeCtrl::DeleteAllItems()
{
if ( !TreeView_DeleteAllItems(wxhWnd) )
return wxTreeItemId((WXHTREEITEM) hitTestInfo.hItem);
}
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)
{
int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
const wxTreeItemId& item2)
{
void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
{
// rely on the fact that TreeView_SortChildren does the same thing as our
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);
- // 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
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// implementation
// ----------------------------------------------------------------------------
TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
event.m_code = wxCharCodeMSWToWX(info->wVKey);
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);
+ }