X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bb08a4a194a81dce7a08a642060b044a2a19d148..488b2c29c0cf468f96f148003b21952611325dbf:/src/generic/choicbkg.cpp diff --git a/src/generic/choicbkg.cpp b/src/generic/choicbkg.cpp index 7620db21e9..05b057a16f 100644 --- a/src/generic/choicbkg.cpp +++ b/src/generic/choicbkg.cpp @@ -50,6 +50,13 @@ const wxCoord MARGIN = 5; // various wxWidgets macros // ---------------------------------------------------------------------------- +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxChoicebook, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxChoicebookEvent, wxNotifyEvent) @@ -57,7 +64,7 @@ const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING = wxNewEventType(); const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED = wxNewEventType(); const int wxID_CHOICEBOOKCHOICE = wxNewId(); -BEGIN_EVENT_TABLE(wxChoicebook, wxBookCtrl) +BEGIN_EVENT_TABLE(wxChoicebook, wxBookCtrlBase) EVT_SIZE(wxChoicebook::OnSize) EVT_CHOICE(wxID_CHOICEBOOKCHOICE, wxChoicebook::OnChoiceSelected) END_EVENT_TABLE() @@ -137,7 +144,8 @@ wxRect wxChoicebook::GetPageRect() const { const wxSize sizeChoice = m_choice->GetSize(); - wxRect rectPage(wxPoint(0, 0), GetClientSize()); + wxPoint pt; + wxRect rectPage(pt, GetClientSize()); switch ( GetWindowStyle() & wxCHB_ALIGN_MASK ) { default: @@ -268,7 +276,7 @@ void wxChoicebook::SetImageList(wxImageList *imageList) { // TODO: can be implemented in form of static bitmap near choice control - wxBookCtrl::SetImageList(imageList); + wxBookCtrlBase::SetImageList(imageList); } // ---------------------------------------------------------------------------- @@ -282,25 +290,37 @@ int wxChoicebook::GetSelection() const int wxChoicebook::SetSelection(size_t n) { - wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, - _T("invalid page index in wxChoicebook::SetSelection()") ); + wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND, + wxT("invalid page index in wxChoicebook::SetSelection()") ); - const int selOld = m_selection; + const int oldSel = m_selection; - if ( (int)n != m_selection ) + if ( int(n) != m_selection ) { - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - wxWindow *page = m_pages[n]; - page->SetSize(GetPageRect()); - page->Show(); + wxChoicebookEvent event(wxEVT_COMMAND_CHOICEBOOK_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(); - // change m_selection only now to ignore the selection change event - m_selection = n; - m_choice->Select(n); + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); + + // change m_selection now to ignore the selection change event + m_selection = n; + m_choice->Select(n); + + // program allows the page change + event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED); + (void)GetEventHandler()->ProcessEvent(event); + } } - return selOld; + return oldSel; } // ---------------------------------------------------------------------------- @@ -314,21 +334,33 @@ wxChoicebook::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_choice->Insert(text, n); - // 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_choice->Select(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; @@ -337,7 +369,7 @@ wxChoicebook::InsertPage(size_t n, wxWindow *wxChoicebook::DoRemovePage(size_t page) { const int page_count = GetPageCount(); - wxWindow *win = wxBookCtrl::DoRemovePage(page); + wxWindow *win = wxBookCtrlBase::DoRemovePage(page); if ( win ) { @@ -367,7 +399,7 @@ wxWindow *wxChoicebook::DoRemovePage(size_t page) bool wxChoicebook::DeleteAllPages() { m_choice->Clear(); - return wxBookCtrl::DeleteAllPages(); + return wxBookCtrlBase::DeleteAllPages(); } // ---------------------------------------------------------------------------- @@ -377,7 +409,6 @@ bool wxChoicebook::DeleteAllPages() void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) { const int selNew = eventChoice.GetSelection(); - const int selOld = m_selection; if ( selNew == m_selection ) { @@ -387,28 +418,11 @@ void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) return; } - // first send "change in progress" event which may be vetoed by user - wxChoicebookEvent eventIng(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, GetId()); - - eventIng.SetEventObject(this); - eventIng.SetSelection(selNew); - eventIng.SetOldSelection(selOld); - if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() ) - { - m_choice->Select(m_selection); - return; - } - - // change allowed: do change the page and notify the user about it SetSelection(selNew); - wxChoicebookEvent eventEd(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, GetId()); - - eventEd.SetEventObject(this); - eventEd.SetSelection(selNew); - eventEd.SetOldSelection(selOld); - - (void)GetEventHandler()->ProcessEvent(eventEd); + // change wasn't allowed, return to previous state + if (m_selection != selNew) + m_choice->Select(m_selection); } #endif // wxUSE_CHOICEBOOK