
package uk.co.wingpath.gui;

import java.util.*;
import javax.swing.table.*;
import java.util.Vector;
import java.util.Enumeration;

/*
    Extension of TableColumnModel that allows the visibility of columns
    to be changed.
    Code is derived from http://www.stephenkelvin.de/XTableColumnModel/
*/

public class WTableColumnModel
    extends DefaultTableColumnModel
{
    private Vector<TableColumn> allTableColumns =
        new Vector<TableColumn> ();

    public void setColumnVisible (TableColumn column, boolean visible)
    {
        if (!visible)
        {
            super.removeColumn (column);
        }
        else
        {
            int noVisibleColumns = tableColumns.size ();
            int noInvisibleColumns = allTableColumns.size ();
            int visibleIndex = 0;

            for (int invisibleIndex = 0 ; invisibleIndex < noInvisibleColumns ;
                ++invisibleIndex)
            {
                TableColumn visibleColumn = visibleIndex < noVisibleColumns ?
                    tableColumns.get (visibleIndex) : null;
                TableColumn testColumn = allTableColumns.get (invisibleIndex);

                if (testColumn == column)
                {
                    if (visibleColumn != column)
                    {
                        super.addColumn (column);
                        super.moveColumn (tableColumns.size () - 1,
                            visibleIndex);
                    }
                    return;
                }
                if (testColumn == visibleColumn)
                    ++visibleIndex;
            }
        }
    }

    @Override
    public void addColumn (TableColumn column)
    {
        allTableColumns.addElement (column);
        super.addColumn (column);
    }

    @Override
    public void removeColumn (TableColumn column)
    {
        allTableColumns.remove (column);
        super.removeColumn (column);
    }

    @Override
    public void moveColumn (int oldIndex, int newIndex)
    {
        if (oldIndex < 0 || oldIndex >= getColumnCount () ||
            newIndex < 0 || newIndex >= getColumnCount ())
        {
            throw new IllegalArgumentException (
                "moveColumn() - Index out of range");
        }

        if (oldIndex != newIndex)
        {
            TableColumn fromColumn = tableColumns.get (oldIndex);
            TableColumn toColumn = tableColumns.get (newIndex);

            int allColumnsOldIndex = allTableColumns.indexOf (fromColumn);
            int allColumnsNewIndex = allTableColumns.indexOf (toColumn);

            allTableColumns.removeElementAt (allColumnsOldIndex);
            allTableColumns.insertElementAt (fromColumn, allColumnsNewIndex);
        }

        // Always call super method - it fires an event even if the column
        // hasn't moved.

        super.moveColumn (oldIndex, newIndex);
    }
}
