#ifndef __TWIN32__
#ifdef __GNUWIN32__
+#ifndef wxUSE_NORLANDER_HEADERS
#include "wx/msw/gnuwin32/extra.h"
#endif
#endif
+#endif
-#if !defined(__GNUWIN32__) || defined(__TWIN32__)
+#if !defined(__GNUWIN32__) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
#include <commctrl.h>
#endif
wxASSERT( pPage != NULL );
wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE );
- // add the tab to the control
+ // do add the tab to the control
+
+ // init all fields to 0
TC_ITEM tcItem;
- tcItem.mask = 0;
+ memset(&tcItem, 0, sizeof(tcItem));
- if (imageId != -1)
+ if ( imageId != -1 )
{
tcItem.mask |= TCIF_IMAGE;
tcItem.iImage = imageId;
}
- else
- tcItem.iImage = 0;
- if (!strText.IsEmpty())
+ if ( !strText.IsEmpty() )
{
- tcItem.mask |= TCIF_TEXT;
- tcItem.pszText = (wxChar *)strText.c_str();
+ tcItem.mask |= TCIF_TEXT;
+ tcItem.pszText = (wxChar *)strText.c_str(); // const_cast
}
- else
- tcItem.pszText = (wxChar *) NULL;
if ( TabCtrl_InsertItem(m_hwnd, nPage, &tcItem) == -1 ) {
wxLogError(_T("Can't create the notebook page '%s'."), strText.c_str());
+
return FALSE;
}
+ // if the inserted page is before the selected one, we must update the
+ // index of the selected page
+ if ( nPage <= m_nSelection )
+ {
+ // one extra page added
+ m_nSelection++;
+ }
+
// save the pointer to the page
m_aPages.Insert(pPage, nPage);
- // some page must be selected: either this one or the first one if there is
- // still no selection
- if ( bSelect )
- m_nSelection = nPage;
- else if ( m_nSelection == -1 )
- m_nSelection = 0;
-
// don't show pages by default (we'll need to adjust their size first)
HWND hwnd = GetWinHwnd(pPage);
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE);
// this updates internal flag too - otherwise it will get out of sync
pPage->Show(FALSE);
- // FIXME this is ugly, I'm breaking my own rules... but needed to get display
- // right (why?)
- wxSizeEvent event;
- OnSize(event);
+ // some page should be selected: either this one or the first one if there is
+ // still no selection
+ int selNew = -1;
+ if ( bSelect )
+ selNew = nPage;
+ else if ( m_nSelection == -1 )
+ selNew = 0;
+
+ if ( selNew != -1 )
+ SetSelection(selNew);
return TRUE;
}
void wxNotebook::OnSize(wxSizeEvent& event)
{
- // make sure the current page is shown and has focus (it's useful because all
- // pages are created invisible initially)
- if ( m_nSelection != -1 ) {
- wxNotebookPage *pPage = m_aPages[m_nSelection];
- pPage->Show(TRUE);
- pPage->SetFocus();
- }
-
// fit the notebook page to the tab control's display area
RECT rc;
rc.left = rc.top = 0;
// is it our tab control?
if ( event.GetEventObject() == this )
{
- // don't call ChangePage() here because it will generate redundant
- // notification events
int sel = event.GetOldSelection();
if ( sel != -1 )
m_aPages[sel]->Show(FALSE);
// wxNotebook helper functions
// ----------------------------------------------------------------------------
-// hide the currently active panel and show the new one
+// generate the page changing and changed events, hide the currently active
+// panel and show the new one
void wxNotebook::ChangePage(int nOldSel, int nSel)
{
// MT-FIXME should use a real semaphore
return;
}
- if ( nOldSel != -1 )
- m_aPages[nOldSel]->Show(FALSE);
-
- wxNotebookPage *pPage = m_aPages[nSel];
- pPage->Show(TRUE);
- pPage->SetFocus();
-
event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
ProcessEvent(event);
- m_nSelection = nSel;
s_bInsideChangePage = FALSE;
}