treectrl.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,196 行 · 第 1/5 页
CPP
2,196 行
void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item,
const wxColour& col)
{
wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
wxTreeItemAttr *attr;
wxMapTreeAttr::iterator it = m_attrs.find(item.m_pItem);
if ( it == m_attrs.end() )
{
m_hasAnyAttr = true;
m_attrs[item.m_pItem] =
attr = new wxTreeItemAttr;
}
else // already in the hash
{
attr = it->second;
}
attr->SetBackgroundColour(col);
RefreshItem(item);
}
void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font)
{
wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
wxTreeItemAttr *attr;
wxMapTreeAttr::iterator it = m_attrs.find(item.m_pItem);
if ( it == m_attrs.end() )
{
m_hasAnyAttr = true;
m_attrs[item.m_pItem] =
attr = new wxTreeItemAttr;
}
else // already in the hash
{
attr = it->second;
}
attr->SetFont(font);
RefreshItem(item);
}
// ----------------------------------------------------------------------------
// Item status
// ----------------------------------------------------------------------------
bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
if ( item == wxTreeItemId(TVI_ROOT) )
{
// virtual (hidden) root is never visible
return false;
}
// Bug in Gnu-Win32 headers, so don't use the macro TreeView_GetItemRect
RECT rect;
// this ugliness comes directly from MSDN - it *is* the correct way to pass
// the HTREEITEM with TVM_GETITEMRECT
*(HTREEITEM *)&rect = HITEM(item);
// true means to get rect for just the text, not the whole line
if ( !::SendMessage(GetHwnd(), TVM_GETITEMRECT, true, (LPARAM)&rect) )
{
// if TVM_GETITEMRECT returned false, then the item is definitely not
// visible (because its parent is not expanded)
return false;
}
// however if it returned true, the item might still be outside the
// currently visible part of the tree, test for it (notice that partly
// visible means visible here)
return rect.bottom > 0 && rect.top < GetClientSize().y;
}
bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
wxTreeViewItem tvItem(item, TVIF_CHILDREN);
DoGetItem(&tvItem);
return tvItem.cChildren != 0;
}
bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
wxTreeViewItem tvItem(item, TVIF_STATE, TVIS_EXPANDED);
DoGetItem(&tvItem);
return (tvItem.state & TVIS_EXPANDED) != 0;
}
bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
wxTreeViewItem tvItem(item, TVIF_STATE, TVIS_SELECTED);
DoGetItem(&tvItem);
return (tvItem.state & TVIS_SELECTED) != 0;
}
bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
wxTreeViewItem tvItem(item, TVIF_STATE, TVIS_BOLD);
DoGetItem(&tvItem);
return (tvItem.state & TVIS_BOLD) != 0;
}
// ----------------------------------------------------------------------------
// navigation
// ----------------------------------------------------------------------------
wxTreeItemId wxTreeCtrl::GetRootItem() const
{
// Root may be real (visible) or virtual (hidden).
if ( GET_VIRTUAL_ROOT() )
return TVI_ROOT;
return wxTreeItemId(TreeView_GetRoot(GetHwnd()));
}
wxTreeItemId wxTreeCtrl::GetSelection() const
{
wxCHECK_MSG( !(m_windowStyle & wxTR_MULTIPLE), wxTreeItemId(),
wxT("this only works with single selection controls") );
return wxTreeItemId(TreeView_GetSelection(GetHwnd()));
}
wxTreeItemId wxTreeCtrl::GetItemParent(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
HTREEITEM hItem;
if ( IS_VIRTUAL_ROOT(item) )
{
// no parent for the virtual root
hItem = 0;
}
else // normal item
{
hItem = TreeView_GetParent(GetHwnd(), HITEM(item));
if ( !hItem && HasFlag(wxTR_HIDE_ROOT) )
{
// the top level items should have the virtual root as their parent
hItem = TVI_ROOT;
}
}
return wxTreeItemId(hItem);
}
wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
wxTreeItemIdValue& cookie) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
// remember the last child returned in 'cookie'
cookie = TreeView_GetChild(GetHwnd(), HITEM(item));
return wxTreeItemId(cookie);
}
wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
wxTreeItemIdValue& cookie) const
{
wxTreeItemId fromCookie(cookie);
HTREEITEM hitem = HITEM(fromCookie);
hitem = TreeView_GetNextSibling(GetHwnd(), hitem);
wxTreeItemId item(hitem);
cookie = item.m_pItem;
return item;
}
#if WXWIN_COMPATIBILITY_2_4
wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
long& cookie) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
cookie = (long)TreeView_GetChild(GetHwnd(), HITEM(item));
return wxTreeItemId((void *)cookie);
}
wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
long& cookie) const
{
wxTreeItemId fromCookie((void *)cookie);
HTREEITEM hitem = HITEM(fromCookie);
hitem = TreeView_GetNextSibling(GetHwnd(), hitem);
wxTreeItemId item(hitem);
cookie = (long)item.m_pItem;
return item;
}
#endif // WXWIN_COMPATIBILITY_2_4
wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
// can this be done more efficiently?
wxTreeItemIdValue cookie;
wxTreeItemId childLast,
child = GetFirstChild(item, cookie);
while ( child.IsOk() )
{
childLast = child;
child = GetNextChild(item, cookie);
}
return childLast;
}
wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
return wxTreeItemId(TreeView_GetNextSibling(GetHwnd(), HITEM(item)));
}
wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
return wxTreeItemId(TreeView_GetPrevSibling(GetHwnd(), HITEM(item)));
}
wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
{
return wxTreeItemId(TreeView_GetFirstVisible(GetHwnd()));
}
wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetNextVisible() for must be visible itself!"));
return wxTreeItemId(TreeView_GetNextVisible(GetHwnd(), HITEM(item)));
}
wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetPrevVisible() for must be visible itself!"));
return wxTreeItemId(TreeView_GetPrevVisible(GetHwnd(), HITEM(item)));
}
// ----------------------------------------------------------------------------
// multiple selections emulation
// ----------------------------------------------------------------------------
bool wxTreeCtrl::IsItemChecked(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") );
// receive the desired information.
wxTreeViewItem tvItem(item, TVIF_STATE, TVIS_STATEIMAGEMASK);
DoGetItem(&tvItem);
// state image indices are 1 based
return ((tvItem.state >> 12) - 1) == 1;
}
void wxTreeCtrl::SetItemCheck(const wxTreeItemId& item, bool check)
{
wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
// receive the desired information.
wxTreeViewItem tvItem(item, TVIF_STATE, TVIS_STATEIMAGEMASK);
DoGetItem(&tvItem);
// state images are one-based
tvItem.state = (check ? 2 : 1) << 12;
DoSetItem(&tvItem);
}
size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds& selections) const
{
TraverseSelections selector(this, selections);
return selector.GetCount();
}
// ----------------------------------------------------------------------------
// Usual operations
// ----------------------------------------------------------------------------
wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
wxTreeItemId hInsertAfter,
const wxString& text,
int image, int selectedImage,
wxTreeItemData *data)
{
wxCHECK_MSG( parent.IsOk() || !TreeView_GetRoot(GetHwnd()),
wxTreeItemId(),
_T("can't have more than one root in the tree") );
TV_INSERTSTRUCT tvIns;
tvIns.hParent = HITEM(parent);
tvIns.hInsertAfter = HITEM(hInsertAfter);
// this is how we insert the item as the first child: supply a NULL
// hInsertAfter
if ( !tvIns.hInsertAfter )
{
tvIns.hInsertAfter = TVI_FIRST;
}
UINT mask = 0;
if ( !text.empty() )
{
mask |= TVIF_TEXT;
tvIns.item.pszText = (wxChar *)text.c_str(); // cast is ok
}
else
{
tvIns.item.pszText = NULL;
tvIns.item.cchTextMax = 0;
}
if ( image != -1 )
{
mask |= TVIF_IMAGE;
tvIns.item.iImage = image;
if ( selectedImage == -1 )
{
// take the same image for selected icon if not specified
selectedImage = image;
}
}
if ( selectedImage != -1 )
{
mask |= TVIF_SELECTEDIMAGE;
tvIns.item.iSelectedImage = selectedImage;
}
if ( data != NULL )
{
mask |= TVIF_PARAM;
tvIns.item.lParam = (LPARAM)data;
}
tvIns.item.mask = mask;
HTREEITEM id = (HTREEITEM) TreeView_InsertItem(GetHwnd(), &tvIns);
if ( id == 0 )
{
wxLogLastError(wxT("TreeView_InsertItem"));
}
if ( data != NULL )
{
// associate the application tree item with Win32 tree item handle
data->SetId(id);
}
return wxTreeItemId(id);
}
// 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);
}
int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const
{
return GetItemImage(item, wxTreeItemIcon_Selected);
}
void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image)
{
SetItemImage(item, image, wxTreeItemIcon_Selected);
}
#endif // WXWIN_COMPATIBILITY_2_4
wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
int image, int selectedImage,
wxTreeItemData *data)
{
if ( m_windowStyle & wxTR_HIDE_ROOT )
{
// create a virtual root item, the parent for all the others
m_pVirtualRoot = new wxVirtualNode(data);
return TVI_ROOT;
}
return DoInsertItem(wxTreeItemId(), wxTreeItemId(),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?