/* ***************************************************************************** * Copyright (c) 2009 Ola Spjuth. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ola Spjuth - initial API and implementation ******************************************************************************/ package net.bioclipse.balloon.handlers; import java.util.ArrayList; import java.util.List; import net.bioclipse.balloon.business.Activator; import net.bioclipse.balloon.business.IBalloonManager; import net.bioclipse.balloon.ui.BalloonDialog; import net.bioclipse.core.business.BioclipseException; import org.apache.log4j.Logger; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.handlers.HandlerUtil; public class BalloonConformerHandler extends AbstractHandler{ private static final Logger logger = Logger.getLogger(BalloonConformerHandler.class); public Object execute( ExecutionEvent event ) throws ExecutionException { ISelection sel = HandlerUtil.getCurrentSelection( event ); if (sel==null) return null; if (!( sel instanceof StructuredSelection )) return null; IStructuredSelection ssel = (IStructuredSelection)sel; //We operate on files and IMolecules List<String> filenames=new ArrayList<String>(); List<IResource> foldersToRefresh=new ArrayList<IResource>(); //Collect files for (Object obj : ssel.toList()){ if ( obj instanceof IFile ) { IFile file = (IFile) obj; // filenames.add( file.getRawLocation().toOSString() ); filenames.add( file.getFullPath().toOSString() ); foldersToRefresh.add( file.getParent() ); } } logger.debug( "Balloon selection contained: " + filenames.size() + " files." ); if (filenames.size()<=0) return null; BalloonDialog dlg = new BalloonDialog(HandlerUtil.getActiveShell( event )); int ret=dlg.open(); if (ret==Window.CANCEL) return null; final int numconf=dlg.getNumConformers(); logger.debug("User selected: " + numconf + " confomers."); final List<String> final_fnames = filenames; final List<IResource> final_foldersToRefresh = foldersToRefresh; //Set up a job Job job = new Job("Ballon 3D conformer generation") { protected IStatus run(IProgressMonitor monitor) { monitor.beginTask( "Running Balloon 3D conformer generation: " + numconf + " conformers for " + final_fnames + " files", 2 ); monitor.worked( 1 ); //Run balloon on the files IBalloonManager balloon = Activator.getDefault().getJavaBalloonManager(); List<String> ret=null; try { ret = balloon.generate3Dconformations( final_fnames, numconf); } catch ( BioclipseException e ) { logger.error("Balloon failed: " + e.getMessage()); return new Status(IStatus.ERROR,Activator.PLUGIN_ID,"Balloon failed: " + e.getMessage()); } if (ret==null){ logger.error( "Balloon failed: " + ret ); return new Status(IStatus.ERROR,Activator.PLUGIN_ID,"Balloon failed."); } for (String r : ret){ logger.debug( "Balloon wrote output file: " + r ); } //Refresh folders in UI thread Display.getDefault().syncExec( new Runnable(){ public void run() { for (IResource res : final_foldersToRefresh){ try { res.refreshLocal( IResource.DEPTH_ONE, new NullProgressMonitor() ); } catch ( CoreException e ) { logger.error( "Could not refresh resource: " + res + " - " + e.getMessage() ); } } } }); monitor.done(); return Status.OK_STATUS; } }; job.setPriority(Job.LONG); job.setUser( true ); job.schedule(); // start as soon as possible return null; } }