/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.python.pydev.refactoring.ui.findreplace; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.search.ui.ISearchQuery; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.search.ui.text.FileTextSearchScope; import org.eclipse.search.ui.text.TextSearchQueryProvider; import org.eclipse.search.ui.text.TextSearchQueryProvider.TextSearchInput; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.part.MultiPageEditorPart; import org.python.pydev.core.log.Log; import org.python.pydev.editor.actions.PyAction; /** * Helper to make a search in the currently opened documents. */ public class FindInOpenDocuments { /** * Here, all the editors available will be gotten and searched (if possible). * * Note that editors that are not in the workspace may not be searched (it should be possible * to do, but one may have to reimplement large portions of the search for that to work). */ public static void findInOpenDocuments(final String searchText, final boolean caseSensitive, final boolean wholeWord, final boolean isRegEx, IStatusLineManager statusLineManager) { IWorkbenchWindow window = PyAction.getActiveWorkbenchWindow(); if (window == null) { if (statusLineManager != null) statusLineManager.setErrorMessage("Active workbench window is null."); return; } IWorkbenchPage activePage = window.getActivePage(); if (activePage == null) { if (statusLineManager != null) statusLineManager.setErrorMessage("Active page is null."); return; } IEditorReference editorsArray[] = activePage.getEditorReferences(); final List<IFile> files = new ArrayList<IFile>(); for (int i = 0; i < editorsArray.length; i++) { IEditorPart realEditor = editorsArray[i].getEditor(true); if (realEditor != null) { if (realEditor instanceof MultiPageEditorPart) { try { Method getPageCount = MultiPageEditorPart.class.getDeclaredMethod("getPageCount"); getPageCount.setAccessible(true); Method getEditor = MultiPageEditorPart.class.getDeclaredMethod("getEditor", int.class); getEditor.setAccessible(true); Integer pageCount = (Integer) getPageCount.invoke(realEditor); for (int j = 0; j < pageCount; j++) { IEditorPart part = (IEditorPart) getEditor.invoke(realEditor, j); if (part != null) { IEditorInput input = part.getEditorInput(); if (input != null) { IFile file = (IFile) input.getAdapter(IFile.class); if (file != null) { files.add(file); } } } } } catch (Throwable e1) { //Log it but keep going on. Log.log(e1); } } else { IEditorInput input = realEditor.getEditorInput(); if (input != null) { IFile file = (IFile) input.getAdapter(IFile.class); if (file != null) { files.add(file); } else { //it has input, but it's not adaptable to an IFile! if (statusLineManager != null) statusLineManager .setMessage("Warning: Editors not in the workspace cannot be searched."); //but we keep on going... } } } } } if (files.size() == 0) { if (statusLineManager != null) statusLineManager .setMessage("No file was found to perform the search (editors not in the workspace cannot be searched)."); return; } try { ISearchQuery query = TextSearchQueryProvider.getPreferred().createQuery(new TextSearchInput() { public boolean isRegExSearch() { return isRegEx; } public boolean isCaseSensitiveSearch() { return caseSensitive; } public String getSearchText() { return searchText; } public FileTextSearchScope getScope() { return FileTextSearchScope.newSearchScope(files.toArray(new IResource[files.size()]), new String[] { "*" }, true); } }); NewSearchUI.runQueryInBackground(query); } catch (CoreException e1) { Log.log(e1); } } }