]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/notebook.cpp
do use the font in DoGetTextExtent()
[wxWidgets.git] / src / msw / notebook.cpp
index 7bab57b95907308aeb4c0298f076d3c592b6a571..5d41cd238b25204dce72d528574f1bb16d4239cd 100644 (file)
@@ -228,7 +228,7 @@ const wxNotebookPageInfoList& wxNotebook::GetPageInfos() const
 void wxNotebook::Init()
 {
     m_imageList = NULL;
-    m_nSelection = -1;
+    m_nSelection = wxNOT_FOUND;
 
 #if wxUSE_UXTHEME
     m_hbrBackground = NULL;
@@ -293,7 +293,11 @@ bool wxNotebook::Create(wxWindow *parent,
     }
 #endif //wxUSE_UXTHEME
 
+#if defined(__WINE__) && wxUSE_UNICODE
+    LPCTSTR className = L"SysTabControl32";
+#else
     LPCTSTR className = WC_TABCONTROL;
+#endif
 
 #if USE_NOTEBOOK_ANTIFLICKER
     // SysTabCtl32 class has natively CS_HREDRAW and CS_VREDRAW enabled and it
@@ -457,14 +461,14 @@ int wxNotebook::SetSelection(size_t nPage)
     return m_nSelection;
 }
 
-void wxNotebook::UpdateSelection(size_t newsel)
+void wxNotebook::UpdateSelection(int selNew)
 {
-    if ( m_nSelection != -1 )
+    if ( m_nSelection != wxNOT_FOUND )
         m_pages[m_nSelection]->Show(false);
 
-    if ( newsel != -1 )
+    if ( selNew != wxNOT_FOUND )
     {
-        wxNotebookPage *pPage = m_pages[newsel];
+        wxNotebookPage *pPage = m_pages[selNew];
         pPage->Show(true);
     }
 
@@ -478,14 +482,14 @@ void wxNotebook::UpdateSelection(size_t newsel)
     if ( ::IsWindowVisible(GetHwnd()) )
         SetFocus();
 
-    m_nSelection = newsel;
+    m_nSelection = selNew;
 }
 
 int wxNotebook::ChangeSelection(size_t nPage)
 {
     wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
 
-    if ( int(nPage) != m_nSelection )
+    if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection )
     {
         TabCtrl_SetCurSel(GetHwnd(), nPage);
 
@@ -501,7 +505,7 @@ bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
 
     TC_ITEM tcItem;
     tcItem.mask = TCIF_TEXT;
-    tcItem.pszText = (wxChar *)strText.c_str();
+    tcItem.pszText = (wxChar *)strText.wx_str();
 
     if ( !HasFlag(wxNB_MULTILINE) )
         return TabCtrl_SetItem(GetHwnd(), nPage, &tcItem) != 0;
@@ -545,7 +549,8 @@ int wxNotebook::GetPageImage(size_t nPage) const
     TC_ITEM tcItem;
     tcItem.mask = TCIF_IMAGE;
 
-    return TabCtrl_GetItem(GetHwnd(), nPage, &tcItem) ? tcItem.iImage : wxNOT_FOUND;
+    return TabCtrl_GetItem(GetHwnd(), nPage, &tcItem) ? tcItem.iImage
+                                                      : wxNOT_FOUND;
 }
 
 bool wxNotebook::SetPageImage(size_t nPage, int nImage)
@@ -565,7 +570,7 @@ void wxNotebook::SetImageList(wxImageList* imageList)
 
     if ( imageList )
     {
-        (void) TabCtrl_SetImageList(GetHwnd(), (HIMAGELIST)imageList->GetHIMAGELIST());
+        (void) TabCtrl_SetImageList(GetHwnd(), GetHimagelistOf(imageList));
     }
 }
 
@@ -680,12 +685,12 @@ wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage)
     if ( m_pages.IsEmpty() )
     {
         // no selection any more, the notebook becamse empty
-        m_nSelection = -1;
+        m_nSelection = wxNOT_FOUND;
     }
     else // notebook still not empty
     {
         int selNew = TabCtrl_GetCurSel(GetHwnd());
-        if (selNew != -1)
+        if ( selNew != wxNOT_FOUND )
         {
             // No selection change, just refresh the current selection.
             // Because it could be that the slection index changed
@@ -706,7 +711,7 @@ wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage)
 
             // m_nSelection must be always valid so reset it before calling
             // SetSelection()
-            m_nSelection = -1;
+            m_nSelection = wxNOT_FOUND;
             SetSelection(selNew);
         }
         else
@@ -730,7 +735,7 @@ bool wxNotebook::DeleteAllPages()
 
     TabCtrl_DeleteAllItems(GetHwnd());
 
-    m_nSelection = -1;
+    m_nSelection = wxNOT_FOUND;
 
     InvalidateBestSize();
     return true;
@@ -768,7 +773,7 @@ bool wxNotebook::InsertPage(size_t nPage,
     if ( !strText.empty() )
     {
         tcItem.mask |= TCIF_TEXT;
-        tcItem.pszText = (wxChar *)strText.c_str(); // const_cast
+        tcItem.pszText = (wxChar *)strText.wx_str(); // const_cast
     }
 
     // hide the page: unless it is selected, it shouldn't be shown (and if it
@@ -798,7 +803,9 @@ bool wxNotebook::InsertPage(size_t nPage,
     // so the first panel gets the correct themed background
     if ( m_pages.empty() )
     {
+#if wxUSE_UXTHEME
         UpdateBgBrush();
+#endif // wxUSE_UXTHEME
     }
 
     // succeeded: save the pointer to the page
@@ -826,13 +833,13 @@ bool wxNotebook::InsertPage(size_t nPage,
 
     // some page should be selected: either this one or the first one if there
     // is still no selection
-    int selNew = -1;
+    int selNew = wxNOT_FOUND;
     if ( bSelect )
         selNew = nPage;
-    else if ( m_nSelection == -1 )
+    else if ( m_nSelection == wxNOT_FOUND )
         selNew = 0;
 
-    if ( selNew != -1 )
+    if ( selNew != wxNOT_FOUND )
         SetSelection(selNew);
 
     InvalidateBestSize();
@@ -908,6 +915,9 @@ void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event))
     wxBitmap bmp(rc.right, rc.bottom);
     memdc.SelectObject(bmp);
 
+    const wxLayoutDirection dir = dc.GetLayoutDirection();
+    memdc.SetLayoutDirection(dir);
+
     // if there is no special brush just use the solid background colour
 #if wxUSE_UXTHEME
     HBRUSH hbr = (HBRUSH)m_hbrBackground;
@@ -925,7 +935,10 @@ void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event))
 
     MSWDefWindowProc(WM_PAINT, (WPARAM)memdc.GetHDC(), 0);
 
-    dc.Blit(0, 0, rc.right, rc.bottom, &memdc, 0, 0);
+    // For some reason in RTL mode, source offset has to be -1, otherwise the
+    // right border (physical) remains unpainted.
+    const wxCoord ofs = dir == wxLayout_RightToLeft ? -1 : 0;
+    dc.Blit(ofs, 0, rc.right, rc.bottom, &memdc, ofs, 0);
 }
 
 #endif // USE_NOTEBOOK_ANTIFLICKER
@@ -1108,7 +1121,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
         {
             // 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,
-            if ( m_nSelection != -1 &&
+            if ( m_nSelection != wxNOT_FOUND &&
                     (!event.GetDirection() || isFromSelf) )
             {
                 // so that the page knows that the event comes from it's parent