]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/auibook.cpp
[ 1602455 ] [docs] Fix docs for event used by pickers & collapsiblepane
[wxWidgets.git] / src / aui / auibook.cpp
index 0ac7b5dc23b732b70faecffd1df04bda493ddf53..4ecd4c1617fee3c2cc2ef78e6cbff012bca0bd57 100644 (file)
@@ -85,7 +85,7 @@ static void DrawButtons(wxDC& dc,
         button_state == wxAUI_BUTTON_STATE_PRESSED)
     {
         dc.SetBrush(wxBrush(wxAuiStepColour(bkcolour, 120)));
-        dc.SetPen(wxPen(wxAuiStepColour(bkcolour, 70)));
+        dc.SetPen(wxPen(wxAuiStepColour(bkcolour, 75)));
 
         // draw the background behind the button
         dc.DrawRectangle(rect.x, rect.y, 15, 15);
@@ -193,10 +193,19 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt()
     wxColor base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 #endif
 
+    // the base_colour is too pale to use as our base colour,
+    // so darken it a bit --
+    if ((255-base_colour.Red()) +
+        (255-base_colour.Green()) +
+        (255-base_colour.Blue()) < 60)
+    {
+        base_colour = wxAuiStepColour(base_colour, 92);
+    }
+    
     m_base_colour = base_colour;
-    wxColor darker2_colour = wxAuiStepColour(base_colour, 70);
+    wxColor border_colour = wxAuiStepColour(base_colour, 75);
 
-    m_border_pen = wxPen(darker2_colour);
+    m_border_pen = wxPen(border_colour);
     m_base_colour_pen = wxPen(m_base_colour);
     m_base_colour_brush = wxBrush(m_base_colour);
 
@@ -267,7 +276,7 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc,
     // draw background
     wxRect r(rect.x, rect.y, rect.width+2, rect.height-3);
     wxColor top_color = wxAuiStepColour(m_base_colour, 90);
-    wxColor bottom_color = wxAuiStepColour(m_base_colour, 110);
+    wxColor bottom_color = wxAuiStepColour(m_base_colour, 170);
     dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH);
 
     // draw base lines
@@ -290,10 +299,8 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc,
 
 void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
                                  wxWindow* wnd,
+                                 const wxAuiNotebookPage& page,
                                  const wxRect& in_rect,
-                                 const wxString& caption_text,
-                                 const wxBitmap& bitmap,
-                                 bool active,
                                  int close_button_state,
                                  wxRect* out_tab_rect,
                                  wxRect* out_button_rect,
@@ -304,8 +311,8 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     wxCoord textx, texty;
 
     // if the caption is empty, measure some temporary text
-    wxString caption = caption_text;
-    if (caption_text.empty())
+    wxString caption = page.caption;
+    if (caption.empty())
         caption = wxT("Xj");
 
     dc.SetFont(m_selected_font);
@@ -317,9 +324,9 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     // figure out the size of the tab
     wxSize tab_size = GetTabSize(dc,
                                  wnd,
-                                 caption,
-                                 bitmap,
-                                 active,
+                                 page.caption,
+                                 page.bitmap,
+                                 page.active,
                                  close_button_state,
                                  x_extent);
 
@@ -329,12 +336,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     wxCoord tab_y = in_rect.y + in_rect.height - tab_height;
 
 
-    caption = caption_text;
+    caption = page.caption;
 
 
     // select pen, brush and font for the tab to be drawn
 
-    if (active)
+    if (page.active)
     {
         dc.SetFont(m_selected_font);
         textx = selected_textx;
@@ -354,6 +361,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     if (tab_x + clip_width > in_rect.x + in_rect.width)
         clip_width = (in_rect.x + in_rect.width) - tab_x;
 
+/*
     wxPoint clip_points[6];
     clip_points[0] = wxPoint(tab_x,              tab_y+tab_height-3);
     clip_points[1] = wxPoint(tab_x,              tab_y+2);
@@ -368,7 +376,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     wxRegion clipping_region(WXSIZEOF(clip_points), clip_points);
     dc.SetClippingRegion(clipping_region);
 #endif // !wxDFB && !wxCocoa
+*/
+    // since the above code above doesn't play well with WXDFB or WXCOCOA,
+    // 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);
@@ -382,7 +395,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     int drawn_tab_height = border_points[0].y - border_points[1].y;
 
 
-    if (active)
+    if (page.active)
     {
         // draw active tab
 
@@ -390,12 +403,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
         wxRect r(tab_x, tab_y, tab_width, tab_height);
         dc.SetPen(m_base_colour_pen);
         dc.SetBrush(m_base_colour_brush);
-        dc.DrawRectangle(r.x, r.y, r.width, r.height);
+        dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4);
 
         // this white helps fill out the gradient at the top of the tab
         dc.SetPen(*wxWHITE_PEN);
         dc.SetBrush(*wxWHITE_BRUSH);
-        dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height);
+        dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4);
 
         // these two points help the rounded corners appear more antialiased
         dc.SetPen(m_base_colour_pen);
