com.dtsworkshop.flextools.search.ui.SearchResultPage.java Source code

Java tutorial

Introduction

Here is the source code for com.dtsworkshop.flextools.search.ui.SearchResultPage.java

Source

/**
*   Copyright (C) Oliver B. Tupman, 2007.
*   
*   This file is part of the Flex Tools Project.
*   
*   The Flex Tools Project is free software; you can redistribute it and/or modify
*   it under the terms of the GNU General Public License as published by
*   the Free Software Foundation; either version 3 of the License, or
*   (at your option) any later version.
*   
*   The Flex Tools Project is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*   GNU General Public License for more details.
*   
*   You should have received a copy of the GNU General Public License
*   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package com.dtsworkshop.flextools.search.ui;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.print.attribute.HashAttributeSet;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.search.internal.ui.text.EditorOpener;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.SearchResultEvent;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE.SharedImages;

import com.adobe.flexbuilder.editors.common.editor.IFlexEditor;
import com.adobe.flexbuilder.editors.common.ui.ObjectLabelProvider;

import com.dtsworkshop.flextools.Activator;
import com.dtsworkshop.flextools.FlexToolsLog;
import com.dtsworkshop.flextools.search.ClassSearchResult;
import com.dtsworkshop.flextools.search.SearchQuery;
import com.dtsworkshop.flextools.search.SearchReference;

public class SearchResultPage extends AbstractTextSearchViewPage {
    private static Logger log = Logger.getLogger(SearchResultPage.class);

    public SearchResultPage() {
        super(FLAG_LAYOUT_TREE);
        log.debug("Created.");
    }

    @Override
    protected void clear() {
        // TODO: Need to clear the search page
        ((TreeViewer) getViewer()).setInput(new ClassSearchResult(new SearchQuery()));
    }

    /**
     * Basic implementation of the content provider. Currently
     * based upon the ClassSearchResult.
     * 
     * @author Ollie
     *
     */
    private static class ClassContentProvider implements IStructuredContentProvider {
        private ClassSearchResult result = null;

        public Object[] getElements(Object inputElement) {
            // inputElement is the ClassSearchResult
            // return matches?
            //         log.info("getElements()");
            if (result == null) {
                return new Object[0];
            }

            return this.result.getElements();
        }

        private Logger log = Logger.getLogger("ClassContentProvider");

        public void dispose() {

        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // oldInput - old one, duh
            // newInput = ClassSearchResult
            result = (ClassSearchResult) newInput;
        }

    }

    //TODO: Either reimplement or borrow the EditorOpener
    private EditorOpener opener = new EditorOpener();

    private void handleDoubleClick(DoubleClickEvent event) {
        //TODO: Handle search result double click - show result in viewer
        Assert.isTrue(event.getSelection() instanceof StructuredSelection);
        StructuredSelection selection = (StructuredSelection) event.getSelection();
        if (selection.getFirstElement() instanceof SearchReference) {
            showReferenceInEditor((SearchReference) selection.getFirstElement());
        } else if (selection.getFirstElement() instanceof IFile) {
            IFile selectedFile = (IFile) selection.getFirstElement();
            try {

                opener.open(selectedFile, true);
            } catch (PartInitException e) {
                e.printStackTrace();
                FlexToolsLog.logError(
                        String.format("Error initialising editor for file %s", selectedFile.getName()), e);
            }
        } else {
            //TODO: Throw exception on invalid double click selection
        }
    }

    private void showReferenceInEditor(SearchReference referenceToShow) {
        if (referenceToShow.getFrom() == -1 || referenceToShow.getTo() == -1) {
            log.warn("Either the from or to of the reference just double clicked is -1");
        }
        try {
            IEditorPart part = opener.open(referenceToShow.getFilePath(), true);
            Assert.isTrue(part instanceof IFlexEditor, "Editor is not a flex/FB editor");
            IFlexEditor editor = (IFlexEditor) part;
            TextSelection selection = new TextSelection(referenceToShow.getFrom(),
                    referenceToShow.getTo() - referenceToShow.getFrom());
            part.getEditorSite().getSelectionProvider().setSelection(selection);
            //editor.selectAndRevealInCodeView(referenceToShow.getFrom(), referenceToShow.getTo());
        } catch (PartInitException e) {
            e.printStackTrace();
            FlexToolsLog.logError(String.format("Error initialising part to show file %s",
                    referenceToShow.getFilePath().getName()), e);
        } finally {

        }
    }

    @Override
    protected void configureTableViewer(TableViewer viewer) {
        viewer.setUseHashlookup(true); //TODO: What does setUseHashlookup do?
        viewer.setContentProvider(new ClassContentProvider());
        viewer.setLabelProvider(new ClassLabelProvider());
        viewer.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                handleDoubleClick(event);
            }

        });
    }

    /**
     * Label provider, not implemented yet.
     * 
     * @author Ollie
     *
     */
    private static class ClassLabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            // TODO: Need to work out how to obtain images
            // TODO: What images are required? Mebbe stuff from the default Eclipse?
            SearchReference ref = (SearchReference) element;
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            SearchReference ref = (SearchReference) element;
            return ref.getFilePath().getName();
        }

        private Logger log = Logger.getLogger("ClassLabelProvider");

        public void addListener(ILabelProviderListener listener) {
            //TODO: What is listening?
            // TODO Auto-generated method stub
            log.info("addListener");
        }

        public void dispose() {
            // TODO Auto-generated method stub
            log.info("dispose()");
        }

        public boolean isLabelProperty(Object element, String property) {
            //TODO: Need to work out what comes in here
            log.info("isLabelProperty");
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
            //TODO: Remove listener from list (what list?!?!)
            log.info("removeListener");
        }

    }

    private class FlexTreeContentProvider implements ITreeContentProvider {
        private Map<IFile, List<SearchReference>> mappedReferences;

        private void createIndex() {
            Object[] refs = result.getElements();
            for (Object currentRef : refs) {
                if (!(currentRef instanceof SearchReference)) {
                    continue;
                }
                SearchReference castRef = (SearchReference) currentRef;
                IFile file = castRef.getFilePath();
                List<SearchReference> fileReferences = getFileReferences(file);
                fileReferences.add(castRef);
            }
        }

        private List<SearchReference> getFileReferences(IFile file) {
            List<SearchReference> fileReferences;

            if (!mappedReferences.containsKey(file)) {
                mappedReferences.put(file, new ArrayList<SearchReference>(10));
            }
            fileReferences = mappedReferences.get(file);
            return fileReferences;
        }

        public Object[] getElements(Object inputElement) {
            // first call: inputElement = ClassSearchResult
            Object[] elements = result.getElements();
            if (elements.length == 0) {
                return new Object[0];
            }
            createIndex();

            return (Object[]) mappedReferences.keySet().toArray(new Object[mappedReferences.keySet().size()]);
        }

        public Object[] getChildren(Object parentElement) {
            //System.out.println("Getting children for " + parentElement);
            Object[] children = null;
            if (parentElement instanceof IFile) {
                List<SearchReference> references = getFileReferences((IFile) parentElement);
                children = (Object[]) references.toArray(new Object[references.size()]);
            } else {
                children = new Object[0];
            }
            return children;
        }

        public Object getParent(Object element) {

            return null;
        }

        public boolean hasChildren(Object element) {
            if (element instanceof IFile) {
                return true;
            }
            return false;
        }

        public void dispose() {
            mappedReferences.clear();
            result = null;
        }

        private void resetWithResult(ClassSearchResult newResult) {
            result = newResult;
            mappedReferences = new HashMap<IFile, List<SearchReference>>(100);
        }

        ClassSearchResult result;

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            //first call: oldInput - null, newInput - ClassSearchResult
            if (oldInput != newInput) {
                resetWithResult((ClassSearchResult) newInput);
            }
        }

    }

    @Override
    protected void configureTreeViewer(TreeViewer viewer) {
        viewer.setUseHashlookup(true);
        viewer.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                handleDoubleClick(event);
            }

        });
        viewer.setLabelProvider(new ILabelProvider() {

            public Image getImage(Object element) {
                // TODO: Implement image handling!
                return null;
            }

            public String getText(Object element) {
                if (element instanceof IFile) {
                    return ((IFile) element).getProjectRelativePath().toPortableString().replace("/", ".");
                } else if (element instanceof SearchReference) {
                    SearchReference ref = (SearchReference) element;
                    String description = String.format("%s [%d - %d]", ref.getDescription(), ref.getFrom(),
                            ref.getTo());
                    return description;
                }
                return element.toString();
            }

            public void addListener(ILabelProviderListener listener) {
            }

            public void dispose() {
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void removeListener(ILabelProviderListener listener) {
            }

        });
        viewer.setContentProvider(new FlexTreeContentProvider());
    }

    @Override
    protected void elementsChanged(Object[] objects) {
        //TODO: Don't think this should refresh - should add a new item
        getViewer().refresh(true);
    }

}