]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/auibook.cpp
update frm Ivan Masar
[wxWidgets.git] / src / aui / auibook.cpp
index 4ecd4c1617fee3c2cc2ef78e6cbff012bca0bd57..64e0d728e53b06f5ab1a97cb23271eab5cadcb2e 100644 (file)
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/image.h"
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/image.h"
+    #include "wx/menu.h"
 #endif
 
 #include "wx/aui/tabmdi.h"
 #include "wx/dcbuffer.h"
 #endif
 
 #include "wx/aui/tabmdi.h"
 #include "wx/dcbuffer.h"
-#include "wx/menu.h"
 
 #ifdef __WXMAC__
 #include "wx/mac/carbon/private.h"
 
 #ifdef __WXMAC__
 #include "wx/mac/carbon/private.h"
@@ -201,7 +201,7 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt()
     {
         base_colour = wxAuiStepColour(base_colour, 92);
     }
     {
         base_colour = wxAuiStepColour(base_colour, 92);
     }
-    
+
     m_base_colour = base_colour;
     wxColor border_colour = wxAuiStepColour(base_colour, 75);
 
     m_base_colour = base_colour;
     wxColor border_colour = wxAuiStepColour(base_colour, 75);
 
@@ -244,7 +244,7 @@ void wxAuiDefaultTabArt::SetSizingInfo(const wxSize& tab_ctrl_size,
     m_fixed_tab_width = 100;
 
     int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4;
     m_fixed_tab_width = 100;
 
     int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4;
-    
+
     if (m_flags & wxAUI_NB_CLOSE_BUTTON)
         tot_width -= m_active_close_bmp.GetWidth();
     if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON)
     if (m_flags & wxAUI_NB_CLOSE_BUTTON)
         tot_width -= m_active_close_bmp.GetWidth();
     if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON)
@@ -381,7 +381,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     // we'll just use a rectangle for the clipping region for now --
     dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3);
 
     // we'll just use a rectangle for the clipping region for now --
     dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3);
 
-    
+
     wxPoint border_points[6];
     border_points[0] = wxPoint(tab_x,             tab_y+tab_height-4);
     border_points[1] = wxPoint(tab_x,             tab_y+2);
     wxPoint border_points[6];
     border_points[0] = wxPoint(tab_x,             tab_y+tab_height-4);
     border_points[1] = wxPoint(tab_x,             tab_y+2);
@@ -441,15 +441,15 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
         r.width -= 4;
         r.height /= 2;
         r.height--;
         r.width -= 4;
         r.height /= 2;
         r.height--;
-        
+
         // -- draw top gradient fill for glossy look
         wxColor top_color = m_base_colour;
         wxColor bottom_color = wxAuiStepColour(top_color, 160);
         dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH);
         // -- draw top gradient fill for glossy look
         wxColor top_color = m_base_colour;
         wxColor bottom_color = wxAuiStepColour(top_color, 160);
         dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH);
-        
+
         r.y += r.height;
         r.y--;
         r.y += r.height;
         r.y--;
-        
+
         // -- draw bottom fill for glossy look
         top_color = m_base_colour;
         bottom_color = m_base_colour;
         // -- draw bottom fill for glossy look
         top_color = m_base_colour;
         bottom_color = m_base_colour;
@@ -660,13 +660,20 @@ int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd,
                                      const wxAuiNotebookPageArray& pages,
                                      int active_idx)
 {
                                      const wxAuiNotebookPageArray& pages,
                                      int active_idx)
 {
-       wxMenu menuPopup;
+    wxMenu menuPopup;
 
     size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
     {
         const wxAuiNotebookPage& page = pages.Item(i);
 
     size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
     {
         const wxAuiNotebookPage& page = pages.Item(i);
-        menuPopup.AppendCheckItem(1000+i, page.caption);
+        wxString caption = page.caption;
+
+        // if there is no caption, make it a space.  This will prevent
+        // an assert in the menu code.
+        if (caption.IsEmpty())
+            caption = wxT(" ");
+
+        menuPopup.AppendCheckItem(1000+i, caption);
     }
 
     if (active_idx != -1)
     }
 
     if (active_idx != -1)
@@ -710,7 +717,7 @@ int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd,
         measure_bmp.Create(required_bmp_size.x,
                            required_bmp_size.y);
     }
         measure_bmp.Create(required_bmp_size.x,
                            required_bmp_size.y);
     }
