X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c37f1248bda69718bc13e2fdaa1ebb86f3dfc93..6eae1f7d48196dea9968c8e478f28a4166bd0fe9:/src/mac/carbon/notebmac.cpp diff --git a/src/mac/carbon/notebmac.cpp b/src/mac/carbon/notebmac.cpp index cee99d8c80..4dc955d76e 100644 --- a/src/mac/carbon/notebmac.cpp +++ b/src/mac/carbon/notebmac.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: notebook.cpp +// Name: src/mac/carbon/notebmac.cpp // Purpose: implementation of wxNotebook // Author: Stefan Csomor // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "notebook.h" -#endif - // ============================================================================ // declarations // ============================================================================ @@ -20,6 +16,10 @@ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- +#include "wx/wxprec.h" + +#if wxUSE_NOTEBOOK + #include "wx/app.h" #include "wx/string.h" #include "wx/log.h" @@ -43,7 +43,7 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) BEGIN_EVENT_TABLE(wxNotebook, wxControl) - EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange) + EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) EVT_SET_FOCUS(wxNotebook::OnSetFocus) @@ -94,8 +94,8 @@ bool wxNotebook::Create(wxWindow *parent, long style, const wxString& name) { - m_macIsUserPane = FALSE ; - + m_macIsUserPane = false ; + if ( !wxNotebookBase::Create(parent, id, pos, size, style, name) ) return false; @@ -107,29 +107,31 @@ bool wxNotebook::Create(wxWindow *parent, bounds.bottom = bounds.top + 100 ; UInt16 tabstyle = kControlTabDirectionNorth ; - if ( HasFlag(wxNB_LEFT) ) + if ( HasFlag(wxBK_LEFT) ) tabstyle = kControlTabDirectionWest ; - else if ( HasFlag( wxNB_RIGHT ) ) + else if ( HasFlag( wxBK_RIGHT ) ) tabstyle = kControlTabDirectionEast ; - else if ( HasFlag( wxNB_BOTTOM ) ) + else if ( HasFlag( wxBK_BOTTOM ) ) tabstyle = kControlTabDirectionSouth ; - + ControlTabSize tabsize = kControlTabSizeLarge ; if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL ) tabsize = kControlTabSizeSmall ; else if ( GetWindowVariant() == wxWINDOW_VARIANT_MINI ) { if (UMAGetSystemVersion() >= 0x1030 ) - tabsize = 3 ; + tabsize = 3 ; else - tabsize = kControlSizeSmall; + tabsize = kControlSizeSmall; } + m_peer = new wxMacControl(this) ; verify_noerr ( CreateTabsControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds , - tabsize , tabstyle, 0, NULL, (ControlRef*) &m_macControl) ); - + tabsize , tabstyle, 0, NULL, m_peer->GetControlRefAddr() ) ); + + MacPostControlCreate(pos,size) ; - return TRUE ; + return true ; } // dtor @@ -161,37 +163,9 @@ wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const return DoGetSizeFromClientSize( sizePage ) ; } -wxSize wxNotebook::DoGetBestSize() const -{ - // calculate the max page size - wxSize size(0, 0); - - size_t count = GetPageCount(); - if ( count ) - { - for ( size_t n = 0; n < count; n++ ) - { - wxSize sizePage = m_pages[n]->GetSize(); - - if ( size.x < sizePage.x ) - size.x = sizePage.x; - if ( size.y < sizePage.y ) - size.y = sizePage.y; - } - } - else // no pages - { - // use some arbitrary default size - size.x = - size.y = 100; - } - - return CalcSizeFromPage(size); -} - int wxNotebook::SetSelection(size_t nPage) { - wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") ); if ( int(nPage) != m_nSelection ) { @@ -233,16 +207,16 @@ wxString wxNotebook::GetPageText(size_t nPage) const int wxNotebook::GetPageImage(size_t nPage) const { - wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, _T("invalid notebook page") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, _T("invalid notebook page") ); return m_images[nPage]; } bool wxNotebook::SetPageImage(size_t nPage, int nImage) { - wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, _T("invalid notebook page") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), false, _T("invalid notebook page") ); - wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), FALSE, + wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), false, _T("invalid image index in SetPageImage()") ); if ( nImage != m_images[nPage] ) @@ -255,7 +229,7 @@ bool wxNotebook::SetPageImage(size_t nPage, int nImage) MacSetupTabs() ; } - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -277,6 +251,7 @@ wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage) if(m_nSelection >= 0) { m_pages[m_nSelection]->Show(true); } + InvalidateBestSize(); return page; } @@ -286,7 +261,8 @@ bool wxNotebook::DeleteAllPages() WX_CLEAR_ARRAY(m_pages) ; MacSetupTabs(); m_nSelection = -1 ; - return TRUE; + InvalidateBestSize(); + return true; } @@ -325,13 +301,13 @@ bool wxNotebook::InsertPage(size_t nPage, // if the inserted page is before the selected one, we must update the // index of the selected page - if ( int(nPage) <= m_nSelection ) + if ( int(nPage) <= m_nSelection ) { m_nSelection++; // while this still is the same page showing, we need to update the tabs - SetControl32BitValue( (ControlRef) m_macControl , m_nSelection + 1 ) ; + m_peer->SetValue( m_nSelection + 1 ) ; } - + // some page should be selected: either this one or the first one if there // is still no selection int selNew = -1; @@ -343,76 +319,117 @@ bool wxNotebook::InsertPage(size_t nPage, if ( selNew != -1 ) SetSelection(selNew); + InvalidateBestSize(); return true; } +int wxNotebook::HitTest(const wxPoint& pt, long * flags) const +{ + int resultV = wxNOT_FOUND; +#if TARGET_API_MAC_OSX + const int countPages = GetPageCount(); + + HIPoint hipoint= { pt.x , pt.y } ; + HIViewPartCode outPart = 0 ; + OSStatus err = HIViewGetPartHit ( + m_peer->GetControlRef() , + &hipoint , + &outPart + ); + + int max = m_peer->GetMaximum() ; + if ( outPart == 0 && max > 0 ) + { + // this is a hack, as unfortunately a hit on an already selected tab returns 0, + // so we have to go some extra miles to make sure we select something different + // and try again .. + int val = m_peer->GetValue() ; + int maxval = max ; + if ( max == 1 ) + { + m_peer->SetMaximum( 2 ) ; + maxval = 2 ; + } + + if ( val == 1 ) + m_peer->SetValue( maxval ) ; + else + m_peer->SetValue( 1 ) ; + + err = HIViewGetPartHit ( + m_peer->GetControlRef() , + &hipoint , + &outPart + ); + + m_peer->SetValue( val ) ; + if ( max == 1 ) + { + m_peer->SetMaximum( 1 ) ; + } + } + + if ( outPart >= 1 && outPart <= countPages ) + { + resultV = outPart ; + } +#endif // TARGET_API_MAC_OSX + + if (flags != NULL) + { + *flags = 0; + + // we cannot differentiate better + if (resultV >= 1) + *flags |= wxNB_HITTEST_ONLABEL; + else + *flags |= wxNB_HITTEST_NOWHERE; + } + return resultV; +} + /* Added by Mark Newsam * When a page is added or deleted to the notebook this function updates -* information held in the m_macControl so that it matches the order +* information held in the control so that it matches the order * the user would expect. */ void wxNotebook::MacSetupTabs() { - SetControl32BitMaximum( (ControlRef) m_macControl , GetPageCount() ) ; + m_peer->SetMaximum( GetPageCount() ) ; wxNotebookPage *page; - ControlTabInfoRec info; + ControlTabInfoRecV1 info; const size_t countPages = GetPageCount(); for(size_t ii = 0; ii < countPages; ii++) { page = m_pages[ii]; - info.version = 0; + info.version = kControlTabInfoVersionOne; info.iconSuiteID = 0; - wxMacStringToPascal( page->GetLabel() , info.name ) ; + wxMacCFStringHolder cflabel( page->GetLabel() , m_font.GetEncoding() ) ; + info.name = cflabel ; + m_peer->SetData( ii+1, kControlTabInfoTag, &info ) ; - SetControlData( (ControlRef) m_macControl, ii+1, kControlTabInfoTag, - sizeof( ControlTabInfoRec) , (char*) &info ) ; - SetTabEnabled( (ControlRef) m_macControl , ii+1 , true ) ; -#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 - // accross the icon worlds (even Apple DTS did not find a shorter path) - // in order not to pollute the icon registry we put every icon into (OSType) 1 and immediately - // 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 - const wxBitmap* bmap = GetImageList()->GetBitmap( GetPageImage(ii ) ) ; - if ( bmap ) + const wxBitmap bmap = GetImageList()->GetBitmap( GetPageImage(ii ) ) ; + if ( bmap.Ok() ) { - 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( (ControlRef) m_macControl, ii+1,kControlTabImageContentTag, - sizeof( info ), (Ptr)&info ); + + wxMacCreateBitmapButton( &info , bmap ) ; +#ifdef __WXDEBUG__ + OSStatus err = +#endif // __WXDEBUG__ + m_peer->SetData( ii+1,kControlTabImageContentTag, &info ); wxASSERT_MSG( err == noErr , wxT("Error when setting icon on tab") ) ; - if ( UMAGetSystemVersion() < 0x1030 ) - { - UnregisterIconRef( 'WXNG' , (OSType) 1 ) ; - } - - ReleaseIconRef( iconRef ) ; - DisposeHandle( (Handle) iconFamily ) ; + wxMacReleaseBitmapButton( &info ) ; } } -#endif + m_peer->SetTabEnabled( ii + 1 , true ) ; } Rect bounds; - UMAGetControlBoundsInWindowCoords((ControlRef)m_macControl, &bounds); + m_peer->GetRectInWindowCoords( &bounds ) ; InvalWindowRect((WindowRef)MacGetTopLevelWindowRef(), &bounds); } @@ -528,13 +545,13 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse)) { - // don't set the sizes of the pages - their correct size is not yet known - wxControl::SetConstraintSizes(FALSE); + // don't set the sizes of the pages - their correct size is not yet known + wxControl::SetConstraintSizes(false); } bool wxNotebook::DoPhase(int WXUNUSED(nPhase)) { - return TRUE; + return true; } #endif // wxUSE_CONSTRAINTS @@ -551,27 +568,27 @@ void wxNotebook::Command(wxCommandEvent& event) // hide the currently active panel and show the new one void wxNotebook::ChangePage(int nOldSel, int nSel) { - if ( nOldSel != -1 ) + if ( nOldSel != -1 ) { - m_pages[nOldSel]->Show(FALSE); + m_pages[nOldSel]->Show(false); } if ( nSel != -1 ) { wxNotebookPage *pPage = m_pages[nSel]; - pPage->Show(TRUE); + pPage->Show(true); pPage->SetFocus(); } - + m_nSelection = nSel; - SetControl32BitValue( (ControlRef) m_macControl , m_nSelection + 1 ) ; + m_peer->SetValue( m_nSelection + 1 ) ; } -wxInt32 wxNotebook::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) +wxInt32 wxNotebook::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) { OSStatus status = eventNotHandledErr ; - - SInt32 newSel = GetControl32BitValue( (ControlRef) m_macControl ) - 1 ; + + SInt32 newSel = m_peer->GetValue() - 1 ; if ( newSel != m_nSelection ) { wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, @@ -589,10 +606,11 @@ wxInt32 wxNotebook::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTR } else { - SetControl32BitValue( (ControlRef) m_macControl , m_nSelection + 1 ) ; + m_peer->SetValue( m_nSelection + 1 ) ; } status = noErr ; } return status ; } +#endif