Java tutorial
/** * 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); } }