#include "wx/dynarray.h"
#include "wx/imaglist.h"
#include "wx/settings.h"
-#include "wx/msw/treectrl.h"
+#include "wx/treectrl.h"
#include "wx/msw/dragimag.h"
// macros to hide the cast ugliness
m_tree = tree;
}
+ // give it a virtual dtor: not really needed as the class is never used
+ // polymorphically and not even allocated on heap at all, but this is safer
+ // (in case it ever is) and silences the compiler warnings for now
+ virtual ~wxTreeTraversal() { }
+
// do traverse the tree: visit all items (recursively by default) under the
// given one; return true if all items were traversed or false if the
// traversal was aborted because OnVisit returned false
void wxTreeCtrl::Init()
{
- m_imageListNormal = NULL;
- m_imageListState = NULL;
- m_ownsImageListNormal = m_ownsImageListState = false;
m_textCtrl = NULL;
m_hasAnyAttr = false;
m_dragImage = NULL;
// delete user data to prevent memory leaks
// also deletes hidden root node storage.
DeleteAllItems();
-
- if (m_ownsImageListNormal) delete m_imageListNormal;
- if (m_ownsImageListState) delete m_imageListState;
}
// ----------------------------------------------------------------------------
}
}
-size_t wxTreeCtrl::GetCount() const
+unsigned int wxTreeCtrl::GetCount() const
{
- return (size_t)TreeView_GetCount(GetHwnd());
+ return (unsigned int)TreeView_GetCount(GetHwnd());
}
unsigned int wxTreeCtrl::GetIndent() const
TreeView_SetIndent(GetHwnd(), indent);
}
-wxImageList *wxTreeCtrl::GetImageList() const
-{
- return m_imageListNormal;
-}
-
-wxImageList *wxTreeCtrl::GetStateImageList() const
-{
- return m_imageListState;
-}
-
void wxTreeCtrl::SetAnyImageList(wxImageList *imageList, int which)
{
// no error return
- TreeView_SetImageList(GetHwnd(),
- imageList ? imageList->GetHIMAGELIST() : 0,
- which);
+ (void) TreeView_SetImageList(GetHwnd(),
+ imageList ? imageList->GetHIMAGELIST() : 0,
+ which);
}
void wxTreeCtrl::SetImageList(wxImageList *imageList)
m_ownsImageListState = false;
}
-void wxTreeCtrl::AssignImageList(wxImageList *imageList)
-{
- SetImageList(imageList);
- m_ownsImageListNormal = true;
-}
-
-void wxTreeCtrl::AssignStateImageList(wxImageList *imageList)
-{
- SetStateImageList(imageList);
- m_ownsImageListState = true;
-}
-
size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item,
bool recursively) const
{
// Usual operations
// ----------------------------------------------------------------------------
-wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
- wxTreeItemId hInsertAfter,
- const wxString& text,
- int image, int selectedImage,
- wxTreeItemData *data)
+wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent,
+ const wxTreeItemId& hInsertAfter,
+ const wxString& text,
+ int image, int selectedImage,
+ wxTreeItemData *data)
{
wxCHECK_MSG( parent.IsOk() || !TreeView_GetRoot(GetHwnd()),
wxTreeItemId(),
// for compatibility only
#if WXWIN_COMPATIBILITY_2_4
-wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
- const wxString& text,
- int image, int selImage,
- long insertAfter)
-{
- return DoInsertItem(parent, wxTreeItemId((void *)insertAfter), text,
- image, selImage, NULL);
-}
-
-wxImageList *wxTreeCtrl::GetImageList(int) const
-{
- return GetImageList();
-}
-
void wxTreeCtrl::SetImageList(wxImageList *imageList, int)
{
SetImageList(imageList);
return TVI_ROOT;
}
- return DoInsertItem(wxTreeItemId(), wxTreeItemId(),
- text, image, selectedImage, data);
-}
-
-wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent,
- const wxString& text,
- int image, int selectedImage,
- wxTreeItemData *data)
-{
- return DoInsertItem(parent, TVI_FIRST,
- text, image, selectedImage, data);
+ return DoInsertAfter(wxTreeItemId(), wxTreeItemId(),
+ text, image, selectedImage, data);
}
-wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
- const wxTreeItemId& idPrevious,
- const wxString& text,
- int image, int selectedImage,
- wxTreeItemData *data)
-{
- return DoInsertItem(parent, idPrevious, text, image, selectedImage, data);
-}
-
-wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
- size_t index,
- const wxString& text,
- int image, int selectedImage,
- wxTreeItemData *data)
+wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
+ size_t index,
+ const wxString& text,
+ int image, int selectedImage,
+ wxTreeItemData *data)
{
- // find the item from index
- wxTreeItemIdValue cookie;
- wxTreeItemId idPrev, idCur = GetFirstChild(parent, cookie);
- while ( index != 0 && idCur.IsOk() )
+ wxTreeItemId idPrev;
+ if ( index == (size_t)-1 )
{
- index--;
-
- idPrev = idCur;
- idCur = GetNextChild(parent, cookie);
+ // special value: append to the end
+ idPrev = TVI_LAST;
}
+ else // find the item from index
+ {
+ wxTreeItemIdValue cookie;
+ wxTreeItemId idCur = GetFirstChild(parent, cookie);
+ while ( index != 0 && idCur.IsOk() )
+ {
+ index--;
- // assert, not check: if the index is invalid, we will append the item
- // to the end
- wxASSERT_MSG( index == 0, _T("bad index in wxTreeCtrl::InsertItem") );
+ idPrev = idCur;
+ idCur = GetNextChild(parent, cookie);
+ }
- return DoInsertItem(parent, idPrev, text, image, selectedImage, data);
-}
+ // assert, not check: if the index is invalid, we will append the item
+ // to the end
+ wxASSERT_MSG( index == 0, _T("bad index in wxTreeCtrl::InsertItem") );
+ }
-wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
- const wxString& text,
- int image, int selectedImage,
- wxTreeItemData *data)
-{
- return DoInsertItem(parent, TVI_LAST,
- text, image, selectedImage, data);
+ return DoInsertAfter(parent, idPrev, text, image, selectedImage, data);
}
void wxTreeCtrl::Delete(const wxTreeItemId& item)
// A hidden root can be neither expanded nor collapsed.
wxCHECK_RET( !(m_windowStyle & wxTR_HIDE_ROOT) || (HITEM(item) != TVI_ROOT),
- wxT("Can't expand/collapse hidden root node!") )
+ wxT("Can't expand/collapse hidden root node!") );
// TreeView_Expand doesn't send TVN_ITEMEXPAND(ING) messages, so we must
// emulate them. This behaviour has changed slightly with comctl32.dll
}
}
-void wxTreeCtrl::UnselectItem(const wxTreeItemId& item)
-{
- SelectItem(item, false);
-}
-
-void wxTreeCtrl::ToggleItemSelection(const wxTreeItemId& item)
-{
- SelectItem(item, !IsSelected(item));
-}
-
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
{
// no error return
DeleteTextCtrl();
}
-wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
+wxTreeItemId wxTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags)
{
TV_HITTESTINFO hitTestInfo;
hitTestInfo.pt.x = (int)point.x;
hitTestInfo.pt.y = (int)point.y;
- TreeView_HitTest(GetHwnd(), &hitTestInfo);
+ (void) TreeView_HitTest(GetHwnd(), &hitTestInfo);
flags = 0;
}
}
-wxSize wxTreeCtrl::DoGetBestSize() const
-{
- wxSize size;
-
- // this doesn't really compute the total bounding rectangle of all items
- // but a not too bad guess of it which has the advantage of not having to
- // examine all (potentially hundreds or thousands) items in the control
- for ( wxTreeItemId item = GetRootItem();
- item.IsOk();
- item = GetLastChild(item) )
- {
- wxRect rect;
-
- // last parameter is "true" to get only the dimensions of the text
- // label, we don't want to get the entire item width as it's determined
- // by the current size
- if ( GetBoundingRect(item, rect, true) )
- {
- if ( size.x < rect.x + rect.width )
- size.x = rect.x + rect.width;
- if ( size.y < rect.y + rect.height )
- size.y = rect.y + rect.height;
- }
- }
-
- // need some minimal size even for empty tree
- if ( !size.x || !size.y )
- size = wxControl::DoGetBestSize();
-
- return size;
-}
-
// ----------------------------------------------------------------------------
// sorting stuff
// ----------------------------------------------------------------------------
GetIdFromData(tree, pItem2));
}
-int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
- const wxTreeItemId& item2)
-{
- return wxStrcmp(GetItemText(item1), GetItemText(item2));
-}
-
void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
{
wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
int x = GET_X_LPARAM(lParam),
y = GET_Y_LPARAM(lParam);
HTREEITEM htItem = GetItemFromPoint(GetHwnd(), x, y);
-
+
TV_HITTESTINFO tvht;
tvht.pt.x = x;
tvht.pt.y = y;
-
- TreeView_HitTest(GetHwnd(), &tvht);
+
+ (void) TreeView_HitTest(GetHwnd(), &tvht);
switch ( nMsg )
{
{
m_htClickedItem = (WXHTREEITEM) htItem;
m_ptClick = wxPoint(x, y);
-
+
if ( wParam & MK_CONTROL )
{
SetFocus();
{
// avoid doing anything if we click on the only
// currently selected item
-
+
SetFocus();
wxArrayTreeItemIds selections;
tv.hdr.hwndFrom = GetHwnd();
tv.hdr.idFrom = ::GetWindowLong( GetHwnd(), GWL_ID );
tv.hdr.code = TVN_BEGINDRAG;
-
+
tv.itemNew.hItem = HITEM(m_htClickedItem);
-
+
TVITEM tviAux;
ZeroMemory(&tviAux, sizeof(tviAux));
tviAux.hItem = HITEM(m_htClickedItem);
tviAux.mask = TVIF_STATE | TVIF_PARAM;
tviAux.stateMask = 0xffffffff;
TreeView_GetItem( GetHwnd(), &tviAux );
-
+
tv.itemNew.state = tviAux.state;
tv.itemNew.lParam = tviAux.lParam;
-
+
tv.ptDrag.x = x;
tv.ptDrag.y = y;
-
+
::SendMessage( pWnd, WM_NOTIFY, tv.hdr.idFrom, (LPARAM)&tv );
}
m_htClickedItem.Unset();
}
}
#endif // __WXWINCE__
-
+
if ( m_dragImage )
{
m_dragImage->Move(wxPoint(x, y));
WXWPARAM wParam = info->wVKey;
- int keyCode = wxCharCodeMSWToWX(info->wVKey);
+ int keyCode = wxCharCodeMSWToWX(wParam);
if ( !keyCode )
{
// wxCharCodeMSWToWX() returns 0 to indicate that this is a
}
#endif // wxUSE_TREECTRL
-