#include "wx/dcclient.h"
#include "wx/dcmemory.h"
#include "wx/control.h"
+ #include "wx/panel.h"
#endif // WX_PRECOMP
#include "wx/imaglist.h"
#include "wx/sysopt.h"
#include "wx/msw/private.h"
+#include "wx/msw/dc.h"
#include <windowsx.h>
#include "wx/msw/winundef.h"
WX_DEFINE_LIST( wxNotebookPageInfoList )
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
-
BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase)
EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange)
EVT_SIZE(wxNotebook::OnSize)
}
wxBEGIN_PROPERTIES_TABLE(wxNotebook)
- wxEVENT_PROPERTY( PageChanging , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING , wxNotebookEvent )
- wxEVENT_PROPERTY( PageChanged , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED , wxNotebookEvent )
+ wxEVENT_PROPERTY( PageChanging , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING , wxBookCtrlEvent )
+ wxEVENT_PROPERTY( PageChanged , wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED , wxBookCtrlEvent )
wxPROPERTY_COLLECTION( PageInfos , wxNotebookPageInfoList , wxNotebookPageInfo* , AddPageInfo , GetPageInfos , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
wxPROPERTY_FLAGS( WindowStyle , wxNotebookStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxBookCtrlBase)
IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject )
#endif
-IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
// ============================================================================
// implementation
if ( ::GetClassInfo(NULL, WC_TABCONTROL, &wc) )
{
gs_wndprocNotebook =
- wx_reinterpret_cast(WXFARPROC, wc.lpfnWndProc);
+ reinterpret_cast<WXFARPROC>(wc.lpfnWndProc);
wc.lpszClassName = wxT("_wx_SysTabCtl32");
wc.style &= ~(CS_HREDRAW | CS_VREDRAW);
wc.hInstance = wxGetInstance();
}
else
{
- wxLogLastError(_T("GetClassInfoEx(SysTabCtl32)"));
+ wxLogLastError(wxT("GetClassInfoEx(SysTabCtl32)"));
}
}
else if ( style & wxBK_RIGHT )
tabStyle |= TCS_VERTICAL | TCS_RIGHT;
- // ex style
- if ( exstyle )
- {
- // note that we never want to have the default WS_EX_CLIENTEDGE style
- // as it looks too ugly for the notebooks
- *exstyle = 0;
- }
-
return tabStyle;
}
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
+ const int selOld = m_nSelection;
+
if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection )
{
TabCtrl_SetCurSel(GetHwnd(), nPage);
UpdateSelection(nPage);
}
- return m_nSelection;
+ return selOld;
}
bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
tabSize.y = rect.bottom - rect.top;
}
+ const int rows = GetRowCount();
+
// add an extra margin in both directions
const int MARGIN = 8;
if ( IsVertical() )
{
sizeTotal.x += MARGIN;
- sizeTotal.y += tabSize.y + MARGIN;
+ sizeTotal.y += tabSize.y * rows + MARGIN;
}
else // horizontal layout
{
- sizeTotal.x += tabSize.x + MARGIN;
+ sizeTotal.x += tabSize.x * rows + MARGIN;
sizeTotal.y += MARGIN;
}
void wxNotebook::AdjustPageSize(wxNotebookPage *page)
{
- wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") );
+ wxCHECK_RET( page, wxT("NULL page in wxNotebook::AdjustPageSize") );
const wxRect r = GetPageSize();
if ( !r.IsEmpty() )
bool bSelect,
int imageId)
{
- wxCHECK_MSG( pPage != NULL, false, _T("NULL page in wxNotebook::InsertPage") );
+ wxCHECK_MSG( pPage != NULL, false, wxT("NULL page in wxNotebook::InsertPage") );
wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false,
- _T("invalid index in wxNotebook::InsertPage") );
+ wxT("invalid index in wxNotebook::InsertPage") );
wxASSERT_MSG( pPage->GetParent() == this,
- _T("notebook pages must have notebook as parent") );
+ wxT("notebook pages must have notebook as parent") );
// add a new tab to the control
// ----------------------------
// succeeded: save the pointer to the page
m_pages.Insert(pPage, nPage);
+ // also ensure that the notebook background is used for its pages by making
+ // them transparent: this ensures that MSWGetBgBrush() queries the notebook
+ // for the background brush to be used for erasing them
+ if ( wxPanel *panel = wxDynamicCast(pPage, wxPanel) )
+ {
+ panel->MSWSetTransparentBackground();
+ }
+
// 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
MAKELPARAM(rc.right, rc.bottom));
s_isInOnSize = false;
}
+
+ // The best size depends on the number of rows of tabs, which can
+ // change when the notepad is resized.
+ InvalidateBestSize();
}
#if wxUSE_UXTHEME
event.Skip();
}
-void wxNotebook::OnSelChange(wxNotebookEvent& event)
+void wxNotebook::OnSelChange(wxBookCtrlEvent& event)
{
// is it our tab control?
if ( event.GetEventObject() == this )
// the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE
const bool isFromParent = event.GetEventObject() == (wxObject*) parent;
const bool isFromSelf = event.GetEventObject() == (wxObject*) this;
+ const bool isForward = event.GetDirection();
- if ( isFromParent || isFromSelf )
+ if ( isFromSelf && !isForward )
+ {
+ // focus is currently on notebook tab and should leave
+ // it backwards (Shift-TAB)
+ event.SetCurrentFocus(this);
+ parent->HandleWindowEvent(event);
+ }
+ else if ( isFromParent || isFromSelf )
{
// no, it doesn't come from child, case (b) or (c): forward to a
- // page but only if direction is backwards (TAB) or from ourselves,
+ // page but only if entering notebook page (i.e. direction is
+ // backwards (Shift-TAB) comething from out-of-notebook, or
+ // direction is forward (TAB) from ourselves),
if ( m_nSelection != wxNOT_FOUND &&
(!event.GetDirection() || isFromSelf) )
{
// if the direction is forwards. Otherwise set the focus to the
// notebook itself. The notebook is always the 'first' control of a
// page.
- if ( !event.GetDirection() )
+ if ( !isForward )
{
SetFocus();
}
}
}
-WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd)
+WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *child)
{
if ( m_hbrBackground )
{
// before drawing with the background brush, we need to position it
// correctly
RECT rc;
- ::GetWindowRect((HWND)hWnd, &rc);
+ ::GetWindowRect(GetHwndOf(child), &rc);
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1);
if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) )
{
- wxLogLastError(_T("SetBrushOrgEx(notebook bg brush)"));
+ wxLogLastError(wxT("SetBrushOrgEx(notebook bg brush)"));
}
return m_hbrBackground;
}
- return wxNotebookBase::MSWGetBgBrushForChild(hDC, hWnd);
+ return wxNotebookBase::MSWGetBgBrushForChild(hDC, child);
}
bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)
bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result)
{
- wxNotebookEvent event(wxEVT_NULL, m_windowId);
+ wxBookCtrlEvent event(wxEVT_NULL, m_windowId);
NMHDR* hdr = (NMHDR *)lParam;
switch ( hdr->code ) {