Ticket #10848: CycleControls.patch

File CycleControls.patch, 4.1 KB (added by LukasK, 8 years ago)

Patch which makes Ctrl+Tab and Ctrl+Shift+Tab cycles through the tabs in one tab control in the visual control order order, and switching to the next tab control after the last or first tab

  • src/aui/auibook.cpp

     
    41844184
    41854185    wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes();
    41864186    size_t i, pane_count = all_panes.GetCount();
    4187     for (i = 0; i < pane_count; ++i)
    4188     {
     4187    for (i = 0; i < pane_count; ++i) {
    41894188        wxAuiPaneInfo& pane = all_panes.Item(i);
    41904189        if (pane.name == wxT("dummy"))
    41914190            continue;
     
    44414440    return m_tab_ctrl_height;
    44424441}
    44434442
     4443wxAuiTabCtrl* GetNextTabCtrl( wxAuiTabCtrl* current, wxAuiManager& mgr )
     4444{
     4445    wxAuiPaneInfoArray& allPanes = mgr.GetAllPanes();
     4446    for ( size_t i = 0; i != allPanes.GetCount(); i++ ){
     4447        wxTabFrame* tabFrame = (wxTabFrame*)allPanes.Item(i).window;
     4448        if ( tabFrame->m_tabs != current ){
     4449            continue;
     4450        }
     4451        for ( size_t j = i + 1; j < allPanes.GetCount(); j++ ){
     4452            if ( allPanes.Item(j).name == wxT("dummy") ){
     4453                continue;
     4454            }
     4455            return ((wxTabFrame*)(allPanes.Item(j).window))->m_tabs;
     4456        }
     4457    }
     4458    for ( size_t j = 0; j != allPanes.GetCount(); j++ ){
     4459        if ( allPanes.Item(j).name == wxT("dummy") ){
     4460            continue;
     4461        }
     4462        return ((wxTabFrame*)(allPanes.Item(j).window))->m_tabs;
     4463    }
     4464    return 0;
     4465}
     4466
     4467wxAuiTabCtrl* GetPrevTabCtrl( wxAuiTabCtrl* current, wxAuiManager& mgr )
     4468{
     4469    wxAuiPaneInfoArray& allPanes = mgr.GetAllPanes();
     4470    for ( int i = 0; i != allPanes.GetCount(); i++ ){
     4471        wxTabFrame* tabFrame = (wxTabFrame*)allPanes.Item(i).window;
     4472        if ( tabFrame->m_tabs != current ){
     4473            continue;
     4474        }
     4475
     4476        // Search for the previous pane
     4477        for ( int j = i - 1; j >= 0; j-- ){
     4478            if ( allPanes.Item(j).name == wxT("dummy") ){
     4479                continue;
     4480            }
     4481            return ((wxTabFrame*)(allPanes.Item(j).window))->m_tabs;
     4482        }
     4483        break;
     4484    }
     4485
     4486    // Search for the last valid pane
     4487    for ( size_t j = allPanes.GetCount(); j != 0; j-- ){
     4488        if ( allPanes.Item(j - 1).name == wxT("dummy") ){
     4489            continue;
     4490        }
     4491        return ( (wxTabFrame*)(allPanes.Item(j-1).window) )->m_tabs;
     4492    }
     4493    return 0;
     4494}
     4495
    44444496// Gets the height of the notebook for a given page height
    44454497int wxAuiNotebook::GetHeightForPageHeight(int pageHeight)
    44464498{
     
    44544506// Advances the selection, generation page selection events
    44554507void wxAuiNotebook::AdvanceSelection(bool forward)
    44564508{
    4457     if (GetPageCount() <= 1)
     4509    if (GetPageCount() <= 1){
    44584510        return;
     4511    }
    44594512
    4460     int currentSelection = GetSelection();
     4513    wxAuiTabCtrl* tabCtrl = 0;
     4514    int idx = -1;
     4515    if( !FindTab(GetPage(GetSelection()), &tabCtrl, &idx) ){
     4516        // Could not find the tab control containing the currently
     4517        // active tab
     4518        return;
     4519    }
     4520    if( tabCtrl == 0 || idx < 0 ){
     4521        return;
     4522    }
    44614523
    4462     if (forward)
    4463     {
    4464         if (currentSelection == (int) (GetPageCount() - 1))
    4465             return;
    4466         else if (currentSelection == -1)
    4467             currentSelection = 0;
    4468         else
    4469             currentSelection ++;
     4524    wxWindow* page = 0;
     4525    const size_t maxPages = tabCtrl->GetPageCount();
     4526    forward ? idx++: idx--;
     4527    if( idx < 0 ){
     4528        // Wraparound to the last tab control
     4529        wxAuiTabCtrl* prevCtrl = GetPrevTabCtrl( tabCtrl, m_mgr );
     4530        page = prevCtrl->GetPage(prevCtrl->GetActivePage()).window;
    44704531    }
    4471     else
    4472     {
    4473         if (currentSelection <= 0)
    4474             return;
    4475         else
    4476             currentSelection --;
     4532    else if ((size_t)idx < maxPages){
     4533        // Select the neighbouring page in the active
     4534        // tab control
     4535        page = tabCtrl->GetPage(idx).window;
    44774536    }
     4537    else if ( maxPages > 0 ){
     4538        // Wrap around to the first tab control
     4539        wxAuiTabCtrl* nextCtrl = GetNextTabCtrl( tabCtrl, m_mgr );
     4540        page = nextCtrl->GetPage(nextCtrl->GetActivePage()).window;
     4541    }
    44784542
    4479     SetSelection(currentSelection);
     4543    if( page != 0 ){
     4544        SetSelection( GetPageIndex(page) );
     4545    }
    44804546}
    44814547
    44824548// Shows the window menu