@@ -431,7 +444,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
         
         // -- draw top gradient fill for glossy look
         wxColor top_color = m_base_colour;
-        wxColor bottom_color = wxAuiStepColour(top_color, 106);
+        wxColor bottom_color = wxAuiStepColour(top_color, 160);
         dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH);
         
         r.y += r.height;
@@ -450,7 +463,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
 
     // there are two horizontal grey lines at the bottom of the tab control,
     // this gets rid of the top one of those lines in the tab control
-    if (active)
+    if (page.active)
     {
         wxColor start_color = m_base_colour;
         dc.SetPen(m_base_colour_pen);
@@ -469,17 +482,17 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc,
     }
 
 
-    if (bitmap.IsOk())
+    if (page.bitmap.IsOk())
     {
         int bitmap_offset = tab_x + 8;
 
         // draw bitmap
-        dc.DrawBitmap(bitmap,
+        dc.DrawBitmap(page.bitmap,
                       bitmap_offset,
-                      drawn_tab_yoff + (drawn_tab_height/2) - (bitmap.GetHeight()/2) + 1,
+                      drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2),
                       true);
 
-        text_offset = bitmap_offset + bitmap.GetWidth();
+        text_offset = bitmap_offset + page.bitmap.GetWidth();
         text_offset += 3; // bitmap padding
     }
      else
@@ -583,47 +596,40 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc,
                                     int bitmap_id,
                                     int button_state,
                                     int orientation,
-                                    const wxBitmap& bitmap_override,
                                     wxRect* out_rect)
 {
     wxBitmap bmp;
     wxRect rect;
 
-    if (bitmap_override.IsOk())
+    switch (bitmap_id)
     {
-        bmp = bitmap_override;
-    }
-     else
-    {
-        switch (bitmap_id)
-        {
-            case wxAUI_BUTTON_CLOSE:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_close_bmp;
-                     else
-                    bmp = m_active_close_bmp;
-                break;
-            case wxAUI_BUTTON_LEFT:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_left_bmp;
-                     else
-                    bmp = m_active_left_bmp;
-                break;
-            case wxAUI_BUTTON_RIGHT:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_right_bmp;
-                     else
-                    bmp = m_active_right_bmp;
-                break;
-            case wxAUI_BUTTON_WINDOWLIST:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_windowlist_bmp;
-                     else
-                    bmp = m_active_windowlist_bmp;
-                break;
-        }
+        case wxAUI_BUTTON_CLOSE:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_close_bmp;
+                 else
+                bmp = m_active_close_bmp;
+            break;
+        case wxAUI_BUTTON_LEFT:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_left_bmp;
+                 else
+                bmp = m_active_left_bmp;
+            break;
+        case wxAUI_BUTTON_RIGHT:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_right_bmp;
+                 else
+                bmp = m_active_right_bmp;
+            break;
+        case wxAUI_BUTTON_WINDOWLIST:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_windowlist_bmp;
+                 else
+                bmp = m_active_windowlist_bmp;
+            break;
     }
 
+
     if (!bmp.IsOk())
         return;
 
@@ -650,16 +656,17 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc,
 }
 
 
-int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd,
-                                       const wxArrayString& items,
-                                       int active_idx)
+int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd,
+                                     const wxAuiNotebookPageArray& pages,
+                                     int active_idx)
 {
        wxMenu menuPopup;
 
-    size_t i, count = items.GetCount();
+    size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
     {
-        menuPopup.AppendCheckItem(1000+i, items.Item(i));
+        const wxAuiNotebookPage& page = pages.Item(i);
+        menuPopup.AppendCheckItem(1000+i, page.caption);
     }
 
     if (active_idx != -1)
@@ -667,15 +674,9 @@ int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd,
         menuPopup.Check(1000+active_idx, true);
     }
 
