📄 notebmac.cpp
字号:
///////////////////////////////////////////////////////////////////////////////// Name: src/mac/classic/notebmac.cpp// Purpose: implementation of wxNotebook// Author: Stefan Csomor// Modified by:// Created: 1998-01-01// RCS-ID: $Id: notebmac.cpp,v 1.13 2006/07/03 19:02:32 ABX Exp $// Copyright: (c) Stefan Csomor// Licence: wxWindows licence///////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------#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/imaglist.h"#include "wx/mac/uma.h"// ----------------------------------------------------------------------------// macros// ----------------------------------------------------------------------------// check that the page index is valid#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())// ----------------------------------------------------------------------------// event table// ----------------------------------------------------------------------------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_MOUSE_EVENTS(wxNotebook::OnMouse) 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)// ============================================================================// implementation// ============================================================================// The Appearance Manager docs show using tab controls in either edge to edge// mode, or inset. I think edge to edge conforms better to the other ports,// and inset mode is better accomplished with space around the wxNotebook rather// than within it. --Robin// CS : had to switch off tight spacing due to 10.3 problems#define wxMAC_EDGE_TO_EDGE 0static inline int wxMacTabMargin(long nbStyle, long side){ static int tabMargin = -1; static int otherMargin = -1; if ( tabMargin == -1) { if ( UMAHasAquaLayout() ) { tabMargin = 26; // From Appearance Manager docs for small tab control dimensions#if wxMAC_EDGE_TO_EDGE otherMargin = 0;#else// otherMargin = 20; // JACS - this seems fine on 10.3; 20 is way too much otherMargin = 8;#endif } else { tabMargin = 30;#if wxMAC_EDGE_TO_EDGE otherMargin = 0;#else otherMargin = 16;#endif } } // If the style matches the side asked for then return the tab margin, // but we have to special case wxBK_TOP since it is zero... if ( side == wxBK_TOP) { if ( nbStyle != 0 && nbStyle & (wxBK_LEFT|wxBK_RIGHT|wxBK_BOTTOM)) { return otherMargin; } else { return tabMargin; } } else if ( nbStyle & side) return tabMargin; else return otherMargin;}static inline int wxMacTabLeftMargin(long style){ return wxMacTabMargin(style, wxBK_LEFT);}static inline int wxMacTabTopMargin(long style){ return wxMacTabMargin(style, wxBK_TOP);}static inline int wxMacTabRightMargin(long style){ return wxMacTabMargin(style, wxBK_RIGHT);}static inline int wxMacTabBottomMargin(long style){ return wxMacTabMargin(style, wxBK_BOTTOM);}// ----------------------------------------------------------------------------// wxNotebook construction// ----------------------------------------------------------------------------// common part of all ctorsvoid wxNotebook::Init(){ if ( UMAHasAquaLayout() ) { // Should these depend on wxMAC_EDGE_TO_EDGE too? m_macHorizontalBorder = 7; m_macVerticalBorder = 8; } 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);}// Create() functionbool wxNotebook::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name){ if ( !wxNotebookBase::Create(parent, id, pos, size, style, name) ) return false; Rect bounds ; Str255 title ; if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) style |= wxBK_TOP; MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ; int tabstyle = kControlTabSmallNorthProc ; if ( HasFlag(wxBK_LEFT) ) tabstyle = kControlTabSmallWestProc ; else if ( HasFlag( wxBK_RIGHT ) ) tabstyle = kControlTabSmallEastProc ; else if ( HasFlag( wxBK_BOTTOM ) ) tabstyle = kControlTabSmallSouthProc ; m_macControl = (WXWidget) ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1, tabstyle , (long) this ) ; MacPostControlCreate() ; 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{ wxSize sizeTotal = sizePage; sizeTotal.x += 2 * m_macHorizontalBorder + wxMacTabLeftMargin(GetWindowStyle()) + wxMacTabRightMargin(GetWindowStyle()) ; sizeTotal.y += 2 * m_macVerticalBorder + wxMacTabTopMargin(GetWindowStyle()) + wxMacTabBottomMargin(GetWindowStyle()) ; return sizeTotal;}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), wxNOT_FOUND, wxT("notebook page out of range") ); if ( int(nPage) != m_nSelection ) { wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); event.SetSelection(nPage); event.SetOldSelection(m_nSelection); event.SetEventObject(this); if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) { // program allows the page change event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); (void)GetEventHandler()->ProcessEvent(event); ChangePage(m_nSelection, nPage); } } return m_nSelection;}bool wxNotebook::SetPageText(size_t nPage, const wxString& strText){ wxASSERT( IS_VALID_PAGE(nPage) ); wxNotebookPage *page = m_pages[nPage]; page->SetLabel(strText); MacSetupTabs(); return true;}wxString wxNotebook::GetPageText(size_t nPage) const{ wxASSERT( IS_VALID_PAGE(nPage) ); wxNotebookPage *page = m_pages[nPage]; return page->GetLabel();}int wxNotebook::GetPageImage(size_t nPage) const{ 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( m_imageList && nImage < m_imageList->GetImageCount(), false, _T("invalid image index in SetPageImage()") ); 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( IS_VALID_PAGE(nPage), NULL ); 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) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -