org.eclipse.xtend.shared.ui.editor.search.view.XtendXpandSearchResultPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtend.shared.ui.editor.search.view.XtendXpandSearchResultPage.java

Source

/*******************************************************************************
 * Copyright (c) 2005 - 2007 committers of openArchitectureWare and others. All
 * rights reserved. This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: committers of openArchitectureWare - initial API and
 * implementation
 ******************************************************************************/
package org.eclipse.xtend.shared.ui.editor.search.view;

import java.util.HashMap;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.search.internal.ui.text.NewTextSearchActionGroup;
import org.eclipse.search.ui.IContextMenuConstants;
import org.eclipse.search.ui.ISearchResultViewPart;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.text.AbstractTextSearchResult;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.search.ui.text.Match;
import org.eclipse.search2.internal.ui.OpenSearchPreferencesAction;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.xtend.shared.ui.editor.search.query.XtendXpandSearchQuery;

import com.ibm.icu.text.MessageFormat;

/**
 * <code>XtendXpandSearchResultPage </code> displays the search results of an Xtend
 * related query.
 * 
 * @author Peter Friese
 */
@SuppressWarnings("restriction")
public class XtendXpandSearchResultPage extends AbstractTextSearchViewPage implements IAdaptable {

    public static class DecoratorIgnoringViewerSorter extends ViewerComparator {
        private final ILabelProvider labelProvider;

        public DecoratorIgnoringViewerSorter(ILabelProvider labelProvider) {
            this.labelProvider = labelProvider;
        }

        @Override
        public int category(Object element) {
            if (element instanceof IContainer) {
                return 1;
            }
            return 2;
        }

        @SuppressWarnings("unchecked")
        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {
            int cat1 = category(e1);
            int cat2 = category(e2);

            if (cat1 != cat2) {
                return cat1 - cat2;
            }

            String name1 = labelProvider.getText(e1);
            String name2 = labelProvider.getText(e2);
            if (name1 == null) {
                name1 = "";//$NON-NLS-1$
            }
            if (name2 == null) {
                name2 = "";//$NON-NLS-1$
            }
            return getComparator().compare(name1, name2);
        }
    }

    private ActionGroup actionGroup;
    private XtendXpandTableContentProvider contentProvider;

    private final EditorOpener editorOpener = new EditorOpener();

