/**
 *
 */
package net.sf.taverna.t2.workbench.ui.servicepanel;

import static java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType;
import static javax.swing.SwingUtilities.invokeLater;

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.TransferHandler;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;

import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
import net.sf.taverna.t2.ui.menu.MenuManager;
import net.sf.taverna.t2.workbench.edits.EditManager;
import net.sf.taverna.t2.workbench.selection.SelectionManager;
import net.sf.taverna.t2.workbench.ui.servicepanel.menu.AddServiceProviderMenu;
import net.sf.taverna.t2.workbench.ui.servicepanel.tree.Filter;
import net.sf.taverna.t2.workbench.ui.servicepanel.tree.FilterTreeModel;
import net.sf.taverna.t2.workbench.ui.servicepanel.tree.FilterTreeNode;
import net.sf.taverna.t2.workbench.ui.servicepanel.tree.TreePanel;

import org.apache.log4j.Logger;

import uk.org.taverna.commons.services.ServiceRegistry;

public class ServiceTreePanel extends TreePanel {
	private static final long serialVersionUID = 6611462684296693909L;
	private static Logger logger = Logger.getLogger(ServiceTreePanel.class);

	private final ServiceDescriptionRegistry serviceDescriptionRegistry;
	private final EditManager editManager;
	private final MenuManager menuManager;
	private final SelectionManager selectionManager;
	private final ServiceRegistry serviceRegistry;

	public ServiceTreePanel(FilterTreeModel treeModel,
			ServiceDescriptionRegistry serviceDescriptionRegistry, EditManager editManager,
			MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
		super(treeModel);
		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
		this.editManager = editManager;
		this.menuManager = menuManager;
		this.selectionManager = selectionManager;
		this.serviceRegistry = serviceRegistry;
		initialize();
	}

	@Override
	protected void initialize() {
		super.initialize();
		tree.setDragEnabled(true);
		tree.setTransferHandler(new ServiceTransferHandler());
		tree.addTreeWillExpandListener(new AvoidRootCollapse());
		tree.expandRow(0);

		invokeLater(new Runnable() {
			@Override
			public void run() {
				tree.addMouseListener(new ServiceTreeClickListener(tree,
						ServiceTreePanel.this, serviceDescriptionRegistry,
						editManager, menuManager, selectionManager,
						serviceRegistry));
			}
		});
	}

	@Override
	protected Component createExtraComponent() {
		JComponent buttonPanel = new JPanel(new FlowLayout());
		buttonPanel.add(new AddServiceProviderMenu(serviceDescriptionRegistry));
		// buttonPanel.add(new JButton(new RefreshProviderRegistryAction()));
		return buttonPanel;
	}

	@Override
	public Filter createFilter(String text) {
		return new ServiceFilter(text, filterTreeModel.getRoot());
	}

	@Override
	protected TreeCellRenderer createCellRenderer() {
		return new ServiceTreeCellRenderer();
	}

	public static class AvoidRootCollapse implements TreeWillExpandListener {
		@Override
		public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
			if (event.getPath().getPathCount() == 1)
				throw new ExpandVetoException(event, "Can't collapse root");
		}

		@Override
		public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
		}
	}

	private final class ServiceTransferHandler extends TransferHandler {
		private static final long serialVersionUID = 4347965626386951176L;

		/**
		 * Triggered when a node ie. an {@link ActivityItem} is dragged out of
		 * the tree. Figures out what node it is being dragged and then starts a
		 * drag action with it
		 */
		@Override
		protected Transferable createTransferable(JComponent c) {
			TreePath selectionPath = tree.getSelectionPath();
			if (selectionPath == null)
				return null;
			FilterTreeNode lastPathComponent = (FilterTreeNode) selectionPath
					.getLastPathComponent();
			if (!(lastPathComponent.getUserObject() instanceof ServiceDescription))
				return null;
			final ServiceDescription serviceDescription = (ServiceDescription) lastPathComponent
					.getUserObject();

			return new Transferable() {
				@Override
				public Object getTransferData(DataFlavor flavor)
						throws UnsupportedFlavorException, IOException {
					return serviceDescription;
				}

				@Override
				public DataFlavor[] getTransferDataFlavors() {
					DataFlavor[] flavors = new DataFlavor[1];
					try {
						flavors[0] = getFlavorForClass(ServiceDescription.class);
					} catch (ClassNotFoundException e) {
						logger.error("Error casting Dataflavor", e);
						flavors[0] = null;
					}
					return flavors;
				}

				@Override
				public boolean isDataFlavorSupported(DataFlavor flavor) {
					DataFlavor thisFlavor = null;
					try {
						thisFlavor = getFlavorForClass(ServiceDescription.class);
					} catch (ClassNotFoundException e) {
						logger.error("Error casting Dataflavor", e);
					}
					return flavor.equals(thisFlavor);
				}
			};
		}

		@Override
		public int getSourceActions(JComponent c) {
			return COPY_OR_MOVE;
		}
	}

	private DataFlavor getFlavorForClass(Class<?> clazz)
			throws ClassNotFoundException {
		String name = clazz.getName();
		return new DataFlavor(javaJVMLocalObjectMimeType + ";class=" + clazz,
				name.substring(name.lastIndexOf('.') + 1),
				clazz.getClassLoader());
	}
}
