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:
@@ -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)
|
||||
|
@@ -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
|
||||
};
|
||||
};
|
@@ -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"
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user