it.unibz.instasearch.ui.InstaSearchPage.java Source code

Java tutorial

Introduction

Here is the source code for it.unibz.instasearch.ui.InstaSearchPage.java

Source

/*
 * Copyright (c) 2009 Andrejs Jermakovics.
 * 
 * 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:
 *     Andrejs Jermakovics - initial implementation
 */
package it.unibz.instasearch.ui;

import it.unibz.instasearch.InstaSearchPlugin;
import it.unibz.instasearch.indexing.Field;
import it.unibz.instasearch.indexing.WorkspaceIndexerJDT;
import it.unibz.instasearch.indexing.SearchQuery;
import it.unibz.instasearch.prefs.PreferenceConstants;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.search.ui.ISearchPage;
import org.eclipse.search.ui.ISearchPageContainer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.dialogs.TypeFilteringDialog;

public class InstaSearchPage extends DialogPage implements ISearchPage {
    public static final String ID = "it.unibz.instasearch.ui.InstaSearchPage";
    /**
     * 
     */
    private ISearchPageContainer container;
    private Text searchText;
    private Button similarSearch;
    private StringButtonFieldEditor extensionEditor;
    //private Button jarSearch;

    public boolean performAction() {
        HashMap<Field, Set<String>> filter = new HashMap<Field, Set<String>>();

        if (container.getSelectedScope() == ISearchPageContainer.SELECTED_PROJECTS_SCOPE
                && container.getSelectedProjectNames().length != 0) // projects
        {
            TreeSet<String> selectedProjects = new TreeSet<String>();
            Collections.addAll(selectedProjects, container.getSelectedProjectNames());
            filter.put(Field.PROJ, selectedProjects);

        } else if (container.getSelectedScope() == ISearchPageContainer.WORKING_SET_SCOPE
                && container.getSelectedWorkingSets().length != 0) { // working sets

            filter.put(Field.WS, getWorkingSetSearchString());

        } else if (container.getSelectedScope() == ISearchPageContainer.SELECTION_SCOPE
                && !container.getSelection().isEmpty()) {
            getSelectedResources(filter);
        }

        filter.put(Field.EXT, getSelectedExtensions());
        extensionEditor.store();

        String searchString = searchText.getText();

        InstaSearchView searchView = InstaSearchUI.showSearchView();

        if (searchView != null) {
            int maxResults = SearchQuery.UNLIMITED_RESULTS;
            searchString += convertFilterToString(filter);
            SearchQuery searchQuery = new SearchQuery(searchString, maxResults);
            searchQuery.setExact(similarSearch.getSelection());
            searchQuery.setFilter(null); // put filters in search string instead

            searchView.setSearchString(searchString); // to display
            searchView.search(searchQuery, false);
        }

        return true;
    }

    private void getSelectedResources(HashMap<Field, Set<String>> filter) {
        if (container.getSelection() instanceof IStructuredSelection) {

            IStructuredSelection sel = (IStructuredSelection) container.getSelection();

            for (Object elem : sel.toArray()) {
                if (elem instanceof IAdaptable) {

                    IResource res = null;

                    if (elem instanceof IResource)
                        res = (IResource) elem;
                    else {
                        IAdaptable adaptable = (IAdaptable) elem;
                        res = (IResource) adaptable.getAdapter(IResource.class);
                    }

                    if (res == null)
                        continue;

                    switch (res.getType()) {
                    case IResource.PROJECT:
                        Set<String> projects = filter.containsKey(Field.PROJ) ? filter.get(Field.PROJ)
                                : new TreeSet<String>();
                        projects.add(((IProject) res).getName());
                        filter.put(Field.PROJ, projects);
                        break;
                    case IResource.FILE:
                        Set<String> files = filter.containsKey(Field.FILE) ? filter.get(Field.FILE)
                                : new TreeSet<String>();
                        files.add(((IFile) res).getFullPath().toString());
                        filter.put(Field.FILE, files);
                        break;
                    case IResource.FOLDER:
                        Set<String> folders = filter.containsKey(Field.DIR) ? filter.get(Field.DIR)
                                : new TreeSet<String>();
                        folders.add(res.getFullPath().toString());
                        filter.put(Field.DIR, folders);
                        break;
                    }

                }
            }
        }
    }

    /**
     * @param filter
     * @return
     */
    private static String convertFilterToString(HashMap<Field, Set<String>> filter) {

        String filterString = "";

        for (Entry<Field, Set<String>> entry : filter.entrySet()) {

            String fieldFilterString = getFieldFilterString(entry.getKey(), entry.getValue());

            if (!"".equals(fieldFilterString))
                filterString += " " + fieldFilterString;
        }

        return filterString;
    }

