/* * Copyright (c) 2014, 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.common.collect.Lists; import com.google.common.util.concurrent.Uninterruptibles; import com.google.dart.server.FindMemberDeclarationsConsumer; import com.google.dart.tools.core.DartCore; import com.google.dart.tools.core.analysis.model.SearchResultsListener; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.actions.AbstractDartSelectionAction_NEW; import com.google.dart.tools.ui.internal.search.SearchMessages; import com.google.dart.tools.ui.internal.text.DartHelpContextIds; import com.google.dart.tools.ui.internal.text.editor.DartEditor; import com.google.dart.tools.ui.internal.text.functions.DartWordFinder; import com.google.dart.tools.ui.internal.util.ExceptionHandler; import org.dartlang.analysis.server.protocol.RequestError; import org.dartlang.analysis.server.protocol.SearchResult; import org.eclipse.core.resources.IProject; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.PlatformUI; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * Finds declarations similar to the selected in the workspace. * * @coverage dart.editor.ui.search */ public class FindDeclarationsAction_NEW extends AbstractDartSelectionAction_NEW { /** * Asks {@link SearchView} to execute query and display results. */ public static void doSearch(final String name) { try { SearchView view = (SearchView) DartToolsPlugin.showView(SearchView.ID); if (view == null) { return; } String taskName = "Searching for declarations of '" + name + "'..."; view.showPage(new SearchResultPage_NEW(view, taskName) { @Override protected boolean canUseFilterPotential() { return false; } @Override protected IProject getCurrentProject() { return FindReferencesAction.findCurrentProject(); } @Override protected String getQueryElementName() { return name; } @Override protected String getQueryKindName() { return "declarations"; } @Override protected List<SearchResult> runQuery() { final List<SearchResult> allResults = Lists.newArrayList(); final CountDownLatch latch = new CountDownLatch(1); DartCore.getAnalysisServer().search_findMemberDeclarations( name, new FindMemberDeclarationsConsumer() { @Override public void computedSearchId(String searchId) { DartCore.getAnalysisServerData().addSearchResultsListener( searchId, new SearchResultsListener() { @Override public void computedSearchResults(List<SearchResult> results, boolean last) { allResults.addAll(results); if (last) { latch.countDown(); } } }); } @Override public void onError(RequestError requestError) { latch.countDown(); } }); Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.MINUTES); return allResults; } }); } catch (Throwable e) { ExceptionHandler.handle(e, "Find Declarations", "Exception during search."); } } private String selectionName; public FindDeclarationsAction_NEW(DartEditor editor) { super(editor); } @Override public void run() { super.run(); if (selectionName != null) { doSearch(selectionName); } } @Override public void selectionChanged(ISelection selection) { super.selectionChanged(selection); updateSelectionName(); setEnabled(selectionName != null); } @Override protected void init() { setText(SearchMessages.Search_FindDeclarationsAction_label); setToolTipText(SearchMessages.Search_FindDeclarationsAction_tooltip); PlatformUI.getWorkbench().getHelpSystem().setHelp( this, DartHelpContextIds.FIND_DECLARATIONS_IN_WORKSPACE_ACTION); } private void updateSelectionName() { selectionName = null; try { IDocument document = editor.getViewer().getDocument(); IRegion nameRegion = DartWordFinder.findWord(document, selectionOffset); if (nameRegion == null) { return; } if (nameRegion.getLength() == 0) { return; } selectionName = document.get(nameRegion.getOffset(), nameRegion.getLength()); } catch (Throwable e) { } } }