swingx-master/swingx-demos/swingx-demos-content/src/main/java/org/jdesktop/swingx/util/CustomColumnFactory.java
/*
 * Created on 29.02.2008
 *
 */
package org.jdesktop.swingx.util;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.TableModel;

import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.renderer.StringValue;
import org.jdesktop.swingx.table.ColumnFactory;
import org.jdesktop.swingx.table.TableColumnExt;

/**
 * A ColumnFactory is used by JXTable to create and configure all columns.
 * It can be set per-application (before creating an JXTable) or per-table
 * (before setting the model). <p>
 * 
 * Additional features:
 * <ul>
 * <li> changes the column titles to a more human readable form. 
 * <li> support list of identifiers to exclude from column creation
 * <li> support list of identifiers to hide on column configuration
 * <li> support pluggable maximal rowCount to measure
 * </ul>
 */
public  class CustomColumnFactory extends ColumnFactory {
    
    List<Object> excludes;
    List<Object> hidden;
    private StringValue titleStringValue;

    /**
     * 
     * @param names the identifiers to exclude.
     */
    public void addExcludeNames(Object... names) {
        for (Object object : names) {
            getExcludeNames().add(object);
        }
    }
    
    /**
     * 
     * @param names the identifiers to exclude.
     */
    public void addHiddenNames(Object... names) {
        for (Object object : names) {
            getHiddenNames().add(object);
        }
    }

    /**
     * 
     * @param sv the StringValue to use for column header "beautification".
     */
    public void setTitleStringValue(StringValue sv) {
        this.titleStringValue = sv;
    }
    
    /**
     * {@inheritDoc} <p>
     * Overridden to not create columns for the model columns which are 
     * listed in the excludes.
     */
    @Override
    public TableColumnExt createAndConfigureTableColumn(TableModel model,
            int modelIndex) {
        if (getExcludeNames().contains(model.getColumnName(modelIndex))) {
            return null;
        }
        return super.createAndConfigureTableColumn(model, modelIndex);
    }



    /**
     * {@inheritDoc} <p>
     * 
     * Overridden to set the column's identifier, beautify the display title.
     */
    @Override
    public void configureTableColumn(TableModel model,
            TableColumnExt columnExt) {
        super.configureTableColumn(model, columnExt);
        columnExt.setIdentifier(model.getColumnName(columnExt.getModelIndex()));
        beautifyColumnTitle(columnExt);
        if (getHiddenNames().contains(columnExt.getIdentifier())) {
            columnExt.setVisible(false);
        }
    }

    /**
     * {@inheritDoc} <p>
     * Overridden to check if the wants to limit the count of rows when
     * measuring. 
     */
    @Override
    protected int getRowCount(JXTable table) {
        if (table.getClientProperty("ColumnFactory.maxRowCount") instanceof Integer) {
            return Math.min(table.getRowCount(), 
                    (Integer) table.getClientProperty("ColumnFactory.maxRowCount"));
        }
        return super.getRowCount(table);
    }

    private void beautifyColumnTitle(TableColumnExt columnExt) {
        if (titleStringValue != null) {
            columnExt.setTitle(titleStringValue.getString(columnExt.getTitle()));
        }
    }

    private List<Object> getExcludeNames() {
        if (excludes == null) {
            excludes = new ArrayList<Object>();
        }
        return excludes;
    }
    
    private List<Object> getHiddenNames() {
        if (hidden == null) {
            hidden = new ArrayList<Object>();
        }
        return hidden;
    }
}