-    
+
 
     int max_y = 0;
     size_t i, page_count = pages.GetCount();
 
     int max_y = 0;
     size_t i, page_count = pages.GetCount();
@@ -736,7 +743,7 @@ int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd,
                               true,
                               wxAUI_BUTTON_STATE_HIDDEN,
                               &x_ext);
                               true,
                               wxAUI_BUTTON_STATE_HIDDEN,
                               &x_ext);
-                              
+
         max_y = wxMax(max_y, s.y);
     }
 
         max_y = wxMax(max_y, s.y);
     }
 
@@ -1107,7 +1114,7 @@ int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd,
                                     const wxAuiNotebookPageArray& pages,
                                     int active_idx)
 {
                                     const wxAuiNotebookPageArray& pages,
                                     int active_idx)
 {
-       wxMenu menuPopup;
+    wxMenu menuPopup;
 
     size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
 
     size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
@@ -1437,14 +1444,14 @@ wxWindow* wxAuiTabContainer::GetWindowFromIdx(size_t idx) const
 
 int wxAuiTabContainer::GetIdxFromWindow(wxWindow* wnd) const
 {
 
 int wxAuiTabContainer::GetIdxFromWindow(wxWindow* wnd) const
 {
-    size_t i, page_count = m_pages.GetCount();
-    for (i = 0; i < page_count; ++i)
+    const size_t page_count = m_pages.GetCount();
+    for ( size_t i = 0; i < page_count; ++i )
     {
         wxAuiNotebookPage& page = m_pages.Item(i);
         if (page.window == wnd)
             return i;
     }
     {
         wxAuiNotebookPage& page = m_pages.Item(i);
         if (page.window == wnd)
             return i;
     }
-    return -1;
+    return wxNOT_FOUND;
 }
 
 wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx)
 }
 
 wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx)
@@ -1454,6 +1461,13 @@ wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx)
     return m_pages[idx];
 }
 
     return m_pages[idx];
 }
 
+const wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx) const
+{
+    wxASSERT_MSG(idx < m_pages.GetCount(), wxT("Invalid Page index"));
+
+    return m_pages[idx];
+}
+
 wxAuiNotebookPageArray& wxAuiTabContainer::GetPages()
 {
     return m_pages;
 wxAuiNotebookPageArray& wxAuiTabContainer::GetPages()
 {
     return m_pages;
@@ -1928,7 +1942,8 @@ void wxAuiTabContainer::DoShowHide()
     for (i = 0; i < page_count; ++i)
     {
         wxAuiNotebookPage& page = pages.Item(i);
     for (i = 0; i < page_count; ++i)
     {
         wxAuiNotebookPage& page = pages.Item(i);
-        ShowWnd(page.window, page.active);
+        if (!page.active)
+            ShowWnd(page.window, false);
     }
 }
 
     }
 }
 
@@ -1950,7 +1965,7 @@ BEGIN_EVENT_TABLE(wxAuiTabCtrl, wxControl)
     EVT_LEFT_UP(wxAuiTabCtrl::OnLeftUp)
     EVT_MOTION(wxAuiTabCtrl::OnMotion)
     EVT_LEAVE_WINDOW(wxAuiTabCtrl::OnLeaveWindow)
     EVT_LEFT_UP(wxAuiTabCtrl::OnLeftUp)
     EVT_MOTION(wxAuiTabCtrl::OnMotion)
     EVT_LEAVE_WINDOW(wxAuiTabCtrl::OnLeaveWindow)
-    EVT_AUINOTEBOOK_BUTTON(-1, wxAuiTabCtrl::OnButton)
+    EVT_AUINOTEBOOK_BUTTON(wxID_ANY, wxAuiTabCtrl::OnButton)
 END_EVENT_TABLE()
 
 
 END_EVENT_TABLE()
 
 
@@ -2217,6 +2232,11 @@ public:
         m_tab_ctrl_height = 20;
     }
 
         m_tab_ctrl_height = 20;
     }
 
