package com.dassault.cecilia.plugin.faulttree.compute.pref;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.dassault.cecilia.core.swing.JOptionCecilia;
import com.dassault.cecilia.core.swing.other.Gbc;


import dassault.ocas.util.AltaUtil;

public class PrintExportMCSSynthesis extends PrintExportMCSAbstract {

  public static final String PREF_KEY = "Arbor.PrintExport.CutsSynthesis.";
	private static final String PREF_CODE = "<arborPrintExportCutsSynthesis ";

  public static final String PREF_FILTER_OCCURRENCES  = "Filter.Occurrences"; 
	
  protected JCheckBox _ck_filter;
  protected JTextField _tf_filter;

  public PrintExportMCSSynthesis() {
		super(ResCompute.getString(ResCompute.KEY_1074));
	}

  @Override
  protected JComponent makeContent() {
    _ck_filter = new JCheckBox(ResCompute.getString(ResCompute.KEY_1124) + " >= ");
    _tf_filter = new JTextField(5);
    
    return super.makeContent();
  }
  
  @Override
  protected void createContentPanel() {
    JPanel analysisPanel = new JPanel();
    {
      analysisPanel.setLayout(new GridBagLayout());
      analysisPanel.setBorder(BorderFactory.createTitledBorder(ResCompute.getString(ResCompute.KEY_0405)));
      analysisPanel.add(_analysis,         new Gbc(0, 0, 1, 1, 2, 2, 5, 10, 
          GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 0.5, 0.0));
      analysisPanel.add(_contentsTable,    new Gbc(1, 0, 1, 1, 2, 2, 10, 5, 
          GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, 0.5, 0.0));
    }
    
    JPanel filterPanel = new JPanel();
    {
      filterPanel.setLayout(new GridBagLayout());
      filterPanel.setBorder(BorderFactory.createTitledBorder(ResCompute.getString(ResCompute.KEY_0206)));
      filterPanel.add(_ck_filter, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 
          GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0));
      filterPanel.add(_tf_filter, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, 
          GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 5), 0, 0));
  
      _tf_filter.setEditable(false) ;
      _ck_filter.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent arg0) {
          _tf_filter.setEditable(_ck_filter.isSelected()) ; 
        }
      }) ;
      _tf_filter.addFocusListener(new FocusAdapter() {
        @Override
        public void focusLost(FocusEvent e) {
          String txt = _tf_filter.getText().trim();
          if (txt.length() == 0) {
            _ck_filter.setSelected(false);
            return;
          }
          try {
            double val = Double.parseDouble(_tf_filter.getText());
            if (val>=0 && val<=1) 
              return;
          } catch (NumberFormatException nfe) {}
          _tf_filter.requestFocus();
          JOptionPane.showMessageDialog(
              JOptionCecilia.getTopContainerOf(_tf_filter), 
              ResCompute.getString(ResCompute.KEY_0729), 
              ResCompute.getString(ResCompute.KEY_0217),
              JOptionPane.ERROR_MESSAGE);          
        }
      });
    }

    _prefsPanel = new JPanel();
    _prefsPanel.setLayout(new GridBagLayout());
    _prefsPanel.add(analysisPanel,  new Gbc(0, 0, 1, 1, 5, 2, 5, 5, 
        GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, 1.0, 0.0));
    _prefsPanel.add(filterPanel, new Gbc(0, 2, 1, 1, 2, 2, 5, 5, GridBagConstraints.CENTER,
        GridBagConstraints.HORIZONTAL, 1.0, 0.0));
    _prefsPanel.add(new JPanel(),   new Gbc(0, 3, 1, 1, 2, 5, 5, 5, 
        GridBagConstraints.CENTER, GridBagConstraints.BOTH, 1.0, 1.0));
  }

  @Override
  public JPanel getPanel() {
    return this;
  }

  @Override
	public String getKey() {
		return PREF_KEY;
	}
  
  @Override
  public String getCodeForLoadPreference() {
    return PREF_CODE;
  }
	
  @Override
	public void savePreferences(Appendable output) throws IOException {
    super.savePreferences(output);
    output.append(getCodeForLoadPreference()).append("key=\"").append(PREF_FILTER_OCCURRENCES).append("\"");
    output.append(" value=\"").append(Double.toString(getDoubleValue(PREF_FILTER_OCCURRENCES))).append("\" >\n");    
	}

	@Override
	public void loadPreference(String line) {
	  String key = AltaUtil.searchString(line, "key=");
		if (PREF_FILTER_OCCURRENCES.equals(key)) {
	    String value = AltaUtil.searchString(line, "value=");
	    if (value == null || value.length()==0) return;
      boolean appendValue = false;
      try {
        double dVal = Double.parseDouble(value);
        if (dVal>=0 && dVal<=1) {
          _ck_filter.setSelected(true);
          _tf_filter.setText(value);
          appendValue = true;
        }
      } catch (NumberFormatException nfe) {
      } catch (Exception exc) { 
        exc.printStackTrace();
      }
      if (!appendValue) {
        _ck_filter.setSelected(false);
        _tf_filter.setText("");
      }		  
		}
		else super.loadPreference(line);
	}

  @Override
  public double getDoubleValue(String key) {
    if (PREF_FILTER_OCCURRENCES.equals(key)) {
      if (_ck_filter.isSelected()) {
        try {
          String txt = _tf_filter.getText();
          double value = Double.parseDouble(txt);
          if (value>=0 && value<=1) 
            return value;
        } catch (NumberFormatException nfe) {
        } catch (Exception exc) { 
          exc.printStackTrace();
        }
      }
      return -1;
    }
    return Double.NaN;
  }
}

