missing functions implemented in wxMSW tree ctrl (custom sorting,

GetChildrenCount(), DeleteChildren()).


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1246 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1998-12-20 00:34:52 +00:00
parent d3b4d11313
commit 23fd5130c7
4 changed files with 93 additions and 33 deletions

View 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)

View 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
};
};

View 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"

View 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;
}