/**
* (c) 2011, Alejandro Serrano
* Released under the terms of the EPL.
*/
package net.sf.eclipsefp.haskell.browser.views.modules;
import net.sf.eclipsefp.haskell.browser.Database;
import net.sf.eclipsefp.haskell.browser.util.HtmlUtil;
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.IMemento;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
/**
* View part for showing the 'modules' in the Browser.
* @author Alejandro Serrano
*
*/
public class ModulesView 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.modules.ModulesView";
TreeViewer viewer;
Browser doc;
ModulesContentProvider provider;
private IMemento memento;
@Override
public void init( final IViewSite site, final IMemento memento )
throws PartInitException {
super.init( site, memento );
this.memento = memento;
}
@Override
public void saveState( final IMemento memento ) {
super.saveState( memento );
provider.saveState( memento );
}
@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 ModulesLabelProvider() );
viewer.setSorter( new ModulesSorter() );
// Set content provider
provider = new ModulesContentProvider( this.memento );
viewer.setContentProvider( provider );
viewer.setInput( null );
viewer.addDoubleClickListener( this );
// Hook for changes in selection
viewer.addPostSelectionChangedListener( this );
// Register as selection provider
getSite().setSelectionProvider( viewer );
// 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();
}
// 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 Database || o instanceof PackagesItem ) {
viewer.setInput( o );
}
}
public void setHierarchical( final boolean isH ) {
if( provider.getHierarchical() != isH ) {
provider.setHierarchical( isH );
viewer.refresh();
}
}
public boolean getHierarchical() {
return provider.getHierarchical();
}
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
TreeSelection selection = ( TreeSelection )event.getSelection();
ModulesItem item = ( ModulesItem )selection.getFirstElement();
if( item == null || item.getModule() == null ) {
doc.setText( "" );
} else {
doc.setText( HtmlUtil.generateDocument( null, item.getModule().getDoc() ) );
}
}
@Override
public void doubleClick( final DoubleClickEvent event ) {
TreeSelection selection = ( TreeSelection )event.getSelection();
Object o = selection.getFirstElement();
if( o == null || !( o instanceof ModulesItem ) ) {
return;
}
ModulesItem item = ( ModulesItem )o;
Object dbInfo=item.getDatabaseInfo();
if (dbInfo instanceof PackagesItem){
PackagesItem pkg=(PackagesItem)dbInfo;
// Open browser
try {
OpenDefinitionHandler.openExternalDefinition( this.getSite().getPage(), null,pkg.getPackage().getIdentifier().toString(), item.getModule().getName(), null, null );
} catch( Throwable ex ) {
// Do nothing
}
}
}
}