+       ~wxTabFrame()
+       {
+               wxDELETE(m_tabs);
+       }
+
     void SetTabCtrlHeight(int h)
     {
         m_tab_ctrl_height = h;
     void SetTabCtrlHeight(int h)
     {
         m_tab_ctrl_height = h;
@@ -2358,7 +2378,7 @@ void wxAuiNotebook::InitNotebook(long style)
     m_dummy_wnd = NULL;
     m_flags = (unsigned int)style;
     m_tab_ctrl_height = 20;
     m_dummy_wnd = NULL;
     m_flags = (unsigned int)style;
     m_tab_ctrl_height = 20;
-    
+
     m_normal_font = *wxNORMAL_FONT;
     m_selected_font = *wxNORMAL_FONT;
     m_selected_font.SetWeight(wxBOLD);
     m_normal_font = *wxNORMAL_FONT;
     m_selected_font = *wxNORMAL_FONT;
     m_selected_font.SetWeight(wxBOLD);
@@ -2401,7 +2421,7 @@ void wxAuiNotebook::SetArtProvider(wxAuiTabArt* art)
 void wxAuiNotebook::SetTabCtrlHeight(int height)
 {
     m_requested_tabctrl_height = height;
 void wxAuiNotebook::SetTabCtrlHeight(int height)
 {
     m_requested_tabctrl_height = height;
-    
+
     // if window is already initialized, recalculate the tab height
     if (m_dummy_wnd)
     {
     // if window is already initialized, recalculate the tab height
     if (m_dummy_wnd)
     {
@@ -2420,7 +2440,7 @@ void wxAuiNotebook::SetTabCtrlHeight(int height)
 void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size)
 {
     m_requested_bmp_size = size;
 void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size)
 {
     m_requested_bmp_size = size;
-    
+
     // if window is already initialized, recalculate the tab height
     if (m_dummy_wnd)
     {
     // if window is already initialized, recalculate the tab height
     if (m_dummy_wnd)
     {
@@ -2434,7 +2454,7 @@ void wxAuiNotebook::UpdateTabCtrlHeight()
 {
     // get the tab ctrl height we will use
     int height = CalculateTabCtrlHeight();
 {
     // get the tab ctrl height we will use
     int height = CalculateTabCtrlHeight();
-    
+
     // if the tab control height needs to change, update
     // all of our tab controls with the new height
     if (m_tab_ctrl_height != height)
     // if the tab control height needs to change, update
     // all of our tab controls with the new height
     if (m_tab_ctrl_height != height)
@@ -2462,7 +2482,7 @@ void wxAuiNotebook::UpdateTabCtrlHeight()
 void wxAuiNotebook::UpdateHintWindowSize()
 {
     wxSize size = CalculateNewSplitSize();
 void wxAuiNotebook::UpdateHintWindowSize()
 {
     wxSize size = CalculateNewSplitSize();
-    
+
     // the placeholder hint window should be set to this size
     wxAuiPaneInfo& info = m_mgr.GetPane(wxT("dummy"));
     if (info.IsOk())
     // the placeholder hint window should be set to this size
     wxAuiPaneInfo& info = m_mgr.GetPane(wxT("dummy"));
     if (info.IsOk())
@@ -2490,7 +2510,7 @@ wxSize wxAuiNotebook::CalculateNewSplitSize()
     }
 
     wxSize new_split_size;
     }
 
     wxSize new_split_size;
-    
+
     // if there is only one tab control, the first split
     // should happen around the middle
     if (tab_ctrl_count < 2)
     // if there is only one tab control, the first split
     // should happen around the middle
     if (tab_ctrl_count < 2)
@@ -2505,7 +2525,7 @@ wxSize wxAuiNotebook::CalculateNewSplitSize()
         // that needs to be implemented
         new_split_size = wxSize(180,180);
     }
         // that needs to be implemented
         new_split_size = wxSize(180,180);
     }
-    
+
     return new_split_size;
 }
 
     return new_split_size;
 }
 
@@ -2516,7 +2536,7 @@ int wxAuiNotebook::CalculateTabCtrlHeight()
     // tab height
     if (m_requested_tabctrl_height != -1)
         return m_requested_tabctrl_height;
     // tab height
     if (m_requested_tabctrl_height != -1)
         return m_requested_tabctrl_height;
-        
+
     // find out new best tab height
     wxAuiTabArt* art = m_tabs.GetArtProvider();
 
     // find out new best tab height
     wxAuiTabArt* art = m_tabs.GetArtProvider();
 
@@ -2591,7 +2611,8 @@ bool wxAuiNotebook::InsertPage(size_t page_idx,
     // select is false, it must become the "current page"
     // (though no select events will be fired)
     if (!select && m_tabs.GetPageCount() == 1)
     // select is false, it must become the "current page"
     // (though no select events will be fired)
     if (!select && m_tabs.GetPageCount() == 1)
-        m_curpage = GetPageIndex(page);
+        select = true;
+        //m_curpage = GetPageIndex(page);
 
     wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl();
     if (page_idx >= active_tabctrl->GetPageCount())
 
     wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl();
     if (page_idx >= active_tabctrl->GetPageCount())
@@ -2605,10 +2626,7 @@ bool wxAuiNotebook::InsertPage(size_t page_idx,
 
     if (select)
     {
 
     if (select)
     {
-        int idx = m_tabs.GetIdxFromWindow(page);
-        wxASSERT_MSG(idx != -1, wxT("Invalid Page index returned on wxAuiNotebook::InsertPage()"));
-
-        SetSelection(idx);
+        SetSelectionToWindow(page);
     }
 
     return true;
     }
 
     return true;
@@ -2694,7 +2712,7 @@ bool wxAuiNotebook::RemovePage(size_t page_idx)
     if (new_active)
     {
         m_curpage = -1;
     if (new_active)
     {
         m_curpage = -1;
-        SetSelection(m_tabs.GetIdxFromWindow(new_active));
+        SetSelectionToWindow(new_active);
     }
 
     return true;
     }
 
     return true;
@@ -2733,6 +2751,16 @@ bool wxAuiNotebook::SetPageText(size_t page_idx, const wxString& text)
     return true;
 }
 
     return true;
 }
 
+// returns the page caption
+wxString wxAuiNotebook::GetPageText(size_t page_idx) const
+{
+    if (page_idx >= m_tabs.GetPageCount())
+        return wxEmptyString;
+
+    // update our own tab catalog
+    const wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx);
+    return page_info.caption;
+}
 
 bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap)
 {
 
 bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap)
 {
@@ -2760,6 +2788,16 @@ bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap)
     return true;
 }
 
     return true;
 }
 
+// returns the page bitmap
+wxBitmap wxAuiNotebook::GetPageBitmap(size_t page_idx) const
+{
+    if (page_idx >= m_tabs.GetPageCount())
+        return wxBitmap();
+
+    // update our own tab catalog
+    const wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx);
+    return page_info.bitmap;
+}
 
 // GetSelection() returns the index of the currently active page
 int wxAuiNotebook::GetSelection() const
 
 // GetSelection() returns the index of the currently active page
 int wxAuiNotebook::GetSelection() const
@@ -2771,9 +2809,9 @@ int wxAuiNotebook::GetSelection() const
 size_t wxAuiNotebook::SetSelection(size_t new_page)
 {
     // don't change the page unless necessary
 size_t wxAuiNotebook::SetSelection(size_t new_page)
 {
     // don't change the page unless necessary
-    if (new_page == m_curpage)
+    if ((int)new_page == m_curpage)
         return m_curpage;
         return m_curpage;
-        
+
     wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page);
     if (!wnd)
         return m_curpage;
     wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page);
     if (!wnd)
         return m_curpage;
@@ -2829,6 +2867,14 @@ size_t wxAuiNotebook::SetSelection(size_t new_page)
     return m_curpage;
 }
 
     return m_curpage;
 }
 
