// DateTimeChooserEditor.java
//
// Created: February 2006
//
// This file is a component of the BioMoby project.
// Copyright Martin Senger (martin.senger@gmail.com).
//

package org.biomoby.service.dashboard.chooser;

import org.biomoby.shared.datatypes.MobyDateTime;

import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang.time.DateFormatUtils;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.AbstractCellEditor;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Component;

import java.util.Date;

/**
 * A cell editor that invokes {@link DateTimeChooser} to get a
 * calendar GUI. The editor is supposed to be used for editing cells
 * in JTable, and it complies with the Biomoby specification for
 * date-time formats. <p>
 *
 * @author <A HREF="mailto:martin.senger@gmail.com">Martin Senger</A>
 * @version $Id: DateTimeChooserEditor.java,v 1.2 2007/05/21 00:56:15 senger Exp $
 */

public class DateTimeChooserEditor
    extends AbstractCellEditor
    implements TableCellEditor {

    private JButton delegate = new JButton();

    public DateTimeChooserEditor() {
	delegate.addActionListener (new ActionListener() {
		public void actionPerformed (ActionEvent actionEvent) {
		    Date initialDate = null;
		    try {
			String value = (String)DateTimeChooserEditor.this.getCellEditorValue();
			initialDate = DateUtils.parseDate (value,
							   MobyDateTime.ALLOWED_FORMATS);
		    } catch (Exception e) {
		    }
		    
		    DateTimeChooser chooser = new DateTimeChooser (initialDate);
		    chooser.setPreviewPanel (new PreviewPanel (chooser));
		    Date date = DateTimeChooser.showDialog (delegate,
							    "Date-Time Chooser",
							    chooser);
		    if (date == null) {
			delegate.setText ("");
		    } else {
			delegate.setText (DateFormatUtils.format (date,
								  MobyDateTime.FULL_FORMAT));
		    }
		    fireEditingStopped();
		}
	    });
    }

    public Object getCellEditorValue() {
	return delegate.getText();
    }

    public Component getTableCellEditorComponent (JTable table,
						  Object value,
						  boolean isSelected,
						  int row, int column) {
	if (value == null)
	    delegate.setText ("");
	else
	    delegate.setText (value.toString());
	return delegate;
    }


    class PreviewPanel
	extends JPanel
	implements ChangeListener {

	private JLabel preview = new JLabel ("");
	private DateTimeChooser chooser;

	public PreviewPanel (DateTimeChooser chooser) {
	    this.chooser = chooser;
	    preview.setText (formatDate());
	    chooser.addChangeListener (this);
	    add (preview);
	}

	protected String formatDate() {
	    Date date = chooser.getDate();
	    return DateFormatUtils.format (date, MobyDateTime.FULL_FORMAT);
	}

	public void stateChanged (ChangeEvent evt) {
	    preview.setText (formatDate());
	}
    }
}

