| /** |
| * |
| */ |
| 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()); |
| } |
| } |