// Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////////
-// TODO:
-// 1) keyboard interface for changing pages ([Shift]+Ctrl-Tab)
-// 2) using OnSize() for showing pages for the first time works, but it surely
-// us ugly
-// 3) I'm not sure that setting fonts works
-
// ============================================================================
// declarations
// ============================================================================
#error "wxNotebook is not supported under Windows 3.1"
#endif //Win95
+#include <windowsx.h> // for SetWindowFont
+
#ifdef __GNUWIN32__
#include "wx/msw/gnuwin32/extra.h"
#else //!GnuWin32
return FALSE;
}
+ SetWindowFont((HWND)m_hwnd, ::GetStockObject(DEFAULT_GUI_FONT), FALSE);
+
if ( parent != NULL )
parent->AddChild(this);
// wxNotebook callbacks
// ----------------------------------------------------------------------------
-// @@@ OnSize() is used for setting the font when it's called for the first
-// time because doing it in ::Create() doesn't work (for unknown reasons)
void wxNotebook::OnSize(wxSizeEvent& event)
{
- static bool s_bFirstTime = TRUE;
- if ( s_bFirstTime ) {
- SendMessage((HWND)m_hwnd, WM_SETFONT,
- (WPARAM)GetStockObject(DEFAULT_GUI_FONT),
- MAKELPARAM(TRUE, 0));
- s_bFirstTime = FALSE;
- }
-
// emulate page change (it's esp. important to do it first time because
// otherwise our page would stay invisible)
int nSel = m_nSelection;
m_nSelection = -1;
SetSelection(nSel);
+ // fit the notebook page to the tab control's display area
+ RECT rc;
+ rc.left = rc.top = 0;
+ GetSize((int *)&rc.right, (int *)&rc.bottom);
+
+ TabCtrl_AdjustRect(m_hwnd, FALSE, &rc);
+ uint nCount = m_aPages.Count();
+ for ( uint nPage = 0; nPage < nCount; nPage++ ) {
+ wxNotebookPage *pPage = m_aPages[nPage];
+ pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
+ if ( pPage->GetAutoLayout() )
+ pPage->Layout();
+ }
+
event.Skip();
}
// ----------------------------------------------------------------------------
// wxNotebook base class virtuals
// ----------------------------------------------------------------------------
+
+// override these 2 functions to do nothing: everything is done in OnSize
+
+void wxNotebook::SetConstraintSizes(bool /* recurse */)
+{
+ // don't set the sizes of the pages - their correct size is not yet known
+ wxControl::SetConstraintSizes(FALSE);
+}
+
+bool wxNotebook::DoPhase(int /* nPhase */)
+{
+ return TRUE;
+}
+
void wxNotebook::Command(wxCommandEvent& event)
{
wxFAIL_MSG("wxNotebook::Command not implemented");
bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam)
{
- wxNotebookEvent event(wxEVT_NULL, m_windowId,
- TabCtrl_GetCurSel(m_hwnd), m_nSelection);
+ wxNotebookEvent event(wxEVT_NULL, m_windowId);
NMHDR* hdr = (NMHDR *)lParam;
switch ( hdr->code ) {
event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING);
break;
+ // prevent this msg from being passed to wxControl::MSWNotify which would
+ // retrun FALSE disabling the change of page
+ case UDN_DELTAPOS:
+ return TRUE;
+
default :
return wxControl::MSWNotify(wParam, lParam);
}
+ event.SetSelection(TabCtrl_GetCurSel(m_hwnd));
+ event.SetOldSelection(m_nSelection);
event.SetEventObject(this);
event.SetInt(LOWORD(wParam));
// hide the currently active panel and show the new one
void wxNotebook::ChangePage(int nOldSel, int nSel)
{
- wxASSERT( nOldSel != nSel ); // impossible
+ // it's not an error (the message may be generated by the tab control itself)
+ // and it may happen - just do nothing
+ if ( nSel == nOldSel )
+ return;
- if ( nOldSel != -1 ) {
+ if ( nOldSel != -1 )
m_aPages[nOldSel]->Show(FALSE);
- }
wxNotebookPage *pPage = m_aPages[nSel];
- FitPage(pPage);
pPage->Show(TRUE);
-
- // set focus to the currently selected page
- wxWindow *win = m_aPages[nSel];
- if ( win->IsKindOf(CLASSINFO(wxPanel)) ) {
- wxList *children = win->GetChildren();
- if ( children->First() != NULL );
- win = (wxWindow *)children->First()->Data();
- }
- win->SetFocus();
+ pPage->SetFocus();
m_nSelection = nSel;
}
-
-// fit the notebook page to the tab control's display area
-void wxNotebook::FitPage(wxNotebookPage *pPage)
-{
- RECT rc;
- rc.left = rc.top = 0;
- GetSize((int *)&rc.right, (int *)&rc.bottom);
-
- TabCtrl_AdjustRect(m_hwnd, FALSE, &rc);
- pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
-}
\ No newline at end of file