implementation changes to closer follow MSW, crashes fixed

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23446 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2003-09-09 15:44:02 +00:00
parent 0351877058
commit 461fe6e255
2 changed files with 232 additions and 98 deletions

View File

@@ -39,22 +39,20 @@
// event table
// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARIES
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(-1, wxNotebook::OnSelChange)
EVT_MOUSE_EVENTS(wxNotebook::OnMouse)
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)
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)
#endif
// ============================================================================
// implementation
@@ -261,13 +259,24 @@ void wxNotebook::SetPageSize(const wxSize& size)
int wxNotebook::SetSelection(size_t nPage)
{
if( !IS_VALID_PAGE(nPage) )
return m_nSelection ;
wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
ChangePage(m_nSelection, nPage);
SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ;
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);
}
}
Refresh();
return m_nSelection;
}
@@ -359,24 +368,18 @@ bool wxNotebook::InsertPage(size_t nPage,
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();
if ( bSelect ) {
m_nSelection = nPage;
}
else if ( m_nSelection == -1 ) {
m_nSelection = 0;
}
else if ((size_t)m_nSelection >= nPage) {
m_nSelection++;
}
// don't show pages by default (we'll need to adjust their size first)
pPage->Show( false ) ;
int h, w;
GetSize(&w, &h);
pPage->SetSize(wxMacTabLeftMargin(GetWindowStyle()) + m_macHorizontalBorder,
@@ -387,6 +390,31 @@ bool wxNotebook::InsertPage(size_t nPage,
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);
return true;
}
@@ -466,9 +494,11 @@ void wxNotebook::OnSize(wxSizeEvent& event)
{
// emulate page change (it's esp. important to do it first time because
// otherwise our page would stay invisible)
/*
int nSel = m_nSelection;
m_nSelection = -1;
SetSelection(nSel);
*/
// fit the notebook page to the tab control's display area
int w, h;
@@ -516,10 +546,50 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
AdvanceSelection(event.GetDirection());
}
else {
// pass to the parent
if ( GetParent() ) {
event.SetCurrentFocus(this);
GetParent()->ProcessEvent(event);
// 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);
}
}
}
}
@@ -528,19 +598,23 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
// wxNotebook base class virtuals
// ----------------------------------------------------------------------------
#if wxUSE_CONSTRAINTS
// override these 2 functions to do nothing: everything is done in OnSize
void wxNotebook::SetConstraintSizes(bool /* recurse */)
void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse))
{
// don't set the sizes of the pages - their correct size is not yet known
wxControl::SetConstraintSizes(FALSE);
// don't set the sizes of the pages - their correct size is not yet known
wxControl::SetConstraintSizes(FALSE);
}
bool wxNotebook::DoPhase(int /* nPhase */)
bool wxNotebook::DoPhase(int WXUNUSED(nPhase))
{
return TRUE;
return TRUE;
}
#endif // wxUSE_CONSTRAINTS
void wxNotebook::Command(wxCommandEvent& event)
{
wxFAIL_MSG(wxT("wxNotebook::Command not implemented"));
@@ -553,27 +627,20 @@ void wxNotebook::Command(wxCommandEvent& event)
// hide the currently active panel and show the new one
void wxNotebook::ChangePage(int nOldSel, int nSel)
{
// it's not an error (the message may be generated by the tab control itself)
// and it may happen - just do nothing
if ( nSel == nOldSel )
if ( nOldSel != -1 )
{
wxNotebookPage *pPage = m_pages[nSel];
pPage->Show(FALSE);
pPage->Show(TRUE);
pPage->SetFocus();
return;
}
// Hide previous page
if ( nOldSel != -1 ) {
m_pages[nOldSel]->Show(FALSE);
}
wxNotebookPage *pPage = m_pages[nSel];
pPage->Show(TRUE);
pPage->SetFocus();
if ( nSel != -1 )
{
wxNotebookPage *pPage = m_pages[nSel];
pPage->Show(TRUE);
pPage->SetFocus();
}
m_nSelection = nSel;
SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ;
}