package net.sf.jabref.gui.maintable;

import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Enumeration;

import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

/**
 * Related to <code>MainTable</code> class. <br/>
 * Prevents dragging of the first header column ("#") and shows icons in the table header if an icon has to be set.
 *
 * This might not be the best way to solve this problem. Overriding
 * <code>getDraggedColumn</code> produces some ugly gui dragging artifacts if a
 * user attempts to drag something before the first columns.
 *
 * @author Daniel Waeber
 * @author Fabian Bieker
 * @since 12/2008
 */
class PreventDraggingJTableHeader extends JTableHeader {

    private final MainTableFormat tableFormat;

    public PreventDraggingJTableHeader(JTable table, MainTableFormat tableFormat) {
        super(table.getColumnModel());
        this.setTable(table);
        this.tableFormat = tableFormat;
        setupTableHeaderIcons();
    }

    private void setupTableHeaderIcons() {

        Enumeration<TableColumn> columns = columnModel.getColumns();
        for (TableColumn column : Collections.list(columns)) {
            MainTableColumn mainTableColumn = tableFormat.getTableColumn(column.getModelIndex());
            column.setHeaderValue(mainTableColumn.getHeaderLabel());
        }

    }

    @Override
    public String getToolTipText(MouseEvent event) {
        int index = columnModel.getColumnIndexAtX(event.getX());
        int realIndex = columnModel.getColumn(index).getModelIndex();
        MainTableColumn column = tableFormat.getTableColumn(realIndex);
        return column.getDisplayName();
    }

    /**
     * Overridden to prevent dragging of first column ("#")
     */
    @Override
    public void setDraggedColumn(TableColumn column) {

        if ((column != null) && (column.getModelIndex() == 0)) {
            return;
        }
        super.setDraggedColumn(column);
    }

    /**
     * Overridden to prevent dragging of an other column before the first column ("#").
     */
    @Override
    public TableColumn getDraggedColumn() {
        TableColumn column = super.getDraggedColumn();
        if (column != null) {
            PreventDraggingJTableHeader.preventDragBeforeNumberColumn(this.getTable(), column.getModelIndex());
        }

        return column;
    }

    /**
     * Transform model index <code>modelIndex</code> to a view based index and
     * prevent dragging before model index <code>toIndex</code> (inclusive).
     */
    private static void preventDragBeforeNumberColumn(JTable table, int modelIndex) {

        for (int columnIndex = 0; columnIndex < table.getColumnCount(); columnIndex++) {

            TableColumn col = table.getColumnModel().getColumn(columnIndex);

            // found the element in the view ...
            // ... and check if it should not be dragged
            if ((col.getModelIndex() == modelIndex) && (columnIndex < 1)) {
                // prevent dragging (move it back ...)
                table.getColumnModel().moveColumn(columnIndex, 1);
                return; // we are done now
            }

        }
    }
}
