#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;
::SendMessage(GetHwnd(), TCM_SETITEMSIZE, 0, MAKELPARAM(sz.x, sz.y));
}
+wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const
+{
+ wxSize sizeTotal = sizePage;
+
+ // We need to make getting tab size part of the wxWindows API.
+ wxSize tabSize(0, 0);
+ if (GetPageCount() > 0)
+ {
+ RECT rect;
+ TabCtrl_GetItemRect((HWND) GetHWND(), 0, & rect);
+ tabSize.x = rect.right - rect.left;
+ tabSize.y = rect.bottom - rect.top;
+ }
+ if ( HasFlag(wxNB_LEFT) || HasFlag(wxNB_RIGHT) )
+ {
+ sizeTotal.x += tabSize.x + 7;
+ sizeTotal.y += 7;
+ }
+ else
+ {
+ sizeTotal.x += 7;
+ sizeTotal.y += tabSize.y + 7;
+ }
+
+ return sizeTotal;
+}
+
void wxNotebook::AdjustPageSize(wxNotebookPage *page)
{
wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") );
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)
+{
+ TC_HITTESTINFO hitTestInfo;
+ hitTestInfo.pt.x = pt.x;
+ hitTestInfo.pt.y = pt.y;
+ int item = TabCtrl_HitTest( (HWND) GetHWND(), & hitTestInfo ) ;
+ flags = 0;
+
+ 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;
+
+ return item;
+}
+
// ----------------------------------------------------------------------------
// wxNotebook callbacks
// ----------------------------------------------------------------------------
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::Node *node = window->GetChildren().GetFirst(); node; node = node->GetNext() )
+ {
+ wxWindow *child = node->GetData();
+ ApplyThemeBackground(child, colour);
+ }
+#endif
+}
+
#endif // wxUSE_NOTEBOOK