-    // find out where to put the popup menu of window
-    // items.  Subtract 100 for now to center the menu
-    // a bit, until a better mechanism can be implemented
+    // find out where to put the popup menu of window items
     wxPoint pt = ::wxGetMousePosition();
     pt = wnd->ScreenToClient(pt);
-    if (pt.x < 100)
-        pt.x = 0;
-         else
-        pt.x -= 100;
 
     // find out the screen coordinate at the bottom of the tab ctrl
     wxRect cli_rect = wnd->GetClientRect();
@@ -694,7 +695,7 @@ int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd,
 }
 
 int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd,
-                                           wxAuiNotebookPageArray& pages,
+                                           const wxAuiNotebookPageArray& pages,
                                            const wxSize& required_bmp_size)
 {
     wxClientDC dc(wnd);
@@ -772,7 +773,7 @@ wxAuiSimpleTabArt::wxAuiSimpleTabArt()
 
     wxColour base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 
-    wxColour background_colour = wxAuiStepColour(base_colour, 95);
+    wxColour background_colour = base_colour;
     wxColour normaltab_colour = base_colour;
     wxColour selectedtab_colour = *wxWHITE;
 
@@ -865,10 +866,8 @@ void wxAuiSimpleTabArt::DrawBackground(wxDC& dc,
 
 void wxAuiSimpleTabArt::DrawTab(wxDC& dc,
                                 wxWindow* wnd,
+                                const wxAuiNotebookPage& page,
                                 const wxRect& in_rect,
-                                const wxString& caption_text,
-                                const wxBitmap& bitmap,
-                                bool active,
                                 int close_button_state,
                                 wxRect* out_tab_rect,
                                 wxRect* out_button_rect,
@@ -879,8 +878,8 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc,
     wxCoord textx, texty;
 
     // if the caption is empty, measure some temporary text
-    wxString caption = caption_text;
-    if (caption_text.empty())
+    wxString caption = page.caption;
+    if (caption.empty())
         caption = wxT("Xj");
 
     dc.SetFont(m_selected_font);
@@ -892,9 +891,9 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc,
     // figure out the size of the tab
     wxSize tab_size = GetTabSize(dc,
                                  wnd,
-                                 caption,
-                                 bitmap,
-                                 active,
+                                 page.caption,
+                                 page.bitmap,
+                                 page.active,
                                  close_button_state,
                                  x_extent);
 
@@ -903,11 +902,11 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc,
     wxCoord tab_x = in_rect.x;
     wxCoord tab_y = in_rect.y + in_rect.height - tab_height;
 
-    caption = caption_text;
+    caption = page.caption;
 
     // select pen, brush and font for the tab to be drawn
 
-    if (active)
+    if (page.active)
     {
         dc.SetPen(m_selected_bkpen);
         dc.SetBrush(m_selected_bkbrush);
@@ -984,7 +983,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc,
     if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
     {
         wxBitmap bmp;
-        if (active)
+        if (page.active)
             bmp = m_active_close_bmp;
              else
             bmp = m_disabled_close_bmp;
@@ -1045,45 +1044,37 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc,
                                    int bitmap_id,
                                    int button_state,
                                    int orientation,
-                                   const wxBitmap& bitmap_override,
                                    wxRect* out_rect)
 {
     wxBitmap bmp;
     wxRect rect;
 
-    if (bitmap_override.IsOk())
+    switch (bitmap_id)
     {
-        bmp = bitmap_override;
-    }
-     else
-    {
-        switch (bitmap_id)
-        {
-            case wxAUI_BUTTON_CLOSE:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_close_bmp;
-                     else
-                    bmp = m_active_close_bmp;
-                break;
-            case wxAUI_BUTTON_LEFT:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_left_bmp;
-                     else
-                    bmp = m_active_left_bmp;
-                break;
-            case wxAUI_BUTTON_RIGHT:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_right_bmp;
-                     else
-                    bmp = m_active_right_bmp;
-                break;
-            case wxAUI_BUTTON_WINDOWLIST:
-                if (button_state & wxAUI_BUTTON_STATE_DISABLED)
-                    bmp = m_disabled_windowlist_bmp;
-                     else
-                    bmp = m_active_windowlist_bmp;
-                break;
-        }
+        case wxAUI_BUTTON_CLOSE:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_close_bmp;
+                 else
+                bmp = m_active_close_bmp;
+            break;
+        case wxAUI_BUTTON_LEFT:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_left_bmp;
+                 else
+                bmp = m_active_left_bmp;
+            break;
+        case wxAUI_BUTTON_RIGHT:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_right_bmp;
+                 else
+                bmp = m_active_right_bmp;
+            break;
+        case wxAUI_BUTTON_WINDOWLIST:
+            if (button_state & wxAUI_BUTTON_STATE_DISABLED)
+                bmp = m_disabled_windowlist_bmp;
+                 else
+                bmp = m_active_windowlist_bmp;
+            break;
     }
 
     if (!bmp.IsOk())
@@ -1112,16 +1103,17 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc,
 }
 
 
-int wxAuiSimpleTabArt::ShowWindowList(wxWindow* wnd,
-                                      const wxArrayString& items,
-                                      int active_idx)
+int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd,
+                                    const wxAuiNotebookPageArray& pages,
+                                    int active_idx)
 {
        wxMenu menuPopup;
 
-    size_t i, count = items.GetCount();
+    size_t i, count = pages.GetCount();
     for (i = 0; i < count; ++i)
     {
-        menuPopup.AppendCheckItem(1000+i, items.Item(i));
+        const wxAuiNotebookPage& page = pages.Item(i);
+        menuPopup.AppendCheckItem(1000+i, page.caption);
     }
 
     if (active_idx != -1)
@@ -1156,7 +1148,7 @@ int wxAuiSimpleTabArt::ShowWindowList(wxWindow* wnd,
 }
 
 int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd,
-                                          wxAuiNotebookPageArray& WXUNUSED(pages),
+                                          const wxAuiNotebookPageArray& WXUNUSED(pages),
                                           const wxSize& WXUNUSED(required_bmp_size))
 {
     wxClientDC dc(wnd);
@@ -1658,7 +1650,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd)
                           button.id,
                           button.cur_state,
                           wxRIGHT,
-                          wxNullBitmap,
                           &button.rect);
 
         offset -= button.rect.GetWidth();
@@ -1688,7 +1679,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd)
                           button.id,
                           button.cur_state,
                           wxLEFT,
-                          wxNullBitmap,
                           &button.rect);
 
         offset += button.rect.GetWidth();
