// wxNotebook operations
// ----------------------------------------------------------------------------
-// remove one page from the notebook
-bool wxNotebook::DeletePage(int nPage)
-{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
-
- if ( m_nSelection == nPage ) {
- // advance selection backwards - the page being deleted shouldn't be left
- // selected
- AdvanceSelection(FALSE);
- }
-
- TabCtrl_DeleteItem(m_hwnd, nPage);
-
- delete m_pages[nPage];
- m_pages.RemoveAt(nPage);
-
- if ( m_pages.IsEmpty() ) {
- // no selection if the notebook became empty
- m_nSelection = -1;
- }
- else
- m_nSelection = TabCtrl_GetCurSel(m_hwnd);
-
-
- return TRUE;
-}
-
// remove one page from the notebook, without deleting
wxNotebookPage *wxNotebook::DoRemovePage(int nPage)
{
- wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage);
- if ( !pageRemoved )
- return NULL;
+ wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage);
+ if ( !pageRemoved )
+ return NULL;
- TabCtrl_DeleteItem(m_hwnd, nPage);
+ TabCtrl_DeleteItem(m_hwnd, nPage);
- if ( m_pages.IsEmpty() )
- m_nSelection = -1;
- else
- m_nSelection = TabCtrl_GetCurSel(m_hwnd);
+ if ( m_pages.IsEmpty() )
+ {
+ // no selection any more, the notebook becamse empty
+ m_nSelection = -1;
+ }
+ else // notebook still not empty
+ {
+ // change the selected page if it was deleted or became invalid
+ int selNew;
+ if ( m_nSelection == GetPageCount() )
+ {
+ // last page deleted, make the new last page the new selection
+ selNew = m_nSelection - 1;
+ }
+ else if ( nPage <= m_nSelection )
+ {
+ // we must show another page, even if it has the same index
+ selNew = m_nSelection;
+ }
+ else // nothing changes for the currently selected page
+ {
+ selNew = -1;
+
+ // we still must refresh the current page: this needs to be done
+ // for some unknown reason if the tab control shows the up-down
+ // control (i.e. when there are too many pages) -- otherwise after
+ // deleting a page nothing at all is shown
+ m_pages[m_nSelection]->Refresh();
+ }
+
+ if ( selNew != -1 )
+ {
+ // m_nSelection must be always valid so reset it before calling
+ // SetSelection()
+ m_nSelection = -1;
+ SetSelection(selNew);
+ }
+ }
- return pageRemoved;
+ return pageRemoved;
}
// remove all pages