package org.atdl4j.ui.swing.widget;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.atdl4j.ui.impl.ControlHelper;
import org.atdl4j.ui.swing.SwingListener;

public class SwingTextFieldWidget
		extends AbstractSwingWidget<String>
{
	private JFormattedTextField textField;
	private JLabel label;
	private JPanel wrapper;

	public void createWidget(JPanel parent)
	{
		// tooltip
		String tooltip = control.getTooltip();
		
		// label		
		if ( control.getLabel() != null ) {
			label = new JLabel();
			label.setName(getName()+"/label");
			label.setText(control.getLabel());
			if ( tooltip != null ) label.setToolTipText( tooltip );
		}
				
		// textField
		textField = new JFormattedTextField();
		textField.setName(getName()+"/text");
		
		// init value
		if ( ControlHelper.getInitValue( control, getAtdl4jOptions() ) != null )
			textField.setText( (String) ControlHelper.getInitValue( control, getAtdl4jOptions() ) );

		// tooltip
		if (tooltip != null) textField.setToolTipText(tooltip);

		if (label != null){
			wrapper = new JPanel(new GridBagLayout());
			GridBagConstraints c = new GridBagConstraints();
			c.fill = GridBagConstraints.HORIZONTAL;
	    c.gridx = 0;
	    c.gridy = 0;   
	    c.gridwidth = 1;
	    c.weightx = 1.0;
	    c.weighty = 1.0;
	    c.insets = new Insets(0, 0, 0, 0);
	    wrapper.add( label, c);
			c.gridx = 1;
	    c.gridy = 0;
	    c.insets = new Insets(0, 0, 0, 0);
	    wrapper.add( textField, c);
			parent.add(wrapper);
		}
		else {
			parent.add(textField);
		}

		textField.setPreferredSize(new Dimension(100, textField.getPreferredSize().height));
		textField.revalidate();
	}


	
	public void setVisible(boolean visible){
		if (wrapper != null)
			wrapper.setVisible(visible);
		else 
			super.setVisible(visible);
	}
	
	public String getControlValueRaw()
	{
		String value = textField.getText();

		if ( "".equals( value ) )
		{
			return null;
		}
		else
		{
			return value;
		}
	}

	public void setValue(String value)
	{
		textField.setText( ( value == null ) ? "" : value.toString() );
	}
	
	public List<Component> getComponents() {
		List<Component> widgets = new ArrayList<Component>();
		if (label != null) widgets.add(label);
		widgets.add(textField);
		return widgets;
	}

	public List<Component> getComponentsExcludingLabel() {
		List<Component> widgets = new ArrayList<Component>();
		widgets.add(textField);
		return widgets;
	}	
	
	public void addListener(SwingListener listener) {
		textField.getDocument().addDocumentListener(listener);
	}

	public void removeListener(SwingListener listener) {
	   textField.getDocument().removeDocumentListener(listener);
	}

	/**
	 * Overridden -- makes the textField appear non-editable vs. the default of disabled.
	 */
	public void processConstValueHasBeenSet()
	{
		textField.setEditable( false );
	}

	/* 
	 * 
	 */
	protected void processNullValueIndicatorChange(Boolean aOldNullValueInd, Boolean aNewNullValueInd)
	{
		if ( Boolean.FALSE.equals( aNewNullValueInd ) )
		{
			textField.setText( "" );
		}
	}

	/* (non-Javadoc)
	 * @see org.atdl4j.ui.ControlUI#reinit()
	 */
	@Override
	public void processReinit( Object aControlInitValue )
	{
		if ( ( textField != null ) )
		{
			textField.setText( (aControlInitValue != null ) ? (String) aControlInitValue : "" );
		}
	}
	
	
	@Override
	public List< ? extends Component> createBrickComponents() {
	  
	  List<Component> components = new ArrayList<Component>();
	  
	// tooltip
      String tooltip = control.getTooltip();
      
      // label        
      if ( control.getLabel() != null ) {
          label = new JLabel();
          label.setName(getName()+"/label");
          label.setText(control.getLabel());
          if ( tooltip != null ) label.setToolTipText( tooltip );
      }
              
      // textField
      textField = new JFormattedTextField();
      textField.setName(getName()+"/text");
      
      // init value
      if ( ControlHelper.getInitValue( control, getAtdl4jOptions() ) != null )
          textField.setText( (String) ControlHelper.getInitValue( control, getAtdl4jOptions() ) );

      // tooltip
      if (tooltip != null) textField.setToolTipText(tooltip);

      if (label != null){
        components.add( label);
      }
      components.add( textField);

      textField.setPreferredSize(new Dimension(100, textField.getPreferredSize().height));
      
	  return components;
	}
}