/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* 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:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.jdt.ui.internal.actions;
import java.io.File;
import java.net.URL;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionDelegate;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.ArtifactKey;
import org.eclipse.m2e.core.embedder.IMaven;
import org.eclipse.m2e.core.ui.internal.actions.SelectionUtil;
import org.eclipse.m2e.jdt.internal.Messages;
/**
* Open JavaDoc action
*
* @author Eugene Kuleshov
*/
public class OpenJavaDocAction extends ActionDelegate {
private static final Logger log = LoggerFactory.getLogger(OpenJavaDocAction.class);
public static final String ID = "org.eclipse.m2e.openJavaDocAction"; //$NON-NLS-1$
private IStructuredSelection selection;
public void selectionChanged(IAction action, ISelection selection) {
if(selection instanceof IStructuredSelection) {
this.selection = (IStructuredSelection) selection;
} else {
this.selection = null;
}
}
public void run(IAction action) {
if(selection != null) {
try {
final ArtifactKey ak = SelectionUtil.getArtifactKey(this.selection.getFirstElement());
if(ak == null) {
openDialog(Messages.OpenJavaDocAction_message1);
return;
}
new Job(NLS.bind(Messages.OpenJavaDocAction_job_open_javadoc, ak)) {
protected IStatus run(IProgressMonitor monitor) {
openJavaDoc(ak.getGroupId(), ak.getArtifactId(), ak.getVersion(), monitor);
return Status.OK_STATUS;
}
}.schedule();
} catch(CoreException ex) {
log.error(ex.getMessage(), ex);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation(Display.getDefault().getActiveShell(), //
Messages.OpenJavaDocAction_error_title, Messages.OpenJavaDocAction_error_message);
}
});
}
}
}
protected void openJavaDoc(String groupId, String artifactId, String version, IProgressMonitor monitor) {
final String name = groupId + ":" + artifactId + ":" + version + ":javadoc"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
try {
IMaven maven = MavenPlugin.getMaven();
List<ArtifactRepository> artifactRepositories = maven.getArtifactRepositories();
Artifact artifact = maven.resolve(groupId, artifactId, version,
"javadoc", "javadoc", artifactRepositories, monitor); //$NON-NLS-1$ //$NON-NLS-2$
final File file = artifact.getFile();
if(file == null) {
openDialog(NLS.bind(Messages.OpenJavaDocAction_error_download, name));
return;
}
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
try {
String url = "jar:" + file.toURI().toString() + "!/index.html"; //$NON-NLS-1$ //$NON-NLS-2$
URL helpUrl = PlatformUI.getWorkbench().getHelpSystem().resolve(url, true);
IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
IWebBrowser browser = browserSupport.createBrowser(IWorkbenchBrowserSupport.NAVIGATION_BAR, //
name, name, name);
browser.openURL(helpUrl);
} catch(PartInitException ex) {
log.error(ex.getMessage(), ex);
}
}
});
} catch(CoreException ex) {
log.error("Can't download JavaDoc for " + name, ex);
openDialog(NLS.bind(Messages.OpenJavaDocAction_error_download, name));
// TODO search index and offer to select other version
}
}
private static void openDialog(final String msg) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation(Display.getDefault().getActiveShell(), //
Messages.OpenJavaDocAction_info_title, msg);
}
});
}
}