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