org.cs3.pdt.common.search.PrologSearchResultPage.java Source code

Java tutorial

Introduction

Here is the source code for org.cs3.pdt.common.search.PrologSearchResultPage.java

Source

/*****************************************************************************
 * This file is part of the Prolog Development Tool (PDT)
 * 
 * Author: Lukas Degener (among others)
 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
 * Mail: pdt@lists.iai.uni-bonn.de
 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn
 * 
 * All rights reserved. This program is  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
 * 
 ****************************************************************************/

/*
 * Created on 23.08.2004
 *
 */
package org.cs3.pdt.common.search;

import org.cs3.pdt.common.PDTCommonUtil;
import org.cs3.pdt.common.internal.ImageRepository;
import org.cs3.pdt.common.structureElements.ModuleMatch;
import org.cs3.pdt.common.structureElements.PredicateMatch;
import org.cs3.pdt.common.structureElements.PrologMatch;
import org.cs3.pdt.common.structureElements.SearchFileTreeElement;
import org.cs3.pdt.common.structureElements.SearchModuleElement;
import org.cs3.pdt.common.structureElements.SearchPredicateElement;
import org.cs3.prolog.common.logging.Debug;
import org.cs3.prolog.ui.util.UIUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.search.ui.text.Match;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.UIJob;

public class PrologSearchResultPage extends AbstractTextSearchViewPage {

    private PrologSearchContentProvider fContentProvider;
    protected static final Image IMAGE = ImageRepository.getImage(ImageRepository.PE_PUBLIC);

    public PrologSearchResultPage() {
        super(AbstractTextSearchViewPage.FLAG_LAYOUT_TREE);
        init(NewSearchUI.getSearchResultView().getActivePage().getSite());
    }

    @Override
    protected void elementsChanged(Object[] objects) {
        if (fContentProvider != null)
            fContentProvider.elementsChanged(objects);
        StructuredViewer viewer = getViewer();
        if (viewer != null) {
            viewer.refresh();
        }
    }

    @Override
    protected void clear() {
        if (fContentProvider != null)
            fContentProvider.clear();
        StructuredViewer viewer = getViewer();
        if (viewer != null) {
            viewer.refresh();
        }
    }

    @Override
    protected void configureTreeViewer(TreeViewer viewer) {
        viewer.setLabelProvider(new DecoratingPrologSearchLabelProvider(new PrologSearchLabelProvider()));
        ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);
        //      viewer.setLabelProvider(new DecoratingLabelProvider(new PrologSearchLabelProvider(), 
        //            PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
        fContentProvider = new PrologSearchTreeContentProvider(this);
        viewer.setContentProvider(fContentProvider);
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                ISelection selection = event.getSelection();
                if (selection instanceof TreeSelection) {
                    Object firstElement = ((TreeSelection) selection).getFirstElement();
                    Match m = null;
                    if (firstElement instanceof SearchModuleElement) {
                        m = ((SearchModuleElement) firstElement).getMatch();
                    } else if (firstElement instanceof SearchPredicateElement) {
                        m = ((SearchPredicateElement) firstElement).getFirstOccurrence();
                    } else if (firstElement instanceof SearchFileTreeElement) {
                        m = ((SearchFileTreeElement) firstElement).getFirstMatch();
                    }
                    if (m != null) {
                        final Match match = m;
                        UIJob job = new UIJob("Show Match") {
                            @Override
                            public IStatus runInUIThread(IProgressMonitor monitor) {
                                try {
                                    showMatch(match, match.getOffset(), match.getLength(), true);
                                } catch (PartInitException e) {
                                    Debug.report(e);
                                }
                                return Status.OK_STATUS;
                            }
                        };
                        job.schedule();
                    }
                }
            }
        });
        viewer.addTreeListener(new ITreeViewerListener() {
            @Override
            public void treeExpanded(TreeExpansionEvent event) {
                final AbstractTreeViewer treeViewer = event.getTreeViewer();
                PrologSearchTreeContentProvider contentProvider = (PrologSearchTreeContentProvider) treeViewer
                        .getContentProvider();
                final Object element = event.getElement();
                int expandLevel = 1;
                Object[] children = contentProvider.getChildren(element);
                while (children.length == 1) {
                    expandLevel++;
                    children = contentProvider.getChildren(children[0]);
                }
                if (expandLevel > 1) {
                    final int finalExpandLevel = expandLevel;
                    treeViewer.getControl().getDisplay().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            treeViewer.expandToLevel(element, finalExpandLevel);
                        }
                    });
                }
            }

            @Override
            public void treeCollapsed(TreeExpansionEvent event) {
            }
        });
    }

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

    @Override
    protected void configureTableViewer(TableViewer viewer) {
        viewer.setLabelProvider(new DecoratingLabelProvider(new PrologSearchLabelProvider(),
                PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
        fContentProvider = new PrologSearchTableContentProvider(this);
        viewer.setContentProvider(fContentProvider);
    }

    @Override
    protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate)
            throws PartInitException {
        if (match instanceof PrologMatch) {
            PrologMatch prologMatch = (PrologMatch) match;
            if (prologMatch.isLineLocation()) {
                PDTCommonUtil.selectInEditor(prologMatch.getLine(), prologMatch.getFile(), activate);
            } else {
                PDTCommonUtil.selectInEditor(currentOffset, currentLength, prologMatch.getFile(), activate, false);
            }
        } else if (match instanceof ModuleMatch) {
            ModuleMatch moduleMatch = (ModuleMatch) match;
            PDTCommonUtil.selectInEditor(moduleMatch.getOffset(), moduleMatch.getFile(), activate);
        } else if (match instanceof PredicateMatch) {
            UIUtils.displayMessageDialog(getSite().getShell(), "Show Match",
                    "There is no source code for this predicate.");
        }
    }

}