📄 notebmac.cpp
字号:
///////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/notebmac.cpp// Purpose: implementation of wxNotebook// Author: Stefan Csomor// Modified by:// Created: 1998-01-01// RCS-ID: $Id: notebmac.cpp,v 1.79 2006/10/14 16:42:02 SC Exp $// Copyright: (c) Stefan Csomor// Licence: wxWindows licence///////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#if wxUSE_NOTEBOOK#include "wx/notebook.h"#ifndef WX_PRECOMP #include "wx/string.h" #include "wx/log.h" #include "wx/app.h" #include "wx/image.h"#endif#include "wx/string.h"#include "wx/imaglist.h"#include "wx/mac/uma.h"// check that the page index is valid#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())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(wxID_ANY, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) EVT_SET_FOCUS(wxNotebook::OnSetFocus) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)END_EVENT_TABLE()IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)// common part of all ctorsvoid wxNotebook::Init(){ m_nSelection = -1;}// default for dynamic classwxNotebook::wxNotebook(){ Init();}// the same arguments as for wxControlwxNotebook::wxNotebook( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ){ Init(); Create( parent, id, pos, size, style, name );}bool wxNotebook::Create( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ){ m_macIsUserPane = false ; if (! (style & wxBK_ALIGN_MASK)) style |= wxBK_TOP; if ( !wxNotebookBase::Create( parent, id, pos, size, style, name ) ) return false; Rect bounds = wxMacGetBoundsForControl( this, pos, size ); if ( bounds.right <= bounds.left ) bounds.right = bounds.left + 100; if ( bounds.bottom <= bounds.top ) bounds.bottom = bounds.top + 100; UInt16 tabstyle = kControlTabDirectionNorth; if ( HasFlag(wxBK_LEFT) ) tabstyle = kControlTabDirectionWest; else if ( HasFlag( wxBK_RIGHT ) ) tabstyle = kControlTabDirectionEast; else if ( HasFlag( wxBK_BOTTOM ) ) tabstyle = kControlTabDirectionSouth; ControlTabSize tabsize; switch (GetWindowVariant()) { case wxWINDOW_VARIANT_MINI: if ( UMAGetSystemVersion() >= 0x1030 ) tabsize = 3 ; else tabsize = kControlSizeSmall; break; case wxWINDOW_VARIANT_SMALL: tabsize = kControlTabSizeSmall; break; default: tabsize = kControlTabSizeLarge; break; } m_peer = new wxMacControl( this ); OSStatus err = CreateTabsControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, tabsize, tabstyle, 0, NULL, m_peer->GetControlRefAddr() ); verify_noerr( err ); MacPostControlCreate( pos, size ); return true ;}// dtorwxNotebook::~wxNotebook(){}// ----------------------------------------------------------------------------// wxNotebook accessors// ----------------------------------------------------------------------------void wxNotebook::SetPadding(const wxSize& padding){ // unsupported by OS}void wxNotebook::SetTabSize(const wxSize& sz){ // unsupported by OS}void wxNotebook::SetPageSize(const wxSize& size){ SetSize( CalcSizeFromPage( size ) );}wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const{ return DoGetSizeFromClientSize( sizePage );}int wxNotebook::DoSetSelection(size_t nPage, int flags){ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("DoSetSelection: invalid notebook page") ); if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) { if ( flags & SetSelection_SendEvent ) { if ( !SendPageChangingEvent(nPage) ) { // vetoed by program return m_nSelection; } //else: program allows the page change SendPageChangedEvent(m_nSelection, nPage); } ChangePage(m_nSelection, nPage); } //else: no change return m_nSelection;}bool wxNotebook::SetPageText(size_t nPage, const wxString& strText){ wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("SetPageText: invalid notebook page") ); wxNotebookPage *page = m_pages[nPage]; page->SetLabel(strText); MacSetupTabs(); return true;}wxString wxNotebook::GetPageText(size_t nPage) const{ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxEmptyString, wxT("GetPageText: invalid notebook page") ); wxNotebookPage *page = m_pages[nPage]; return page->GetLabel();}int wxNotebook::GetPageImage(size_t nPage) const{ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("GetPageImage: invalid notebook page") ); return m_images[nPage];}bool wxNotebook::SetPageImage(size_t nPage, int nImage){ wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("SetPageImage: invalid notebook page") ); wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), false, wxT("SetPageImage: invalid image index") ); 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;}// ----------------------------------------------------------------------------// wxNotebook operations// ----------------------------------------------------------------------------// remove one page from the notebook, without deleting the windowwxNotebookPage* wxNotebook::DoRemovePage(size_t nPage){ wxCHECK_MSG( IS_VALID_PAGE(nPage), NULL, wxT("DoRemovePage: invalid notebook page") ); wxNotebookPage* page = m_pages[nPage] ; m_pages.RemoveAt(nPage); MacSetupTabs(); if (m_nSelection >= (int)GetPageCount()) m_nSelection = GetPageCount() - 1; if (m_nSelection >= 0) m_pages[m_nSelection]->Show(true); InvalidateBestSize(); return page;}// remove all pagesbool wxNotebook::DeleteAllPages(){ WX_CLEAR_ARRAY(m_pages) ; 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, wxT("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 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; if ( bSelect )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -