X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7205570233ce8420b71fa5df368054c8953ff0e4..fa2f5d3bc9563c2b88282d5487758572d8baffb3:/src/mac/carbon/notebmac.cpp diff --git a/src/mac/carbon/notebmac.cpp b/src/mac/carbon/notebmac.cpp index 88e098ac96..908cef7b5f 100644 --- a/src/mac/carbon/notebmac.cpp +++ b/src/mac/carbon/notebmac.cpp @@ -20,6 +20,7 @@ #pragma implementation "notebook.h" #endif +#include "wx/app.h" #include "wx/string.h" #include "wx/log.h" #include "wx/imaglist.h" @@ -32,18 +33,12 @@ // check that the page index is valid #define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount())) -#ifdef __DARWIN__ - // I got these values for Mac OS X from the Appearance mgr docs. (Mark Newsam) -const short kwxMacTabLeftMargin = 20 ; -const short kwxMacTabTopMargin = 38 ; -const short kwxMacTabRightMargin = 20 ; -const short kwxMacTabBottomMargin = 12 ; -#else -const short kwxMacTabLeftMargin = 16 ; -const short kwxMacTabTopMargin = 30 ; -const short kwxMacTabRightMargin = 16 ; -const short kwxMacTabBottomMargin = 16 ; -#endif +static bool constantsSet = false ; + + short kwxMacTabLeftMargin = 0 ; + short kwxMacTabTopMargin = 0 ; + short kwxMacTabRightMargin = 0 ; + short kwxMacTabBottomMargin = 0 ; // ---------------------------------------------------------------------------- // event table @@ -55,7 +50,8 @@ 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) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) @@ -76,10 +72,31 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) // common part of all ctors void wxNotebook::Init() { -#ifdef __DARWIN__ - m_macHorizontalBorder = 7; - m_macVerticalBorder = 8; -#endif + if ( !constantsSet ) + { + if ( UMAHasAquaLayout() ) + { + // I got these values for Mac OS X from the Appearance mgr docs. (Mark Newsam) + kwxMacTabLeftMargin = 20 ; + kwxMacTabTopMargin = 38 ; + kwxMacTabRightMargin = 20 ; + kwxMacTabBottomMargin = 12 ; + } + else + { + kwxMacTabLeftMargin = 16 ; + kwxMacTabTopMargin = 30 ; + kwxMacTabRightMargin = 16 ; + kwxMacTabBottomMargin = 16 ; + } + constantsSet = true ; + } + if ( UMAHasAquaLayout() ) + { + m_macHorizontalBorder = 7; + m_macVerticalBorder = 8; + } + m_nSelection = -1; } @@ -115,8 +132,17 @@ bool wxNotebook::Create(wxWindow *parent, MacPreControlCreate( parent , id , "" , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ; - m_macControl = ::NewControl( parent->GetMacRootWindow() , &bounds , title , false , 0 , 0 , 1, - kControlTabSmallProc , (long) this ) ; + int tabstyle = kControlTabSmallNorthProc ; + if ( HasFlag(wxNB_LEFT) ) + tabstyle = kControlTabSmallWestProc ; + else if ( HasFlag( wxNB_RIGHT ) ) + tabstyle = kControlTabSmallEastProc ; + else if ( HasFlag( wxNB_BOTTOM ) ) + tabstyle = kControlTabSmallSouthProc ; + + + m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1, + tabstyle , (long) this ) ; MacPostControlCreate() ; return TRUE ; @@ -128,6 +154,41 @@ wxNotebook::~wxNotebook() m_macControl = NULL ; } +wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) +{ + wxSize sizeTotal = sizePage; + + int major,minor; + wxGetOsVersion( &major, &minor ); + + // Mac has large notebook borders. Aqua even more so. + + if ( HasFlag(wxNB_LEFT) || HasFlag(wxNB_RIGHT) ) + { + sizeTotal.x += 90; + + if (major >= 10) + sizeTotal.y += 28; + else + sizeTotal.y += 20; + } + else + { + if (major >= 10) + { + sizeTotal.x += 34; + sizeTotal.y += 46; + } + else + { + sizeTotal.x += 22; + sizeTotal.y += 44; + } + } + + return sizeTotal; +} + // ---------------------------------------------------------------------------- // wxNotebook accessors // ---------------------------------------------------------------------------- @@ -153,8 +214,9 @@ int wxNotebook::SetSelection(int nPage) return m_nSelection ; ChangePage(m_nSelection, nPage); - SetControlValue( m_macControl , m_nSelection + 1 ) ; + SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ; + Refresh(); return m_nSelection; } @@ -181,7 +243,7 @@ int wxNotebook::GetPageImage(int nPage) const { wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, _T("invalid notebook page") ); - return 0 ; + return m_images[nPage]; } bool wxNotebook::SetPageImage(int nPage, int nImage) @@ -191,7 +253,17 @@ bool wxNotebook::SetPageImage(int nPage, int nImage) wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), FALSE, _T("invalid image index in SetPageImage()") ); - return FALSE; + if ( nImage != m_images[nPage] ) + { + // if the item didn't have an icon before or, on the contrary, did have + // it but has lost it now, its size will change - but if the icon just + // changes, it won't + m_images[nPage] = nImage; + + MacSetupTabs() ; + } + + return TRUE; } // ---------------------------------------------------------------------------- @@ -243,6 +315,8 @@ bool wxNotebook::InsertPage(int nPage, // save the pointer to the page m_pages.Insert(pPage, nPage); + m_images.Insert(imageId, nPage); + MacSetupTabs(); if ( bSelect ) { @@ -276,11 +350,11 @@ bool wxNotebook::InsertPage(int nPage, */ void wxNotebook::MacSetupTabs() { - SetControlMaximum( m_macControl , GetPageCount() ) ; + SetControl32BitMaximum( (ControlHandle) m_macControl , GetPageCount() ) ; wxNotebookPage *page; ControlTabInfoRec info; - Boolean enabled = true; + for(int ii = 0; ii < GetPageCount(); ii++) { page = m_pages[ii]; @@ -292,14 +366,41 @@ void wxNotebook::MacSetupTabs() strcpy( (char *) info.name , page->GetLabel() ) ; c2pstr( (char *) info.name ) ; #endif - SetControlData( m_macControl, ii+1, kControlTabInfoTag, + SetControlData( (ControlHandle) m_macControl, ii+1, kControlTabInfoTag, sizeof( ControlTabInfoRec) , (char*) &info ) ; - SetControlData( m_macControl, ii+1, kControlTabEnabledFlagTag, - sizeof( Boolean ), (Ptr)&enabled ); + SetTabEnabled( (ControlHandle) 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 + 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 ) ; + } +#endif } Rect bounds; - GetControlBounds(m_macControl, &bounds); - InvalWindowRect(GetMacRootWindow(), &bounds); + GetControlBounds((ControlHandle)m_macControl, &bounds); + InvalWindowRect((WindowRef)MacGetRootWindow(), &bounds); } // ---------------------------------------------------------------------------- @@ -421,11 +522,80 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) m_nSelection = nSel; } -void wxNotebook::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) + +void wxNotebook::OnMouse( wxMouseEvent &event ) { - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControlValue(m_macControl) - 1, m_nSelection); + if ( (ControlHandle) m_macControl == NULL ) + { + event.Skip() ; + return ; + } + + if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK ) + { + int x = event.m_x ; + int y = event.m_y ; + + MacClientToRootWindow( &x , &y ) ; + + ControlHandle control ; + Point localwhere ; + SInt16 controlpart ; + + localwhere.h = x ; + localwhere.v = y ; + + short modifiers = 0; + + 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 = (ControlHandle) m_macControl ; + if ( control && ::IsControlActive( control ) ) + { + { + wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, + ::GetControl32BitValue(control) - 1, m_nSelection); + changing.SetEventObject(this); + ProcessEvent(changing); + + 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); + + ProcessEvent(event); + } + } + } + } +} + + +void wxNotebook::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) +{ +#if 0 + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControl32BitValue((ControlHandle)m_macControl) - 1, m_nSelection); event.SetEventObject(this); ProcessEvent(event); +#endif }