+void wxAuiNotebook::SetSelectionToWindow(wxWindow *win)
+{
+    const int idx = m_tabs.GetIdxFromWindow(win);
+    wxCHECK_RET( idx != wxNOT_FOUND, _T("invalid notebook page") );
+
+    SetSelection(idx);
+}
+
 // GetPageCount() returns the total number of
 // pages managed by the multi-notebook
 size_t wxAuiNotebook::GetPageCount() const
 // GetPageCount() returns the total number of
 // pages managed by the multi-notebook
 size_t wxAuiNotebook::GetPageCount() const
@@ -2933,10 +2979,124 @@ bool wxAuiNotebook::FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx)
     return false;
 }
 
     return false;
 }
 
+void wxAuiNotebook::Split(size_t page, int direction)
+{
+    wxSize cli_size = GetClientSize();
+
+    // get the page's window pointer
+    wxWindow* wnd = GetPage(page);
+    if (!wnd)
+        return;
+
+    // notebooks with 1 or less pages can't be split
+    if (GetPageCount() < 2)
+        return;
+
+    // find out which tab control the page currently belongs to
+    wxAuiTabCtrl *src_tabs, *dest_tabs;
+    int src_idx = -1;
+    src_tabs = NULL;
+    if (!FindTab(wnd, &src_tabs, &src_idx))
+        return;
+    if (!src_tabs || src_idx == -1)
+        return;
+
+    // choose a split size
+    wxSize split_size;
+    if (GetPageCount() > 2)
+    {
+        split_size = CalculateNewSplitSize();
+    }
+     else
+    {
+        // because there are two panes, always split them
+        // equally
+        split_size = GetClientSize();
+        split_size.x /= 2;
+        split_size.y /= 2;
+    }
+
+
+    // create a new tab frame
+    wxTabFrame* new_tabs = new wxTabFrame;
+    new_tabs->m_rect = wxRect(wxPoint(0,0), split_size);
+    new_tabs->SetTabCtrlHeight(m_tab_ctrl_height);
+    new_tabs->m_tabs = new wxAuiTabCtrl(this,
+                                        m_tab_id_counter++,
+                                        wxDefaultPosition,
+                                        wxDefaultSize,
+                                        wxNO_BORDER);
+    new_tabs->m_tabs->SetArtProvider(m_tabs.GetArtProvider()->Clone());
+    new_tabs->m_tabs->SetFlags(m_flags);
+    dest_tabs = new_tabs->m_tabs;
+
+    // create a pane info structure with the information
+    // about where the pane should be added
+    wxAuiPaneInfo pane_info = wxAuiPaneInfo().Bottom().CaptionVisible(false);
+    wxPoint mouse_pt;
+
+    if (direction == wxLEFT)
+    {
+        pane_info.Left();
+        mouse_pt = wxPoint(0, cli_size.y/2);
+    }
+     else if (direction == wxRIGHT)
+    {
+        pane_info.Right();
+        mouse_pt = wxPoint(cli_size.x, cli_size.y/2);
+    }
+     else if (direction == wxTOP)
+    {
+        pane_info.Top();
+        mouse_pt = wxPoint(cli_size.x/2, 0);
+    }
+     else if (direction == wxBOTTOM)
+    {
+        pane_info.Bottom();
+        mouse_pt = wxPoint(cli_size.x/2, cli_size.y);
+    }
+
+    m_mgr.AddPane(new_tabs, pane_info, mouse_pt);
+    m_mgr.Update();
+
+    // remove the page from the source tabs
+    wxAuiNotebookPage page_info = src_tabs->GetPage(src_idx);
+    page_info.active = false;
+    src_tabs->RemovePage(page_info.window);
+    if (src_tabs->GetPageCount() > 0)
+    {
+        src_tabs->SetActivePage((size_t)0);
+        src_tabs->DoShowHide();
+        src_tabs->Refresh();
+    }
+
+
+    // add the page to the destination tabs
+    dest_tabs->InsertPage(page_info.window, page_info, 0);
+
+    if (src_tabs->GetPageCount() == 0)
+    {
+        RemoveEmptyTabFrames();
+    }
+
+    DoSizing();
+    dest_tabs->DoShowHide();
+    dest_tabs->Refresh();
+
+    // force the set selection function reset the selection
+    m_curpage = -1;
+
+    // set the active page to the one we just split off
+    SetSelectionToPage(page_info);
+
+    UpdateHintWindowSize();
+}
+
+
 void wxAuiNotebook::OnSize(wxSizeEvent& evt)
 {
     UpdateHintWindowSize();
 void wxAuiNotebook::OnSize(wxSizeEvent& evt)
 {
     UpdateHintWindowSize();
-    
+
     evt.Skip();
 }
 
     evt.Skip();
 }
 
