com.aptana.ide.search.epl.filesystem.ui.text.FileSystemSearchPage.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.search.epl.filesystem.ui.text.FileSystemSearchPage.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Juerg Billeter, juergbi@ethz.ch - 47136 Search view should show match objects
 *     Ulrich Etter, etteru@ethz.ch - 47136 Search view should show match objects
 *     Roman Fuchs, fuchsro@ethz.ch - 47136 Search view should show match objects
 *******************************************************************************/
package com.aptana.ide.search.epl.filesystem.ui.text;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

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.util.DelegatingDragAdapter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
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.Messages;
import org.eclipse.search.internal.ui.SearchPlugin;
import org.eclipse.search.internal.ui.text.IFileSearchContentProvider;
import org.eclipse.search.internal.ui.text.NewTextSearchActionGroup;
import org.eclipse.search.ui.IContextMenuConstants;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.ISearchResultViewPart;
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.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
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.part.IPageSite;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.part.ResourceTransfer;
import org.eclipse.ui.texteditor.ITextEditor;

import com.aptana.ide.search.epl.AptanaFileSystemMatch;
import com.aptana.ide.search.epl.Compatibility;

public class FileSystemSearchPage extends AbstractTextSearchViewPage implements IAdaptable {

    public Integer getElementLimit1() {
        if (Compatibility.isTableLimited()) {
            return new Integer(Compatibility.getTableLimit());
        }
        return new Integer(-1);
    }

    /**
     * @author Pavel Petrochenko
     */
    public static class DecoratorIgnoringViewerSorter extends ViewerComparator {

        private final ILabelProvider fLabelProvider;

        /**
         * @param labelProvider
         */
        public DecoratorIgnoringViewerSorter(ILabelProvider labelProvider) {
            fLabelProvider = labelProvider;
        }

        /**
         * @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object)
         */
        public int category(Object element) {
            File fl = null;
            if (element instanceof File) {
                fl = (File) element;
            } else {
                fl = ((AptanaFileSystemMatch) element).getFile();
            }

            if (fl.isDirectory()) {
                return 1;
            }
            return 2;
        }