@@ -1766,10 +1756,8 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd)
 
         m_art->DrawTab(dc,
                        wnd,
+                       page,
                        rect,
-                       page.caption,
-                       page.bitmap,
-                       page.active,
                        tab_button.cur_state,
                        &page.rect,
                        &tab_button.rect,
@@ -1811,10 +1799,8 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd)
         rect.x = active_offset;
         m_art->DrawTab(dc,
                        wnd,
+                       page,
                        active_rect,
-                       page.caption,
-                       page.bitmap,
-                       page.active,
                        tab_button.cur_state,
                        &page.rect,
                        &tab_button.rect,
@@ -1960,6 +1946,7 @@ BEGIN_EVENT_TABLE(wxAuiTabCtrl, wxControl)
     EVT_ERASE_BACKGROUND(wxAuiTabCtrl::OnEraseBackground)
     EVT_SIZE(wxAuiTabCtrl::OnSize)
     EVT_LEFT_DOWN(wxAuiTabCtrl::OnLeftDown)
+    EVT_LEFT_DCLICK(wxAuiTabCtrl::OnLeftDown)
     EVT_LEFT_UP(wxAuiTabCtrl::OnLeftUp)
     EVT_MOTION(wxAuiTabCtrl::OnMotion)
     EVT_LEAVE_WINDOW(wxAuiTabCtrl::OnLeaveWindow)
@@ -2018,7 +2005,11 @@ void wxAuiTabCtrl::OnLeftDown(wxMouseEvent& evt)
     {
         int new_selection = GetIdxFromWindow(wnd);
 
-        if (new_selection != GetActivePage())
+        // wxAuiNotebooks always want to receive this event
+        // even if the tab is already active, because they may
+        // have multiple tab controls
+        if (new_selection != GetActivePage() ||
+            GetParent()->IsKindOf(CLASSINFO(wxAuiNotebook)))
         {
             wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId);
             e.SetSelection(new_selection);
@@ -2190,16 +2181,7 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event)
     }
      else if (button == wxAUI_BUTTON_WINDOWLIST)
     {
-        wxArrayString as;
-
-        size_t i, page_count = m_pages.GetCount();
-        for (i = 0; i < page_count; ++i)
-        {
-            wxAuiNotebookPage& page = m_pages.Item(i);
-            as.Add(page.caption);
-        }
-
-        int idx = GetArtProvider()->ShowWindowList(this, as, GetActivePage());
+        int idx = GetArtProvider()->ShowDropDown(this, m_pages, GetActivePage());
 
         if (idx != -1)
         {
@@ -2306,29 +2288,27 @@ public:
 };
 
 
-
+const int wxAuiBaseTabCtrlId = 5380;
 
 
 // -- wxAuiNotebook class implementation --
 
 BEGIN_EVENT_TABLE(wxAuiNotebook, wxControl)
-    //EVT_ERASE_BACKGROUND(wxAuiNotebook::OnEraseBackground)
     EVT_SIZE(wxAuiNotebook::OnSize)
-    //EVT_LEFT_DOWN(wxAuiNotebook::OnLeftDown)
     EVT_CHILD_FOCUS(wxAuiNotebook::OnChildFocus)
-    EVT_COMMAND_RANGE(10000, 10100,
+    EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
                       wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING,
                       wxAuiNotebook::OnTabClicked)
-    EVT_COMMAND_RANGE(10000, 10100,
+    EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
                       wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG,
                       wxAuiNotebook::OnTabBeginDrag)
-    EVT_COMMAND_RANGE(10000, 10100,
+    EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
                       wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
                       wxAuiNotebook::OnTabEndDrag)
-    EVT_COMMAND_RANGE(10000, 10100,
+    EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
                       wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION,
                       wxAuiNotebook::OnTabDragMotion)
-    EVT_COMMAND_RANGE(10000, 10100,
+    EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
                       wxEVT_COMMAND_AUINOTEBOOK_BUTTON,
                       wxAuiNotebook::OnTabButton)
 END_EVENT_TABLE()
@@ -2336,7 +2316,7 @@ END_EVENT_TABLE()
 wxAuiNotebook::wxAuiNotebook()
 {
     m_curpage = -1;
-    m_tab_id_counter = 10000;
+    m_tab_id_counter = wxAuiBaseTabCtrlId;
     m_dummy_wnd = NULL;
     m_tab_ctrl_height = 20;
     m_requested_bmp_size = wxDefaultSize;
@@ -2374,7 +2354,7 @@ bool wxAuiNotebook::Create(wxWindow* parent,
 void wxAuiNotebook::InitNotebook(long style)
 {
     m_curpage = -1;
-    m_tab_id_counter = 10000;
+    m_tab_id_counter = wxAuiBaseTabCtrlId;
     m_dummy_wnd = NULL;
     m_flags = (unsigned int)style;
     m_tab_ctrl_height = 20;
@@ -2390,7 +2370,8 @@ void wxAuiNotebook::InitNotebook(long style)
     m_dummy_wnd->Show(false);
 
     m_mgr.SetManagedWindow(this);
-    m_mgr.SetFlags(wxAUI_MGR_DEFAULT | (1 << 28) /*wxAUI_MGR_NO_DOCK_SIZE_LIMIT*/);
+    m_mgr.SetFlags(wxAUI_MGR_DEFAULT);
+    m_mgr.SetDockSizeConstraint(1.0, 1.0); // no dock size constraint
 
     m_mgr.AddPane(m_dummy_wnd,
               wxAuiPaneInfo().Name(wxT("dummy")).Bottom().CaptionVisible(false).Show(false));
@@ -2606,6 +2587,12 @@ bool wxAuiNotebook::InsertPage(size_t page_idx,
 
     m_tabs.InsertPage(page, info, page_idx);
 
+    // if that was the first page added, even if
+    // 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);
+
     wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl();
     if (page_idx >= active_tabctrl->GetPageCount())
         active_tabctrl->AddPage(page, info);
@@ -2783,6 +2770,10 @@ int wxAuiNotebook::GetSelection() const
 // SetSelection() sets the currently active page
 size_t wxAuiNotebook::SetSelection(size_t new_page)
 {
+    // don't change the page unless necessary
+    if (new_page == m_curpage)
+        return m_curpage;
+        
     wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page);
     if (!wnd)
         return m_curpage;
@@ -2942,11 +2933,6 @@ bool wxAuiNotebook::FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx)
     return false;
 }
 
-
-void wxAuiNotebook::OnEraseBackground(wxEraseEvent&)
-{
-}
-
 void wxAuiNotebook::OnSize(wxSizeEvent& evt)
 {
     UpdateHintWindowSize();
@@ -3297,6 +3283,10 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt)
         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
         SetSelection(m_tabs.GetIdxFromWindow(page_info.window));
         
         UpdateHintWindowSize();