X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9cf0f6ae4f20919ec35834109914f825f10a4363..06077aaf2c11135bb9ca18ef33181ab18ac7480e:/src/generic/listbkg.cpp diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index a0e5073a9c..a9498bdf3c 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -26,11 +26,15 @@ #if wxUSE_LISTBOOK +#include "wx/listbook.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" +#endif + #include "wx/listctrl.h" #include "wx/statline.h" -#include "wx/listbook.h" #include "wx/imaglist.h" -#include "wx/settings.h" // ---------------------------------------------------------------------------- // various wxWidgets macros @@ -157,6 +161,45 @@ void wxListbook::OnSize(wxSizeEvent& event) wxBookCtrlBase::OnSize(event); } +int wxListbook::HitTest(const wxPoint& pt, long *flags) const +{ + int pagePos = wxNOT_FOUND; + + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + + // convert from listbook control coordinates to list control coordinates + const wxListView * const list = GetListView(); + const wxPoint listPt = list->ScreenToClient(ClientToScreen(pt)); + + // is the point inside list control? + if ( wxRect(list->GetSize()).Contains(listPt) ) + { + int flagsList; + pagePos = list->HitTest(listPt, flagsList); + + if ( flags ) + { + if ( pagePos != wxNOT_FOUND ) + *flags = 0; + + if ( flagsList & (wxLIST_HITTEST_ONITEMICON | + wxLIST_HITTEST_ONITEMSTATEICON ) ) + *flags |= wxBK_HITTEST_ONICON; + + if ( flagsList & wxLIST_HITTEST_ONITEMLABEL ) + *flags |= wxBK_HITTEST_ONLABEL; + } + } + else // not over list control at all + { + if ( flags && GetPageRect().Contains(pt) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return pagePos; +} + wxSize wxListbook::CalcSizeFromPage(const wxSize& sizePage) const { // we need to add the size of the list control and the border between @@ -219,47 +262,29 @@ void wxListbook::SetImageList(wxImageList *imageList) // selection // ---------------------------------------------------------------------------- +void wxListbook::UpdateSelectedPage(size_t newsel) +{ + m_selection = newsel; + GetListView()->Select(newsel); + GetListView()->Focus(newsel); +} + int wxListbook::GetSelection() const { return m_selection; } -int wxListbook::SetSelection(size_t n) +wxBookCtrlBaseEvent* wxListbook::CreatePageChangingEvent() const { - wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND, - wxT("invalid page index in wxListbook::SetSelection()") ); - - const int oldSel = m_selection; - - if ( int(n) != m_selection ) - { - wxListbookEvent event(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId); - event.SetSelection(n); - event.SetOldSelection(m_selection); - event.SetEventObject(this); - if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) - { - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - - wxWindow *page = m_pages[n]; - page->SetSize(GetPageRect()); - page->Show(); - - // change m_selection now to ignore the selection change event - m_selection = n; - GetListView()->Select(n); - GetListView()->Focus(n); - - // program allows the page change - event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); - (void)GetEventHandler()->ProcessEvent(event); - } - } + return new wxListbookEvent(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId); +} - return oldSel; +void wxListbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); } + // ---------------------------------------------------------------------------- // adding/removing the pages // ---------------------------------------------------------------------------- @@ -301,7 +326,14 @@ wxListbook::InsertPage(size_t n, SetSelection(selNew); InvalidateBestSize(); + // GetListView()->InvalidateBestSize(); GetListView()->Arrange(); + + if (GetPageCount() == 1) + { + wxSizeEvent sz(GetSize(), GetId()); + ProcessEvent(sz); + } return true; } @@ -331,6 +363,11 @@ wxWindow *wxListbook::DoRemovePage(size_t page) } GetListView()->Arrange(); + if (GetPageCount() == 0) + { + wxSizeEvent sz(GetSize(), GetId()); + ProcessEvent(sz); + } } return win; @@ -340,7 +377,15 @@ wxWindow *wxListbook::DoRemovePage(size_t page) bool wxListbook::DeleteAllPages() { GetListView()->DeleteAllItems(); - return wxBookCtrlBase::DeleteAllPages(); + if (!wxBookCtrlBase::DeleteAllPages()) + return false; + + m_selection = -1; + + wxSizeEvent sz(GetSize(), GetId()); + ProcessEvent(sz); + + return true; } // ----------------------------------------------------------------------------