@@ -2950,10 +3110,7 @@ void wxAuiNotebook::OnTabClicked(wxCommandEvent& command_evt)
     wxWindow* wnd = ctrl->GetWindowFromIdx(evt.GetSelection());
     wxASSERT(wnd != NULL);
 
     wxWindow* wnd = ctrl->GetWindowFromIdx(evt.GetSelection());
     wxASSERT(wnd != NULL);
 
-    int idx = m_tabs.GetIdxFromWindow(wnd);
-    wxASSERT(idx != -1);
-
-    SetSelection(idx);
+    SetSelectionToWindow(wnd);
 }
 
 void wxAuiNotebook::OnTabBeginDrag(wxCommandEvent&)
 }
 
 void wxAuiNotebook::OnTabBeginDrag(wxCommandEvent&)
@@ -3100,12 +3257,9 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
 
 
     wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject();
 
 
     wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject();
-    wxAuiTabCtrl* dest_tabs = NULL;
-    if (src_tabs)
-    {
-        // set cursor back to an arrow
-        src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW));
-    }
+    wxCHECK_RET( src_tabs, _T("no source object?") );
+
+    src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW));
 
     // get the mouse position, which will be used to determine the drop point
     wxPoint mouse_screen_pt = ::wxGetMousePosition();
 
     // get the mouse position, which will be used to determine the drop point
     wxPoint mouse_screen_pt = ::wxGetMousePosition();
