/** * 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. */ /* * Created on Mar 7, 2006 */ package com.python.pydev.interactiveconsole; import java.io.File; import java.util.ListResourceBundle; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.widgets.Display; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.core.log.Log; import org.python.pydev.debug.newconsole.PydevConsoleFactory; import org.python.pydev.debug.newconsole.prefs.InteractiveConsolePrefs; import org.python.pydev.editor.PyEdit; import org.python.pydev.shared_interactive_console.console.codegen.PythonSnippetUtils; import org.python.pydev.shared_interactive_console.console.ui.ScriptConsole; import org.python.pydev.shared_interactive_console.console.ui.internal.ScriptConsoleViewer; import org.python.pydev.shared_interactive_console.console.ui.internal.actions.IInteractiveConsoleConstants; import org.python.pydev.shared_ui.editor.BaseEditor; import org.python.pydev.shared_ui.editor.IPyEditListener; /** * This class will setup the editor so that we can create interactive consoles, send code to it or make an execfile. * * It is as a 'singleton' for all PyEdit editors. */ public class EvaluateActionSetter implements IPyEditListener { private class EvaluateAction extends Action { private final PyEdit edit; private EvaluateAction(PyEdit edit) { super(); this.edit = edit; } @Override public void run() { try { PySelection selection = new PySelection(edit); ScriptConsole console = ScriptConsole.getActiveScriptConsole(); if (console == null) { //if no console is available, create it (if possible). PydevConsoleFactory factory = new PydevConsoleFactory(); String cmd = null; //Check if the current selection should be sent to the editor. if (InteractiveConsolePrefs.getSendCommandOnCreationFromEditor()) { cmd = getCommandToSend(edit, selection); if (cmd != null) { cmd = "\n" + cmd; } } factory.createConsole(cmd); } else { if (console instanceof ScriptConsole) { //ok, console available sendCommandToConsole(selection, console, this.edit); } } } catch (Exception e) { Log.log(e); } } } /** * Sends the current selected text/editor to the console. */ private static void sendCommandToConsole(PySelection selection, ScriptConsole console, PyEdit edit) throws BadLocationException { ScriptConsole pydevConsole = console; IDocument document = pydevConsole.getDocument(); String cmd = getCommandToSend(edit, selection); if (cmd != null) { document.replace(document.getLength(), 0, cmd); } if (InteractiveConsolePrefs.getFocusConsoleOnSendCommand()) { ScriptConsoleViewer viewer = pydevConsole.getViewer(); if (viewer == null) { return; } StyledText textWidget = viewer.getTextWidget(); if (textWidget == null) { return; } textWidget.setFocus(); } } /** * Gets the command to send to the console (either the selected text or a runfile with the editor). */ private static String getCommandToSend(PyEdit edit, PySelection selection) { String cmd = null; String code = selection.getTextSelection().getText(); if (code.length() != 0) { cmd = code + "\n"; } else { //no code available: do a runfile in the current context File editorFile = edit.getEditorFile(); if (editorFile != null) { cmd = PythonSnippetUtils.getRunfileCommand(editorFile); } } return cmd; } /** * This method associates Ctrl+new line with the evaluation of commands in the console. */ @Override public void onCreateActions(ListResourceBundle resources, final BaseEditor baseEditor, IProgressMonitor monitor) { final PyEdit edit = (PyEdit) baseEditor; final EvaluateAction evaluateAction = new EvaluateAction(edit); evaluateAction.setActionDefinitionId(IInteractiveConsoleConstants.EVALUATE_ACTION_ID); evaluateAction.setId(IInteractiveConsoleConstants.EVALUATE_ACTION_ID); Runnable runnable = new Runnable() { @Override public void run() { if (!edit.isDisposed()) { edit.setAction(IInteractiveConsoleConstants.EVALUATE_ACTION_ID, evaluateAction); } } }; Display.getDefault().syncExec(runnable); } @Override public void onSave(BaseEditor baseEditor, IProgressMonitor monitor) { //ignore } @Override public void onDispose(BaseEditor baseEditor, IProgressMonitor monitor) { //ignore } @Override public void onSetDocument(IDocument document, BaseEditor baseEditor, IProgressMonitor monitor) { //ignore } }