/**
* (c) 2011, Alejandro Serrano
* Released under the terms of the EPL.
*/
package net.sf.eclipsefp.haskell.browser.views.declarations;
import net.sf.eclipsefp.haskell.browser.items.Constructor;
import net.sf.eclipsefp.haskell.browser.items.DeclarationType;
import net.sf.eclipsefp.haskell.browser.items.QueryItem;
import net.sf.eclipsefp.haskell.browser.util.HtmlUtil;
import net.sf.eclipsefp.haskell.browser.views.modules.ModulesItem;
import net.sf.eclipsefp.haskell.browser.views.packages.PackagesItem;
import net.sf.eclipsefp.haskell.ui.handlers.OpenDefinitionHandler;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
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.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
/**
* Base class for types and functions views, which share the
* idea of showing a Haskell declaration.
* @author Alejandro Serrano
*
*/
public abstract class DeclarationsView extends ViewPart implements
ISelectionListener, ISelectionChangedListener, IDoubleClickListener {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "net.sf.eclipsefp.haskell.browser.views.declarations.DeclarationsView";
protected boolean isTypes;
TreeViewer viewer;
Browser doc;
DeclarationsContentProvider provider;
public DeclarationsView( final boolean isTypes ) {
super();
this.isTypes = isTypes;
}
@Override
public void createPartControl( final Composite parent ) {
SashForm form = new SashForm( parent, SWT.VERTICAL );
viewer = new TreeViewer( form );
doc = new Browser( form, SWT.NONE );
form.setWeights( new int[] { 75, 25 } );
// Set label provider and sorter
viewer.setLabelProvider( new DeclarationsLabelProvider() );
viewer.setSorter( new DeclarationsSorter() );
// Set content provider
provider = new DeclarationsContentProvider( isTypes );
viewer.setContentProvider( provider );
viewer.setInput( null );
// Hook for changes in selection
viewer.addPostSelectionChangedListener( this );
// Hook for double clicking
viewer.addDoubleClickListener( this );
// Hook onto selection changes
getSite().getPage().addPostSelectionListener( this );
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
@Override
public void dispose() {
getSite().getPage().removePostSelectionListener( this );
super.dispose();
}
// Last module loaded, needed for opening help
ModulesItem lastModulesItem = null;
// This will be called when a new package is selected
@Override
public void selectionChanged( final IWorkbenchPart part,
final ISelection selection ) {
if( part == this ) {
return;
}
if( !( selection instanceof IStructuredSelection ) ) {
return;
}
IStructuredSelection sel = ( IStructuredSelection )selection;
Object o = sel.getFirstElement();
if( o == null ) {
return;
}
if( o instanceof PackagesItem ) {
viewer.setInput( null );
viewer.refresh();
}
if( o instanceof ModulesItem ) {
this.lastModulesItem = ( ModulesItem )o;
viewer.setInput( o );
viewer.refresh();
}
}
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
TreeSelection selection = ( TreeSelection )event.getSelection();
Object o = selection.getFirstElement();
if( o == null ) {
doc.setText( "" );
return;
}
if( o instanceof QueryItem ) {
QueryItem decl = ( QueryItem )o;
doc.setText( HtmlUtil.generateDocument( decl.getDeclaration()
.getCompleteDefinition(), decl.getPackages(), null, false, decl
.getDeclaration().getDoc() ) );
} else if( o instanceof Constructor ) {
Constructor c = ( Constructor )o;
doc.setText( HtmlUtil.generateDocument( c.getCompleteDefinition(),
c.getDoc() ) );
}
}
@Override
public void doubleClick( final DoubleClickEvent event ) {
TreeSelection selection = ( TreeSelection )event.getSelection();
Object o = selection.getFirstElement();
if( o == null || o instanceof Constructor ) {
return;
}
QueryItem item = ( QueryItem )o;
if( item.getDeclaration().getType() == DeclarationType.INSTANCE ) {
return; // No documentation for instances
}
OpenDefinitionHandler.openExternalDefinition( getSite().getPage(), null, item.getPackages().get( 0 ).toString(), lastModulesItem.getModule().getName(),
item.getName(), (item.getType() == DeclarationType.FUNCTION)?"v":"t" );
}
}