bool wxHeaderCtrlBase::ShowCustomizeDialog() { #if wxUSE_REARRANGECTRL // prepare the data for showing the dialog wxArrayInt order = GetColumnsOrder(); const unsigned count = GetColumnCount(); // notice that titles are always in the index order, they will be shown // rearranged according to the display order in the dialog wxArrayString titles; titles.reserve(count); for ( unsigned n = 0; n < count; n++ ) titles.push_back(GetColumn(n).GetTitle()); // this loop is however over positions and not indices unsigned pos; for ( pos = 0; pos < count; pos++ ) { int& idx = order[pos]; if ( GetColumn(idx).IsHidden() ) { // indicate that this one is hidden idx = ~idx; } } // do show it wxHeaderColumnsRearrangeDialog dlg(this, order, titles); if ( dlg.ShowModal() == wxID_OK ) { // and apply the changes order = dlg.GetOrder(); for ( pos = 0; pos < count; pos++ ) { int& idx = order[pos]; const bool show = idx >= 0; if ( !show ) { // make all indices positive for passing them to SetColumnsOrder() idx = ~idx; } if ( show != GetColumn(idx).IsShown() ) UpdateColumnVisibility(idx, show); } UpdateColumnsOrder(order); SetColumnsOrder(order); return true; } #endif // wxUSE_REARRANGECTRL return false; }
void CBOINCListCtrl::SetStandardColumnOrder() { int i; int colCount = GetColumnCount(); wxArrayInt aOrder(colCount); for (i=0; i<colCount; ++i) { aOrder[i] = i; } #ifdef wxHAS_LISTCTRL_COLUMN_ORDER if (colCount) { SetColumnsOrder(aOrder); } #endif }
void wxGxContentView::SetStyle(wxGISEnumContentsViewStyle style) { if(m_current_style == style) return; if(m_current_style == enumGISCVReport) { //store values m_anWidth.Clear(); for (int i = 0; i < GetColumnCount(); ++i) { m_anWidth.Add( GetColumnWidth(i) ); } #ifdef wxHAS_LISTCTRL_COLUMN_ORDER m_anOrder = GetColumnsOrder(); #endif } m_current_style = style; switch(m_current_style) { case enumGISCVReport: SetSingleStyle(wxLC_REPORT); InitColumns(); for(size_t i = 0; i < m_anWidth.GetCount(); ++i) SetColumnWidth(i, m_anWidth[i]); #ifdef wxHAS_LISTCTRL_COLUMN_ORDER SetColumnsOrder(m_anOrder); #endif SetColumnImage(m_currentSortCol, m_bSortAsc ? 0 : 1); break; case enumGISCVSmall: SetSingleStyle(wxLC_SMALL_ICON); break; case enumGISCVLarge: SetSingleStyle(wxLC_ICON); break; case enumGISCVList: SetSingleStyle(wxLC_LIST); break; } RefreshAll(); }
// SetListColumnOrder() is called mostly from OnRestoreState(), so we don't // call OnSaveState() from here. CDlgHiddenColumns calls OnSaveState() // when we really need to do that. // // Unfortunately, we have no way of immediately calling OnSaveState() when // the user manually reorders columns because that does not generate a // notification from MS Windows so wxWidgets can't generate an event. void CBOINCListCtrl::SetListColumnOrder(wxArrayString& orderArray) { int i, stdCount, columnPosition; int colCount = GetColumnCount(); int shownColCount = orderArray.GetCount(); int columnIndex = 0; // Column number among shown columns before re-ordering int columnID = 0; // ID of column, e.g. COLUMN_PROJECT, COLUMN_STATUS, etc. int sortColumnIndex = -1; wxArrayInt aOrder(shownColCount); CBOINCBaseView* pView = (CBOINCBaseView*)GetParent(); wxASSERT(wxDynamicCast(pView, CBOINCBaseView)); pView->m_iColumnIndexToColumnID.Clear(); for (i=colCount-1; i>=0; --i) { DeleteColumn(i); } stdCount = pView->m_aStdColNameOrder->GetCount(); pView->m_iColumnIDToColumnIndex.Clear(); for (columnID=0; columnID<stdCount; ++columnID) { pView->m_iColumnIDToColumnIndex.Add(-1); } for (columnID=0; columnID<stdCount; ++columnID) { for (columnPosition=0; columnPosition<shownColCount; ++columnPosition) { if (orderArray[columnPosition].IsSameAs(pView->m_aStdColNameOrder->Item(columnID))) { aOrder[columnPosition] = columnIndex; pView->AppendColumn(columnID); pView->m_iColumnIndexToColumnID.Add(columnID); pView->m_iColumnIDToColumnIndex[columnID] = columnIndex; ++columnIndex; break; } } } // Prevent a crash bug if we just changed to a new locale. // // If a column has the same name in both the old and new locale, we guard against // changing the sort column to that column. // // CBOINCListCtrl::OnRestoreState() may have incorrectly added the column names in // the new locale as "new" columns, so check against both shownColCount and stdCount. int limit = wxMin(shownColCount, stdCount); if (columnIndex < limit) { SetStandardColumnOrder(); for (columnID=0; columnID<limit; ++columnID) { aOrder[columnID] = columnID; pView->AppendColumn(columnID); pView->m_iColumnIndexToColumnID.Add(columnID); pView->m_iColumnIDToColumnIndex[columnID] = columnID; } } // If sort column is now hidden, set the new first column as sort column if (pView->m_iSortColumnID >= 0) { sortColumnIndex = pView->m_iColumnIDToColumnIndex[pView->m_iSortColumnID]; if (sortColumnIndex < 0) { pView->m_iSortColumnID = pView->m_iColumnIndexToColumnID[0]; pView->m_bReverseSort = false; pView->SetSortColumn(0); } else { // Redraw the sort arrow, etc. pView->SetSortColumn(sortColumnIndex); } } #ifdef wxHAS_LISTCTRL_COLUMN_ORDER colCount = GetColumnCount(); if ((shownColCount > 0) && (shownColCount <= stdCount) && (colCount == shownColCount)) { SetColumnsOrder(aOrder); } #endif }