    private static final String[] SHOW_IN_TARGETS = new String[] { IPageLayout.ID_RES_NAV };
    private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
        public String[] getShowInTargetIds() {
            return XtendXpandSearchResultPage.SHOW_IN_TARGETS;
        }
    };

    public XtendXpandSearchResultPage() {
        super(AbstractTextSearchViewPage.FLAG_LAYOUT_FLAT);
    }

    @Override
    public StructuredViewer getViewer() {
        return super.getViewer();
    }

    private void addDragAdapters(StructuredViewer viewer) {
        // Transfer[] transfers = new Transfer[] { ResourceTransfer.getInstance() };
        // int ops = DND.DROP_COPY | DND.DROP_LINK;
        // viewer.addDragSupport(ops, transfers, new
        // ResourceTransferDragAdapter(viewer));
    }

    @Override
    protected void configureTableViewer(TableViewer viewer) {
        viewer.setUseHashlookup(true);
        WorkbenchLabelProvider innerLabelProvider = new WorkbenchLabelProvider();
        viewer.setLabelProvider(new DecoratingLabelProvider(innerLabelProvider,
                PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
        viewer.setContentProvider(new XtendXpandTableContentProvider(this));
        viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider));
        contentProvider = (XtendXpandTableContentProvider) viewer.getContentProvider();
        addDragAdapters(viewer);
    }

    @Override
    protected void configureTreeViewer(TreeViewer viewer) {
        // viewer.setUseHashlookup(true);
        // FileLabelProvider innerLabelProvider = new FileLabelProvider(this,
        // FileLabelProvider.SHOW_LABEL);
        // viewer.setLabelProvider(new
        // DecoratingLabelProvider(innerLabelProvider, PlatformUI.getWorkbench()
        // .getDecoratorManager().getLabelDecorator()));
        // viewer.setContentProvider(new FileTreeContentProvider(this, viewer));
        // viewer.setComparator(new
        // DecoratorIgnoringViewerSorter(innerLabelProvider));
        // fContentProvider = (IFileSearchContentProvider)
        // viewer.getContentProvider();
        // addDragAdapters(viewer);
    }

    @Override
    protected void showMatch(Match match, int offset, int length, boolean activate) throws PartInitException {
        IFile file = (IFile) match.getElement();
        IEditorPart editor = editorOpener.open(file, activate);
        if (offset != 0 && length != 0) {
            if (editor instanceof ITextEditor) {
                ITextEditor textEditor = (ITextEditor) editor;
                textEditor.selectAndReveal(offset, length);
            } else if (editor != null) {
                showWithMarker(editor, file, offset, length);
            }
        }
    }

    private void showWithMarker(IEditorPart editor, IFile file, int offset, int length) throws PartInitException {
        IMarker marker = null;
        try {
            marker = file.createMarker(NewSearchUI.SEARCH_MARKER);
            HashMap<String, Integer> attributes = new HashMap<String, Integer>(4);
            attributes.put(IMarker.CHAR_START, new Integer(offset));
            attributes.put(IMarker.CHAR_END, new Integer(offset + length));
            marker.setAttributes(attributes);
            IDE.gotoMarker(editor, marker);
        } catch (CoreException e) {
            throw new PartInitException("Could not create marker", e);
        } finally {
            if (marker != null) {
                try {
                    marker.delete();
                } catch (CoreException e) {
                    // ignore
                }
            }
        }
    }

    @Override
    protected void fillContextMenu(IMenuManager mgr) {
        super.fillContextMenu(mgr);
        addSortActions(mgr);
        actionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection()));
        actionGroup.fillContextMenu(mgr);
        @SuppressWarnings("unused")
        XtendXpandSearchQuery query = (XtendXpandSearchQuery) getInput().getQuery();
    }

    private void addSortActions(IMenuManager mgr) {
        if (getLayout() != AbstractTextSearchViewPage.FLAG_LAYOUT_FLAT) {
            return;
        }
        MenuManager sortMenu = new MenuManager("Sort By");

        mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortMenu);
    }

    @Override
    public void setViewPart(ISearchResultViewPart part) {
        super.setViewPart(part);
        actionGroup = new NewTextSearchActionGroup(part);
    }

    @Override
    public void init(IPageSite site) {
        super.init(site);
        IMenuManager menuManager = site.getActionBars().getMenuManager();
        menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new OpenSearchPreferencesAction());
    }

    @Override
    public void dispose() {
        actionGroup.dispose();
        super.dispose();
    }

    @Override
    protected void elementsChanged(Object[] objects) {
        if (contentProvider != null) {
            contentProvider.elementsChanged(objects);
        }
    }

    @Override
    protected void clear() {
        if (contentProvider != null) {
            contentProvider.clear();
        }
    }

    @SuppressWarnings("unchecked")
    public Object getAdapter(Class adapter) {
        if (IShowInTargetList.class.equals(adapter)) {
            return XtendXpandSearchResultPage.SHOW_IN_TARGET_LIST;
        }
        return null;
    }

    @Override
    public String getLabel() {
        String label = super.getLabel();
        StructuredViewer viewer = getViewer();
        if (viewer instanceof TableViewer) {
            TableViewer tv = (TableViewer) viewer;

            AbstractTextSearchResult result = getInput();
            if (result != null) {
                int itemCount = ((IStructuredContentProvider) tv.getContentProvider())
                        .getElements(getInput()).length;
                int fileCount = getInput().getElements().length;
                if (itemCount < fileCount) {
                    String format = "{0} (showing {1} of {2} files)";
                    MessageFormat.format(format,
                            new Object[] { label, new Integer(itemCount), new Integer(fileCount) });
                }
            }
        }
        return label;
    }

}