// wxWindows
#ifndef WX_PRECOMP
- #include <wx/string.h>
+ #include "wx/string.h"
#endif // WX_PRECOMP
-#include <wx/log.h>
-#include <wx/imaglist.h>
-#include <wx/event.h>
-#include <wx/control.h>
-#include <wx/notebook.h>
+#include "wx/log.h"
+#include "wx/imaglist.h"
+#include "wx/event.h"
+#include "wx/control.h"
+#include "wx/notebook.h"
-#include <wx/msw/private.h>
+#include "wx/msw/private.h"
// Windows standard headers
#ifndef __WIN95__
#include <windowsx.h> // for SetWindowFont
#ifndef __TWIN32__
-#ifdef __GNUWIN32__
-#ifndef wxUSE_NORLANDER_HEADERS
- #include "wx/msw/gnuwin32/extra.h"
-#endif
-#endif
+ #ifdef __GNUWIN32_OLD__
+ #include "wx/msw/gnuwin32/extra.h"
+ #endif
#endif
-#if !defined(__GNUWIN32__) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
- #include <commctrl.h>
+#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) && !defined(__CYGWIN10__))
+ #include <commctrl.h>
#endif
// ----------------------------------------------------------------------------
// event table
// ----------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARIES
- BEGIN_EVENT_TABLE(wxNotebook, wxControl)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
+
+BEGIN_EVENT_TABLE(wxNotebook, wxControl)
EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange)
EVT_SIZE(wxNotebook::OnSize)
EVT_SET_FOCUS(wxNotebook::OnSetFocus)
EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
- END_EVENT_TABLE()
+END_EVENT_TABLE()
- IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
- IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
-#endif
+IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
// ============================================================================
// implementation
void wxNotebook::Init()
{
m_pImageList = NULL;
+ m_bOwnsImageList = FALSE;
m_nSelection = -1;
}
// colors and font
m_backgroundColour = wxColour(GetSysColor(COLOR_BTNFACE));
- m_foregroundColour = *wxBLACK ;
+ m_foregroundColour = *wxBLACK;
// style
m_windowStyle = style | wxTAB_TRAVERSAL;
long tabStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | TCS_TABS;
+ if ( m_windowStyle & wxCLIP_SIBLINGS )
+ tabStyle |= WS_CLIPSIBLINGS;
if (m_windowStyle & wxCLIP_CHILDREN)
tabStyle |= WS_CLIPCHILDREN;
if ( m_windowStyle & wxTC_MULTILINE )
// dtor
wxNotebook::~wxNotebook()
{
+ if (m_bOwnsImageList) delete m_pImageList;
}
// ----------------------------------------------------------------------------
void wxNotebook::SetImageList(wxImageList* imageList)
{
+ if (m_bOwnsImageList) delete m_pImageList;
m_pImageList = imageList;
+ m_bOwnsImageList = FALSE;
TabCtrl_SetImageList(m_hwnd, (HIMAGELIST)imageList->GetHIMAGELIST());
}
+void wxNotebook::AssignImageList(wxImageList* imageList)
+{
+ SetImageList(imageList);
+ m_bOwnsImageList = TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// wxNotebook size settings
+// ----------------------------------------------------------------------------
+
+void wxNotebook::SetPageSize(const wxSize& size)
+{
+ // transform the page size into the notebook size
+ RECT rc;
+ rc.left =
+ rc.top = 0;
+ rc.right = size.x;
+ rc.bottom = size.y;
+
+ TabCtrl_AdjustRect(GetHwnd(), TRUE, &rc);
+
+ // and now set it
+ SetSize(rc.right - rc.left, rc.bottom - rc.top);
+}
+
+void wxNotebook::SetPadding(const wxSize& padding)
+{
+ TabCtrl_SetPadding(GetHwnd(), padding.x, padding.y);
+}
// Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH
// style.
// no selection if the notebook became empty
m_nSelection = -1;
}
+ else
+ m_nSelection = TabCtrl_GetCurSel(m_hwnd);
+
return TRUE;
}
m_aPages.Remove(nPage);
+ if ( m_aPages.IsEmpty() )
+ m_nSelection = -1;
+ else
+ m_nSelection = TabCtrl_GetCurSel(m_hwnd);
+
return TRUE;
}
TabCtrl_DeleteAllItems(m_hwnd);
+ m_nSelection = -1;
+
return TRUE;
}
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);
- if ( pPage->GetAutoLayout() )
- pPage->Layout();
-
// some page should be selected: either this one or the first one if there is
// still no selection
GetSize((int *)&rc.right, (int *)&rc.bottom);
TabCtrl_AdjustRect(m_hwnd, FALSE, &rc);
+
+ int width = rc.right - rc.left,
+ height = rc.bottom - rc.top;
size_t nCount = m_aPages.Count();
for ( size_t 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();
+ pPage->SetSize(rc.left, rc.top, width, height);
}
event.Skip();
void wxNotebook::OnSetFocus(wxFocusEvent& event)
{
- // set focus to the currently selected page if any
- if ( m_nSelection != -1 )
- m_aPages[m_nSelection]->SetFocus();
+ // this function is only called when the focus is explicitly set (i.e. from
+ // the program) to the notebook - in this case we don't need the
+ // complicated OnNavigationKey() logic because the programmer knows better
+ // what [s]he wants
- event.Skip();
+ // set focus to the currently selected page if any
+ if ( m_nSelection != -1 )
+ m_aPages[m_nSelection]->SetFocus();
+
+ event.Skip();
}
void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
{
- if ( event.IsWindowChange() ) {
- // change pages
- AdvanceSelection(event.GetDirection());
- }
- else {
- // pass to the parent
- if ( GetParent() ) {
- event.SetCurrentFocus(this);
- GetParent()->GetEventHandler()->ProcessEvent(event);
+ if ( event.IsWindowChange() ) {
+ // change pages
+ AdvanceSelection(event.GetDirection());
+ }
+ else {
+ // we get this event in 2 cases
+ //
+ // a) one of our pages might have generated it because the user TABbed
+ // out from it in which case we should propagate the event upwards and
+ // our parent will take care of setting the focus to prev/next sibling
+ //
+ // or
+ //
+ // b) the parent panel wants to give the focus to us so that we
+ // forward it to our selected page. We can't deal with this in
+ // OnSetFocus() because we don't know which direction the focus came
+ // from in this case and so can't choose between setting the focus to
+ // first or last panel child
+
+ wxWindow *parent = GetParent();
+ if ( event.GetEventObject() == parent )
+ {
+ // no, it doesn't come from child, case (b): forward to a page
+ if ( m_nSelection != -1 )
+ {
+ // so that the page knows that the event comes from it's parent
+ // and is being propagated downwards
+ event.SetEventObject(this);
+
+ wxWindow *page = m_aPages[m_nSelection];
+ if ( !page->GetEventHandler()->ProcessEvent(event) )
+ {
+ page->SetFocus();
+ }
+ //else: page manages focus inside it itself
+ }
+ else
+ {
+ // we have no pages - still have to give focus to _something_
+ SetFocus();
+ }
+ }
+ else
+ {
+ // it comes from our child, case (a), pass to the parent
+ if ( parent ) {
+ event.SetCurrentFocus(this);
+ parent->GetEventHandler()->ProcessEvent(event);
+ }
+ }
}
- }
}
// ----------------------------------------------------------------------------
// override these 2 functions to do nothing: everything is done in OnSize
-void wxNotebook::SetConstraintSizes(bool /* recurse */)
+void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse))
{
// don't set the sizes of the pages - their correct size is not yet known
wxControl::SetConstraintSizes(FALSE);
}
-bool wxNotebook::DoPhase(int /* nPhase */)
+bool wxNotebook::DoPhase(int WXUNUSED(nPhase))
{
return TRUE;
}