// Author: Stefan Csomor
// Modified by:
// Created: 1998-01-01
-// RCS-ID: $Id: notebmac.cpp 55079 2008-08-13 14:56:42Z PC $
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
END_EVENT_TABLE()
-IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxBookCtrlBase)
-
-
-// common part of all ctors
-void wxNotebook::Init()
-{
- m_nSelection = -1;
-}
-
-// default for dynamic class
-wxNotebook::wxNotebook()
-{
- Init();
-}
-
-// the same arguments as for wxControl
-wxNotebook::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 ;
-
+{
+ DontCreatePeer();
+
if (! (style & wxBK_ALIGN_MASK))
style |= wxBK_TOP;
if ( !wxNotebookBase::Create( parent, id, pos, size, style, name ) )
return false;
- m_peer = wxWidgetImpl::CreateTabView(this,parent, id, pos, size, style, GetExtraStyle() );
-
+ SetPeer(wxWidgetImpl::CreateTabView(this,parent, id, pos, size, style, GetExtraStyle() ));
+
MacPostControlCreate( pos, size );
return true ;
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("DoSetSelection: invalid notebook page") );
- if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection )
+ if ( m_selection == wxNOT_FOUND || nPage != (size_t)m_selection )
{
if ( flags & SetSelection_SendEvent )
{
if ( !SendPageChangingEvent(nPage) )
{
// vetoed by program
- return m_nSelection;
+ return m_selection;
}
//else: program allows the page change
- SendPageChangedEvent(m_nSelection, nPage);
+ SendPageChangedEvent(m_selection, nPage);
}
- ChangePage(m_nSelection, nPage);
+ ChangePage(m_selection, nPage);
}
//else: no change
- return m_nSelection;
+ return m_selection;
}
bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), false,
wxT("SetPageImage: invalid notebook page") );
- wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), false,
+ wxCHECK_MSG( HasImageList() && nImage < GetImageList()->GetImageCount(), false,
wxT("SetPageImage: invalid image index") );
if ( nImage != m_images[nPage] )
wxNotebookPage* page = m_pages[nPage] ;
m_pages.RemoveAt(nPage);
+ m_images.RemoveAt(nPage);
MacSetupTabs();
- if (m_nSelection >= (int)GetPageCount())
- m_nSelection = GetPageCount() - 1;
+ if ( m_selection >= (int)nPage )
+ {
+ if ( GetPageCount() == 0 )
+ m_selection = wxNOT_FOUND;
+ else
+ m_selection = m_selection ? m_selection - 1 : 0;
- if (m_nSelection >= 0)
- m_pages[m_nSelection]->Show(true);
+ GetPeer()->SetValue( m_selection + 1 ) ;
+ }
+
+ if (m_selection >= 0)
+ m_pages[m_selection]->Show(true);
InvalidateBestSize();
// remove all pages
bool wxNotebook::DeleteAllPages()
{
- WX_CLEAR_ARRAY(m_pages) ;
+ WX_CLEAR_ARRAY(m_pages);
+ m_images.clear();
MacSetupTabs();
- m_nSelection = -1 ;
+ m_selection = wxNOT_FOUND ;
InvalidateBestSize();
return true;
// if the inserted page is before the selected one, we must update the
// index of the selected page
- if ( int(nPage) <= m_nSelection )
+ if ( int(nPage) <= m_selection )
{
- m_nSelection++;
+ m_selection++;
// while this still is the same page showing, we need to update the tabs
- m_peer->SetValue( m_nSelection + 1 ) ;
+ GetPeer()->SetValue( m_selection + 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 );
+ DoSetSelectionAfterInsertion(nPage, bSelect);
InvalidateBestSize();
return true;
}
-int wxNotebook::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags)) const
+int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
{
- int resultV = wxNOT_FOUND;
-#if 0
- const int countPages = GetPageCount();
-
- // we have to convert from Client to Window relative coordinates
- wxPoint adjustedPt = pt + GetClientAreaOrigin();
- // and now to HIView native ones
- adjustedPt.x -= MacGetLeftBorderSize() ;
- adjustedPt.y -= MacGetTopBorderSize() ;
-
- HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ;
- HIViewPartCode outPart = 0 ;
- OSStatus err = HIViewGetPartHit( m_peer->GetControlRef(), &hipoint, &outPart );
-
- int max = m_peer->GetMaximum() ;
- if ( outPart == 0 && max > 0 )
- {
- // this is a hack, as unfortunately a hit on an already selected tab returns 0,
- // so we have to go some extra miles to make sure we select something different
- // and try again ..
- int val = m_peer->GetValue() ;
- int maxval = max ;
- if ( max == 1 )
- {
- m_peer->SetMaximum( 2 ) ;
- maxval = 2 ;
- }
-
- if ( val == 1 )
- m_peer->SetValue( maxval ) ;
- else
- m_peer->SetValue( 1 ) ;
-
- err = HIViewGetPartHit( m_peer->GetControlRef(), &hipoint, &outPart );
-
- m_peer->SetValue( val ) ;
- if ( max == 1 )
- m_peer->SetMaximum( 1 ) ;
- }
-
- if ( outPart >= 1 && outPart <= countPages )
- resultV = outPart - 1 ;
-
- if (flags != NULL)
- {
- *flags = 0;
-
- // we cannot differentiate better
- if (resultV >= 0)
- *flags |= wxBK_HITTEST_ONLABEL;
- else
- *flags |= wxBK_HITTEST_NOWHERE;
- }
-#endif
- return resultV;
+ return GetPeer()->TabHitTest(pt,flags);
}
// Added by Mark Newsam
//
void wxNotebook::MacSetupTabs()
{
- m_peer->SetupTabs(*this);
+ GetPeer()->SetupTabs(*this);
Refresh();
}
for ( unsigned int nPage = 0; nPage < nCount; nPage++ )
{
wxNotebookPage *pPage = m_pages[nPage];
- pPage->SetSize(rect);
- if ( pPage->GetAutoLayout() )
- pPage->Layout();
+ pPage->SetSize(rect, wxSIZE_FORCE_EVENT);
}
+#if 0 // deactivate r65078 for the moment
+ // If the selected page is hidden at this point, the notebook
+ // has become visible for the first time after creation, and
+ // we postponed showing the page in ChangePage().
+ // So show the selected page now.
+ if ( m_selection != wxNOT_FOUND )
+ {
+ wxNotebookPage *pPage = m_pages[m_selection];
+ if ( !pPage->IsShown() )
+ {
+ pPage->Show( true );
+ pPage->SetFocus();
+ }
+ }
+#endif
+
// Processing continues to next OnSize
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();
+ if ( m_selection != wxNOT_FOUND )
+ m_pages[m_selection]->SetFocus();
event.Skip();
}
if ( ((wxWindow*)event.GetEventObject()) == parent )
{
// no, it doesn't come from child, case (b): forward to a page
- if ( m_nSelection != -1 )
+ if ( m_selection != wxNOT_FOUND )
{
// 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];
+ wxWindow *page = m_pages[m_selection];
if ( !page->HandleWindowEvent( event ) )
{
page->SetFocus();
if (nOldSel == nSel)
return;
- if ( nOldSel != -1 )
+ if ( nOldSel != wxNOT_FOUND )
m_pages[nOldSel]->Show( false );
- if ( nSel != -1 )
+ if ( nSel != wxNOT_FOUND )
{
wxNotebookPage *pPage = m_pages[nSel];
+#if 0 // deactivate r65078 for the moment
+ if ( IsShownOnScreen() )
+ {
+ pPage->Show( true );
+ pPage->SetFocus();
+ }
+ else
+ {
+ // Postpone Show() until the control is actually shown.
+ // Otherwise this forces the containing toplevel window
+ // to show, even if it's just being created and called
+ // AddPage() without intent to show the window yet.
+ // We Show() the selected page in our OnSize handler,
+ // unless it already is shown.
+ }
+#else
pPage->Show( true );
pPage->SetFocus();
+#endif
}
- m_nSelection = nSel;
- m_peer->SetValue( m_nSelection + 1 ) ;
+ m_selection = nSel;
+ GetPeer()->SetValue( m_selection + 1 ) ;
}
bool wxNotebook::OSXHandleClicked( double WXUNUSED(timestampsec) )
{
bool status = false ;
- SInt32 newSel = m_peer->GetValue() - 1 ;
- if ( newSel != m_nSelection )
+ SInt32 newSel = GetPeer()->GetValue() - 1 ;
+ if ( newSel != m_selection )
{
wxBookCtrlEvent changing(
- wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId,
- newSel , m_nSelection );
+ wxEVT_NOTEBOOK_PAGE_CHANGING, m_windowId,
+ newSel , m_selection );
changing.SetEventObject( this );
HandleWindowEvent( changing );
if ( changing.IsAllowed() )
{
wxBookCtrlEvent event(
- wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId,
- newSel, m_nSelection );
+ wxEVT_NOTEBOOK_PAGE_CHANGED, m_windowId,
+ newSel, m_selection );
event.SetEventObject( this );
HandleWindowEvent( event );
+
+ m_selection = newSel;
}
else
{
- m_peer->SetValue( m_nSelection + 1 ) ;
+ GetPeer()->SetValue( m_selection + 1 ) ;
}
status = true ;