]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treebkg.cpp
[ 1509599 ] 'Split pickers page in widgets sample' with more icons and rebaking.
[wxWidgets.git] / src / generic / treebkg.cpp
index 47fefdc7d06b7cdc616880bc42334f5da1feffc0..fcf10b9d351c8bc4d1dd1954e4330891f9fb123b 100644 (file)
 #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
 IMPLEMENT_DYNAMIC_CLASS(wxTreebook, wxBookCtrlBase)
 IMPLEMENT_DYNAMIC_CLASS(wxTreebookEvent, wxNotifyEvent)
 
+#if !WXWIN_COMPATIBILITY_EVENT_TYPES
 const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING = wxNewEventType();
 const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED = wxNewEventType();
 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)
@@ -98,11 +104,14 @@ wxTreebook::Create(wxWindow *parent,
                     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__
@@ -125,11 +134,11 @@ bool wxTreebook::InsertPage(size_t pagePos,
     return DoInsertPage(pagePos, page, text, bSelect, imageId);
 }
 
-bool wxTreebook::AddSubPage(size_t pagePos,
-                            wxWindow *page,
-                            const wxString& text,
-                            bool bSelect,
-                            int imageId)
+bool wxTreebook::InsertSubPage(size_t pagePos,
+                               wxWindow *page,
+                               const wxString& text,
+                               bool bSelect,
+                               int imageId)
 {
     return DoInsertSubPage(pagePos, page, text, bSelect, imageId);
 }
@@ -201,8 +210,6 @@ bool wxTreebook::DoInsertPage(size_t pagePos,
 
     DoUpdateSelection(bSelect, pagePos);
 
-    m_bookctrl->InvalidateBestSize();
-
     return true;
 }
 
@@ -244,6 +251,8 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos,
 
     wxTreeItemId newId = tree->AppendItem(parentId, text, imageId);
 
+    tree->InvalidateBestSize();
+
     if ( !newId.IsOk() )
     {
         (void)wxBookCtrlBase::DoRemovePage(newPos);
@@ -256,8 +265,6 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos,
 
     DoUpdateSelection(bSelect, newPos);
 
-    m_bookctrl->InvalidateBestSize();
-
     return true;
 }
 
@@ -306,7 +313,6 @@ wxTreebookPage *wxTreebook::DoRemovePage(size_t pagePos)
 
     tree->DeleteChildren( pageId );
     tree->Delete( pageId );
-    tree->InvalidateBestSize();
 
     return oldPage;
 }
@@ -612,25 +618,22 @@ int wxTreebook::DoSetSelection(size_t pagePos)
             // 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));
 
@@ -647,6 +650,20 @@ int wxTreebook::DoSetSelection(size_t pagePos)
     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);
@@ -706,18 +723,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 = wxNB_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 |= wxNB_HITTEST_ONICON;
+
+            if ( flagsTree & wxTREE_HITTEST_ONITEMLABEL )
+                *flags |= wxNB_HITTEST_ONLABEL;
+        }
+    }
+    else // not over the tree
+    {
+        if ( flags && GetPageRect().Inside( pt ) )
+            *flags |= wxNB_HITTEST_ONPAGE;
     }
 
-    return page;
+    return pagePos;
 }
 
 #endif // wxUSE_TREEBOOK