X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9eddec696f06d65a80e7339b2fae14fcb55f8383..02761f6cd478e3c2c97cf6f93442747f7b029833:/src/generic/treebkg.cpp diff --git a/src/generic/treebkg.cpp b/src/generic/treebkg.cpp index 4bce15eca2..066e30edff 100644 --- a/src/generic/treebkg.cpp +++ b/src/generic/treebkg.cpp @@ -60,18 +60,24 @@ 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) + + WX_EVENT_TABLE_CONTROL_CONTAINER(wxTreebook) END_EVENT_TABLE() // ============================================================================ // wxTreebook implementation // ============================================================================ +WX_DELEGATE_TO_CONTROL_CONTAINER(wxTreebook, wxControl) + // ---------------------------------------------------------------------------- // wxTreebook creation // ---------------------------------------------------------------------------- void wxTreebook::Init() { + m_container.SetContainerWindow(this); + m_selection = m_actualSelection = wxNOT_FOUND; } @@ -89,6 +95,7 @@ wxTreebook::Create(wxWindow *parent, { style |= wxBK_LEFT; } + style |= wxTAB_TRAVERSAL; // no border for this control, it doesn't look nice together with the tree style &= ~wxBORDER_MASK; @@ -644,12 +651,27 @@ int wxTreebook::DoSetSelection(size_t pagePos) else // page change vetoed { // tree selection might have already had changed - tree->SelectItem(DoInternalGetPage(oldSel)); + if ( oldSel != wxNOT_FOUND ) + tree->SelectItem(DoInternalGetPage(oldSel)); } return oldSel; } +wxTreebookPage *wxTreebook::DoGetCurrentPage() const +{ + if ( m_selection == wxNOT_FOUND ) + return NULL; + + wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); + if ( !page && m_actualSelection != wxNOT_FOUND ) + { + page = wxBookCtrlBase::GetPage(m_actualSelection); + } + + return page; +} + void wxTreebook::SetImageList(wxImageList *imageList) { wxBookCtrlBase::SetImageList(imageList); @@ -709,18 +731,49 @@ void wxTreebook::OnTreeNodeExpandedCollapsed(wxTreeEvent & event) // wxTreebook geometry management // ---------------------------------------------------------------------------- -wxTreebookPage * wxTreebook::DoGetCurrentPage() const +int wxTreebook::HitTest(wxPoint const & pt, long * flags) const { - if ( m_selection == wxNOT_FOUND ) - return NULL; + int pagePos = wxNOT_FOUND; - wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); - if ( !page && m_actualSelection != wxNOT_FOUND ) + if ( flags ) + *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) ) { - page = wxBookCtrlBase::GetPage(m_actualSelection); + int flagsTree; + wxTreeItemId id = tree->HitTest(treePt, flagsTree); + + if ( id.IsOk() && (flagsTree & wxTREE_HITTEST_ONITEM) ) + { + pagePos = DoInternalFindPageById(id); + } + + if ( flags ) + { + if ( pagePos != wxNOT_FOUND ) + *flags = 0; + + if ( flagsTree & (wxTREE_HITTEST_ONITEMBUTTON | + wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMSTATEICON) ) + *flags |= wxBK_HITTEST_ONICON; + + if ( flagsTree & wxTREE_HITTEST_ONITEMLABEL ) + *flags |= wxBK_HITTEST_ONLABEL; + } + } + else // not over the tree + { + if ( flags && GetPageRect().Inside( pt ) ) + *flags |= wxBK_HITTEST_ONPAGE; } - return page; + return pagePos; } #endif // wxUSE_TREEBOOK