    private Set<String> getSelectedExtensions() {

        TreeSet<String> extSet = new TreeSet<String>();

        String exts = extensionEditor.getStringValue();

        if (exts != null && !"".equals(exts) && !"*".equals(exts)) {
            exts = exts.replace(" ", "");
            exts = exts.replace("*.", "");
            Collections.addAll(extSet, exts.split(","));
        }

        return extSet;
    }

    private Set<String> getWorkingSetSearchString() {

        Set<String> wsNames = new TreeSet<String>();

        for (IWorkingSet ws : container.getSelectedWorkingSets()) {
            String workingSet = ws.getName();
            wsNames.add(workingSet);
        }

        return wsNames;
    }

    private static String getFieldFilterString(Field field, Set<String> values) {
        String filterString = null;

        if (values.size() == 0)
            return "";

        for (String val : values) {
            if (filterString == null)
                filterString = "";
            else
                filterString += ",";
            filterString += val;
        }

        if (filterString.contains(" "))
            filterString = '"' + filterString + '"';

        return field.toString() + ':' + filterString;
    }

    public void setContainer(ISearchPageContainer container) {
        this.container = container;
    }

    public void createControl(Composite parent) {
        Composite pageComposite = new Composite(parent, SWT.FILL);

        GridLayout pageLayout = new GridLayout();
        pageLayout.numColumns = 1;

        pageComposite.setLayout(pageLayout);
        pageComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));

        Label label = new Label(pageComposite, SWT.LEFT);
        label.setText("Search:");
        label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false, 1, 1));

        searchText = new Text(pageComposite, SWT.SINGLE | SWT.BORDER | SWT.FILL);
        searchText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1));

        if (container.getSelection() instanceof TextSelection) {
            String selection = ((TextSelection) container.getSelection()).getText();
            searchText.setText(selection);
        }

        createShowViewLink(pageComposite);

        similarSearch = new Button(pageComposite, SWT.CHECK);
        similarSearch.setText("Find similar matches");
        similarSearch.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1));

        if (InstaSearchPlugin.getInstaSearch() != null
                && InstaSearchPlugin.getInstaSearch().getIndexer() instanceof WorkspaceIndexerJDT) {
            //         jarSearch = new Button(pageComposite, SWT.CHECK);
            //         jarSearch.setText("Exclude JAR files");
            //         jarSearch.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,false,1,1));
        }

        createExtensionEditor(pageComposite);

        setControl(searchText);
    }

    private void createExtensionEditor(Composite pageComposite) {

        GridLayout pageLayout = new GridLayout();
        pageLayout.numColumns = 1;
        pageLayout.marginWidth = 1;

        Composite labelComposite = new Composite(pageComposite, SWT.FILL);
        labelComposite.setLayout(pageLayout);
        Label label = new Label(labelComposite, SWT.NONE);
        label.setText("File types:");
        labelComposite.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, 1, 1));

        Composite extensionsComposite = new Composite(pageComposite, SWT.FILL);
        extensionsComposite.setLayout(pageLayout);
        extensionsComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));

        extensionEditor = new StringButtonFieldEditor(PreferenceConstants.P_SEARCH_EXTENSIONS, "",
                extensionsComposite) {
            protected String changePressed() {
                String exts = this.getStringValue();
                exts = exts.replace(" ", "");

                List<String> extList = Arrays.asList(exts.split(","));
                TypeFilteringDialog dialog = new TypeFilteringDialog(getShell(), extList);
                dialog.open();

                Object[] newSelectedTypes = dialog.getResult();

                return StringUtils.join(newSelectedTypes, ",");
            }

        };
        extensionEditor.setChangeButtonText("Choose...");
        extensionEditor.setEmptyStringAllowed(true);
        extensionEditor.setPreferenceStore(InstaSearchPlugin.getDefault().getPreferenceStore());
        extensionEditor.load();

        Text txt = extensionEditor.getTextControl(extensionsComposite);
        txt.setToolTipText("E.g:\njava, xml");
    }

    private void createShowViewLink(Composite pageComposite) {
        Composite linkComposite = new Composite(pageComposite, SWT.FILL);
        GridLayout pageLayout = new GridLayout();
        pageLayout.numColumns = 2;
        pageLayout.marginWidth = 1;

        linkComposite.setLayout(pageLayout);
        linkComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));

        Link openViewLink = new Link(linkComposite, SWT.NONE);
        openViewLink.setText("You can search directly from the <a>search view</a>");
        openViewLink.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                InstaSearchUI.showSearchView();
            }
        });
        openViewLink.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false, 1, 1));
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        searchText.setFocus();
        container.setPerformActionEnabled(true);
    }

}