/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.internal.search.ui; import com.google.dart.engine.search.SearchMatch; import com.google.dart.tools.core.DartCore; import com.google.dart.tools.core.DartCoreDebug; import com.google.dart.tools.internal.search.ui.text.FileSearchPage; import com.google.dart.tools.search.internal.ui.text.FileSearchQuery; import com.google.dart.tools.search.internal.ui.text.FileSearchResult; import com.google.dart.tools.search.ui.ISearchQuery; import com.google.dart.tools.search.ui.text.FileTextSearchScope; import com.google.dart.tools.search.ui.text.Match; import com.google.dart.tools.ui.DartPluginImages; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.internal.util.ExceptionHandler; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.progress.UIJob; import java.text.MessageFormat; /** * @coverage dart.editor.ui.search */ public class TextSearchPage extends SearchPage { private static final String[] DEFAULT_FILE_EXTENSIONS = {"*"}; private final SearchView searchView; private final String taskName; private final String searchText; private FileSearchPage fileSearchPage; private FileSearchResult searchResult; private IAction refreshAction = new Action() { { setToolTipText("Refresh the Current Search"); DartPluginImages.setLocalImageDescriptors(this, "refresh.gif"); } @Override public void run() { refresh(); } }; private IAction removeAction = new Action() { { setToolTipText("Remove Selected Matches"); DartPluginImages.setLocalImageDescriptors(this, "search_rem.gif"); } @Override public void run() { fileSearchPage.internalRemoveSelected(); } }; private IAction removeAllAction = new Action() { { setToolTipText("Remove All Matches"); DartPluginImages.setLocalImageDescriptors(this, "search_remall.gif"); } @Override public void run() { searchView.showPage(null); } }; public TextSearchPage(SearchView searchView, String taskName, String searchText) { this.searchView = searchView; this.taskName = taskName; this.searchText = searchText; fileSearchPage = new FileSearchPage(); } @Override public void createControl(Composite parent) { fileSearchPage.createControl(parent); } @Override public void dispose() { super.dispose(); if (fileSearchPage != null) { fileSearchPage.dispose(); fileSearchPage = null; } } @Override public Control getControl() { return fileSearchPage.getControl(); } @Override public long getLastQueryFinishTime() { return 0; } @Override public long getLastQueryStartTime() { return 0; } @Override public void init(IPageSite pageSite) { super.init(pageSite); fileSearchPage.init(pageSite); } @Override public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) { toolBarManager.add(new Separator()); toolBarManager.add(removeAction); toolBarManager.add(removeAllAction); toolBarManager.add(new Separator()); toolBarManager.add(refreshAction); } @Override public void setFocus() { fileSearchPage.setFocus(); } @Override public void show() { refresh(); } private FileTextSearchScope createTextSearchScope() { return FileTextSearchScope.newWorkspaceScope(DEFAULT_FILE_EXTENSIONS, false); } private boolean isInWrongPackageFolder(IFile file) { return DartCore.isInSelfLinkedPackageFolder(file) || DartCore.isInDuplicatePackageFolder(file); } private ISearchQuery newQuery() throws CoreException { return new FileSearchQuery(searchText, false, false, createTextSearchScope()); } /** * Runs background {@link Job} to fetch {@link SearchMatch}s and then displays them in the * {@link #viewer}. */ private void refresh() { try { new Job(taskName) { @Override protected IStatus run(IProgressMonitor monitor) { try { ISearchQuery searchQuery = newQuery(); searchQuery.run(monitor); searchResult = (FileSearchResult) searchQuery.getSearchResult(); removeWrongPackageFolders(); } catch (Throwable e) { DartToolsPlugin.log(e); return Status.CANCEL_STATUS; } // schedule UI update new UIJob("Displaying search results...") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { searchView.setContentDescription(MessageFormat.format( "''{0}'' - {1} text occurrences in workspace", searchText, searchResult.getMatchCount())); if (fileSearchPage != null) { fileSearchPage.setInput(searchResult, fileSearchPage); fileSearchPage.setViewPart(searchView); } return Status.OK_STATUS; } }.schedule(); // done return Status.OK_STATUS; } }.schedule(); } catch (Throwable e) { ExceptionHandler.handle(e, "Search", "Exception during search."); } } /** * Removes matches corresponding to the resources located in the "packages" sub-folder that * references the enclosing package. There are no reason to show them - they are always duplicates * and we don't want to edit "packages" resources anyway. */ private void removeWrongPackageFolders() { Object[] elements = searchResult.getElements(); for (Object element : elements) { // prepare file IFile file = searchResult.getFile(element); if (file == null) { continue; } // remove if in wrong folder if (DartCoreDebug.ENABLE_ANALYSIS_SERVER) { if (DartCore.isPackagesResource(file)) { Match[] matches = searchResult.getMatches(element); searchResult.removeMatches(matches); } } else { if (isInWrongPackageFolder(file)) { Match[] matches = searchResult.getMatches(element); searchResult.removeMatches(matches); } } } } }