private int FindColInfoIdx(int columnIx, int fromColInfoIdx) { if (columnIx < 0) { throw new ArgumentException("column parameter out of range: " + columnIx); } if (fromColInfoIdx < 0) { throw new ArgumentException("fromIdx parameter out of range: " + fromColInfoIdx); } for (int k = fromColInfoIdx; k < records.Count; k++) { ColumnInfoRecord ci = GetColInfo(k); if (ci.ContainsColumn(columnIx)) { return(k); } if (ci.FirstColumn > columnIx) { break; } } return(-1); }
/// <summary> /// Finds the ColumnInfoRecord /// which contains the specified columnIndex /// </summary> /// <param name="columnIndex">index of the column (not the index of the ColumnInfoRecord)</param> /// <returns> /// <c>null</c> /// if no column info found for the specified column /// </returns> public ColumnInfoRecord FindColumnInfo(int columnIndex) { int nInfos = records.Count; for (int i = 0; i < nInfos; i++) { ColumnInfoRecord ci = GetColInfo(i); if (ci.ContainsColumn(columnIndex)) { return(ci); } } return(null); }
/// <summary> /// Sets the column. /// </summary> /// <param name="targetColumnIx">The target column ix.</param> /// <param name="xfIndex">Index of the xf.</param> /// <param name="width">The width.</param> /// <param name="level">The level.</param> /// <param name="hidden">The hidden.</param> /// <param name="collapsed">The collapsed.</param> public void SetColumn(int targetColumnIx, short?xfIndex, int?width, int?level, bool?hidden, bool?collapsed) { ColumnInfoRecord ci = null; int k = 0; for (k = 0; k < records.Count; k++) { ColumnInfoRecord tci = (ColumnInfoRecord)records[k]; if (tci.ContainsColumn(targetColumnIx)) { ci = tci; break; } if (tci.FirstColumn > targetColumnIx) { // call targetColumnIx infos after k are for later targetColumnIxs break; // exit now so k will be the correct insert pos } } if (ci == null) { // okay so there IsN'T a targetColumnIx info record that cover's this targetColumnIx so lets Create one! ColumnInfoRecord nci = new ColumnInfoRecord(); nci.FirstColumn = targetColumnIx; nci.LastColumn = targetColumnIx; SetColumnInfoFields(nci, xfIndex, width, level, hidden, collapsed); InsertColumn(k, nci); AttemptMergeColInfoRecords(k); return; } bool styleChanged = ci.XFIndex != xfIndex; bool widthChanged = ci.ColumnWidth != width; bool levelChanged = ci.OutlineLevel != level; bool hiddenChanged = ci.IsHidden != hidden; bool collapsedChanged = ci.IsCollapsed != collapsed; bool targetColumnIxChanged = styleChanged || widthChanged || levelChanged || hiddenChanged || collapsedChanged; if (!targetColumnIxChanged) { // do nothing...nothing Changed. return; } if ((ci.FirstColumn == targetColumnIx) && (ci.LastColumn == targetColumnIx)) { // if its only for this cell then // ColumnInfo ci for a single column, the target column SetColumnInfoFields(ci, xfIndex, width, level, hidden, collapsed); AttemptMergeColInfoRecords(k); return; } if ((ci.FirstColumn == targetColumnIx) || (ci.LastColumn == targetColumnIx)) { // The target column is at either end of the multi-column ColumnInfo ci // we'll just divide the info and create a new one if (ci.FirstColumn == targetColumnIx) { ci.FirstColumn = targetColumnIx + 1; } else { ci.LastColumn = targetColumnIx - 1; k++; // adjust insert pos to insert after } ColumnInfoRecord nci = CopyColInfo(ci); nci.FirstColumn = targetColumnIx; nci.LastColumn = targetColumnIx; SetColumnInfoFields(nci, xfIndex, width, level, hidden, collapsed); InsertColumn(k, nci); AttemptMergeColInfoRecords(k); } else { //split to 3 records ColumnInfoRecord ciStart = ci; ColumnInfoRecord ciMid = CopyColInfo(ci); ColumnInfoRecord ciEnd = CopyColInfo(ci); int lastcolumn = ci.LastColumn; ciStart.LastColumn = (targetColumnIx - 1); ciMid.FirstColumn = (targetColumnIx); ciMid.LastColumn = (targetColumnIx); SetColumnInfoFields(ciMid, xfIndex, width, level, hidden, collapsed); InsertColumn(++k, ciMid); ciEnd.FirstColumn = (targetColumnIx + 1); ciEnd.LastColumn = (lastcolumn); InsertColumn(++k, ciEnd); // no need to attemptMergeColInfoRecords because we // know both on each side are different } }