]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/notebmac.cpp
trying to avoid redraw problems at wrong places
[wxWidgets.git] / src / mac / carbon / notebmac.cpp
index 88a922f99314f147acb0cd42f0a51f89e7c7e6be..36a27df2eb26ac41d893f384593c220a2a59509d 100644 (file)
@@ -24,6 +24,7 @@
 #include "wx/string.h"
 #include "wx/log.h"
 #include "wx/imaglist.h"
+#include "wx/image.h"
 #include "wx/notebook.h"
 #include "wx/mac/uma.h"
 // ----------------------------------------------------------------------------
@@ -31,7 +32,7 @@
 // ----------------------------------------------------------------------------
 
 // check that the page index is valid
-#define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
+#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())
 
 
 // ----------------------------------------------------------------------------
@@ -96,7 +97,7 @@ static inline int wxMacTabMargin(long nbStyle, long side)
     // but we have to special case wxNB_TOP since it is zero...
     if ( side == wxNB_TOP)
     {
-        if ( nbStyle != 0 && nbStyle & wxNB_LEFT|wxNB_RIGHT|wxNB_BOTTOM)
+        if ( nbStyle != 0 && nbStyle & (wxNB_LEFT|wxNB_RIGHT|wxNB_BOTTOM))
         {
             return otherMargin;
         }
@@ -175,6 +176,9 @@ bool wxNotebook::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
+    if ( !wxNotebookBase::Create(parent, id, pos, size, style, name) )
+        return false;
+
     Rect bounds ;
     Str255 title ;
 
@@ -199,10 +203,9 @@ bool wxNotebook::Create(wxWindow *parent,
 // dtor
 wxNotebook::~wxNotebook()
 {
-    m_macControl = NULL ;
 }
 
-wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage)
+wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const
 {
     wxSize sizeTotal = sizePage;
 
@@ -256,7 +259,7 @@ void wxNotebook::SetPageSize(const wxSize& size)
     wxFAIL_MSG( wxT("wxNotebook::SetPageSize not implemented") );
 }
 
-int wxNotebook::SetSelection(int nPage)
+int wxNotebook::SetSelection(size_t nPage)
 {
     if( !IS_VALID_PAGE(nPage) )
         return m_nSelection ;
@@ -268,7 +271,7 @@ int wxNotebook::SetSelection(int nPage)
     return m_nSelection;
 }
 
-bool wxNotebook::SetPageText(int nPage, const wxString& strText)
+bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
 {
     wxASSERT( IS_VALID_PAGE(nPage) );
 
@@ -279,7 +282,7 @@ bool wxNotebook::SetPageText(int nPage, const wxString& strText)
     return true;
 }
 
-wxString wxNotebook::GetPageText(int nPage) const
+wxString wxNotebook::GetPageText(size_t nPage) const
 {
     wxASSERT( IS_VALID_PAGE(nPage) );
 
@@ -287,14 +290,14 @@ wxString wxNotebook::GetPageText(int nPage) const
     return page->GetLabel();
 }
 
-int wxNotebook::GetPageImage(int nPage) const
+int wxNotebook::GetPageImage(size_t nPage) const
 {
     wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, _T("invalid notebook page") );
 
     return m_images[nPage];
 }
 
-bool wxNotebook::SetPageImage(int nPage, int nImage)
+bool wxNotebook::SetPageImage(size_t nPage, int nImage)
 {
     wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, _T("invalid notebook page") );
 
@@ -319,7 +322,7 @@ bool wxNotebook::SetPageImage(int nPage, int nImage)
 // ----------------------------------------------------------------------------
 
 // remove one page from the notebook, without deleting the window
