#include "wx/event.h"
#include "wx/control.h"
#include "wx/notebook.h"
+#include "wx/app.h"
#include "wx/msw/private.h"
#include <commctrl.h>
#endif
+#include "wx/msw/winundef.h"
+
+#if wxUSE_UXTHEME
+#include "wx/msw/uxtheme.h"
+
+#include "wx/radiobut.h"
+#include "wx/radiobox.h"
+#include "wx/checkbox.h"
+#include "wx/bmpbuttn.h"
+#include "wx/statline.h"
+#include "wx/statbox.h"
+#include "wx/stattext.h"
+#include "wx/slider.h"
+#include "wx/scrolwin.h"
+#include "wx/panel.h"
+#endif
+
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
long style,
const wxString& name)
{
- // base init
+ // Does ComCtl32 support non-top tabs?
+ int verComCtl32 = wxApp::GetComCtl32Version();
+ if ( verComCtl32 < 470 || verComCtl32 >= 600 )
+ {
+ if (style & wxNB_BOTTOM)
+ style &= ~wxNB_BOTTOM;
+
+ if (style & wxNB_LEFT)
+ style &= ~wxNB_LEFT;
+
+ if (style & wxNB_RIGHT)
+ style &= ~wxNB_RIGHT;
+ }
+
if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL,
wxDefaultValidator, name) )
return FALSE;
- if ( !MSWCreateControl(WC_TABCONTROL, _T(""), pos, size) )
+ if ( !MSWCreateControl(WC_TABCONTROL, wxEmptyString, pos, size) )
return FALSE;
SetBackgroundColour(wxColour(::GetSysColor(COLOR_BTNFACE)));
wxString wxNotebook::GetPageText(int nPage) const
{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), wxT(""), wxT("notebook page out of range") );
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxEmptyString, wxT("notebook page out of range") );
wxChar buf[256];
TC_ITEM tcItem;
wxASSERT_MSG( pPage->GetParent() == this,
_T("notebook pages must have notebook as parent") );
+#if wxUSE_UXTHEME && wxUSE_UXTHEME_AUTO
+ // Automatically apply the theme background,
+ // changing the colour of the panel to match the
+ // tab page colour. This won't work well with all
+ // themes but it's a start.
+ if (wxUxThemeEngine::Get() && pPage->IsKindOf(CLASSINFO(wxPanel)))
+ {
+ ApplyThemeBackground(pPage, GetThemeBackgroundColour());
+ }
+#endif
+
// add a new tab to the control
// ----------------------------
return TRUE;
}
-// Hit test
-int wxNotebook::HitTest(const wxPoint& pt, long& flags)
+int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
{
TC_HITTESTINFO hitTestInfo;
hitTestInfo.pt.x = pt.x;
hitTestInfo.pt.y = pt.y;
- int item = TabCtrl_HitTest( (HWND) GetHWND(), & hitTestInfo ) ;
- flags = 0;
+ int item = TabCtrl_HitTest(GetHwnd(), &hitTestInfo);
- if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE)
- flags |= wxNB_HITTEST_NOWHERE;
- if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON)
- flags |= wxNB_HITTEST_ONICON;
- if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL)
- flags |= wxNB_HITTEST_ONLABEL;
+ if ( flags )
+ {
+ *flags = 0;
+
+ if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE)
+ *flags |= wxNB_HITTEST_NOWHERE;
+ if ((hitTestInfo.flags & TCHT_ONITEM) == TCHT_ONITEM)
+ *flags |= wxNB_HITTEST_ONITEM;
+ if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON)
+ *flags |= wxNB_HITTEST_ONICON;
+ if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL)
+ *flags |= wxNB_HITTEST_ONLABEL;
+ }
return item;
}
+
// ----------------------------------------------------------------------------
// wxNotebook callbacks
// ----------------------------------------------------------------------------
// 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 )
+ // the cast is here to fic a GCC ICE
+ if ( ((wxWindow*)event.GetEventObject()) == parent )
{
// no, it doesn't come from child, case (b): forward to a page
if ( m_nSelection != -1 )
return processed;
}
+// Windows only: attempts to get colour for UX theme page background
+wxColour wxNotebook::GetThemeBackgroundColour()
+{
+#if wxUSE_UXTHEME
+ if (wxUxThemeEngine::Get())
+ {
+ WXHTHEME hTheme = wxUxThemeEngine::Get()->m_pfnOpenThemeData(GetHWND(), L"TAB");
+ if (hTheme)
+ {
+ // This is total guesswork.
+ // See PlatformSDK\Include\Tmschema.h for values
+ COLORREF themeColor;
+ wxUxThemeEngine::Get()->
+ m_pfnGetThemeColor(hTheme,
+ 10 /* TABP_BODY */,
+ 1 /* NORMAL */,
+ 3821, /* FILLCOLORHINT */
+ & themeColor);
+
+ wxUxThemeEngine::Get()->m_pfnCloseThemeData(hTheme);
+
+ wxColour colour(GetRValue(themeColor), GetGValue(themeColor), GetBValue(themeColor));
+ return colour;
+ }
+ }
+#endif
+ return GetBackgroundColour();
+}
+
+// Windows only: attempts to apply the UX theme page background to this page
+void wxNotebook::ApplyThemeBackground(wxWindow* window, const wxColour& colour)
+{
+#if wxUSE_UXTHEME
+ // Don't set the background for buttons since this will
+ // switch it into ownerdraw mode
+ if (window->IsKindOf(CLASSINFO(wxButton)) && !window->IsKindOf(CLASSINFO(wxBitmapButton)))
+ // This is essential, otherwise you'll see dark grey
+ // corners in the buttons.
+ ((wxButton*)window)->wxControl::SetBackgroundColour(colour);
+ else if (window->IsKindOf(CLASSINFO(wxStaticText)) ||
+ window->IsKindOf(CLASSINFO(wxStaticBox)) ||
+ window->IsKindOf(CLASSINFO(wxStaticLine)) ||
+ window->IsKindOf(CLASSINFO(wxRadioButton)) ||
+ window->IsKindOf(CLASSINFO(wxRadioBox)) ||
+ window->IsKindOf(CLASSINFO(wxCheckBox)) ||
+ window->IsKindOf(CLASSINFO(wxBitmapButton)) ||
+ window->IsKindOf(CLASSINFO(wxSlider)) ||
+ window->IsKindOf(CLASSINFO(wxPanel)) ||
+ (window->IsKindOf(CLASSINFO(wxNotebook)) && (window != this)) ||
+ window->IsKindOf(CLASSINFO(wxScrolledWindow))
+ )
+ {
+ window->SetBackgroundColour(colour);
+ }
+
+ for ( wxWindowList::compatibility_iterator node = window->GetChildren().GetFirst(); node; node = node->GetNext() )
+ {
+ wxWindow *child = node->GetData();
+ ApplyThemeBackground(child, colour);
+ }
+#endif
+}
+
#endif // wxUSE_NOTEBOOK