/** * Copyright (c) 2012 by JP Moresmau * This code is made available under the terms of the Eclipse Public License, * version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html */ package net.sf.eclipsefp.haskell.ui.wizards.cabal; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import net.sf.eclipsefp.haskell.browser.BrowserPlugin; import net.sf.eclipsefp.haskell.core.cabal.CabalImplementationManager; import net.sf.eclipsefp.haskell.core.util.ResourceUtil; import net.sf.eclipsefp.haskell.debug.core.internal.launch.AbstractHaskellLaunchDelegate; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.backend.BackendManager; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; /** * this wizard run cabal haddock on all selected projects, with options * @author JP Moresmau * */ public class CabalHaddockWizard extends Wizard implements IExportWizard { private final Set<IProject> projects=new LinkedHashSet<>(); private CabalHaddockOptionsPage optionsPage; /** * */ public CabalHaddockWizard() { setDialogSettings( HaskellUIPlugin.getDefault().getDialogSettings() ); setWindowTitle( Platform.getResourceBundle( Platform.getBundle( HaskellUIPlugin.getPluginId() )).getString( "cabalHaddockWizard.name" )); } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) */ @Override public void init( final IWorkbench arg0, final IStructuredSelection arg1 ) { projects.addAll( ResourceUtil.getProjects( arg1 ) ); } /* (non-Javadoc) * @see org.eclipse.jface.wizard.Wizard#addPages() */ @Override public void addPages() { optionsPage=new CabalHaddockOptionsPage(projects); addPage(optionsPage); } /* (non-Javadoc) * @see org.eclipse.jface.wizard.Wizard#performFinish() */ @Override public boolean performFinish() { final String cabalExecutable=CabalImplementationManager.getCabalExecutable(); if (cabalExecutable!=null){ final List<String> commands = new ArrayList<>(); commands.add( cabalExecutable ); commands.add("haddock"); // options commands.add("--builddir="+optionsPage.getFolder()); if (CabalHaddockOptionsPage.isDoHoogle()){ commands.add("--hoogle"); } if (CabalHaddockOptionsPage.isDoExecutables()){ commands.add("--executables"); } if (CabalHaddockOptionsPage.isDoInternal()){ commands.add("--internal"); } if (CabalHaddockOptionsPage.isDoHtml() && CabalHaddockOptionsPage.getHtml().length()>0){ commands.add("--html-location="+CabalHaddockOptionsPage.getHtml()); } if (CabalHaddockOptionsPage.isDoCss() && CabalHaddockOptionsPage.getCss().length()>0){ commands.add("--css="+CabalHaddockOptionsPage.getCss()); } if (CabalHaddockOptionsPage.isDoColourSrc()){ commands.add("--hyperlink-source"); if (CabalHaddockOptionsPage.isDoColourSrcCss() && CabalHaddockOptionsPage.getColourSrcCss().length()>0){ commands.add("--hscolour-css="+CabalHaddockOptionsPage.getColourSrcCss()); } } final String fold= optionsPage.getFolder(); for (final IProject p:projects){ Runnable r=new Runnable() { @Override public void run() { IFolder f=p.getFolder(fold ); if (f!=null){ // refresh folder try { f.refreshLocal( IResource.DEPTH_INFINITE, new NullProgressMonitor() ); } catch ( CoreException ce ) { HaskellUIPlugin.log( ce ); } // open library doc first IFile idx=f.getFile("doc/html/"+ p.getName()+"/index.html" ); if (idx!=null && idx.exists()){ try { PlatformUI.getWorkbench().getBrowserSupport().createBrowser(p.getName() ).openURL( idx.getLocationURI().toURL() ); } catch ( Exception ce ) { HaskellUIPlugin.log( ce ); } } if (CabalHaddockOptionsPage.isDoHoogle()){ IFile txt=f.getFile("doc/html/"+ p.getName()+"/"+ p.getName()+".txt" ); if (txt.exists() && BackendManager.getCabalImplDetails().isSandboxed() && BackendManager.getCabalImplDetails().isUniqueSandbox()){ BrowserPlugin.addToHoogle( txt.getLocation().toFile() ); } } } } }; try { AbstractHaskellLaunchDelegate.runInConsole(p, commands, new File(p.getLocation().toOSString()), NLS.bind( UITexts.exportDoc_job, p.getName() ),false ,r); } catch (Exception ioe){ HaskellUIPlugin.log(ioe); final IStatus st=new Status( IStatus.ERROR, HaskellUIPlugin.getPluginId(),ioe.getLocalizedMessage(),ioe); ErrorDialog.openError( getShell(), UITexts.exportDoc_error, UITexts.exportDoc_error_text, st); } } } return true; } }