/** * 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.internal.search; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import net.sf.eclipsefp.haskell.buildwrapper.types.SearchResultLocation; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.views.projectexplorer.HaskellResourceExtensionLP; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.search.internal.ui.text.NewTextSearchActionGroup; import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.ISearchResultViewPart; import org.eclipse.search.ui.text.AbstractTextSearchViewPage; import org.eclipse.search.ui.text.Match; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.editors.text.TextFileDocumentProvider; import org.eclipse.ui.model.WorkbenchViewerComparator; import org.eclipse.ui.part.IShowInSource; import org.eclipse.ui.part.IShowInTarget; import org.eclipse.ui.part.IShowInTargetList; import org.eclipse.ui.part.ShowInContext; import org.eclipse.ui.texteditor.IDocumentProvider; /** * Search page for Haskell usage searches: does the plumbing with the Eclipse search result handling * @author JP Moresmau * */ public class UsageSearchPage extends AbstractTextSearchViewPage implements IAdaptable { private UsageSearchResult lastResults; private ActionGroup fActionGroup; /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[]) */ @Override protected void elementsChanged( final Object[] paramArrayOfObject ) { getViewer().setInput( lastResults); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setInput(org.eclipse.search.ui.ISearchResult, java.lang.Object) */ @Override public void setInput( final ISearchResult newSearch, final Object viewState ) { super.setInput( newSearch, viewState ); final UsageSearchResult results=(UsageSearchResult)newSearch; lastResults=results; } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear() */ @Override protected void clear() { lastResults=null; } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(org.eclipse.search.ui.text.Match, int, int, boolean) */ @Override protected void showMatch( final Match match, final int currentOffset, final int currentLength, final boolean activate ) throws PartInitException { IWorkbenchPage page = getSite().getPage(); openAndSelect( page, ((SectionSearchResult)match.getElement()).getFile(), currentOffset, currentLength, activate ); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer) */ @Override protected void configureTreeViewer( final TreeViewer treeViewer ) { treeViewer.setUseHashlookup( true ); treeViewer.setContentProvider( new UsageResultContentProvider() ); treeViewer.setComparator( new WorkbenchViewerComparator() ); treeViewer.setLabelProvider( new HaskellResourceExtensionLP() ); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer) */ @Override protected void configureTableViewer( final TableViewer tableViewer ) { // NOOP } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getCurrentMatchLocation(org.eclipse.search.ui.text.Match) */ @Override public IRegion getCurrentMatchLocation( final Match match ) { IDocumentProvider prov=new TextFileDocumentProvider(); SearchResultLocation loc=((SectionSearchResult)match.getElement()).getLocations().iterator().next(); try { prov.connect( loc.getIFile() ); try { IDocument doc=prov.getDocument( loc.getIFile() ); int off1=loc.getStartOffset( doc ); return new Region(off1,loc.getLength( doc )); } finally { prov.disconnect( loc.getIFile() ); } } catch (Exception ce){ HaskellUIPlugin.log( ce ); } return super.getCurrentMatchLocation( match ); } private static final String[] SHOW_IN_TARGETS = { "org.eclipse.ui.views.ResourceNavigator" }; private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() { @Override public String[] getShowInTargetIds() { return SHOW_IN_TARGETS; } }; /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ @Override public Object getAdapter( @SuppressWarnings("rawtypes") final Class arg0 ) { if( arg0.equals( IShowInTarget.class ) ) { return SHOW_IN_TARGET_LIST; } if(arg0.equals( IShowInSource.class ) ) { ISelectionProvider selectionProvider = getSite().getSelectionProvider(); if( selectionProvider == null ) { return null; } ISelection selection = selectionProvider.getSelection(); if( selection instanceof IStructuredSelection ) { IStructuredSelection structuredSelection = ( IStructuredSelection )selection; final Set<Object> newSelection = new HashSet<>( structuredSelection.size() ); Iterator<?> iter = structuredSelection.iterator(); while( iter.hasNext() ) { Object element = iter.next(); if (element instanceof SectionSearchResult){ element = ((SectionSearchResult)element).getFile(); } if (element!=null){ newSelection.add( element ); } } return new IShowInSource() { @Override public ShowInContext getShowInContext() { return new ShowInContext( null, new StructuredSelection( new ArrayList<>( newSelection ) ) ); } }; } return null; } return null; } @Override public void setViewPart(final ISearchResultViewPart part) { super.setViewPart(part); this.fActionGroup = new NewTextSearchActionGroup(part); } @Override protected void fillContextMenu(final IMenuManager mgr) { super.fillContextMenu(mgr); this.fActionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection())); this.fActionGroup.fillContextMenu(mgr); } }