const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED = wxNewEventType();
const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED = wxNewEventType();
#endif
-const int wxID_TREEBOOKTREEVIEW = wxNewId();
BEGIN_EVENT_TABLE(wxTreebook, wxBookCtrlBase)
- EVT_TREE_SEL_CHANGED (wxID_TREEBOOKTREEVIEW, wxTreebook::OnTreeSelectionChange)
- EVT_TREE_ITEM_EXPANDED (wxID_TREEBOOKTREEVIEW, wxTreebook::OnTreeNodeExpandedCollapsed)
- EVT_TREE_ITEM_COLLAPSED(wxID_TREEBOOKTREEVIEW, wxTreebook::OnTreeNodeExpandedCollapsed)
+ EVT_TREE_SEL_CHANGED (wxID_ANY, wxTreebook::OnTreeSelectionChange)
+ EVT_TREE_ITEM_EXPANDED (wxID_ANY, wxTreebook::OnTreeNodeExpandedCollapsed)
+ EVT_TREE_ITEM_COLLAPSED(wxID_ANY, wxTreebook::OnTreeNodeExpandedCollapsed)
END_EVENT_TABLE()
// ============================================================================
{
style |= wxBK_LEFT;
}
+ style |= wxTAB_TRAVERSAL;
// no border for this control, it doesn't look nice together with the tree
style &= ~wxBORDER_MASK;
m_bookctrl = new wxTreeCtrl
(
this,
- wxID_TREEBOOKTREEVIEW,
+ wxID_ANY,
wxDefaultPosition,
wxDefaultSize,
#ifndef __WXMSW__
wxTreeItemId newId = tree->AppendItem(parentId, text, imageId);
- tree->InvalidateBestSize();
-
if ( !newId.IsOk() )
{
(void)wxBookCtrlBase::DoRemovePage(newPos);
// actually shown page (the first (sub)child with page != NULL) is
// already deleted
m_actualSelection = m_selection;
- DoSetSelection(m_selection);
+
+ // send event as documented
+ DoSetSelection(m_selection, SetSelection_SendEvent);
}
//else: nothing to do -- selection is before the deleted node
}
return m_selection;
}
-int wxTreebook::SetSelection(size_t pagePos)
-{
- if ( (size_t)m_selection != pagePos )
- return DoSetSelection(pagePos);
-
- return m_selection;
-}
-
-int wxTreebook::DoSetSelection(size_t pagePos)
+int wxTreebook::DoSetSelection(size_t pagePos, int flags)
{
wxCHECK_MSG( IS_VALID_PAGE(pagePos), wxNOT_FOUND,
- wxT("invalid page index in wxListbook::SetSelection()") );
+ wxT("invalid page index in wxListbook::DoSetSelection()") );
wxASSERT_MSG( GetPageCount() == DoInternalGetPageCount(),
wxT("wxTreebook logic error: m_treeIds and m_pages not in sync!"));
+ wxTreebookEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId);
const int oldSel = m_selection;
wxTreeCtrl *tree = GetTreeCtrl();
+ bool allowed = false;
- wxTreebookEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId);
- event.SetEventObject(this);
- event.SetSelection(pagePos);
- event.SetOldSelection(m_selection);
-
- // don't send the event if the old and new pages are the same; do send it
- // otherwise and be prepared for it to be vetoed
- if ( (int)pagePos == m_selection ||
- !GetEventHandler()->ProcessEvent(event) ||
- event.IsAllowed() )
+ if (flags & SetSelection_SendEvent)
+ {
+ event.SetEventObject(this);
+ event.SetSelection(pagePos);
+ event.SetOldSelection(m_selection);
+
+ // don't send the event if the old and new pages are the same; do send it
+ // otherwise and be prepared for it to be vetoed
+ allowed = (int)pagePos == m_selection ||
+ !GetEventHandler()->ProcessEvent(event) ||
+ event.IsAllowed();
+ }
+
+ if ( !(flags & SetSelection_SendEvent) || allowed )
{
// hide the previously shown page
wxTreebookPage * const oldPage = DoGetCurrentPage();
tree->SelectItem(DoInternalGetPage(pagePos));
- // notify about the (now completed) page change
- event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
+ if (flags & SetSelection_SendEvent)
+ {
+ // notify about the (now completed) page change
+ event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED);
+ (void)GetEventHandler()->ProcessEvent(event);
+ }
}
- else // page change vetoed
+ else if ( (flags & SetSelection_SendEvent) && !allowed) // page change vetoed
{
// tree selection might have already had changed
- tree->SelectItem(DoInternalGetPage(oldSel));
+ if ( oldSel != wxNOT_FOUND )
+ tree->SelectItem(DoInternalGetPage(oldSel));
}
return oldSel;
void wxTreebook::OnTreeSelectionChange(wxTreeEvent& event)
{
+ if ( event.GetEventObject() != m_bookctrl )
+ {
+ event.Skip();
+ return;
+ }
+
wxTreeItemId newId = event.GetItem();
if ( (m_selection == wxNOT_FOUND &&
void wxTreebook::OnTreeNodeExpandedCollapsed(wxTreeEvent & event)
{
+ if ( event.GetEventObject() != m_bookctrl )
+ {
+ event.Skip();
+ return;
+ }
+
wxTreeItemId nodeId = event.GetItem();
if ( !nodeId.IsOk() || nodeId == GetTreeCtrl()->GetRootItem() )
return;
int pagePos = wxNOT_FOUND;
if ( flags )
- *flags = wxNB_HITTEST_NOWHERE;
+ *flags = wxBK_HITTEST_NOWHERE;
// convert from wxTreebook coorindates to wxTreeCtrl ones
const wxTreeCtrl * const tree = GetTreeCtrl();
const wxPoint treePt = tree->ScreenToClient(ClientToScreen(pt));
// is it over the tree?
- if ( wxRect(tree->GetSize()).Inside(treePt) )
+ if ( wxRect(tree->GetSize()).Contains(treePt) )
{
int flagsTree;
wxTreeItemId id = tree->HitTest(treePt, flagsTree);
if ( flagsTree & (wxTREE_HITTEST_ONITEMBUTTON |
wxTREE_HITTEST_ONITEMICON |
wxTREE_HITTEST_ONITEMSTATEICON) )
- *flags |= wxNB_HITTEST_ONICON;
+ *flags |= wxBK_HITTEST_ONICON;
if ( flagsTree & wxTREE_HITTEST_ONITEMLABEL )
- *flags |= wxNB_HITTEST_ONLABEL;
+ *flags |= wxBK_HITTEST_ONLABEL;
}
}
else // not over the tree
{
- if ( flags && GetPageRect().Inside( pt ) )
- *flags |= wxNB_HITTEST_ONPAGE;
+ if ( flags && GetPageRect().Contains( pt ) )
+ *flags |= wxBK_HITTEST_ONPAGE;
}
return pagePos;