package com.actelion.research.gui.swing;

import com.actelion.research.chem.SmilesParser;
import com.actelion.research.chem.StereoMolecule;
import com.actelion.research.gui.editor.GenericEditorArea;
import com.actelion.research.gui.editor.SwingEditorArea;
import com.actelion.research.gui.editor.SwingEditorPanel;
import com.actelion.research.gui.generic.*;
import com.actelion.research.gui.hidpi.HiDPIHelper;
import info.clearthought.layout.TableLayout;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SwingDialog extends JDialog implements ActionListener,GenericDialog {
	private Component mParent;
	private JPanel  mContent;
	private GenericEventListener<GenericActionEvent> mConsumer;

	public SwingDialog(Frame parent, String title) {
		super(parent, title, true);
		mParent = parent;
		}

	public SwingDialog(Dialog parent, String title) {
		super(parent, title, true);
		mParent = parent;
		}

	@Override
	public void setEventConsumer(GenericEventListener<GenericActionEvent> consumer) {
		mConsumer = consumer;
	}

	@Override
	public void setLayout(int[] hLayout, int[] vLayout) {
		double[][] size = new double[2][];
		size[0] = new double[hLayout.length];
		size[1] = new double[vLayout.length];
		for (int i=0; i<hLayout.length; i++)
			size[0][i] = (hLayout[i] > 0) ? HiDPIHelper.scale(hLayout[i]) : hLayout[i];
		for (int i=0; i<vLayout.length; i++)
			size[1][i] = (vLayout[i] > 0) ? HiDPIHelper.scale(vLayout[i]) : vLayout[i];

		mContent = new JPanel();
		mContent.setLayout(new TableLayout(size));
		}

	@Override
	public void add(GenericComponent c, int x, int y) {
		mContent.add(((SwingComponent)c).getComponent(), x+","+y);
	}

	@Override
	public void add(GenericComponent c, int x1, int y1, int x2, int y2) {
		mContent.add(((SwingComponent)c).getComponent(), x1+","+y1+","+x2+","+y2);
	}

	@Override
	public void showDialog(GenericDialogCallback cb) {
		JPanel buttonpanel = new JPanel();
		int gap = HiDPIHelper.scale(8);
		buttonpanel.setBorder(BorderFactory.createEmptyBorder(gap*3/2, gap, gap, gap));
		buttonpanel.setLayout(new BorderLayout());
		JPanel ibp = new JPanel();
		ibp.setLayout(new GridLayout(1, 2, gap, 0));
		JButton bcancel = new JButton("Cancel");
		bcancel.addActionListener(this);
		ibp.add(bcancel);
		JButton bok = new JButton("OK");
		bok.addActionListener(this);
		ibp.add(bok);
		buttonpanel.add(ibp, BorderLayout.EAST);

		getContentPane().add(mContent, BorderLayout.CENTER);
		getContentPane().add(buttonpanel, BorderLayout.SOUTH);
		getRootPane().setDefaultButton(bok);

		pack();
		setLocationRelativeTo(mParent);
		setVisible(true);
		cb.onClose();
		}

	@Override
	public void disposeDialog() {
		dispose();
		}

	@Override
	public void actionPerformed(ActionEvent e) {
		if ("OK".equals(e.getActionCommand()))
			mConsumer.eventHappened(new GenericActionEvent(this, GenericActionEvent.WHAT_OK, 0));
		else if ("Cancel".equals(e.getActionCommand()))
			mConsumer.eventHappened(new GenericActionEvent(this, GenericActionEvent.WHAT_CANCEL, 0));
		}

	@Override
	public void showMessage(String message) {
		JOptionPane.showMessageDialog(mParent, message);
		}

	@Override
	public GenericLabel createLabel(String text) {
		return new SwingLabel(text);
		}

	@Override
	public GenericTextField createTextField(int width, int height) {
		return new SwingTextField(width, height);
	}

	@Override
	public GenericCheckBox createCheckBox(String text) {
		return new SwingCheckBox(text);
	}

	@Override
	public GenericComboBox createComboBox() {
		return new SwingComboBox();
	}
	
	public static void main(String[] args) {
		String smiles = JOptionPane.showInputDialog("enter a SMILES",
				"CN1CC[C@@]23[C@H]4OC5=C(O)C=CC(=C25)C[C@@H]1[C@@H]3C=C[C@@H]4O");
		StereoMolecule mol = new SmilesParser().parseMolecule(smiles);
		SwingEditorPanel p = new SwingEditorPanel(mol);
		p.setSize(new Dimension(500, 500));
		int mode = 0;
		SwingEditorArea area = (SwingEditorArea) p.getComponent(0);
		GenericEditorArea drawing = area.getGenericDrawArea();
		drawing.setDisplayMode(mode);
		JFrame d = new JFrame("OCLFrame");
		d.setSize(new Dimension(500, 500));
		d.add(p);
		d.setVisible(true);
	}
	
	}
