[Pydev-cvs] org.python.pydev/src_dltk_console/org/python/pydev/dltk/console/ui ScriptConsole.java,
Brought to you by:
fabioz
Update of /cvsroot/pydev/org.python.pydev/src_dltk_console/org/python/pydev/dltk/console/ui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8584/src_dltk_console/org/python/pydev/dltk/console/ui Added Files: ScriptConsole.java IScriptConsoleSession.java IScriptConsoleListener.java IConsoleStyleProvider.java ScriptConsoleSourceViewerConfiguration.java ScriptConsoleManager.java ScriptConsoleTextHover.java IScriptConsoleViewer.java ScriptConsolePartitioner.java ScriptConsoleUIConstants.java IScriptConsoleInput.java Log Message: Initial commit of console. Based on dltk implementation (but with extensive changes to work in pydev). --- NEW FILE: IConsoleStyleProvider.java --- package org.python.pydev.dltk.console.ui; import org.eclipse.swt.custom.StyleRange; /** * Interface that will create the style range for the contents entered in the console. */ public interface IConsoleStyleProvider { StyleRange createPromptStyle(String prompt, int offset); StyleRange createUserInputStyle(String content, int offset); StyleRange createInterpreterOutputStyle(String content, int offset); StyleRange createInterpreterErrorStyle(String content, int offset); } --- NEW FILE: ScriptConsoleTextHover.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; public abstract class ScriptConsoleTextHover implements ITextHover { protected abstract String getHoverInfoImpl(IScriptConsoleViewer viewer, IRegion hoverRegion); public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { return getHoverInfoImpl((IScriptConsoleViewer) textViewer, hoverRegion); } public IRegion getHoverRegion(ITextViewer textViewer, int offset) { return new Region(offset, 0); } } --- NEW FILE: ScriptConsole.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.ui.console.IConsoleDocumentPartitioner; import org.eclipse.ui.console.IConsoleView; import org.eclipse.ui.console.TextConsole; import org.eclipse.ui.part.IPageBookViewPage; import org.python.pydev.dltk.console.IScriptConsoleInterpreter; import org.python.pydev.dltk.console.InterpreterResponse; import org.python.pydev.dltk.console.ScriptConsoleHistory; import org.python.pydev.dltk.console.ScriptConsolePrompt; import org.python.pydev.dltk.console.ui.internal.ICommandHandler; import org.python.pydev.dltk.console.ui.internal.ScriptConsoleInput; import org.python.pydev.dltk.console.ui.internal.ScriptConsolePage; import org.python.pydev.dltk.console.ui.internal.ScriptConsoleSession; import org.python.pydev.plugin.PydevPlugin; public class ScriptConsole extends TextConsole implements ICommandHandler { private ScriptConsolePage page; private ScriptConsolePartitioner partitioner; private IContentAssistProcessor processor; private ITextHover hover; private IScriptConsoleInterpreter interpreter; private ScriptConsoleSession session; private ListenerList consoleListeners; private ScriptConsolePrompt prompt; private ScriptConsoleHistory history; protected IConsoleDocumentPartitioner getPartitioner() { return partitioner; } public ScriptConsole(String consoleName, String consoleType) { super(consoleName, consoleType, null, true); this.consoleListeners = new ListenerList(ListenerList.IDENTITY); this.prompt = new ScriptConsolePrompt("=>", "->"); //$NON-NLS-1$ //$NON-NLS-2$ this.history = new ScriptConsoleHistory(); this.session = new ScriptConsoleSession(); addListener(this.session); partitioner = new ScriptConsolePartitioner(); getDocument().setDocumentPartitioner(partitioner); partitioner.connect(getDocument()); } public IScriptConsoleSession getSession() { return session; } public void addListener(IScriptConsoleListener listener) { consoleListeners.add(listener); } public void removeListener(IScriptConsoleListener listener) { consoleListeners.remove(listener); } protected void setContentAssistProcessor(IContentAssistProcessor processor) { this.processor = processor; } protected void setInterpreter(IScriptConsoleInterpreter interpreter) { this.interpreter = interpreter; // interpreter.addInitialListenerOperation(new Runnable() { // public void run() { // Object[] listeners = consoleListeners.getListeners(); // String output = ScriptConsole.this.interpreter // .getInitialOuput(); // if (output != null) { // for (int i = 0; i < listeners.length; i++) { // ((IScriptConsoleListener) listeners[i]) // .interpreterResponse(output); // } // } // } // }); } public void setPrompt(ScriptConsolePrompt prompt) { this.prompt = prompt; } public ScriptConsolePrompt getPrompt() { return prompt; } public ScriptConsoleHistory getHistory() { return history; } protected void setTextHover(ITextHover hover) { this.hover = hover; } public IPageBookViewPage createPage(IConsoleView view) { SourceViewerConfiguration cfg = new ScriptConsoleSourceViewerConfiguration(processor, hover); page = new ScriptConsolePage(this, view, cfg); return page; } public void clearConsole() { page.clearConsolePage(); } public IScriptConsoleInput getInput() { return new ScriptConsoleInput(page); } public InterpreterResponse handleCommand(String userInput) throws Exception { Object[] listeners = consoleListeners.getListeners(); for (Object listener:listeners) { ((IScriptConsoleListener)listener).userRequest(userInput); } InterpreterResponse response = interpreter.exec(userInput); prompt.setMode(!response.more); for (Object listener:listeners) { ((IScriptConsoleListener)listener).interpreterResponse(response.out); ((IScriptConsoleListener)listener).interpreterResponse(response.err); } return response; } public void terminate() { try { interpreter.close(); } catch (Exception e) { PydevPlugin.log(e); } } } --- NEW FILE: ScriptConsoleUIConstants.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; /** * Constants for the console UI. */ public class ScriptConsoleUIConstants { public static final String TERMINATE_ICON = "terminate.gif"; //$NON-NLS-1$ public static final String SAVE_SESSION_ICON = "save.gif"; //$NON-NLS-1$ } --- NEW FILE: ScriptConsolePartitioner.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.jface.text.TypedRegion; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.console.IConsoleDocumentPartitioner; /** * This document partitioner does not actually partition things, but receives ranges with the * valid styles, so, each range maps to a style. * * Aside from that, all is marked as the default content type. */ public class ScriptConsolePartitioner implements IConsoleDocumentPartitioner { private static final String[] LEGAL_CONTENT_TYPES = new String[]{IDocument.DEFAULT_CONTENT_TYPE}; private List<StyleRange> ranges = new ArrayList<StyleRange>(); public ScriptConsolePartitioner() { } /** * Adds a given style range. * * When a range is added, the ranges that were added before must be removed/updated if the added range * has some intersection with a previous one. * * The ranges must all be set sequentially, so, all the ranges that have some intersection with that * range must be removed/updated. * * @param r the range to be added. */ public void addRange(StyleRange r) { if(r.length > 0){ for(int i=ranges.size()-1; i>=0; i--){ StyleRange last = ranges.get(i); int end = last.start+last.length; if(end > r.start){ if(r.start <= last.start){ ranges.remove(i); }else{ last.length = r.start-last.start; } }else{ // break; } } ranges.add(r); } } /** * @return the ranges that intersect with the given offset/length. */ public StyleRange[] getStyleRanges(int offset, int length) { int lastOffset = offset; List<StyleRange> result = new ArrayList<StyleRange>(); for (StyleRange r:ranges) { if ((r.start >= offset && r.start <= offset + length) || (r.start < offset && r.start+r.length > offset)){ result.add(r); lastOffset = r.start+r.length; } } if(lastOffset < offset+length){ //if we haven't been able to cover the whole range, there's probably something wrong (so, let's //leave it in gray so that we know about that). StyleRange lastPart = new StyleRange(lastOffset, length-lastOffset, Display.getDefault().getSystemColor(SWT.COLOR_GRAY), Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); result.add(lastPart); } return (StyleRange[]) result.toArray(new StyleRange[result.size()]); } //-------------------- Just return default content type for any related request ------------------------------------ public boolean isReadOnly(int offset) { return false; } public ITypedRegion[] computePartitioning(int offset, int length) { return new TypedRegion[]{new TypedRegion(offset, length, IDocument.DEFAULT_CONTENT_TYPE)}; } public void connect(IDocument document) { } public void disconnect() { } public void documentAboutToBeChanged(DocumentEvent event) { } public boolean documentChanged(DocumentEvent event) { return false; } public String getContentType(int offset) { return IDocument.DEFAULT_CONTENT_TYPE; } public String[] getLegalContentTypes() { return LEGAL_CONTENT_TYPES; } public ITypedRegion getPartition(int offset) { return new TypedRegion(offset, 1, IDocument.DEFAULT_CONTENT_TYPE); } } --- NEW FILE: IScriptConsoleSession.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; public interface IScriptConsoleSession { } --- NEW FILE: IScriptConsoleViewer.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import org.eclipse.jface.text.ITextViewer; public interface IScriptConsoleViewer extends ITextViewer { String getCommandLine(); int getCommandLineOffset(); } --- NEW FILE: ScriptConsoleManager.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsoleConstants; import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.IConsoleView; /** * Helper to manage the consoles created. */ public class ScriptConsoleManager { private static ScriptConsoleManager instance; /** * @return the singleton for the script console manager. */ public static synchronized ScriptConsoleManager getInstance() { if (instance == null) { instance = new ScriptConsoleManager(); } return instance; } /** * Reference to the console manager singleton from eclipse. */ private IConsoleManager manager; protected ScriptConsoleManager() { this.manager = ConsolePlugin.getDefault().getConsoleManager(); } /** * @param consoleType the console type we're searching for * @return the currently active console. */ public ScriptConsole getActiveScriptConsole(String consoleType) { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page = window.getActivePage(); if (page != null) { IViewPart part = page.findView(IConsoleConstants.ID_CONSOLE_VIEW); if (part != null && part instanceof IConsoleView) { IConsoleView view = (IConsoleView) part; IConsole console = view.getConsole(); if (console instanceof ScriptConsole && console.getType().equals(consoleType)) { return (ScriptConsole) console; } } } } return null; } /** * Terminates the execution of the given console and removes it from the list of available consoles. * @param console the console to be terminated and removed. */ public void close(ScriptConsole console) { console.terminate(); manager.removeConsoles(new IConsole[] { console }); } /** * Closes all the script consoles available. */ public void closeAll() { IConsole[] consoles = manager.getConsoles(); for (int i = 0; i < consoles.length; ++i) { IConsole console = consoles[i]; if (console instanceof ScriptConsole) { close((ScriptConsole) console); } } } /** * Adds a given console to the console view. * * @param console the console to be added to the console view * @param show whether it should be shown or not. */ public void add(ScriptConsole console, boolean show) { manager.addConsoles(new IConsole[] { console }); if (show) { manager.showConsoleView(console); } } } --- NEW FILE: IScriptConsoleListener.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; public interface IScriptConsoleListener { void userRequest(String text); void interpreterResponse(String text); } --- NEW FILE: ScriptConsoleSourceViewerConfiguration.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.contentassist.ContentAssistant; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; public class ScriptConsoleSourceViewerConfiguration extends SourceViewerConfiguration { private static final int DEFAULT_TAB_WIDTH = 4; private static final int DEFAULT_CA_DELAY = 50; private static final String PARTITION_TYPE = IDocument.DEFAULT_CONTENT_TYPE; private IContentAssistProcessor processor; private ITextHover hover; public ScriptConsoleSourceViewerConfiguration(IContentAssistProcessor processor, ITextHover hover) { this.processor = processor; this.hover = hover; } public int getTabWidth(ISourceViewer sourceViewer) { return DEFAULT_TAB_WIDTH; } public ITextHover getTextHover(ISourceViewer sv, String contentType) { return hover; } public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { return new String[] { PARTITION_TYPE }; } public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { ContentAssistant ca = new ContentAssistant(); ca.setContentAssistProcessor(processor, PARTITION_TYPE); ca.enableAutoActivation(true); ca.enableAutoInsert(false); ca.setAutoActivationDelay(DEFAULT_CA_DELAY); return ca; } } --- NEW FILE: IScriptConsoleInput.java --- /******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.python.pydev.dltk.console.ui; public interface IScriptConsoleInput { void insertText(String line); } |