/**
   * creates the ColumnInfo Record and sets it to a default column/width
   *
   * @see loci.poi.hssf.record.ColumnInfoRecord
   * @return record containing a ColumnInfoRecord
   */
  public static Record createColInfo() {
    ColumnInfoRecord retval = new ColumnInfoRecord();

    retval.setColumnWidth((short) 2275);
    // was:       retval.setOptions(( short ) 6);
    retval.setOptions((short) 2);
    retval.setXFIndex((short) 0x0f);
    return retval;
  }
 /** Sets all non null fields into the <code>ci</code> parameter. */
 private void setColumnInfoFields(
     ColumnInfoRecord ci,
     Short xfStyle,
     Short width,
     Integer level,
     Boolean hidden,
     Boolean collapsed) {
   if (xfStyle != null) ci.setXFIndex(xfStyle.shortValue());
   if (width != null) ci.setColumnWidth(width.shortValue());
   if (level != null) ci.setOutlineLevel(level.shortValue());
   if (hidden != null) ci.setHidden(hidden.booleanValue());
   if (collapsed != null) ci.setCollapsed(collapsed.booleanValue());
 }
  public void setColumn(
      short column, Short xfIndex, Short width, Integer level, Boolean hidden, Boolean collapsed) {
    ColumnInfoRecord ci = null;
    int k = 0;

    for (k = 0; k < records.size(); k++) {
      ci = (ColumnInfoRecord) records.get(k);
      if ((ci.getFirstColumn() <= column) && (column <= ci.getLastColumn())) {
        break;
      }
      ci = null;
    }

    if (ci != null) {
      boolean styleChanged = xfIndex != null && ci.getXFIndex() != xfIndex.shortValue();
      boolean widthChanged = width != null && ci.getColumnWidth() != width.shortValue();
      boolean levelChanged = level != null && ci.getOutlineLevel() != level.intValue();
      boolean hiddenChanged = hidden != null && ci.getHidden() != hidden.booleanValue();
      boolean collapsedChanged = collapsed != null && ci.getCollapsed() != collapsed.booleanValue();
      boolean columnChanged =
          styleChanged || widthChanged || levelChanged || hiddenChanged || collapsedChanged;
      if (!columnChanged) {
        // do nothing...nothing changed.
      } else if ((ci.getFirstColumn() == column)
          && (ci.getLastColumn() == column)) { // if its only for this cell then
        setColumnInfoFields(ci, xfIndex, width, level, hidden, collapsed);
      } else if ((ci.getFirstColumn() == column) || (ci.getLastColumn() == column)) {
        // okay so the width is different but the first or last column == the column we'return
        // setting
        // we'll just divide the info and create a new one
        if (ci.getFirstColumn() == column) {
          ci.setFirstColumn((short) (column + 1));
        } else {
          ci.setLastColumn((short) (column - 1));
        }
        ColumnInfoRecord nci = (ColumnInfoRecord) createColInfo();

        nci.setFirstColumn(column);
        nci.setLastColumn(column);
        nci.setOptions(ci.getOptions());
        nci.setXFIndex(ci.getXFIndex());
        setColumnInfoFields(nci, xfIndex, width, level, hidden, collapsed);

        insertColumn(k, nci);
      } else {
        // split to 3 records
        short lastcolumn = ci.getLastColumn();
        ci.setLastColumn((short) (column - 1));

        ColumnInfoRecord nci = (ColumnInfoRecord) createColInfo();
        nci.setFirstColumn(column);
        nci.setLastColumn(column);
        nci.setOptions(ci.getOptions());
        nci.setXFIndex(ci.getXFIndex());
        setColumnInfoFields(nci, xfIndex, width, level, hidden, collapsed);
        insertColumn(++k, nci);

        nci = (ColumnInfoRecord) createColInfo();
        nci.setFirstColumn((short) (column + 1));
        nci.setLastColumn(lastcolumn);
        nci.setOptions(ci.getOptions());
        nci.setXFIndex(ci.getXFIndex());
        nci.setColumnWidth(ci.getColumnWidth());
        insertColumn(++k, nci);
      }
    } else {

      // okay so there ISN'T a column info record that cover's this column so lets create one!
      ColumnInfoRecord nci = (ColumnInfoRecord) createColInfo();

      nci.setFirstColumn(column);
      nci.setLastColumn(column);
      setColumnInfoFields(nci, xfIndex, width, level, hidden, collapsed);
      insertColumn(k, nci);
    }
  }