X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f30c17645c56f85178ee780fa330d954e45cea9..f54632db33bc3ccc834cc5bcb6405fae6e26ed6e:/src/generic/listbkg.cpp diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 313205d051..e9b4baa656 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -62,7 +62,7 @@ const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING = wxNewEventType(); const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED = wxNewEventType(); const int wxID_LISTBOOKLISTVIEW = wxNewId(); -BEGIN_EVENT_TABLE(wxListbook, wxBookCtrl) +BEGIN_EVENT_TABLE(wxListbook, wxBookCtrlBase) EVT_SIZE(wxListbook::OnSize) EVT_LIST_ITEM_SELECTED(wxID_LISTBOOKLISTVIEW, wxListbook::OnListSelected) END_EVENT_TABLE() @@ -134,7 +134,7 @@ wxListbook::Create(wxWindow *parent, #ifdef __WXMSW__ // On XP with themes enabled the GetViewRect used in GetListSize to // determine the space needed for the list view will incorrectly return - // (0,0,0,0) the first time. So send a pending event so OnSize wiull be + // (0,0,0,0) the first time. So send a pending event so OnSize will be // called again after the window is ready to go. Technically we don't // need to do this on non-XP windows, but if things are already sized // correctly then nothing changes and so there is no harm. @@ -172,7 +172,8 @@ wxRect wxListbook::GetPageRect() const { const wxSize sizeList = m_list->GetSize(); - wxRect rectPage(wxPoint(0, 0), GetClientSize()); + wxPoint pt; + wxRect rectPage(pt, GetClientSize()); switch ( GetWindowStyle() & wxLB_ALIGN_MASK ) { default: @@ -240,7 +241,7 @@ void wxListbook::OnSize(wxSizeEvent& event) #if wxUSE_LINE_IN_LISTBOOK if ( m_line ) { - wxRect rectLine(wxPoint(0, 0), sizeClient); + wxRect rectLine(sizeClient); switch ( GetWindowStyle() & wxLB_ALIGN_MASK ) { @@ -322,7 +323,7 @@ int wxListbook::GetPageImage(size_t WXUNUSED(n)) const bool wxListbook::SetPageImage(size_t n, int imageId) { - return m_list->SetItemImage(n, imageId, imageId); + return m_list->SetItemImage(n, imageId); } // ---------------------------------------------------------------------------- @@ -333,7 +334,7 @@ void wxListbook::SetImageList(wxImageList *imageList) { m_list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); - wxBookCtrl::SetImageList(imageList); + wxBookCtrlBase::SetImageList(imageList); } // ---------------------------------------------------------------------------- @@ -367,6 +368,7 @@ int wxListbook::SetSelection(size_t n) page->SetSize(GetPageRect()); page->Show(); + // change m_selection now to ignore the selection change event m_selection = n; m_list->Select(n); m_list->Focus(n); @@ -391,21 +393,34 @@ wxListbook::InsertPage(size_t n, bool bSelect, int imageId) { - if ( !wxBookCtrl::InsertPage(n, page, text, bSelect, imageId) ) + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) return false; m_list->InsertItem(n, text, imageId); - // we should always have some selection if possible - if ( bSelect || (m_selection == wxNOT_FOUND) ) + // if the inserted page is before the selected one, we must update the + // index of the selected page + if ( int(n) <= m_selection ) { - SetSelection(n); + // one extra page added + m_selection++; + m_list->Select(m_selection); + m_list->Focus(m_selection); } - else // don't select this page - { - // it will be shown only when selected + + // some page should be selected: either this one or the first one if there + // is still no selection + int selNew = -1; + if ( bSelect ) + selNew = n; + else if ( m_selection == -1 ) + selNew = 0; + + if ( selNew != m_selection ) page->Hide(); - } + + if ( selNew != -1 ) + SetSelection(selNew); InvalidateBestSize(); return true; @@ -414,7 +429,7 @@ wxListbook::InsertPage(size_t n, wxWindow *wxListbook::DoRemovePage(size_t page) { const int page_count = GetPageCount(); - wxWindow *win = wxBookCtrl::DoRemovePage(page); + wxWindow *win = wxBookCtrlBase::DoRemovePage(page); if ( win ) { @@ -444,7 +459,7 @@ wxWindow *wxListbook::DoRemovePage(size_t page) bool wxListbook::DeleteAllPages() { m_list->DeleteAllItems(); - return wxBookCtrl::DeleteAllPages(); + return wxBookCtrlBase::DeleteAllPages(); } // ---------------------------------------------------------------------------- @@ -454,7 +469,6 @@ bool wxListbook::DeleteAllPages() void wxListbook::OnListSelected(wxListEvent& eventList) { const int selNew = eventList.GetIndex(); - const int selOld = m_selection; if ( selNew == m_selection ) { @@ -464,28 +478,14 @@ void wxListbook::OnListSelected(wxListEvent& eventList) return; } - // first send "change in progress" event which may be vetoed by user - wxListbookEvent eventIng(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, GetId()); + SetSelection(selNew); - eventIng.SetEventObject(this); - eventIng.SetSelection(selNew); - eventIng.SetOldSelection(selOld); - if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() ) + // change wasn't allowed, return to previous state + if (m_selection != selNew) { m_list->Select(m_selection); - return; + m_list->Focus(m_selection); } - - // change allowed: do change the page and notify the user about it - SetSelection(selNew); - - wxListbookEvent eventEd(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, GetId()); - - eventEd.SetEventObject(this); - eventEd.SetSelection(selNew); - eventEd.SetOldSelection(selOld); - - (void)GetEventHandler()->ProcessEvent(eventEd); } #endif // wxUSE_LISTBOOK