-wxNotebookPage* wxNotebook::DoRemovePage(int nPage)
+wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage)
 {
     wxCHECK( IS_VALID_PAGE(nPage), NULL );
     wxNotebookPage* page = m_pages[nPage] ;
@@ -327,7 +330,7 @@ wxNotebookPage* wxNotebook::DoRemovePage(int nPage)
 
     MacSetupTabs();
 
-    if(m_nSelection >= GetPageCount()) {
+    if(m_nSelection >= (int)GetPageCount()) {
         m_nSelection = GetPageCount() - 1;
     }
     if(m_nSelection >= 0) {
@@ -339,30 +342,25 @@ wxNotebookPage* wxNotebook::DoRemovePage(int nPage)
 // remove all pages
 bool wxNotebook::DeleteAllPages()
 {
-    // TODO: delete native widget pages
-
     WX_CLEAR_ARRAY(m_pages) ;
     MacSetupTabs();
-
+    m_nSelection = -1 ;
     return TRUE;
 }
 
 
 // same as AddPage() but does it at given position
-bool wxNotebook::InsertPage(int nPage,
+bool wxNotebook::InsertPage(size_t nPage,
                             wxNotebookPage *pPage,
                             const wxString& strText,
                             bool bSelect,
                             int imageId)
 {
-    wxASSERT( pPage != NULL );
-    wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE );
+    if ( !wxNotebookBase::InsertPage(nPage, pPage, strText, bSelect, imageId) )
+        return false;
 
     pPage->SetLabel(strText);
 
-    // save the pointer to the page
-    m_pages.Insert(pPage, nPage);
-
     m_images.Insert(imageId, nPage);
 
     MacSetupTabs();
@@ -373,7 +371,7 @@ bool wxNotebook::InsertPage(int nPage,
     else if ( m_nSelection == -1 ) {
         m_nSelection = 0;
     }
-    else if (m_nSelection >= nPage) {
+    else if ((size_t)m_nSelection >= nPage) {
         m_nSelection++;
     }
     // don't show pages by default (we'll need to adjust their size first)
@@ -404,7 +402,8 @@ void wxNotebook::MacSetupTabs()
     wxNotebookPage *page;
     ControlTabInfoRec info;
 
-    for(int ii = 0; ii < GetPageCount(); ii++)
+    const size_t countPages = GetPageCount();
+    for(size_t ii = 0; ii < countPages; ii++)
     {
         page = m_pages[ii];
         info.version = 0;
@@ -414,7 +413,7 @@ void wxNotebook::MacSetupTabs()
         SetControlData( (ControlHandle) m_macControl, ii+1, kControlTabInfoTag,
             sizeof( ControlTabInfoRec) , (char*) &info ) ;
         SetTabEnabled( (ControlHandle) m_macControl , ii+1 , true ) ;
-#if 0 // TARGET_CARBON
+#if TARGET_CARBON
         if ( GetImageList() && GetPageImage(ii) >= 0 && UMAGetSystemVersion() >= 0x1020 )
         {
             // tab controls only support very specific types of images, therefore we are doing an odyssee
@@ -423,22 +422,32 @@ void wxNotebook::MacSetupTabs()
             // afterwards Unregister it (IconRef is ref counted, so it will stay on the tab even if we
             // unregister it) in case this will ever lead to having the same icon everywhere add some kind
             // of static counter
-            ControlButtonContentInfo info ;
-            wxMacCreateBitmapButton( &info , *GetImageList()->GetBitmap( GetPageImage(ii ) ) , kControlContentPictHandle) ;
-            IconFamilyHandle iconFamily = (IconFamilyHandle) NewHandle(0) ;
-            OSErr err = SetIconFamilyData( iconFamily, 'PICT' , (Handle) info.u.picture ) ;
-            wxASSERT_MSG( err == noErr , "Error when adding bitmap" ) ;
-            IconRef iconRef ;
-            err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) 1 , iconFamily, &iconRef ) ;
-            wxASSERT_MSG( err == noErr , "Error when adding bitmap" ) ;
-            info.contentType = kControlContentIconRef ;
-            info.u.iconRef = iconRef ;
-            SetControlData( (ControlHandle) m_macControl, ii+1,kControlTabImageContentTag,
-                sizeof( info ), (Ptr)&info );
-            wxASSERT_MSG( err == noErr , "Error when setting icon on tab" ) ;
-               UnregisterIconRef( 'WXNG' , (OSType) 1 ) ;
-            ReleaseIconRef( iconRef ) ;
-            DisposeHandle( (Handle) iconFamily ) ;
+            wxBitmap* bmap = GetImageList()->GetBitmap( GetPageImage(ii ) ) ;
+            if ( bmap )
+            {
+                wxBitmap scaledBitmap ;
+                if ( bmap->GetWidth() != 16 || bmap->GetHeight() != 16 )
+                {
+                    scaledBitmap = wxBitmap( bmap->ConvertToImage().Scale(16,16) ) ;
+                    bmap = &scaledBitmap ;
+                }
+                ControlButtonContentInfo info ;
+                wxMacCreateBitmapButton( &info , *bmap , kControlContentPictHandle) ;
+                IconFamilyHandle iconFamily = (IconFamilyHandle) NewHandle(0) ;
+                OSErr err = SetIconFamilyData( iconFamily, 'PICT' , (Handle) info.u.picture ) ;
+                wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
+                IconRef iconRef ;
+                err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) 1 , iconFamily, &iconRef ) ;
+                wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
+                info.contentType = kControlContentIconRef ;
+                info.u.iconRef = iconRef ;
+                SetControlData( (ControlHandle) m_macControl, ii+1,kControlTabImageContentTag,
+                    sizeof( info ), (Ptr)&info );
+                wxASSERT_MSG( err == noErr , wxT("Error when setting icon on tab") ) ;
+                   UnregisterIconRef( 'WXNG' , (OSType) 1 ) ;
+                ReleaseIconRef( iconRef ) ;
+                DisposeHandle( (Handle) iconFamily ) ;
+            }
         }
 #endif
     }
@@ -614,7 +623,7 @@ void  wxNotebook::OnMouse( wxMouseEvent &event )
                 wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId,
                     ::GetControl32BitValue(control) - 1, m_nSelection);
                 changing.SetEventObject(this);
-                ProcessEvent(changing);
+                GetEventHandler()->ProcessEvent(changing);
 
                 if(changing.IsAllowed())
                 {
@@ -626,7 +635,7 @@ void  wxNotebook::OnMouse( wxMouseEvent &event )
                         ::GetControl32BitValue(control) - 1, m_nSelection);
                     event.SetEventObject(this);
 
-                    ProcessEvent(event);
+                    GetEventHandler()->ProcessEvent(event);
                 }
             }
         }
@@ -634,7 +643,7 @@ void  wxNotebook::OnMouse( wxMouseEvent &event )
 }
 
 
-void wxNotebook::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
+void wxNotebook::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
 {
 #if 0
     wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControl32BitValue((ControlHandle)m_macControl) - 1, m_nSelection);