@@ -3155,9 +3309,11 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
 
                 // get main index of the page
                 int main_idx = m_tabs.GetIdxFromWindow(src_page);
 
                 // get main index of the page
                 int main_idx = m_tabs.GetIdxFromWindow(src_page);
+                wxCHECK_RET( main_idx != wxNOT_FOUND, _T("no source page?") );
+
 
                 // make a copy of the page info
 
                 // make a copy of the page info
-                wxAuiNotebookPage page_info = m_tabs.GetPage((size_t)main_idx);
+                wxAuiNotebookPage page_info = m_tabs.GetPage(main_idx);
 
                 // remove the page from the source notebook
                 RemovePage(main_idx);
 
                 // remove the page from the source notebook
                 RemovePage(main_idx);
@@ -3190,7 +3346,7 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
                 dest_tabs->Refresh();
 
                 // set the selection in the destination tab control
                 dest_tabs->Refresh();
 
                 // set the selection in the destination tab control
-                nb->SetSelection(nb->m_tabs.GetIdxFromWindow(page_info.window));
+                nb->SetSelectionToPage(page_info);
 
                 return;
             }
 
                 return;
             }
@@ -3201,6 +3357,8 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
 
 
     // only perform a tab split if it's allowed
 
 
     // only perform a tab split if it's allowed
+    wxAuiTabCtrl* dest_tabs = NULL;
+
     if ((m_flags & wxAUI_NB_TAB_SPLIT) && m_tabs.GetPageCount() >= 2)
     {
         // If the pointer is in an existing tab frame, do a tab insert
     if ((m_flags & wxAUI_NB_TAB_SPLIT) && m_tabs.GetPageCount() >= 2)
     {
         // If the pointer is in an existing tab frame, do a tab insert
@@ -3223,7 +3381,7 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
                 insert_idx = dest_tabs->GetIdxFromWindow(target);
             }
         }
                 insert_idx = dest_tabs->GetIdxFromWindow(target);
             }
         }
-         else
+        else
         {
             wxPoint zero(0,0);
             wxRect rect = m_mgr.CalculateHintRect(m_dummy_wnd,
         {
             wxPoint zero(0,0);
             wxRect rect = m_mgr.CalculateHintRect(m_dummy_wnd,
@@ -3285,10 +3443,10 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
 
         // force the set selection function reset the selection
         m_curpage = -1;
 
         // force the set selection function reset the selection
         m_curpage = -1;
-        
+
         // set the active page to the one we just split off
         // set the active page to the one we just split off
-        SetSelection(m_tabs.GetIdxFromWindow(page_info.window));
-        
+        SetSelectionToPage(page_info);
+
         UpdateHintWindowSize();
     }
 }
         UpdateHintWindowSize();
     }
 }
@@ -3426,9 +3584,11 @@ void wxAuiNotebook::OnTabButton(wxCommandEvent& command_evt)
             {
                 close_wnd->Close();
             }
             {
                 close_wnd->Close();
             }
-             else
+            else
             {
                 int main_idx = m_tabs.GetIdxFromWindow(close_wnd);
             {
                 int main_idx = m_tabs.GetIdxFromWindow(close_wnd);
+                wxCHECK_RET( main_idx != wxNOT_FOUND, _T("no page to delete?") );
+
                 DeletePage(main_idx);
             }
         }
                 DeletePage(main_idx);
             }
         }