/*
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This source code is provided to illustrate the usage of a given feature
 * or technique and has been deliberately simplified. Additional steps
 * required for a production-quality application, such as security checks,
 * input validation and proper error handling, might not be present in
 * this sample code.
 */



import java.util.EventObject;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;


/**
 *  The OldJTable is an unsupported class containing some methods that were
 *  deleted from the JTable between releases 0.6 and 0.7
 */
@SuppressWarnings("serial")
public class OldJTable extends JTable
{
   /*
    *  A new convenience method returning the index of the column in the
    *  co-ordinate space of the view.
    */
    public int getColumnIndex(Object identifier) {
        return getColumnModel().getColumnIndex(identifier);
    }

//
//  Methods deleted from the JTable because they only work with the
//  DefaultTableModel.
//

    public TableColumn addColumn(Object columnIdentifier, int width) {
        return addColumn(columnIdentifier, width, null, null, null);
    }

    public TableColumn addColumn(Object columnIdentifier, List columnData) {
        return addColumn(columnIdentifier, -1, null, null, columnData);
    }

    // Override the new JTable implementation - it will not add a column to the
    // DefaultTableModel.
    public TableColumn addColumn(Object columnIdentifier, int width,
                                 TableCellRenderer renderer,
                                 TableCellEditor editor) {
        return addColumn(columnIdentifier, width, renderer, editor, null);
    }

    public TableColumn addColumn(Object columnIdentifier, int width,
                                 TableCellRenderer renderer,
                                 TableCellEditor editor, List columnData) {
        checkDefaultTableModel();

        // Set up the model side first
        DefaultTableModel m = (DefaultTableModel)getModel();
        m.addColumn(columnIdentifier, columnData.toArray());

        // The column will have been added to the end, so the index of the
        // column in the model is the last element.
        TableColumn newColumn = new TableColumn(
                m.getColumnCount()-1, width, renderer, editor);
        super.addColumn(newColumn);
        return newColumn;
    }

    // Not possilble to make this work the same way ... change it so that
    // it does not delete columns from the model.
    public void removeColumn(Object columnIdentifier) {
        super.removeColumn(getColumn(columnIdentifier));
    }

    public void addRow(Object[] rowData) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).addRow(rowData);
    }

    public void addRow(List rowData) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).addRow(rowData.toArray());
    }

    public void removeRow(int rowIndex) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).removeRow(rowIndex);
    }

    public void moveRow(int startIndex, int endIndex, int toIndex) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).moveRow(startIndex, endIndex, toIndex);
    }

    public void insertRow(int rowIndex, Object[] rowData) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).insertRow(rowIndex, rowData);
    }

    public void insertRow(int rowIndex, List rowData) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).insertRow(rowIndex, rowData.toArray());
    }

    public void setNumRows(int newSize) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).setNumRows(newSize);
    }

    public void setDataVector(Object[][] newData, List columnIds) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).setDataVector(
                newData, columnIds.toArray());
    }

    public void setDataVector(Object[][] newData, Object[] columnIds) {
        checkDefaultTableModel();
        ((DefaultTableModel)getModel()).setDataVector(newData, columnIds);
    }

    protected void checkDefaultTableModel() {
        if(!(dataModel instanceof DefaultTableModel))
            throw new InternalError("In order to use this method, the data model must be an instance of DefaultTableModel.");
    }

//
//  Methods removed from JTable in the move from identifiers to ints.
//

    public Object getValueAt(Object columnIdentifier, int rowIndex) {
        return super.getValueAt(rowIndex, getColumnIndex(columnIdentifier));
    }

    public boolean isCellEditable(Object columnIdentifier, int rowIndex) {
        return super.isCellEditable(rowIndex, getColumnIndex(columnIdentifier));
    }

    public void setValueAt(Object aValue, Object columnIdentifier, int rowIndex) {
        super.setValueAt(aValue, rowIndex, getColumnIndex(columnIdentifier));
    }

    public boolean editColumnRow(Object identifier, int row) {
        return super.editCellAt(row, getColumnIndex(identifier));
    }

    public void moveColumn(Object columnIdentifier, Object targetColumnIdentifier) {
        moveColumn(getColumnIndex(columnIdentifier),
                   getColumnIndex(targetColumnIdentifier));
    }

    public boolean isColumnSelected(Object identifier) {
        return isColumnSelected(getColumnIndex(identifier));
    }

    public TableColumn addColumn(int modelColumn, int width) {
        return addColumn(modelColumn, width, null, null);
    }

    public TableColumn addColumn(int modelColumn) {
        return addColumn(modelColumn, 75, null, null);
    }

    /**
     *  Creates a new column with <I>modelColumn</I>, <I>width</I>,
     *  <I>renderer</I>, and <I>editor</I> and adds it to the end of
     *  the JTable's array of columns. This method also retrieves the
     *  name of the column using the model's <I>getColumnName(modelColumn)</I>
     *  method, and sets the both the header value and the identifier
     *  for this TableColumn accordingly.
     *  <p>
     *  The <I>modelColumn</I> is the index of the column in the model which
     *  will supply the data for this column in the table. This, like the
     *  <I>columnIdentifier</I> in previous releases, does not change as the
     *  columns are moved in the view.
     *  <p>
     *  For the rest of the JTable API, and all of its associated classes,
     *  columns are referred to in the co-ordinate system of the view, the
     *  index of the column in the model is kept inside the TableColumn
     *  and is used only to retrieve the information from the appropraite
     *  column in the model.
     *  <p>
     *
     *  @param  modelColumn     The index of the column in the model
     *  @param  width           The new column's width.  Or -1 to use
     *                          the default width
     *  @param  renderer        The renderer used with the new column.
     *                          Or null to use the default renderer.
     *  @param  editor          The editor used with the new column.
     *                          Or null to use the default editor.
     */
    public TableColumn addColumn(int modelColumn, int width,
                                 TableCellRenderer renderer,
                                 TableCellEditor editor) {
        TableColumn newColumn = new TableColumn(
                modelColumn, width, renderer, editor);
        addColumn(newColumn);
        return newColumn;
    }

//
//  Methods that had their arguments switched.
//

// These won't work with the new table package.

/*
    public Object getValueAt(int columnIndex, int rowIndex) {
        return super.getValueAt(rowIndex, columnIndex);
    }

    public boolean isCellEditable(int columnIndex, int rowIndex) {
        return super.isCellEditable(rowIndex, columnIndex);
    }

    public void setValueAt(Object aValue, int columnIndex, int rowIndex) {
        super.setValueAt(aValue, rowIndex, columnIndex);
    }
*/

    public boolean editColumnRow(int columnIndex, int rowIndex) {
        return super.editCellAt(rowIndex, columnIndex);
    }

    public boolean editColumnRow(int columnIndex, int rowIndex, EventObject e){
        return super.editCellAt(rowIndex, columnIndex, e);
    }


}  // End Of Class OldJTable