        /**
         * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        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 = fLabelProvider.getText(e1);
            String name2 = fLabelProvider.getText(e2);
            if (name1 == null) {
                name1 = ""; //$NON-NLS-1$
            }
            if (name2 == null) {
                name2 = ""; //$NON-NLS-1$
            }
            return getComparator().compare(name1, name2);
        }

    }

    private static final String KEY_SORTING = "org.eclipse.search.resultpage.sorting"; //$NON-NLS-1$

    private ActionGroup fActionGroup;
    private IFileSearchContentProvider fContentProvider;
    private int fCurrentSortOrder;
    private SortAction fSortByNameAction;
    private SortAction fSortByPathAction;

    private EditorOpener fEditorOpener = 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 FileSystemSearchPage.SHOW_IN_TARGETS;
        }
    };

    private IPropertyChangeListener fPropertyChangeListener;

    /**
    * 
    */
    public FileSystemSearchPage() {
        fSortByNameAction = new SortAction(SearchMessages.FileSearchPage_sort_name_label, this,
                FileLabelProvider.SHOW_LABEL_PATH);
        fSortByPathAction = new SortAction(SearchMessages.FileSearchPage_sort_path_label, this,
                FileLabelProvider.SHOW_PATH_LABEL);

        fPropertyChangeListener = new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if (Compatibility.ORG_ECLIPSE_SEARCH_LIMIT_TABLE.equals(event.getProperty())
                        || Compatibility.ORG_ECLIPSE_SEARCH_LIMIT_TABLE_TO.equals(event.getProperty())) {
                    if (getViewer() instanceof TableViewer) {
                        getViewPart().updateLabel();
                        getViewer().refresh();
                    }
                }
            }
        };
        SearchPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPropertyChangeListener);
    }

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

        DelegatingDragAdapter adapter = new DelegatingDragAdapter();
        adapter.addDragSourceListener(new com.aptana.ide.search.epl.ResourceTransferDragAdapter(viewer));

        viewer.addDragSupport(ops, transfers, adapter);
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getViewer()
     */
    public StructuredViewer getViewer() {
        return super.getViewer();
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer)
     */
    protected void configureTableViewer(TableViewer viewer) {
        viewer.setUseHashlookup(true);
        FileLabelProvider innerLabelProvider = new FileLabelProvider(this, fCurrentSortOrder);
        viewer.setLabelProvider(new DecoratingLabelProvider(innerLabelProvider,
                PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
        viewer.setContentProvider(new FileTableContentProvider(this));
        viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider));
        fContentProvider = (IFileSearchContentProvider) viewer.getContentProvider();
        addDragAdapters(viewer);
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer)
     */
    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);
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(org.eclipse.search.ui.text.Match,
     *      int, int, boolean)
     */
    protected void showMatch(Match match, int offset, int length, boolean activate) throws PartInitException {
        File file = (File) match.getElement();
        IEditorPart editor = fEditorOpener.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);
            }
        }
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#canRemoveMatchesWith(org.eclipse.jface.viewers.ISelection)
     */
    protected boolean canRemoveMatchesWith(ISelection selection) {
        if (selection.isEmpty()) {
            StructuredViewer viewer = getViewer();
            if ((viewer != null) && (viewer instanceof TableViewer)) {
                TableViewer tv = (TableViewer) viewer;
                tv.getTable().getParent().setFocus();
                tv.getTable().deselectAll();
            }
            if ((viewer != null) && (viewer instanceof TreeViewer)) {
                TreeViewer tv = (TreeViewer) viewer;
                tv.getTree().deselectAll();
            }
        }
        return !selection.isEmpty();
    }

    private void showWithMarker(IEditorPart editor, File file, int offset, int length) throws PartInitException {
        IMarker marker = null;
        try {
            // marker = file.createMarker(NewSearchUI.SEARCH_MARKER);
            Map<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);
        } finally {
            if (marker != null) {
                try {
                    marker.delete();
                } catch (CoreException e) {
                    // ignore
                }
            }
        }
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#fillContextMenu(org.eclipse.jface.action.IMenuManager)
     */
    protected void fillContextMenu(IMenuManager mgr) {
        super.fillContextMenu(mgr);
        addSortActions(mgr);
        fActionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection()));
        fActionGroup.fillContextMenu(mgr);
    }

    private void addSortActions(IMenuManager mgr) {
        if (getLayout() != AbstractTextSearchViewPage.FLAG_LAYOUT_FLAT) {
            return;
        }
        MenuManager sortMenu = new MenuManager(SearchMessages.FileSearchPage_sort_by_label);
        sortMenu.add(fSortByNameAction);
        sortMenu.add(fSortByPathAction);

        fSortByNameAction.setChecked(fCurrentSortOrder == fSortByNameAction.getSortOrder());
        fSortByPathAction.setChecked(fCurrentSortOrder == fSortByPathAction.getSortOrder());

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

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setInput(org.eclipse.search.ui.ISearchResult,
     *      java.lang.Object)
     */
    public void setInput(ISearchResult newSearch, Object viewState) {
        super.setInput(newSearch, viewState);
        getViewer().setSelection(new StructuredSelection());
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setViewPart(org.eclipse.search.ui.ISearchResultViewPart)
     */
    public void setViewPart(ISearchResultViewPart part) {
        super.setViewPart(part);
        fActionGroup = new NewTextSearchActionGroup(part);
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#init(org.eclipse.ui.part.IPageSite)
     */
    public void init(IPageSite site) {
        super.init(site);
        IMenuManager menuManager = site.getActionBars().getMenuManager();
        menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new OpenSearchPreferencesAction());
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#dispose()
     */
    public void dispose() {
        fActionGroup.dispose();
        SearchPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener);
        super.dispose();
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[])
     */
    protected void elementsChanged(Object[] objects) {
        if (fContentProvider != null) {
            fContentProvider.elementsChanged(objects);
        }
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear()
     */
    protected void clear() {
        if (fContentProvider != null) {
            fContentProvider.clear();
        }
    }

    /**
     * @param sortOrder
     */
    public void setSortOrder(int sortOrder) {
        fCurrentSortOrder = sortOrder;
        DecoratingLabelProvider lpWrapper = (DecoratingLabelProvider) getViewer().getLabelProvider();
        ((FileLabelProvider) lpWrapper.getLabelProvider()).setOrder(sortOrder);
        getViewer().refresh();
        getSettings().put(FileSystemSearchPage.KEY_SORTING, fCurrentSortOrder);
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#restoreState(org.eclipse.ui.IMemento)
     */
    public void restoreState(IMemento memento) {
        super.restoreState(memento);
        try {
            fCurrentSortOrder = getSettings().getInt(FileSystemSearchPage.KEY_SORTING);
        } catch (NumberFormatException e) {
            fCurrentSortOrder = fSortByNameAction.getSortOrder();
        }
        if (memento != null) {
            Integer value = memento.getInteger(FileSystemSearchPage.KEY_SORTING);
            if (value != null) {
                fCurrentSortOrder = value.intValue();
            }
        }
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#saveState(org.eclipse.ui.IMemento)
     */
    public void saveState(IMemento memento) {
        super.saveState(memento);
        memento.putInteger(FileSystemSearchPage.KEY_SORTING, fCurrentSortOrder);
    }

    /**
     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
     */
    public Object getAdapter(Class adapter) {
        if (IShowInTargetList.class.equals(adapter)) {
            return FileSystemSearchPage.SHOW_IN_TARGET_LIST;
        }
        return null;
    }

    /**
     * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getLabel()
     */
    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) {
                    return Messages.format(SearchMessages.AptanaFileSearchPage_NOT_ALL_MATCHES,
                            new Object[] { label, new Integer(itemCount), new Integer(fileCount) });
                }
            }
        }
        return label;
    }

}