📄 notebmac.cpp
字号:
MacSetupTabs(); m_nSelection = -1 ; InvalidateBestSize(); return true;}// same as AddPage() but does it at given positionbool wxNotebook::InsertPage(size_t nPage, wxNotebookPage *pPage, const wxString& strText, bool bSelect, int imageId){ if ( !wxNotebookBase::InsertPage(nPage, pPage, strText, bSelect, imageId) ) return false; wxASSERT_MSG( pPage->GetParent() == this, _T("notebook pages must have notebook as parent") ); // don't show pages by default (we'll need to adjust their size first) pPage->Show( false ) ; pPage->SetLabel(strText); m_images.Insert(imageId, nPage); MacSetupTabs(); wxRect rect = GetPageRect() ; pPage->SetSize(rect); if ( pPage->GetAutoLayout() ) { pPage->Layout(); } // now deal with the selection // --------------------------- // if the inserted page is before the selected one, we must update the // index of the selected page if ( int(nPage) <= m_nSelection ) { m_nSelection++; // while this still is the same page showing, we need to update the tabs SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ; } // some page should be selected: either this one or the first one if there // is still no selection int selNew = -1; if ( bSelect ) selNew = nPage; else if ( m_nSelection == -1 ) selNew = 0; 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* the user would expect.*/void wxNotebook::MacSetupTabs(){ SetControl32BitMaximum( (ControlHandle) m_macControl , GetPageCount() ) ; wxNotebookPage *page; ControlTabInfoRec info; const size_t countPages = GetPageCount(); for(size_t ii = 0; ii < countPages; ii++) { page = m_pages[ii]; info.version = 0; info.iconSuiteID = 0; wxMacStringToPascal( page->GetLabel() , info.name ) ; SetControlData( (ControlHandle) m_macControl, ii+1, kControlTabInfoTag, sizeof( ControlTabInfoRec) , (char*) &info ) ; 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 const wxBitmap* bmap = GetImageList()->GetBitmapPtr( 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") ) ; if ( UMAGetSystemVersion() < 0x1030 ) { UnregisterIconRef( 'WXNG' , (OSType) 1 ) ; } ReleaseIconRef( iconRef ) ; DisposeHandle( (Handle) iconFamily ) ; } }#endif } Rect bounds; GetControlBounds((ControlHandle)m_macControl, &bounds); InvalWindowRect((WindowRef)MacGetRootWindow(), &bounds);}wxRect wxNotebook::GetPageRect() const{ // fit the notebook page to the tab control's display area int w, h; GetSize(&w, &h); return wxRect( wxMacTabLeftMargin(GetWindowStyle()) + m_macHorizontalBorder, wxMacTabTopMargin(GetWindowStyle()) + m_macVerticalBorder, w - wxMacTabLeftMargin(GetWindowStyle()) - wxMacTabRightMargin(GetWindowStyle()) - 2*m_macHorizontalBorder, h - wxMacTabTopMargin(GetWindowStyle()) - wxMacTabBottomMargin(GetWindowStyle()) - 2*m_macVerticalBorder);}// ----------------------------------------------------------------------------// wxNotebook callbacks// ----------------------------------------------------------------------------// @@@ OnSize() is used for setting the font when it's called for the first// time because doing it in ::Create() doesn't work (for unknown reasons)void wxNotebook::OnSize(wxSizeEvent& event){ unsigned int nCount = m_pages.Count(); wxRect rect = GetPageRect() ; for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) { wxNotebookPage *pPage = m_pages[nPage]; pPage->SetSize(rect); if ( pPage->GetAutoLayout() ) { pPage->Layout(); } } // Processing continues to next OnSize event.Skip();}void wxNotebook::OnSelChange(wxNotebookEvent& event){ // is it our tab control? if ( event.GetEventObject() == this ) ChangePage(event.GetOldSelection(), event.GetSelection()); // we want to give others a chance to process this message as well event.Skip();}void wxNotebook::OnSetFocus(wxFocusEvent& event){ // set focus to the currently selected page if any if ( m_nSelection != -1 ) m_pages[m_nSelection]->SetFocus(); event.Skip();}void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event){ if ( event.IsWindowChange() ) { // change pages AdvanceSelection(event.GetDirection()); } else { // we get this event in 2 cases // // a) one of our pages might have generated it because the user TABbed // out from it in which case we should propagate the event upwards and // our parent will take care of setting the focus to prev/next sibling // // or // // b) the parent panel wants to give the focus to us so that we // forward it to our selected page. We can't deal with this in // OnSetFocus() because we don't know which direction the focus came // from in this case and so can't choose between setting the focus to // first or last panel child wxWindow *parent = GetParent(); // the cast is here to fic a GCC ICE if ( ((wxWindow*)event.GetEventObject()) == parent ) { // no, it doesn't come from child, case (b): forward to a page if ( m_nSelection != -1 ) { // so that the page knows that the event comes from it's parent // and is being propagated downwards event.SetEventObject(this); wxWindow *page = m_pages[m_nSelection]; if ( !page->GetEventHandler()->ProcessEvent(event) ) { page->SetFocus(); } //else: page manages focus inside it itself } else { // we have no pages - still have to give focus to _something_ SetFocus(); } } else { // it comes from our child, case (a), pass to the parent if ( parent ) { event.SetCurrentFocus(this); parent->GetEventHandler()->ProcessEvent(event); } } }}// ----------------------------------------------------------------------------// wxNotebook base class virtuals// ----------------------------------------------------------------------------#if wxUSE_CONSTRAINTS// override these 2 functions to do nothing: everything is done in OnSizevoid wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse)){ // 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;}#endif // wxUSE_CONSTRAINTSvoid wxNotebook::Command(wxCommandEvent& event){ wxFAIL_MSG(wxT("wxNotebook::Command not implemented"));}// ----------------------------------------------------------------------------// wxNotebook helper functions// ----------------------------------------------------------------------------// hide the currently active panel and show the new onevoid wxNotebook::ChangePage(int nOldSel, int nSel){ if ( nOldSel != -1 ) { m_pages[nOldSel]->Show(false); } if ( nSel != -1 ) { wxNotebookPage *pPage = m_pages[nSel]; pPage->Show(true); pPage->SetFocus(); } m_nSelection = nSel; SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ;}void wxNotebook::OnMouse( wxMouseEvent &event ){ 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); GetEventHandler()->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); GetEventHandler()->ProcessEvent(event); } } } }}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); event.SetEventObject(this); ProcessEvent(event);#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -