/*
 * Importer.java
 *
 * Created on 7 de Abril de 2004, 10:56
 */

package siprp.importer;

import com.evolute.utils.*;
import com.evolute.utils.arrays.*;
import com.evolute.utils.tables.*;
import com.evolute.utils.ui.*;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

import jxl.*;

import siprp.*;

/**
 *
 * @author  psantos
 */
public class Importer extends CustomJDialog
{
	public static final int TYPE_ADMISSAO = 0;
	public static final int TYPE_DEMISSAO = 1;
	
	public static final String DATA_PREFIX = "Data ";
	
	public static final String NOME = "Nome do Funcion\u00e1rio";
	public static final String SEXO = "Sexo";
	public static final String NACIONALIDADE = "Nacionalidade";
	public static final String DATA_NASCIMENTO = DATA_PREFIX + "Nascimento";
	public static final String NUMERO_MECANOGRAFICO = "N\u00famero Mecanogr\u00e1fico";
	public static final String DATA_ADMISSAO = DATA_PREFIX + "Admiss\u00e3o";
	public static final String CATEGORIA = "Categoria";
	public static final String LOCAL_TRABALHO = "Local Trabalho";
	public static final String FUNCAO = "Fun\u00e7\u00e3o";
	public static final String DATA_ADMISSAO_FUNCAO = DATA_PREFIX + "Admiss\u00e3o na Fun\u00e7\u00e3o";
	public static final String DATA_DEMISSAO = DATA_PREFIX + "Demiss\u00e3o";
	
	private JPanel panel;
	private BaseTable table;
	private Excel2DArray e2da;
	private boolean canceled = false;
	private DataChooserWindow dcw;
	private Object vals[][];
	private int[] DEFAULT_SELECTION = new int[]{ 0, 2, 3, 1, -1, 4, 5, 7, 6, -1 };
	private int[] DEFAULT_SELECTION_DEMISSAO = new int[]{ 0, 1 };

	public static final String NAMES[] = new String[]{
			NOME,
			SEXO,
			NACIONALIDADE,
			DATA_NASCIMENTO,
			NUMERO_MECANOGRAFICO,
			DATA_ADMISSAO,
			CATEGORIA,
			LOCAL_TRABALHO,
			FUNCAO,
			DATA_ADMISSAO_FUNCAO
		};
	
	public static final String NAMES_DEMISSAO[] = new String[]{
			NOME,
			DATA_DEMISSAO
		};
	private final boolean multipleSelection;
	protected final int type;
	
	/** Creates a new instance of Importer */
	public Importer( JFrame modalFrame, String filename, boolean multiple, int type )
		throws Exception
	{
		super( modalFrame, true );
		multipleSelection = multiple;
		this.type = type;
		
		int []selection = ( int [] ) Singleton.getInstance( SingletonConstants.EXCEL_FORMAT );
		if( selection != null )
		{
			DEFAULT_SELECTION = selection;
		}
		int []selectionDemissao = ( int [] ) Singleton.getInstance( SingletonConstants.EXCEL_FORMAT_DEMISSAO );
		if( selectionDemissao != null )
		{
			DEFAULT_SELECTION_DEMISSAO = selectionDemissao;
		}
		setupComponents( filename );
		if( modalFrame == null )
		{
			center();
		}
		else
		{
			centerSuper();
		}
		setVisible( true );
	}

	private void setupComponents( String filename )
	{
		setSize( 800, 500 );

		GridBagLayout gblGridBag = new GridBagLayout();
		GridBagConstraints gbcConstraints = new GridBagConstraints();

		panel = ( JPanel ) getContentPane();

		panel.setLayout( gblGridBag );

		e2da = new Excel2DArray( filename );

		String colNames[] = new String[ e2da.rowLength() ];
		for( int i = 0; i < colNames.length; i++ )
		{
			colNames[ i ] = " ";
		}
		Virtual2DTableModel tm = new Virtual2DTableModel( colNames,  null );
		tm.setValues( e2da );
		table = new BaseTable( tm );
		int col = 0;
		switch( type )
		{
			case TYPE_ADMISSAO:
				col = DEFAULT_SELECTION[ 0 ];
				break;
				
			case TYPE_DEMISSAO:
				col = DEFAULT_SELECTION_DEMISSAO[ 0 ];
				break;
		}
		table.getColumn( col ).setWidth( 200 );
		if( !multipleSelection )
		{
			table.getSelectionModel().setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		}
		else
		{
			table.getSelectionModel().setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
		}
		table.getTableHeader().setResizingAllowed( true );
		table.getTableHeader().setReorderingAllowed( false );
	//	table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
	
		for( int i = 0; i < e2da.rowLength(); i++ )
		{
			table.getColumn( i ).setMinWidth( 50 );
			//table.getColumn( i ).setResizable( true );
		}

		JScrollPane sp = new JScrollPane( table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

		gbcConstraints.anchor = GridBagConstraints.CENTER;
		gbcConstraints.fill = GridBagConstraints.BOTH;
		gbcConstraints.insets = new Insets(5, 5, 5, 5);
		gbcConstraints.gridwidth = 3;
		gbcConstraints.gridheight = 3;
		gbcConstraints.weighty = 3;
		gbcConstraints.gridx = 0;
		gbcConstraints.gridy = 3;
		gblGridBag.setConstraints( sp, gbcConstraints );

		panel.add( sp );

		JPanel jpButtons = new JPanel();
		final JButton jbOK = new JButton( "Escolher" );
		jbOK.setEnabled( false );
		jpButtons.add( jbOK );
		JButton jbCancel = new JButton( "Cancelar" );
		jpButtons.add( jbCancel );

		gbcConstraints.gridheight = 1;
		gbcConstraints.weightx = 1;
		gbcConstraints.weighty = 0;
		gbcConstraints.anchor = GridBagConstraints.SOUTH;
		gbcConstraints.fill = GridBagConstraints.BOTH;
		gbcConstraints.insets = new Insets( 2, 2, 2, 2 );
		gbcConstraints.gridwidth = 3;
		gbcConstraints.gridx = 0;
		gbcConstraints.gridy = 6;
		gblGridBag.setConstraints( jpButtons, gbcConstraints );
		panel.add( jpButtons );
		
		table.addMouseListener( new MouseAdapter() {
			public void mouseClicked( MouseEvent e ) {
				jbOK.setEnabled( true );
				if( e.getButton() == MouseEvent.BUTTON1
					&& e.getClickCount() == 2
					&& table.columnAtPoint( e.getPoint() ) != -1
					&& table.rowAtPoint( e.getPoint() ) != -1 )
				{
					acceptResult();
				}
			}
			public void mousePressed( MouseEvent e ) {
				jbOK.setEnabled( true );
			}
		});

		jbOK.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent a ) {
				acceptResult();
			}
		});
		
		jbCancel.addActionListener( new ActionListener() {
			public void actionPerformed( ActionEvent a ) {
				setVisible( false );
				dispose();
				canceled = true;
			}
		});

	}

	private void acceptResult()
	{
		if( multipleSelection )
		{
			int rows[] = table.getSelectedRows();
			vals = new Object[ rows.length ][];
			for( int i = 0; i < rows.length; ++i )
			{
				Vector v = new Vector( Arrays.asList( e2da.getRow( rows[ i ] ) ) );
				v.add( "" );
				vals[ i ] = (Object[]) v.toArray( new Object[ v.size() ] );
			}
		}
		else
		{
			Vector v = new Vector( Arrays.asList( e2da.getRow( table.getSelectedRow() ) ) );
			v.add( "" );
			vals = new Object[][] { ( Object[] )v.toArray( new Object[ v.size() ] ) };
		}
		
/*
		System.out.println( "row: " + table.getSelectedRow() );
		System.out.print( "vals: " );
		for( int i = 0; i < vals.length; i++ )
		{
			System.out.print( "[" + vals[ i ] + "]" );
		}
		System.out.println();
*/
		setVisible( false );
		dispose();

	}

	public Hashtable getData()
	{
		if( NAMES == null || vals == null )
		{
			return null;
		}
		dcw = new DataChooserWindow( null, NAMES, vals, DEFAULT_SELECTION );

		if( canceled || ( dcw == null ) )
		{
			return null;
		}
		
		return dcw.getData();
	}

	public Hashtable[] getMultipleData()
	{
		switch( type )
		{
			case TYPE_ADMISSAO:
				if( NAMES == null || vals == null )
				{
					return null;
				}
				dcw = new DataChooserWindow( null, NAMES, vals, DEFAULT_SELECTION );
				break;
				
			case TYPE_DEMISSAO:
				if( NAMES_DEMISSAO == null || vals == null )
				{
					return null;
				}
				dcw = new DataChooserWindow( null, NAMES_DEMISSAO, vals, DEFAULT_SELECTION_DEMISSAO );
				break;
		}

		if( canceled || ( dcw == null ) )
		{
			return null;
		}
		
		return dcw.getMultipleData();
	}

	
	public static void main( String args[] )
	{
//		FileDialog fd = new FileDialog( null, "Escolha um ficheiro Excel:", FileDialog.LOAD );
//		fd.setDirectory( System.getProperty( "user.home" ) );
//		fd.setFilenameFilter( new FilenameFilter() {
//				public boolean accept( File dir, String name )
//				{
//					return (name!=null) && (name.indexOf( ".xls" ) != -1);
//				}
//			} );
//		fd.show();
		String filename = "c:\\teste_com_dados.xls";
		//String filename = fd.getFile();
		if( filename != null )
		{
			//filename = fd.getDirectory() + File.separator + filename;
			try
			{
				Importer importer = new Importer( null, filename, true, TYPE_ADMISSAO );
				Hashtable hash = importer.getData();
				if( hash != null )
				{
					System.out.println( "Data: " + hash );
				}
			}
			catch( Exception ex )
			{
				ex.printStackTrace();
				JOptionPane.showMessageDialog( null, "Erro a importar", "Erro...", JOptionPane.ERROR_MESSAGE );
			}
		}
//		Importer im = null;
//		try
//		{
//			im = new Importer( null,
//				"E:\\test.xls"
//				"C:\\Documents and Settings\\psantos\\My Documents\\Devel\\teste.xls"
//				"C:\\Documents and Settings\\psantos\\My Documents\\Devel\\Docs\\jexcelapi\\jxlrwtest.xls"
//				);
//
//System.out.println( "Escolhido: " + im.getData() );
//
//		}
//		catch( Exception e )
//		{
//			e.printStackTrace();
//		}

//		String[][] all =  (String[][]) e.getObjects();
//
//		for( int j = 0; j < e.rowLength(); j++ )
//		{
//			String[] r = e.getRow( j );
//			for( int i = 0; i < r.length; i++ )
//			{
//				System.out.print( "[" + r[ i ] + "]" );
//			}
//			System.out.println();
//		}
	}
}