blob: ce3e336dea97b5e964c441910a6eb6c0d274414f [file] [log] [blame]
/**
*
*/
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());
}
}