/*
 * Created on 17/02/2004
 *
 */
package com.quantum.extensions;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;

import javax.xml.parsers.ParserConfigurationException;

import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.SelectionListenerAction;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.quantum.Messages;
import com.quantum.QuantumPlugin;
import com.quantum.model.xml.ModelToXMLConverter;
import com.quantum.sql.TableRow;
import com.quantum.sql.metadata.MetaDataXMLInterface;
import com.quantum.util.xml.XMLHelper;
import com.quantum.view.bookmark.BookmarkView;
import com.quantum.view.bookmark.EntityNode;
import com.quantum.view.bookmark.TreeNode;
import com.quantum.view.tableview.TableView;

/**
 * @author panic
 *
 * Defines an Action Class to implement extension Actions. 
 * An external plug-in that wants to extend quantum will 
 * generate one ExtensionAction object for each action it
 * wants to perform.
 */
public class ExtensionAction extends SelectionListenerAction {
	private IViewPart view;
	private IQuantumExtension extension;
	private TableRow tableRow;
	
	public ExtensionAction(IViewPart view, String label, String toolTip, IQuantumExtension extension) {
		super(label);
		this.view = view;
		this.extension = extension;

		setText(label);
		setToolTipText(toolTip); //$NON-NLS-1$
		tableRow = null;
	}
	
	public void run() {
		if (extension instanceof IMetadataExtension &&	view instanceof BookmarkView)
			runMetadataExtension();
		else if (extension instanceof IDataExtension &&	view instanceof TableView)
			runDataExtension();
	}

	/**
	 * 
	 */
	private void runDataExtension() {
		IDataExtension dataExtension = (IDataExtension) extension;
		if (tableRow == null) return;
		Document doc;
		try {
			doc = XMLHelper.createEmptyDocument();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			return;
		}
		Element root = (Element) doc.appendChild(doc.createElement(Messages.getString("ExportXMLAction.Metadata"))); //$NON-NLS-1$
		MetaDataXMLInterface.createElementText(root, Messages.getString("ExportXMLAction.Author"), //$NON-NLS-1$
									Messages.getString("ExportXMLAction.Quantum")); //$NON-NLS-1$
		MetaDataXMLInterface.createElementText(root, Messages.getString("ExportXMLAction.Version"), //$NON-NLS-1$
									Messages.getString("ExportXMLAction.XMLVersionNumber")); //$NON-NLS-1$
		ModelToXMLConverter.getInstance().convert(root, tableRow.getEntity() );                  
		MetaDataXMLInterface.stringMatrixToXML(tableRow.getRowTableData(), doc, root, "DataRow"); //$NON-NLS-1$

		dataExtension.run(doc);
	}

	private void runMetadataExtension() {
		IMetadataExtension metadataExtension = (IMetadataExtension) extension;
		BookmarkView bookmarkView = (BookmarkView) view;
		StructuredSelection selection = bookmarkView.getSelection();
		if (selection == null) return;
		Document doc;
		try {
			doc = XMLHelper.createEmptyDocument();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return;
		}
		Element root = (Element) doc.appendChild(doc.createElement(Messages.getString("ExportXMLAction.Metadata"))); //$NON-NLS-1$
		MetaDataXMLInterface.createElementText(root, Messages.getString("ExportXMLAction.Author"), //$NON-NLS-1$
									Messages.getString("ExportXMLAction.Quantum")); //$NON-NLS-1$
		MetaDataXMLInterface.createElementText(root, Messages.getString("ExportXMLAction.Version"), //$NON-NLS-1$
									Messages.getString("ExportXMLAction.XMLVersionNumber")); //$NON-NLS-1$
		Iterator iter = selection.iterator();
		while (iter.hasNext()) {
			TreeNode current = (TreeNode) iter.next();
			EntityNode entityNode = (EntityNode) current;
			ModelToXMLConverter.getInstance().convert(root, entityNode.getEntity() );                  
		}
		
		StringWriter text = new StringWriter();
		try {
			XMLHelper.write(text, doc);
		} catch (IOException e) {
			e.printStackTrace();
		}
		String textXml = new String(text.getBuffer());
		QuantumPlugin.getDefault().getSysClip().setContents(
			new Object[] { textXml },
			new Transfer[] { TextTransfer.getInstance()});
		
		metadataExtension.run(doc);
	}

	/**
	 * @param row
	 */
	public void addRowData(TableRow row) {
		tableRow = row;
	}

}