/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.browser.views.packages; import net.sf.eclipsefp.haskell.browser.BrowserEvent; import net.sf.eclipsefp.haskell.browser.BrowserPlugin; import net.sf.eclipsefp.haskell.browser.DatabaseLoadedEvent; import net.sf.eclipsefp.haskell.browser.IDatabaseLoadedListener; import net.sf.eclipsefp.haskell.browser.util.HtmlUtil; import net.sf.eclipsefp.haskell.browser.views.SingleObjectProvider; import net.sf.eclipsefp.haskell.browser.views.NoDatabaseLabelProvider; import net.sf.eclipsefp.haskell.browser.views.SpecialRoot; import net.sf.eclipsefp.haskell.ui.handlers.OpenDefinitionHandler; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.part.ViewPart; /** * View part for the 'packages' in the Browser. * @author Alejandro Serrano * */ public class PackagesView extends ViewPart implements IDatabaseLoadedListener, ISelectionChangedListener, IDoubleClickListener { /** * The ID of the view as specified by the extension. */ public static final String ID = "net.sf.eclipsefp.haskell.browser.views.packages.PackagesView"; TreeViewer viewer; Browser doc; IContentProvider provider; private String delayedSelect=null; @Override public void createPartControl( final Composite parent ) { SashForm form = new SashForm( parent, SWT.VERTICAL ); viewer = new TreeViewer( form ); doc = new Browser( form, SWT.NONE ); doc.setFont( viewer.getControl().getFont() ); form.setWeights( new int[] { 75, 25 } ); // Set database if (BrowserPlugin.getDefault().isAnyDatabaseLoaded()) { databaseLoaded( null ); } else { databaseUnloaded( null ); } // Hook for listeners BrowserPlugin.getDefault().addDatabaseLoadedListener( this ); // Hook for changes in selection viewer.addPostSelectionChangedListener( this ); // Hook for double clicking viewer.addDoubleClickListener( this ); // Register as selection provider getSite().setSelectionProvider( viewer ); } @Override public void setFocus() { viewer.getControl().setFocus(); } @Override public void databaseLoaded( final DatabaseLoadedEvent e ) { Display.getDefault().asyncExec( new Runnable() { @Override public void run() { // Set real content provider PackagesContentProvider daProvider = new PackagesContentProvider(); provider = daProvider; viewer.setContentProvider( provider ); viewer.setLabelProvider( new PackagesLabelProvider() ); viewer.setSorter( new PackagesSorter() ); // Refresh with the items viewer.setInput( PackagesRoot.ROOT ); // Use the new provider daProvider.uncache(); viewer.refresh(); if (delayedSelect!=null){ String sel=delayedSelect; delayedSelect=null; select( sel ); } } } ); } @Override public void databaseUnloaded( final BrowserEvent e ) { Display.getDefault().asyncExec( new Runnable() { @Override public void run() { delayedSelect=null; if (!BrowserPlugin.getDefault().isAnyDatabaseLoaded()) { // Put the "no database" content and label viewer.setLabelProvider( new NoDatabaseLabelProvider( false ) ); viewer.setSorter( new ViewerSorter() ); provider = new SingleObjectProvider(); viewer.setContentProvider( provider ); viewer.setInput( SpecialRoot.NO_DATABASE ); viewer.refresh(); } else { PackagesContentProvider daProvider = (PackagesContentProvider)viewer.getContentProvider(); // Refresh with the items viewer.setInput( PackagesRoot.ROOT ); // Use the new provider daProvider.uncache(); viewer.refresh(); } } } ); } @Override public void selectionChanged( final SelectionChangedEvent event ) { TreeSelection selection = ( TreeSelection )event.getSelection(); Object o = selection.getFirstElement(); if( o == null || !( o instanceof PackagesItem ) ) { doc.setText( "" ); } else { PackagesItem item = ( PackagesItem )o; doc.setText( HtmlUtil.generateDocument( null, item.getPackage().getDoc() ) ); } } @Override public void doubleClick( final DoubleClickEvent event ) { TreeSelection selection = ( TreeSelection )event.getSelection(); Object o = selection.getFirstElement(); if( o == null || !( o instanceof PackagesItem ) ) { return; } PackagesItem item = ( PackagesItem )o; // Open browser try { /*IWorkbenchBrowserSupport browserSupport = this.getSite() .getWorkbenchWindow().getWorkbench().getBrowserSupport(); URL webUrl = new URL( HtmlUtil.generatePackageUrl( item.getPackage().getIdentifier() ) ); IWebBrowser browser = browserSupport.createBrowser( IWorkbenchBrowserSupport.AS_EDITOR | IWorkbenchBrowserSupport.LOCATION_BAR, null, "Haskell Browser", "Haskell Browser" ); browser.openURL( webUrl );*/ OpenDefinitionHandler.openExternalDefinition( this.getSite().getPage(), null,item.getPackage().getIdentifier().toString(), null, null, null ); } catch( Throwable ex ) { // Do nothing } } public boolean has(final String name) { PackagesContentProvider pcp=(PackagesContentProvider)viewer.getContentProvider(); if (pcp!=null){ for (PackagesItem[] items : new PackagesItem[][]{ pcp.getLocalCache(), pcp.getHackageCache() }) { for (PackagesItem pi : items){ if (pi.getPackage().getIdentifier().toString().equals( name )){ return true; } } } } return false; } public void select(final String name){ PackagesContentProvider pcp=(PackagesContentProvider)viewer.getContentProvider(); if (pcp==null){ delayedSelect=name; return; } delayedSelect=null; for (PackagesItem[] items : new PackagesItem[][]{ pcp.getLocalCache(), pcp.getHackageCache() }) { for (PackagesItem pi : items){ if (pi.getPackage().getIdentifier().toString().equals( name )){ viewer.setSelection( new StructuredSelection(pi) ); return; } } } } }