]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/notebook.cpp
ODBC library is built when wxUSE_GUI=0, too
[wxWidgets.git] / src / msw / notebook.cpp
index 1fe45847f054b1d6518f7e73531dd917985aaeea..ea3334de804e324c4dcbda26079a3b060c875005 100644 (file)
@@ -9,7 +9,7 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "notebook.h"
 #endif
 
 // event table
 // ----------------------------------------------------------------------------
 
+#include <wx/listimpl.cpp>
+
+WX_DEFINE_LIST( wxNotebookPageInfoList ) ;
+
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
 
@@ -112,7 +116,52 @@ BEGIN_EVENT_TABLE(wxNotebook, wxControl)
     EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
 END_EVENT_TABLE()
 
+#if wxUSE_EXTENDED_RTTI
+
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebook, wxControl,"wx/notebook.h")
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxNotebookPageInfo, wxObject , "wx/notebook.h" )
+
+template<> const wxTypeInfo* wxGetTypeInfo( wxNotebookPageInfoList * )
+{
+    static wxCollectionTypeInfo s_typeInfo( (wxTypeInfo*) wxGetTypeInfo( (wxNotebookPageInfo **) NULL) ) ;
+    return &s_typeInfo ;
+}
+
+WX_BEGIN_PROPERTIES_TABLE(wxNotebook)
+    WX_PROPERTY_COLLECTION( PageInfos , wxNotebookPageInfoList , wxNotebookPageInfo* , AddPageInfo , GetPageInfos )
+/*
+       notebookpage
+               object
+               object_ref
+               label
+               selected
+               style
+               usenotebooksizer
+*/
+WX_END_PROPERTIES_TABLE()
+
+WX_BEGIN_HANDLERS_TABLE(wxNotebook)
+WX_END_HANDLERS_TABLE()
+
+WX_CONSTRUCTOR_4( wxNotebook , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size ) 
+
+
+WX_BEGIN_PROPERTIES_TABLE(wxNotebookPageInfo)
+    WX_READONLY_PROPERTY( Page , wxNotebookPage* , GetPage , )
+    WX_READONLY_PROPERTY( Text , wxString , GetText , wxEmptyString )
+    WX_READONLY_PROPERTY( Selected , bool , GetSelected , false )
+    WX_READONLY_PROPERTY( ImageId , int , GetImageId , -1 )
+WX_END_PROPERTIES_TABLE()
+
+WX_BEGIN_HANDLERS_TABLE(wxNotebookPageInfo)
+WX_END_HANDLERS_TABLE()
+
+WX_CONSTRUCTOR_4( wxNotebookPageInfo , wxNotebookPage* , Page , wxString , Text , bool , Selected , int , ImageId ) 
+
+#else
 IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxNotebookPageInfo, wxObject )
+#endif
 IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
 
 // ============================================================================
@@ -123,6 +172,19 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
 // wxNotebook construction
 // ----------------------------------------------------------------------------
 
+const wxNotebookPageInfoList& wxNotebook::GetPageInfos() const
+{
+    wxNotebookPageInfoList* list = const_cast< wxNotebookPageInfoList* >( &m_pageInfos ) ;
+    WX_CLEAR_LIST( wxNotebookPageInfoList , *list ) ;
+    for( int i = 0 ; i < GetPageCount() ; ++i )
+    {
+        wxNotebookPageInfo *info = new wxNotebookPageInfo() ;
+        info->Create( const_cast<wxNotebook*>(this)->GetPage(i) , GetPageText(i) , GetSelection() == i , GetPageImage(i) ) ;
+        list->Append( info ) ;
+    }
+    return m_pageInfos ;
+}
+
 // common part of all ctors
 void wxNotebook::Init()
 {
@@ -424,7 +486,8 @@ wxNotebookPage *wxNotebook::DoRemovePage(int nPage)
             // for some unknown reason if the tab control shows the up-down
             // control (i.e. when there are too many pages) -- otherwise after
             // deleting a page nothing at all is shown
-            m_pages[m_nSelection]->Refresh();
+            if (m_nSelection >= 0)
+                m_pages[m_nSelection]->Refresh();
         }
 
         if ( selNew != -1 )
@@ -471,11 +534,21 @@ bool wxNotebook::InsertPage(int nPage,
                     _T("notebook pages must have notebook as parent") );
 
 #if wxUSE_UXTHEME && wxUSE_UXTHEME_AUTO
+    static bool g_TestedForTheme = FALSE;
+    static bool g_UseTheme = FALSE;
+    if (!g_TestedForTheme)
+    {
+        int commCtrlVersion = wxTheApp->GetComCtl32Version() ;
+        
+        g_UseTheme = (commCtrlVersion >= 600);
+        g_TestedForTheme = TRUE;
+    }
+    
     // 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)))
+    if (g_UseTheme && wxUxThemeEngine::Get() && pPage->IsKindOf(CLASSINFO(wxPanel)))
     {
         ApplyThemeBackground(pPage, GetThemeBackgroundColour());
     }
@@ -773,31 +846,36 @@ wxColour wxNotebook::GetThemeBackgroundColour()
 #if wxUSE_UXTHEME
     if (wxUxThemeEngine::Get())
     {
-        WXHTHEME hTheme = wxUxThemeEngine::Get()->m_pfnOpenThemeData(GetHWND(), L"TAB");
+        wxUxThemeHandle hTheme(this, 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);
+            wxUxThemeEngine::Get()->GetThemeColor
+                                    (
+                                        hTheme,
+                                        10 /* TABP_BODY */,
+                                        1 /* NORMAL */,
+                                        3821, /* FILLCOLORHINT */
+                                        & themeColor
+                                    );
             
             wxColour colour(GetRValue(themeColor), GetGValue(themeColor), GetBValue(themeColor));
             return colour;
         }
     }
-#endif
+#endif // wxUSE_UXTHEME
+
     return GetBackgroundColour();
 }
 
 // Windows only: attempts to apply the UX theme page background to this page
+#if wxUSE_UXTHEME
 void wxNotebook::ApplyThemeBackground(wxWindow* window, const wxColour& colour)
+#else
+void wxNotebook::ApplyThemeBackground(wxWindow*, const wxColour&)
+#endif
 {
 #if wxUSE_UXTHEME
     // Don't set the background for buttons since this will
@@ -827,10 +905,34 @@ void wxNotebook::ApplyThemeBackground(wxWindow* window, const wxColour& colour)
         wxWindow *child = node->GetData();
         ApplyThemeBackground(child, colour);
     }
-#else
-    window;
-    colour;
 #endif
 }
 
+long wxNotebook::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+    static bool g_TestedForTheme = FALSE;
+    static bool g_UseTheme = FALSE;
+    switch ( nMsg )
+    {
+        case WM_ERASEBKGND:
+        {
+            if (!g_TestedForTheme)
+            {
+                int commCtrlVersion = wxTheApp->GetComCtl32Version() ;
+
+                g_UseTheme = (commCtrlVersion >= 600);
+                g_TestedForTheme = TRUE;
+            }
+
+            // If using XP themes, it seems we can get away
+            // with not drawing a background, which reduces flicker.
+            if (g_UseTheme)            
+                return TRUE;
+        }
+    }
+
+    return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+}
+
+
 #endif // wxUSE_NOTEBOOK