#if wxUSE_TREEBOOK
#include "wx/treebook.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/settings.h"
+#endif
+
#include "wx/imaglist.h"
-#include "wx/settings.h"
// ----------------------------------------------------------------------------
// various wxWidgets macros
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;
}
{
style |= wxBK_LEFT;
}
+ style |= wxTAB_TRAVERSAL;
// no border for this control, it doesn't look nice together with the tree
style &= ~wxBORDER_MASK;
wxID_TREEBOOKTREEVIEW,
wxDefaultPosition,
wxDefaultSize,
- wxBORDER_SIMPLE |
+#ifndef __WXMSW__
+ wxBORDER_SIMPLE | // On wxMSW this produces a black border which is wrong
+#endif
wxTR_DEFAULT_STYLE |
wxTR_HIDE_ROOT |
wxTR_SINGLE
);
+ GetTreeCtrl()->SetQuickBestSize(false); // do full size calculation
GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden
#ifdef __WXMSW__
DoUpdateSelection(bSelect, pagePos);
- m_bookctrl->InvalidateBestSize();
-
return true;
}
wxTreeItemId newId = tree->AppendItem(parentId, text, imageId);
+ tree->InvalidateBestSize();
+
if ( !newId.IsOk() )
{
(void)wxBookCtrlBase::DoRemovePage(newPos);
DoUpdateSelection(bSelect, newPos);
- m_bookctrl->InvalidateBestSize();
-
return true;
}
tree->DeleteChildren( pageId );
tree->Delete( pageId );
- tree->InvalidateBestSize();
return oldPage;
}
// find the next page suitable to be shown: the first (grand)child
// of this one with a non-NULL associated page
wxTreeItemId childId = m_treeIds[pagePos];
- m_actualSelection = pagePos;
+ int actualPagePos = pagePos;
while ( !page && childId.IsOk() )
{
wxTreeItemIdValue cookie;
childId = tree->GetFirstChild( childId, cookie );
if ( childId.IsOk() )
{
- page = wxBookCtrlBase::GetPage(++m_actualSelection);
+ page = wxBookCtrlBase::GetPage(++actualPagePos);
}
}
- wxASSERT_MSG( page, wxT("no page to show found!") );
+ m_actualSelection = page ? actualPagePos : m_selection;
}
if ( page )
- {
- page->SetSize(GetPageRect());
page->Show();
- }
tree->SelectItem(DoInternalGetPage(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);
// 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()).Contains(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().Contains( pt ) )
+ *flags |= wxBK_HITTEST_ONPAGE;
}
- return page;
+ return pagePos;
}
#endif // wxUSE_TREEBOOK