made wxListbook events more consistent with wxNotebook ones (patch 1001271)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29165 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-09-16 22:14:34 +00:00
parent 627b2b2a0d
commit 33ebfc3b9b
3 changed files with 45 additions and 37 deletions

View File

@@ -116,10 +116,6 @@ public:
protected: protected:
virtual wxWindow *DoRemovePage(size_t page); virtual wxWindow *DoRemovePage(size_t page);
private:
// common part of all constructors
void Init();
// get the size which the list control should have // get the size which the list control should have
wxSize GetListSize() const; wxSize GetListSize() const;
@@ -130,7 +126,6 @@ private:
void OnSize(wxSizeEvent& event); void OnSize(wxSizeEvent& event);
void OnListSelected(wxListEvent& event); void OnListSelected(wxListEvent& event);
// the list control we use for showing the pages index // the list control we use for showing the pages index
wxListView *m_list; wxListView *m_list;
@@ -142,6 +137,9 @@ private:
// the currently selected page or wxNOT_FOUND if none // the currently selected page or wxNOT_FOUND if none
int m_selection; int m_selection;
private:
// common part of all constructors
void Init();
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook) DECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook)

View File

@@ -506,7 +506,7 @@ void MyFrame::OnNotebook(wxNotebookEvent& event)
if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
{ {
str = wxT("Notebook changed"); str = wxT("Changed");
} }
else if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) else if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
{ {
@@ -528,13 +528,14 @@ void MyFrame::OnNotebook(wxNotebookEvent& event)
} }
str = wxT("Notebook changing"); str = wxT("Changing");
} }
static int s_numNotebookEvents = 0; static int s_numNotebookEvents = 0;
wxLogMessage(wxT("Notebook event #%d: %s (%d)"), wxLogMessage(wxT("Notebook event #%d: %s (%d) Sel %d, OldSel %d"),
s_numNotebookEvents++, str.c_str(), eventType); s_numNotebookEvents++, str.c_str(), eventType,
event.GetSelection(), event.GetOldSelection());
#if wxUSE_LOG #if wxUSE_LOG
m_text->SetInsertionPointEnd(); m_text->SetInsertionPointEnd();

View File

@@ -262,23 +262,13 @@ void wxListbook::OnSize(wxSizeEvent& event)
} }
#endif // wxUSE_LINE_IN_LISTBOOK #endif // wxUSE_LINE_IN_LISTBOOK
// we should always have some selection if possible // resize the currently shown page
if ( m_selection == wxNOT_FOUND && GetPageCount() ) if (m_selection != wxNOT_FOUND )
{
SetSelection(0);
}
if ( m_selection != wxNOT_FOUND )
{ {
wxWindow *page = m_pages[m_selection]; wxWindow *page = m_pages[m_selection];
wxCHECK_RET( page, _T("NULL page in wxListbook?") ); wxCHECK_RET( page, _T("NULL page in wxListbook?") );
page->SetSize(GetPageRect()); page->SetSize(GetPageRect());
if ( !page->IsShown() )
{
page->Show();
} }
}
} }
wxSize wxListbook::CalcSizeFromPage(const wxSize& sizePage) const wxSize wxListbook::CalcSizeFromPage(const wxSize& sizePage) const
@@ -353,22 +343,26 @@ int wxListbook::SetSelection(size_t n)
wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND,
_T("invalid page index in wxListbook::SetSelection()") ); _T("invalid page index in wxListbook::SetSelection()") );
int selOld = m_selection; const int selOld = m_selection;
if ( (int)n != m_selection ) if ( (int)n != m_selection )
{ {
m_list->Select(n); if ( m_selection != wxNOT_FOUND )
m_list->Focus(n); m_pages[m_selection]->Hide();
wxWindow *page = m_pages[n];
page->SetSize(GetPageRect());
page->Show();
// change m_selection only now, otherwise OnListSelected() would ignore // change m_selection only now to ignore the selection change event
// the selection change event
m_selection = n; m_selection = n;
m_list->Select(n);
m_list->Focus(n);
} }
return selOld; return selOld;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// adding/removing the pages // adding/removing the pages
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -385,10 +379,10 @@ wxListbook::InsertPage(size_t n,
m_list->InsertItem(n, text, imageId); m_list->InsertItem(n, text, imageId);
if ( bSelect ) // we should always have some selection if possible
if ( bSelect || (m_selection == wxNOT_FOUND) )
{ {
m_list->Select(n); SetSelection(n);
m_list->Focus(n);
} }
else // don't select this page else // don't select this page
{ {
@@ -402,10 +396,28 @@ wxListbook::InsertPage(size_t n,
wxWindow *wxListbook::DoRemovePage(size_t page) wxWindow *wxListbook::DoRemovePage(size_t page)
{ {
const int page_count = GetPageCount();
wxWindow *win = wxBookCtrl::DoRemovePage(page); wxWindow *win = wxBookCtrl::DoRemovePage(page);
if ( win ) if ( win )
{ {
m_list->DeleteItem(page); m_list->DeleteItem(page);
if (m_selection >= (int)page)
{
// force new sel valid if possible
int sel = m_selection - 1;
if (page_count == 1)
sel = -1;
else if ((page_count == 2) || (sel == -1))
sel = 0;
// force sel invalid if deleting current page - don't try to hide it
m_selection = (m_selection == (int)page) ? -1 : m_selection - 1;
if ((sel != -1) && (sel != m_selection))
SetSelection(sel);
}
} }
return win; return win;
@@ -425,6 +437,7 @@ bool wxListbook::DeleteAllPages()
void wxListbook::OnListSelected(wxListEvent& eventList) void wxListbook::OnListSelected(wxListEvent& eventList)
{ {
const int selNew = eventList.GetIndex(); const int selNew = eventList.GetIndex();
const int selOld = m_selection;
if ( selNew == m_selection ) if ( selNew == m_selection )
{ {
@@ -439,7 +452,7 @@ void wxListbook::OnListSelected(wxListEvent& eventList)
eventIng.SetEventObject(this); eventIng.SetEventObject(this);
eventIng.SetSelection(selNew); eventIng.SetSelection(selNew);
eventIng.SetOldSelection(m_selection); eventIng.SetOldSelection(selOld);
if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() ) if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() )
{ {
m_list->Select(m_selection); m_list->Select(m_selection);
@@ -447,17 +460,13 @@ void wxListbook::OnListSelected(wxListEvent& eventList)
} }
// change allowed: do change the page and notify the user about it // change allowed: do change the page and notify the user about it
if ( m_selection != wxNOT_FOUND ) SetSelection(selNew);
m_pages[m_selection]->Hide();
wxWindow *page = m_pages[m_selection = selNew];
page->SetSize(GetPageRect());
page->Show();
wxListbookEvent eventEd(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, GetId()); wxListbookEvent eventEd(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, GetId());
eventEd.SetEventObject(this); eventEd.SetEventObject(this);
eventEd.SetSelection(selNew); eventEd.SetSelection(selNew);
eventEd.SetOldSelection(m_selection); eventEd.SetOldSelection(selOld);
(void)GetEventHandler()->ProcessEvent(eventEd); (void)GetEventHandler()->ProcessEvent(eventEd);
} }