X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40f15abf3f3c486682bb65311518fe55d7a3bcf..aacd14428971b5e199f88597f76a895c68dd298f:/src/mac/carbon/notebmac.cpp diff --git a/src/mac/carbon/notebmac.cpp b/src/mac/carbon/notebmac.cpp index ae2e636a3a..3bc3131591 100644 --- a/src/mac/carbon/notebmac.cpp +++ b/src/mac/carbon/notebmac.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "notebook.h" #endif @@ -20,6 +20,10 @@ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- +#include "wx/wxprec.h" + +#if wxUSE_NOTEBOOK + #include "wx/app.h" #include "wx/string.h" #include "wx/log.h" @@ -44,7 +48,6 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) BEGIN_EVENT_TABLE(wxNotebook, wxControl) EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange) - EVT_MOUSE_EVENTS(wxNotebook::OnMouse) EVT_SIZE(wxNotebook::OnSize) EVT_SET_FOCUS(wxNotebook::OnSetFocus) @@ -126,7 +129,10 @@ bool wxNotebook::Create(wxWindow *parent, tabsize = kControlSizeSmall; } - ::CreateTabsControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds , tabsize , tabstyle, 0, NULL, (ControlRef*) &m_macControl); + m_peer = new wxMacControl(this) ; + verify_noerr ( CreateTabsControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds , + tabsize , tabstyle, 0, NULL, m_peer->GetControlRefAddr() ) ); + MacPostControlCreate(pos,size) ; return TRUE ; @@ -161,34 +167,6 @@ 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") ); @@ -277,6 +255,7 @@ wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage) if(m_nSelection >= 0) { m_pages[m_nSelection]->Show(true); } + InvalidateBestSize(); return page; } @@ -286,6 +265,7 @@ bool wxNotebook::DeleteAllPages() WX_CLEAR_ARRAY(m_pages) ; MacSetupTabs(); m_nSelection = -1 ; + InvalidateBestSize(); return TRUE; } @@ -329,7 +309,7 @@ bool wxNotebook::InsertPage(size_t nPage, { 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 @@ -343,17 +323,18 @@ bool wxNotebook::InsertPage(size_t nPage, if ( selNew != -1 ) SetSelection(selNew); + InvalidateBestSize(); return true; } /* 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; @@ -365,54 +346,26 @@ void wxNotebook::MacSetupTabs() info.version = 0; info.iconSuiteID = 0; wxMacStringToPascal( page->GetLabel() , info.name ) ; + m_peer->SetData( ii+1, kControlTabInfoTag, &info ) ; + m_peer->SetTabEnabled( ii + 1 , true ) ; - 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 ) ; + OSStatus err = 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 + } Rect bounds; - UMAGetControlBoundsInWindowCoords((ControlRef)m_macControl, &bounds); + m_peer->GetRectInWindowCoords( &bounds ) ; InvalWindowRect((WindowRef)MacGetTopLevelWindowRef(), &bounds); } @@ -564,91 +517,37 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) } m_nSelection = nSel; - SetControl32BitValue( (ControlRef) m_macControl , m_nSelection + 1 ) ; + m_peer->SetValue( m_nSelection + 1 ) ; } - -void wxNotebook::OnMouse( wxMouseEvent &event ) +wxInt32 wxNotebook::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) { - if ( (ControlRef) m_macControl == NULL ) - { - event.Skip() ; - return ; - } - - if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK ) + OSStatus status = eventNotHandledErr ; + + SInt32 newSel = m_peer->GetValue() - 1 ; + if ( newSel != m_nSelection ) { - int x = event.m_x ; - int y = event.m_y ; - -#if TARGET_API_MAC_OSX - // OS Needs it in window not client coordinates - wxPoint origin = GetClientAreaOrigin() ; - x += origin.x ; - y += origin.y ; -#else - // OS Needs it in tlw content area coordinates - MacClientToRootWindow( &x , &y ) ; -#endif - - ControlRef control ; - Point localwhere ; - SInt16 controlpart ; - - localwhere.h = x ; - localwhere.v = y ; - - short modifiers = 0; + wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, + newSel , m_nSelection); + changing.SetEventObject(this); + GetEventHandler()->ProcessEvent(changing); - if ( !event.m_leftDown && !event.m_rightDown ) - modifiers |= btnState ; - - if ( event.m_shiftDown ) - modifiers |= shiftKey ; - - if ( event.m_controlDown ) - modifiers |= controlKey ; - - if ( event.m_altDown ) - modifiers |= optionKey ; - - if ( event.m_metaDown ) - modifiers |= cmdKey ; - - control = (ControlRef) m_macControl ; - if ( control && ::IsControlActive( control ) ) + if(changing.IsAllowed()) { - { - wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, - ::GetControl32BitValue(control) - 1, m_nSelection); - changing.SetEventObject(this); - GetEventHandler()->ProcessEvent(changing); + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId, + newSel, m_nSelection); + event.SetEventObject(this); - if(changing.IsAllowed()) - { - controlpart = ::HandleControlClick(control, localwhere, modifiers, - (ControlActionUPP) -1); - wxTheApp->s_lastMouseDown = 0 ; - - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId, - ::GetControl32BitValue(control) - 1, m_nSelection); - event.SetEventObject(this); - - GetEventHandler()->ProcessEvent(event); - } - } + GetEventHandler()->ProcessEvent(event); + } + else + { + m_peer->SetValue( m_nSelection + 1 ) ; } + status = noErr ; } + return status ; } - -void wxNotebook::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) ) -{ -#if 0 - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControl32BitValue((ControlRef)m_macControl) - 1, m_nSelection); - event.SetEventObject(this); - - ProcessEvent(event); #endif -}