+ return false;
+ }
+
+ // need to update the bg brush when the first page is added
+ // so the first panel gets the correct themed background
+ if ( m_pages.empty() )
+ {
+#if wxUSE_UXTHEME
+ UpdateBgBrush();
+#endif // wxUSE_UXTHEME
+ }
+
+ // succeeded: save the pointer to the page
+ m_pages.Insert(pPage, nPage);
+
+ // we may need to adjust the size again if the notebook size changed:
+ // normally this only happens for the first page we add (the tabs which
+ // hadn't been there before are now shown) but for a multiline notebook it
+ // can happen for any page at all as a new row could have been started
+ if ( m_pages.GetCount() == 1 || HasFlag(wxNB_MULTILINE) )
+ {
+ AdjustPageSize(pPage);
+
+ // Additionally, force the layout of the notebook itself by posting a
+ // size event to it. If we don't do it, notebooks with pages on the
+ // left or the right side may fail to account for the fact that they
+ // are now big enough to fit all all of their pages on one row and
+ // still reserve space for the second row of tabs, see #1792.
+ const wxSize s = GetSize();
+ ::PostMessage(GetHwnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(s.x, s.y));
+ }
+
+ // now deal with the selection
+ // ---------------------------
+
+ // if the inserted page is before the selected one, we must update the
+ // index of the selected page
+ if ( int(nPage) <= m_selection )
+ {
+ // one extra page added
+ m_selection++;
+ }
+
+ DoSetSelectionAfterInsertion(nPage, bSelect);
+
+ InvalidateBestSize();
+
+ return true;
+}
+
+int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
+{
+ TC_HITTESTINFO hitTestInfo;
+ hitTestInfo.pt.x = pt.x;
+ hitTestInfo.pt.y = pt.y;
+ int item = TabCtrl_HitTest(GetHwnd(), &hitTestInfo);
+
+ if ( flags )
+ {
+ *flags = 0;
+
+ if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE)
+ *flags |= wxBK_HITTEST_NOWHERE;
+ if ((hitTestInfo.flags & TCHT_ONITEM) == TCHT_ONITEM)
+ *flags |= wxBK_HITTEST_ONITEM;
+ if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON)
+ *flags |= wxBK_HITTEST_ONICON;
+ if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL)
+ *flags |= wxBK_HITTEST_ONLABEL;
+ if ( item == wxNOT_FOUND && GetPageSize().Contains(pt) )
+ *flags |= wxBK_HITTEST_ONPAGE;
+ }
+
+ return item;
+}
+
+// ----------------------------------------------------------------------------
+// flicker-less notebook redraw
+// ----------------------------------------------------------------------------
+
+#if USE_NOTEBOOK_ANTIFLICKER
+
+// wnd proc for the spin button
+LRESULT APIENTRY _EXPORT wxNotebookSpinBtnWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ if ( message == WM_ERASEBKGND )
+ return 0;
+
+ return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebookSpinBtn,
+ hwnd, message, wParam, lParam);
+}
+
+LRESULT APIENTRY _EXPORT wxNotebookWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebook,
+ hwnd, message, wParam, lParam);
+}
+
+void wxNotebook::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
+{
+ // do nothing here