/** * Copyright (c) 2005-2013 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.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.ui.internal.texteditor.TextEditorPlugin; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.editor.IOfflineActionWithParameters; import org.python.pydev.editor.PyEdit; import org.python.pydev.shared_core.string.StringUtils; import org.python.pydev.shared_ui.EditorUtils; /** * Action to search in open documents. * * Uses the information that the FindReplace dialog obtained on whether the search is case-sensitive, * whole word, regexp. * * To know what to search, it can use the parameters passed to the action or get the currently * selected text in the editor. */ public class PySearchInOpenDocumentsAction extends Action implements IOfflineActionWithParameters { private List<String> parameters; private PyEdit edit; public PySearchInOpenDocumentsAction(PyEdit edit) { this.edit = edit; } @Override public void setParameters(List<String> parameters) { this.parameters = parameters; } @Override public void run() { IDialogSettings settings = TextEditorPlugin.getDefault().getDialogSettings(); IDialogSettings s = settings.getSection("org.eclipse.ui.texteditor.FindReplaceDialog"); boolean caseSensitive = false; boolean wholeWord = false; boolean isRegEx = false; if (s != null) { caseSensitive = s.getBoolean("casesensitive"); //$NON-NLS-1$ wholeWord = s.getBoolean("wholeword"); //$NON-NLS-1$ isRegEx = s.getBoolean("isRegEx"); //$NON-NLS-1$ } String searchText = ""; if (parameters != null) { searchText = StringUtils.join(" ", parameters); } if (searchText.length() == 0) { PySelection ps = new PySelection(edit); searchText = ps.getSelectedText(); } IStatusLineManager statusLineManager = edit.getStatusLineManager(); if (searchText.length() == 0) { InputDialog d = new InputDialog(EditorUtils.getShell(), "Text to search", "Enter text to search.", "", null); int retCode = d.open(); if (retCode == InputDialog.OK) { searchText = d.getValue(); } } if (searchText.length() >= 0) { if (wholeWord && !isRegEx && isWord(searchText)) { isRegEx = true; searchText = "\\b" + searchText + "\\b"; } FindInOpenDocuments.findInOpenDocuments(searchText, caseSensitive, wholeWord, isRegEx, statusLineManager); } } /** * Tests whether each character in the given string is a letter. * * @param str the string to check * @return <code>true</code> if the given string is a word */ private boolean isWord(String str) { if (str == null || str.length() == 0) { return false; } for (int i = 0; i < str.length(); i++) { if (!Character.isJavaIdentifierPart(str.charAt(i))) { return false; } } return true; } }