Package it.unibz.instasearch.ui

Source Code of it.unibz.instasearch.ui.InstaSearchPage

/*
* 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);
  }
 
 
}
TOP

Related Classes of it.unibz.instasearch.ui.InstaSearchPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.