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