void CViewBase::SaveListState() { CConfigManager* pConfig = wxGetApp().GetConfigManager(); // Save Sorting Information pConfig->SetConfigValue(GetViewName(), wxEmptyString, wxT("SortColumn"), m_iSortColumn); pConfig->SetConfigValue(GetViewName(), wxEmptyString, wxT("ReverseSort"), m_iSortOrder); // Save Column Order #ifdef wxHAS_LISTCTRL_COLUMN_ORDER wxString strColumnOrder; wxString strBuffer; wxArrayInt aOrder(m_pListPane->GetColumnCount()); aOrder = m_pListPane->GetColumnsOrder(); for (int i = 0; i < aOrder.Count(); ++i) { strBuffer.Printf(wxT("%d "), aOrder[i]); strColumnOrder += strBuffer; } pConfig->SetConfigValue(GetViewName(), wxEmptyString, wxT("ColumnOrder"), strColumnOrder); #endif }
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 CViewBase::RestoreListState() { CConfigManager* pConfig = wxGetApp().GetConfigManager(); long lTempValue = 0; // Restore Sorting Information if (pConfig->GetConfigValue(GetViewName(), wxEmptyString, wxT("ReverseSort"), -1, &lTempValue)) { m_iSortOrder = lTempValue; } if (pConfig->GetConfigValue(GetViewName(), wxEmptyString, wxT("SortColumn"), -1, &lTempValue)) { m_iSortColumn = lTempValue; } // Restore Column Order #ifdef wxHAS_LISTCTRL_COLUMN_ORDER wxString strColumnOrder; wxArrayInt aOrder(m_pListPane->GetColumnCount()); long order = 0; int i = 0; if (pConfig->GetConfigValue(GetViewName(), wxEmptyString, wxT("ColumnOrder"), wxEmptyString, &strColumnOrder)) { wxStringTokenizer tok(strColumnOrder, " "); while (tok.HasMoreTokens()) { tok.GetNextToken().ToLong(&order); aOrder[i] = order; ++i; } m_pListPane->SetColumnsOrder(aOrder); } #endif }
// 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 }
bool CBOINCListCtrl::OnSaveState(wxConfigBase* pConfig) { wxString strBaseConfigLocation = wxEmptyString; wxInt32 iIndex = 0; wxInt32 iStdColumnCount = 0; wxInt32 iActualColumnCount = GetColumnCount(); int i, j; wxASSERT(pConfig); // Retrieve the base location to store configuration information // Should be in the following form: "/Projects/" strBaseConfigLocation = pConfig->GetPath() + wxT("/"); iStdColumnCount = m_pParentView->m_iStdColWidthOrder.size(); // Cycle through the columns recording their widths for (iIndex = 0; iIndex < iActualColumnCount; iIndex++) { m_pParentView->m_iStdColWidthOrder[m_pParentView->m_iColumnIndexToColumnID[iIndex]] = GetColumnWidth(iIndex); } for (iIndex = 0; iIndex < iStdColumnCount; iIndex++) { pConfig->SetPath(strBaseConfigLocation + m_pParentView->m_aStdColNameOrder->Item(iIndex)); pConfig->Write(wxT("Width"), m_pParentView->m_iStdColWidthOrder[iIndex]); } // Save sorting column and direction pConfig->SetPath(strBaseConfigLocation); pConfig->Write(wxT("SortColumn"), m_pParentView->m_iSortColumnID); pConfig->Write(wxT("ReverseSortOrder"), m_pParentView->m_bReverseSort); // Save Column Order wxString strColumnOrder; wxString strBuffer; wxString strHiddenColumns; wxArrayInt aOrder(iActualColumnCount); CBOINCBaseView* pView = (CBOINCBaseView*)GetParent(); wxASSERT(wxDynamicCast(pView, CBOINCBaseView)); #ifdef wxHAS_LISTCTRL_COLUMN_ORDER aOrder = GetColumnsOrder(); #else for (i = 0; i < iActualColumnCount; ++i) { aOrder[i] = i; } #endif strColumnOrder.Printf(wxT("%s"), pView->m_aStdColNameOrder->Item(pView->m_iColumnIndexToColumnID[aOrder[0]])); for (i = 1; i < iActualColumnCount; ++i) { strBuffer.Printf(wxT(";%s"), pView->m_aStdColNameOrder->Item(pView->m_iColumnIndexToColumnID[aOrder[i]])); strColumnOrder += strBuffer; } pConfig->Write(wxT("ColumnOrder"), strColumnOrder); strHiddenColumns = wxEmptyString; for (i = 0; i < iStdColumnCount; ++i) { bool found = false; for (j = 0; j < iActualColumnCount; ++j) { if (pView->m_iColumnIndexToColumnID[aOrder[j]] == i) { found = true; break; } } if (found) continue; if (!strHiddenColumns.IsEmpty()) { strHiddenColumns += wxT(";"); } strHiddenColumns += pView->m_aStdColNameOrder->Item(i); } pConfig->Write(wxT("HiddenColumns"), strHiddenColumns); return true; }