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 // MyTreeCtrl implementation
IMPLEMENT_DYNAMIC_CLASS(MyTreeCtrl, wxTreeCtrl)
MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style) long style)

View File

@@ -36,6 +36,7 @@ public:
TreeCtrlIcon_Folder TreeCtrlIcon_Folder
}; };
MyTreeCtrl() { }
MyTreeCtrl(wxWindow *parent, const wxWindowID id, MyTreeCtrl(wxWindow *parent, const wxWindowID id,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style); long style);
@@ -78,6 +79,11 @@ private:
wxImageList *m_imageListNormal; wxImageList *m_imageListNormal;
bool m_reverseSort; // flag for OnCompareItems 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() DECLARE_EVENT_TABLE()
}; };
@@ -132,9 +138,3 @@ enum
TreeTest_Recreate, TreeTest_Recreate,
TreeTest_Ctrl = 100 TreeTest_Ctrl = 100
}; };
enum
{
TreeCtrlIcon_File,
TreeCtrlIcon_Folder
};

View File

@@ -2,6 +2,6 @@ mondrian ICON "mondrian.ico"
aaaa ICON "mondrian.ico" aaaa ICON "mondrian.ico"
#include "wx/msw/wx.rc" #include "wx/msw/wx.rc"
icon1 ICON "bitmaps\\folder1.ico" icon1 ICON "bitmaps\\file1.ico"
icon2 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); 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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -421,9 +446,10 @@ wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item), wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
long& _cookie) const long& _cookie) const
{ {
wxTreeItemId l=wxTreeItemId((WXHTREEITEM) TreeView_GetNextSibling(wxhWnd, wxTreeItemId l = wxTreeItemId((WXHTREEITEM)TreeView_GetNextSibling(wxhWnd,
(HTREEITEM) (WXHTREEITEM)_cookie)); (HTREEITEM)(WXHTREEITEM)_cookie));
_cookie=(long)l; _cookie = (long)l;
return 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() void wxTreeCtrl::DeleteAllItems()
{ {
if ( !TreeView_DeleteAllItems(wxhWnd) ) if ( !TreeView_DeleteAllItems(wxhWnd) )
@@ -736,6 +786,16 @@ wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
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, int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
const wxTreeItemId& item2) const wxTreeItemId& item2)
{ {
@@ -745,34 +805,22 @@ int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
void wxTreeCtrl::SortChildren(const wxTreeItemId& item) void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
{ {
// rely on the fact that TreeView_SortChildren does the same thing as our // rely on the fact that TreeView_SortChildren does the same thing as our
// default behaviour, i.e. sorts items alphabetically // default behaviour, i.e. sorts items alphabetically and so call it
if ( wxIS_KIND_OF(this, wxTreeCtrl) ) // 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 else
{ {
// TODO: use TreeView_SortChildrenCB TVSORTCB tvSort;
wxFAIL_MSG("wxTreeCtrl::SortChildren not implemented"); 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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -907,6 +955,16 @@ bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM *result)
TV_KEYDOWN *info = (TV_KEYDOWN *)lParam; TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
event.m_code = wxCharCodeMSWToWX(info->wVKey); 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; break;
} }