net.sf.eclipsefp.haskell.ui.internal.search.UsageSearchPage.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsefp.haskell.ui.internal.search.UsageSearchPage.java

Source

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