diff options
31 files changed, 610 insertions, 2671 deletions
diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml index 1a648d83e..2d335b7c9 100644 --- a/org.eclipse.debug.ui/plugin.xml +++ b/org.eclipse.debug.ui/plugin.xml @@ -1965,5 +1965,16 @@ M4 = Platform-specific fourth key value="org.eclipse.debug.internal.ui.views.memory.HexRenderer"> </rendering_property> </rendering> + </extension> + <extension + point="org.eclipse.ui.console.consolePatternMatchListener"> + <consolePatternMatchListener + class="org.eclipse.debug.internal.ui.views.console.ConsoleLineNotifier" + id="org.eclipse.debug.ui.consoleLineNotifier" + regex=".*\r(\n?)|.*\n"> + <enablement> + <instanceof value="org.eclipse.debug.internal.ui.views.console.ProcessConsole"/> + </enablement> + </consolePatternMatchListener> </extension> </plugin>
\ No newline at end of file diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java deleted file mode 100644 index 30a078cc6..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.internal.ui.DebugUIPlugin; - -/** - * A partition in a console document that represents a break after an input - * partition. This represents a hard break that the user cannot backspace/delete. - */ -public class BreakPartition extends StreamPartition { - - /** - * Partition type - */ - public static final String BREAK_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".BREAK_PARTITION_TYPE"; //$NON-NLS-1$ - - - public BreakPartition(String streamIdentifier, int offset, int length) { - super(streamIdentifier, offset, length, BREAK_PARTITION_TYPE); - } - - /** - * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int) - */ - public StreamPartition createNewPartition(String streamIdentifier, int offset, int length) { - return new BreakPartition(streamIdentifier, offset, length); - } - -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java deleted file mode 100644 index 6b37c3ff0..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.ui.console.IConsoleColorProvider; -import org.eclipse.jface.text.AbstractDocument; -import org.eclipse.jface.text.DefaultLineTracker; -import org.eclipse.jface.text.ITextStore; - -public class ConsoleDocument extends AbstractDocument { - - private IConsoleColorProvider fColorProvider; - - public ConsoleDocument(IConsoleColorProvider colorProvider) { - fColorProvider = colorProvider; - setTextStore(newTextStore()); - setLineTracker(new DefaultLineTracker()); - completeInitialization(); - } - - /** - * Returns whether this document is read-only. - */ - public boolean isReadOnly() { - return fColorProvider.isReadOnly(); - } - - /** - * Creates a new text store for this document. - */ - protected ITextStore newTextStore() { - return new ConsoleOutputTextStore(2500); - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java deleted file mode 100644 index 2fa82933c..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java +++ /dev/null @@ -1,370 +0,0 @@ -///******************************************************************************* -// * Copyright (c) 2000, 2004 IBM Corporation and others. -// * All rights reserved. This program and the accompanying materials -// * are made available under the terms of the Common Public License v1.0 -// * which accompanies this distribution, and is available at -// * http://www.eclipse.org/legal/cpl-v10.html -// * -// * Contributors: -// * IBM Corporation - initial API and implementation -// *******************************************************************************/ -//package org.eclipse.debug.internal.ui.views.console; -// -// -//import java.text.MessageFormat; -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.Iterator; -//import java.util.List; -//import java.util.Map; -// -//import org.eclipse.core.runtime.CoreException; -//import org.eclipse.core.runtime.IConfigurationElement; -//import org.eclipse.core.runtime.IExtensionPoint; -//import org.eclipse.core.runtime.Platform; -//import org.eclipse.debug.core.DebugPlugin; -//import org.eclipse.debug.core.ILaunch; -//import org.eclipse.debug.core.ILaunchListener; -//import org.eclipse.debug.core.ILaunchManager; -//import org.eclipse.debug.core.model.IProcess; -//import org.eclipse.debug.internal.ui.DebugUIPlugin; -//import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants; -//import org.eclipse.debug.ui.IDebugUIConstants; -//import org.eclipse.debug.ui.console.IConsoleColorProvider; -//import org.eclipse.debug.ui.console.IConsoleLineTracker; -//import org.eclipse.jface.text.IDocument; -//import org.eclipse.ui.console.ConsolePlugin; -//import org.eclipse.ui.console.IConsole; -//import org.eclipse.ui.console.IConsoleManager; -//import org.eclipse.ui.texteditor.IDocumentProvider; -// -///** -// * Creates documents for processes as they are registered with a launch. -// * The singleton manager is accessible from the debug UI plugin. -// */ -//public class ConsoleDocumentManager implements ILaunchListener { -// -// /** -// * Console document content provider extensions, keyed by extension id -// */ -// private Map fColorProviders; -// -// /** -// * Console line trackers; keyed by process type to list of trackers (1:N) -// */ -// private Map fLineTrackers; -// -// /** -// * Default document provider. -// */ -// protected IDocumentProvider fDefaultDocumentProvider = null; -// -// /** -// * Map of processes for a launch to compute removed processes -// */ -// private Map fProcesses; -// -// /** -// * @see ILaunchListener#launchRemoved(ILaunch) -// */ -// public void launchRemoved(ILaunch launch) { -// removeLaunch(launch); -// } -// -// protected void removeLaunch(ILaunch launch) { -// IProcess[] processes= launch.getProcesses(); -// for (int i= 0; i < processes.length; i++) { -// IProcess iProcess = processes[i]; -// removeProcess(iProcess); -// } -// if (fProcesses != null) { -// fProcesses.remove(launch); -// } -// } -// -// /** -// * Removes the console and document associated with the given process. -// * -// * @param iProcess process to clean up -// */ -// private void removeProcess(IProcess iProcess) { -// IConsole console = getConsole(iProcess); -// if (console != null) { -// IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); -// manager.removeConsoles(new IConsole[]{console}); -// } -// IDocumentProvider provider = getDocumentProvider(); -// provider.disconnect(iProcess); -// } -// -// /** -// * Returns the console for the given process, or <code>null</code> if none. -// * -// * @param process -// * @return the console for the given process, or <code>null</code> if none -// */ -// public IConsole getConsole(IProcess process) { -// IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); -// IConsole[] consoles = manager.getConsoles(); -// for (int i = 0; i < consoles.length; i++) { -// IConsole console = consoles[i]; -// if (console instanceof ProcessConsole) { -// ProcessConsole pc = (ProcessConsole)console; -// if (pc.getProcess().equals(process)) { -// return pc; -// } -// } -// } -// return null; -// } -// -// /** -// * @see ILaunchListener#launchAdded(ILaunch) -// */ -// public void launchAdded(ILaunch launch) { -// launchChanged(launch); -// } -// -// /** -// * @see ILaunchListener#launchChanged(ILaunch) -// */ -// public void launchChanged(final ILaunch launch) { -// DebugUIPlugin.getStandardDisplay().syncExec(new Runnable () { -// public void run() { -// IProcess[] processes= launch.getProcesses(); -// for (int i= 0; i < processes.length; i++) { -// if (getConsoleDocument(processes[i]) == null) { -// // create new document -// IProcess process = processes[i]; -// IDocumentProvider provider = getDocumentProvider(); -// try { -// provider.connect(process); -// } catch (CoreException e) { -// } -// ProcessConsole pc = new ProcessConsole(process); -// ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc}); -// } -// } -// List removed = getRemovedProcesses(launch); -// if (removed != null) { -// Iterator iterator = removed.iterator(); -// while (iterator.hasNext()) { -// IProcess p = (IProcess) iterator.next(); -// removeProcess(p); -// } -// } -// } -// }); -// } -// -// /** -// * Returns the document for the process, or <code>null</code> -// * if none. -// */ -// public IDocument getConsoleDocument(IProcess process) { -// IDocumentProvider provider = getDocumentProvider(); -// return provider.getDocument(process); -// } -// -// /** -// * Returns the document provider. -// * -// * @return document provider -// */ -// private IDocumentProvider getDocumentProvider() { -// if (fDefaultDocumentProvider == null) { -// fDefaultDocumentProvider = new ConsoleDocumentProvider(); -// } -// return fDefaultDocumentProvider; -// } -// -// /** -// * Called by the debug ui plug-in on startup. -// * The console document manager starts listening for -// * launches to be registered and initializes if any launches -// * already exist. -// */ -// public void startup() { -// ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager(); -// launchManager.addLaunchListener(this); -// -// //set up the docs for launches already registered -// ILaunch[] launches= launchManager.getLaunches(); -// for (int i = 0; i < launches.length; i++) { -// launchAdded(launches[i]); -// } -// } -// -// /** -// * Called by the debug ui plug-in on shutdown. -// * The console document manager de-registers as a -// * launch listener and kills all existing console documents. -// */ -// public void shutdown() { -// ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager(); -// ILaunch[] launches = launchManager.getLaunches(); -// for (int i = 0; i < launches.length; i++) { -// ILaunch launch = launches[i]; -// removeLaunch(launch); -// } -// launchManager.removeLaunchListener(this); -// if (fProcesses != null) { -// fProcesses.clear(); -// } -// } -// -// /** -// * Notifies the console document manager that system err is about to be written -// * to the console. The manager will open the console if the preference is -// * set to show the console on system err. -// */ -// protected void aboutToWriteSystemErr(IProcess process) { -// if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR)) { -// showConsole(process); -// } -// } -// -// /** -// * Notifies the console document manager that system out is about to be written -// * to the console. The manager will open the console if the preference is -// * set to show the console on system out and the console document being written -// * is associated with the current process. -// */ -// protected void aboutToWriteSystemOut(IProcess process) { -// if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT)) { -// showConsole(process); -// } -// } -// -// /** -// * Opens the console view. If the view is already open, it is brought to the front. -// */ -// protected void showConsole(final IProcess process) { -// ConsolePlugin.getDefault().getConsoleManager().showConsoleView(getConsole(process)); -// } -// -// /** -// * Returns a new console document color provider extension for the given -// * process type, or <code>null</code> if none. -// * -// * @param type corresponds to <code>IProcess.ATTR_PROCESS_TYPE</code> -// * @return IConsoleColorProvider -// */ -// public IConsoleColorProvider getColorProvider(String type) { -// if (fColorProviders == null) { -// fColorProviders = new HashMap(); -// IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_COLOR_PROVIDERS); -// IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); -// for (int i = 0; i < elements.length; i++) { -// IConfigurationElement extension = elements[i]; -// fColorProviders.put(extension.getAttributeAsIs("processType"), extension); //$NON-NLS-1$ -// } -// } -// IConfigurationElement extension = (IConfigurationElement)fColorProviders.get(type); -// if (extension != null) { -// try { -// Object colorProvider = extension.createExecutableExtension("class"); //$NON-NLS-1$ -// if (colorProvider instanceof IConsoleColorProvider) { -// return (IConsoleColorProvider)colorProvider; -// } -// DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.1"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()} )); //$NON-NLS-1$ -// } catch (CoreException e) { -// DebugUIPlugin.log(e); -// } -// } -// return null; -// } -// -// /** -// * Creates and retuns a new line notifier for the given type of process, or -// * <code>null</code> if none. The notifier will be seeded with new console -// * line listeners registered for the given process type. -// * -// * @param type process type -// * @return line notifier or <code>null</code> -// */ -// public ConsoleLineNotifier newLineNotifier(String type) { -// if (fLineTrackers == null) { -// fLineTrackers = new HashMap(); -// IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_LINE_TRACKERS); -// IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); -// for (int i = 0; i < elements.length; i++) { -// IConfigurationElement extension = elements[i]; -// String processType = extension.getAttributeAsIs("processType"); //$NON-NLS-1$ -// List list = (List)fLineTrackers.get(processType); -// if (list == null) { -// list = new ArrayList(); -// fLineTrackers.put(processType, list); -// } -// list.add(extension); -// } -// } -// List extensions = (List)fLineTrackers.get(type); -// ConsoleLineNotifier lineNotifier = null; -// if (extensions != null) { -// lineNotifier = new ConsoleLineNotifier(); -// Iterator iter = extensions.iterator(); -// while (iter.hasNext()) { -// IConfigurationElement extension = (IConfigurationElement)iter.next(); -// try { -// Object tracker = extension.createExecutableExtension("class"); //$NON-NLS-1$ -// if (tracker instanceof IConsoleLineTracker) { -// lineNotifier.addConsoleListener((IConsoleLineTracker)tracker); -// } else { -// DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.2"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()})); //$NON-NLS-1$ -// } -// } catch (CoreException e) { -// DebugUIPlugin.log(e); -// } -// } -// } -// return lineNotifier; -// } -// -// /** -// * Returns the processes that have been removed from the given -// * launch, or <code>null</code> if none. -// * -// * @param launch launch that has changed -// * @return removed processes or <code>null</code> -// */ -// private List getRemovedProcesses(ILaunch launch) { -// List removed = null; -// if (fProcesses == null) { -// fProcesses = new HashMap(); -// } -// IProcess[] old = (IProcess[]) fProcesses.get(launch); -// IProcess[] curr = launch.getProcesses(); -// if (old != null) { -// for (int i = 0; i < old.length; i++) { -// IProcess process = old[i]; -// if (!contains(curr, process)) { -// if (removed == null) { -// removed = new ArrayList(); -// } -// removed.add(process); -// } -// } -// } -// // update cache with current processes -// fProcesses.put(launch, curr); -// return removed; -// } -// -// /** -// * Returns whether the given object is contained in the list. -// * -// * @param list list to search -// * @param object object to search for -// * @return whether the given object is contained in the list -// */ -// private boolean contains(Object[] list, Object object) { -// for (int i = 0; i < list.length; i++) { -// Object object2 = list[i]; -// if (object2.equals(object)) { -// return true; -// } -// } -// return false; -// } -//} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java deleted file mode 100644 index ab6d5b934..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java +++ /dev/null @@ -1,1003 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.debug.internal.ui.views.console; - - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Vector; - -import org.eclipse.debug.core.DebugEvent; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IDebugEventSetListener; -import org.eclipse.debug.core.IStreamListener; -import org.eclipse.debug.core.model.IFlushableStreamMonitor; -import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.core.model.IStreamMonitor; -import org.eclipse.debug.core.model.IStreamsProxy; -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants; -import org.eclipse.debug.ui.DebugUITools; -import org.eclipse.debug.ui.IDebugUIConstants; -import org.eclipse.debug.ui.console.IConsole; -import org.eclipse.debug.ui.console.IConsoleColorProvider; -import org.eclipse.debug.ui.console.IConsoleHyperlink; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.BadPositionCategoryException; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IDocumentPartitioner; -import org.eclipse.jface.text.IDocumentPartitionerExtension; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITypedRegion; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.console.ConsolePlugin; -import org.eclipse.ui.console.IPatternMatchListener; - -/** - * Default console document partitioner. Partitions a document into - * color regions for standard in, out, err. - */ -public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocumentPartitionerExtension, IPropertyChangeListener, IConsole, IDebugEventSetListener { - - protected IProcess fProcess; - protected IConsoleColorProvider fColorProvider; - private IStreamsProxy fProxy; - protected List fStreamListeners = new ArrayList(2); - - private String[] fSortedLineDelimiters; - - // high and low water marks for buffering output - private boolean fUpdatingBuffer = false; - private int fLowWaterMark; - private int fHighWaterMark; - - // max amount of output (characters) processed per poll - private int fMaxAppendSize; - - class StreamEntry { - /** - * Identifier of the stream written to. - */ - private String fStreamIdentifier; - /** - * The text written - */ - private String fText = null; - - StreamEntry(String text, String streamIdentifier) { - fText = text; - fStreamIdentifier = streamIdentifier; - } - - /** - * Returns the stream identifier - */ - public String getStreamIdentifier() { - return fStreamIdentifier; - } - - /** - * Returns the text written - */ - public String getText() { - return fText; - } - - public boolean isClosedEntry() { - return false; - } - } - - /** - * A stream entry representing stream closure - */ - class StreamsClosedEntry extends StreamEntry { - StreamsClosedEntry() { - super("", ""); //$NON-NLS-1$ //$NON-NLS-2$ - } - - public boolean isClosedEntry() { - return true; - } - } - - class StreamListener implements IStreamListener { - - private String fStreamIdentifier; - private IStreamMonitor fStreamMonitor; - private boolean fIsSystemOut = false; - private boolean fIsSystemErr = false; - - public StreamListener(String streamIdentifier, IStreamMonitor streamMonitor) { - fStreamIdentifier = streamIdentifier; - fStreamMonitor = streamMonitor; - fIsSystemOut = IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM.equals(streamIdentifier); - fIsSystemErr = IDebugUIConstants.ID_STANDARD_ERROR_STREAM.equals(streamIdentifier); - } - - public void streamAppended(String newText, IStreamMonitor monitor) { - if (fIsSystemOut) { - DebugUIPlugin.getDefault().getProcessConsoleManager().aboutToWriteSystemOut(getProcess()); - } else if (fIsSystemErr) { - DebugUIPlugin.getDefault().getProcessConsoleManager().aboutToWriteSystemErr(getProcess()); - } - ConsoleDocumentPartitioner.this.streamAppended(newText, fStreamIdentifier); - } - - public void streamClosed(IStreamMonitor monitor) { - //ConsoleDocumentPartitioner.this.streamClosed(fStreamIdentifier); - } - - public void connect() { - fStreamMonitor.addListener(this); - String contents= fStreamMonitor.getContents(); - if (fStreamMonitor instanceof IFlushableStreamMonitor) { - // flush the underlying buffer and do not duplicate storage - IFlushableStreamMonitor flushableStreamMonitor = (IFlushableStreamMonitor)fStreamMonitor; - flushableStreamMonitor.flushContents(); - flushableStreamMonitor.setBuffered(false); - } - if (contents.length() > 0) { - streamAppended(contents, fStreamMonitor); - } - } - - public void disconnect() { - fStreamMonitor.removeListener(this); - } - } - - - /** - * A queue of stream entries written to standard out and standard err. - * Entries appended to the end of the queue and removed from the front. - * Intentionally a vector to obtain synchronization as entries are - * added and removed. - */ - private Vector fQueue = new Vector(10); - - /** - * Thread that polls the queue for new output - */ - private Thread fPollingThread = null; - - /** - * Whether an append is still in progress or to be run - */ - private boolean fAppending = false; - - /** - * Whether the console has been killed/disconnected - */ - private boolean fKilled = false; - - /** - * Whether to keep polling - */ - private boolean fPoll = false; - - /** - * Whether the streams coonnected to the associated process are closed - */ - private boolean fClosed= false; - - /** - * The associated document - */ - private IDocument fDocument = null; - - /** - * The length of the current line - */ - private int fLineLength = 0; - - /** - * Maximum line length before wrapping. - */ - private int fMaxLineLength = 80; - - /** - * Whether using auto-wrap mode - */ - private boolean fWrap = false; - - /** - * List of partitions - */ - private List fPartitions = new ArrayList(5); - - /** - * The base number of milliseconds to pause - * between polls. - */ - private static final long BASE_DELAY= 100L; - - /** - * The identifier of the stream that was last appended to - */ - private String fLastStreamIdentifier= null; - - /** - * Keyboard input buffer - */ - private StringBuffer fInputBuffer = new StringBuffer(); - - /** - * Queue of hyperlinks to be added to the console - */ - private Vector fPendingLinks = new Vector(); - - /** - * The line notifier associated with this partitioner or <code>null</code> if none - */ - private ConsoleLineNotifier fLineNotifier = null; - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#connect(org.eclipse.jface.text.IDocument) - */ - public void connect(IDocument document) { - fDocument = document; - fDocument.addPositionCategory(HyperlinkPosition.HYPER_LINK_CATEGORY); - document.setDocumentPartitioner(this); - IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); - fWrap = store.getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP); - fMaxLineLength = store.getInt(IDebugPreferenceConstants.CONSOLE_WIDTH); - store.addPropertyChangeListener(this); - fColorProvider.connect(fProcess, this); - DebugPlugin.getDefault().addDebugEventListener(this); - if (fProcess.isTerminated()) { - // it is possible the terminate event will have been fired before the - // document is connected - in this case, ensure we have closed the streams - // and notified the line tracker - streamsClosed(); - } - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#disconnect() - */ - public void disconnect() { - kill(); - if (fLineNotifier != null) { - fLineNotifier.disconnect(); - } - fColorProvider.disconnect(); - fDocument.setDocumentPartitioner(null); - DebugPlugin.getDefault().removeDebugEventListener(this); - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) - */ - public void documentAboutToBeChanged(DocumentEvent event) { - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#documentChanged(org.eclipse.jface.text.DocumentEvent) - */ - public boolean documentChanged(DocumentEvent event) { - return documentChanged2(event) != null; - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#getLegalContentTypes() - */ - public String[] getLegalContentTypes() { - return new String[] {InputPartition.INPUT_PARTITION_TYPE, OutputPartition.OUTPUT_PARTITION_TYPE, BreakPartition.BREAK_PARTITION_TYPE}; - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#getContentType(int) - */ - public String getContentType(int offset) { - ITypedRegion partition = getPartition(offset); - if (partition != null) { - return partition.getType(); - } - return null; - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#computePartitioning(int, int) - */ - public ITypedRegion[] computePartitioning(int offset, int length) { - if (offset == 0 && length == fDocument.getLength()) { - return (ITypedRegion[])fPartitions.toArray(new ITypedRegion[fPartitions.size()]); - } - int end = offset + length; - List list = new ArrayList(); - for (int i = 0; i < fPartitions.size(); i++) { - ITypedRegion partition = (ITypedRegion)fPartitions.get(i); - int partitionStart = partition.getOffset(); - int partitionEnd = partitionStart + partition.getLength(); - if ((offset >= partitionStart && offset <= partitionEnd) || - (offset < partitionStart && end >= partitionStart)) { - list.add(partition); - } - } - return (ITypedRegion[])list.toArray(new ITypedRegion[list.size()]); - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitioner#getPartition(int) - */ - public ITypedRegion getPartition(int offset) { - for (int i = 0; i < fPartitions.size(); i++) { - ITypedRegion partition = (ITypedRegion)fPartitions.get(i); - int start = partition.getOffset(); - int end = start + partition.getLength(); - if (offset >= start && offset < end) { - return partition; - } - } - return null; - } - - /** - * @see org.eclipse.jface.text.IDocumentPartitionerExtension#documentChanged2(org.eclipse.jface.text.DocumentEvent) - */ - public IRegion documentChanged2(DocumentEvent event) { - if (fUpdatingBuffer) { - return new Region(0, fDocument.getLength()); - } - addPendingLinks(); - String text = event.getText(); - if (isAppendInProgress()) { - // stream input - addPartition(new OutputPartition(fLastStreamIdentifier, event.getOffset(), text.length())); -// if (fLineNotifier != null) { -// fLineNotifier.consoleChanged(event); -// } - } else { - // console keyboard input - int amountDeleted = event.getLength() - text.length(); - int docLength = fDocument.getLength(); - int bufferStartOffset = docLength + amountDeleted - fInputBuffer.length(); - int bufferModifyOffset = event.getOffset() - bufferStartOffset; - int bufferModifyOffsetEnd = bufferModifyOffset + event.getLength(); - - if (docLength == 0) { - // cleared - fQueue.clear(); - fInputBuffer.setLength(0); - fPartitions.clear(); - // reset lines processed to 0 -// if (fLineNotifier != null) { -// fLineNotifier.setLinesProcessed(0); -// } - // remove existing positions - try { - Position[] positions = fDocument.getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY); - for (int i = 0; i < positions.length; i++) { - Position position = positions[i]; - fDocument.removePosition(HyperlinkPosition.HYPER_LINK_CATEGORY, position); - } - } catch (BadPositionCategoryException e) { - } - return new Region(0,0); - } - - if (amountDeleted > 0) { - // deletion - fInputBuffer.replace(bufferModifyOffset, bufferModifyOffsetEnd, text); - // replace the last partition - InputPartition partition = new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, bufferStartOffset, fInputBuffer.length()); - fPartitions.set(fPartitions.size() - 1, partition); - } else { - // insert/replace - must process entire buffer in case of - // line delimiter insertion in middle of buffer - - // parse for line delimiters (indicate chunks to write to standard in) - String[] lineDelimiters= getLegalLineDelimiters(); - StringBuffer temp =new StringBuffer(fInputBuffer.toString()); - temp.replace(bufferModifyOffset, bufferModifyOffsetEnd, text); - String remaining = temp.toString(); - int partitionOffset = bufferStartOffset; - fInputBuffer.setLength(0); - boolean includesLF = false; - // line delimiters are sorted by length (compare longest ones first) - for (int i= lineDelimiters.length - 1; i >= 0; i--) { - int lf = remaining.indexOf(lineDelimiters[i]); - while (lf >= 0) { - includesLF = true; - int split = lf + lineDelimiters[i].length(); - fInputBuffer.append(remaining.substring(0, split)); - remaining = remaining.substring(split); - String buffer = fInputBuffer.toString(); - fInputBuffer.setLength(0); - InputPartition written = (InputPartition)addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, split)); - written.setReadOnly(true); - partitionOffset += split; - addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, 0)); - if (fProxy != null) { - try { - fProxy.write(buffer); - } catch (IOException ioe) { - DebugUIPlugin.log(ioe); - } - } - lf = remaining.indexOf(lineDelimiters[i]); - } - if (includesLF) { - break; - } - } - if (remaining.length() > 0) { - fInputBuffer.append(remaining); - addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, remaining.length())); - } - } - } - ITypedRegion[] affectedRegions = computePartitioning(event.getOffset(), text.length()); - if (affectedRegions.length == 0) { - return null; - } - if (affectedRegions.length == 1) { - return affectedRegions[0]; - } - int affectedLength = affectedRegions[0].getLength(); - for (int i = 1; i < affectedRegions.length; i++) { - ITypedRegion region = affectedRegions[i]; - affectedLength += region.getLength(); - } - return new Region(affectedRegions[0].getOffset(), affectedLength); - } - - /** - * Adds a new colored input partition, combining with the previous partition if - * possible. - */ - protected StreamPartition addPartition(StreamPartition partition) { - if (fPartitions.isEmpty()) { - fPartitions.add(partition); - } else { - int index = fPartitions.size() - 1; - StreamPartition last = (StreamPartition)fPartitions.get(index); - if (last.canBeCombinedWith(partition)) { - // replace with a single partition - partition = last.combineWith(partition); - fPartitions.set(index, partition); - } else { - // different kinds - add a new parition - fPartitions.add(partition); - } - } - return partition; - } - - /** - * Add any pending links to the document that are now within the document's - * bounds. - */ - protected void addPendingLinks() { - synchronized (fPendingLinks) { - if (fPendingLinks.isEmpty()) { - return; - } - Iterator links = fPendingLinks.iterator(); - while (links.hasNext()) { - HyperlinkPosition link = (HyperlinkPosition)links.next(); - if ((link.getOffset() + link.getLength()) <= fDocument.getLength()) { - links.remove(); - addLink(link.getHyperLink(), link.getOffset(), link.getLength()); - } - } - } - } - - public ConsoleDocumentPartitioner(IProcess process, IConsoleColorProvider colorProvider) { - fProcess= process; - fColorProvider = colorProvider; - IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); - boolean limit = store.getBoolean(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT); - if (limit) { - fLowWaterMark = store.getInt(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK); - fHighWaterMark = store.getInt(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK); - fMaxAppendSize = fLowWaterMark; - } else { - fLowWaterMark = -1; - fHighWaterMark = -1; - fMaxAppendSize = 80000; - } - } - - /** - * Stops reading/polling immediately - */ - public synchronized void kill() { - if (!fKilled) { - fKilled = true; - if (fPollingThread != null && fPollingThread.isAlive()) { - fPollingThread.interrupt(); - } - fPoll = false; - Iterator iter = fStreamListeners.iterator(); - while (iter.hasNext()) { - StreamListener listener = (StreamListener)iter.next(); - listener.disconnect(); - } - DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this); - } - } - - public synchronized void startReading() { - if (fPollingThread != null) { - // already polling - return; - } - Runnable r = new Runnable() { - public void run() { - pollAndSleep(); - } - }; - fPoll = true; - fPollingThread = new Thread(r, "Console Polling Thread"); //$NON-NLS-1$ - fPollingThread.start(); - } - - /** - * Polls and sleeps until closed or the associated - * process terminates - */ - protected void pollAndSleep() { - while (!fKilled && fPoll && (!isClosed() || !fQueue.isEmpty())) { - poll(); - try { - Thread.sleep(BASE_DELAY); - } catch (InterruptedException e) { - } - } - } - - /** - * Polls the queue for new output and updates this document - */ - protected void poll() { - if (isAppendInProgress()) { - return; - } - synchronized(fQueue) { - StringBuffer buffer = null; - StreamEntry prev = null; - int processed = 0; - int amount = 0; - String[] lds = fDocument.getLegalLineDelimiters(); - boolean closed= false; - while (!fKilled && !closed && processed < fQueue.size() && amount < fMaxAppendSize) { - StreamEntry entry = (StreamEntry)fQueue.get(processed); - if (entry.isClosedEntry()) { - closed = true; - processed++; - } else if (prev == null || prev.getStreamIdentifier().equals(entry.getStreamIdentifier())) { - String text = entry.getText(); - if (buffer == null) { - buffer = new StringBuffer(text.length()); - } - if (isWrap()) { - for (int i = 0; i < text.length(); i++) { - if (fLineLength >= fMaxLineLength) { - String d = getLineDelimiter(text, i, lds); - if (d == null) { - buffer.append(lds[0]); - } else { - buffer.append(d); - i = i + d.length(); - } - fLineLength = 0; - } - if (i < text.length()) { - String lineDelimiter = getLineDelimiter(text, i, lds); - if (lineDelimiter == null) { - buffer.append(text.charAt(i)); - fLineLength++; - } else { - buffer.append(lineDelimiter); - fLineLength = 0; - i = i + lineDelimiter.length() - 1; - } - } - } - } else { - buffer.append(text); - } - prev = entry; - processed++; - amount+= entry.getText().length(); - } else { - // change streams - write the contents of the current stream - // and start processing the next stream - if (buffer != null) { - appendToDocument(buffer.toString(), prev.getStreamIdentifier()); - buffer.setLength(0); - prev = null; - } - } - } - if (buffer != null) { - appendToDocument(buffer.toString(), prev.getStreamIdentifier()); - } - if (closed) { - Display display= DebugUIPlugin.getStandardDisplay(); - if (display != null) { - display.asyncExec(new Runnable() { - public void run() { - if (fLineNotifier != null) { - fLineNotifier.streamsClosed(); - } - } - }); - } - } - for (int i = 0; i < processed; i++) { - fQueue.remove(0); - } - } - } - - /** - * Returns the longest line delimiter at the given position in the given text, - * or <code>null</code> if none. - * - * @param text the text in which to look for a line delimiter - * @param pos the position at which to look for a line delimiter - * @param lineDelimiters the line delimiters to look for - */ - protected String getLineDelimiter(String text, int pos, String[] lineDelimiters) { - String ld = null; - for (int i = 0; i < lineDelimiters.length; i++) { - if (text.regionMatches(pos, lineDelimiters[i], 0, lineDelimiters[i].length())) { - if (ld == null) { - ld = lineDelimiters[i]; - } else { - if (ld.length() < lineDelimiters[i].length()) { - ld = lineDelimiters[i]; - } - } - } - } - return ld; - } - - /** - * Returns whether this console document is performing auto-wrap - */ - protected boolean isWrap() { - return fWrap; - } - - /** - * The stream with the given identifier has had text appended to it. - * Adds the new text to the document. - * - * @see IStreamListener#streamAppended(String, IStreamMonitor) - */ - protected void appendToDocument(final String text, final String streamIdentifier) { - Runnable r = new Runnable() { - public void run() { - setAppendInProgress(true); - fLastStreamIdentifier = streamIdentifier; - try { - fDocument.replace(fDocument.getLength(), 0, text); - warnOfContentChange(); - } catch (BadLocationException e) { - } - setAppendInProgress(false); - checkOverflow(); - } - }; - Display display = DebugUIPlugin.getStandardDisplay(); - if (display != null) { - display.asyncExec(r); - } - } - - /** - * Checks to see if the console buffer has overflowed, and empties the - * overflow if needed, updating partitions and hyperlink positions. - */ - protected void checkOverflow() { - if (fHighWaterMark >= 0) { - if (fDocument.getLength() > fHighWaterMark) { -// int lineDifference = 0; - if (fLineNotifier != null) { -// int processed = fLineNotifier.getLinesProcessed(); -// int numLines = fDocument.getNumberOfLines(); -// lineDifference = numLines - processed; - } - int overflow = fDocument.getLength() - fLowWaterMark; - fUpdatingBuffer = true; - try { - // update partitions - List newParitions = new ArrayList(fPartitions.size()); - Iterator partitions = fPartitions.iterator(); - while (partitions.hasNext()) { - ITypedRegion region = (ITypedRegion)partitions.next(); - if (region instanceof StreamPartition) { - StreamPartition streamPartition = (StreamPartition)region; - ITypedRegion newPartition = null; - int offset = region.getOffset(); - if (offset < overflow) { - int endOffset = offset + region.getLength(); - if (endOffset < overflow) { - // remove partition - } else { - // split partition - int length = endOffset - overflow; - newPartition = streamPartition.createNewPartition(streamPartition.getStreamIdentifier(), 0, length); - } - } else { - // modify parition offset - newPartition = streamPartition.createNewPartition(streamPartition.getStreamIdentifier(), streamPartition.getOffset() - overflow, streamPartition.getLength()); - } - if (newPartition != null) { - newParitions.add(newPartition); - } - } - } - fPartitions = newParitions; - // update hyperlinks - try { - Position[] hyperlinks = fDocument.getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY); - for (int i = 0; i < hyperlinks.length; i++) { - HyperlinkPosition position = (HyperlinkPosition)hyperlinks[i]; - // remove old the position - fDocument.removePosition(HyperlinkPosition.HYPER_LINK_CATEGORY, position); - if (position.getOffset() >= overflow) { - // add new poisition - try { - fDocument.addPosition(HyperlinkPosition.HYPER_LINK_CATEGORY, new HyperlinkPosition(position.getHyperLink(), position.getOffset() - overflow, position.getLength())); - } catch (BadLocationException e) { - } - } - } - } catch (BadPositionCategoryException e) { - } - synchronized (fPendingLinks) { - // update pending hyperlinks - Vector newPendingLinks = new Vector(fPendingLinks.size()); - Iterator pendingLinks = fPendingLinks.iterator(); - while (pendingLinks.hasNext()) { - HyperlinkPosition position = (HyperlinkPosition)pendingLinks.next(); - if (position.getOffset() >= overflow) { - newPendingLinks.add(new HyperlinkPosition(position.getHyperLink(), position.getOffset() - overflow, position.getLength())); - } - } - fPendingLinks = newPendingLinks; - } - - // remove overflow text - try { - fDocument.replace(0, overflow, ""); //$NON-NLS-1$ - } catch (BadLocationException e) { - DebugUIPlugin.log(e); - } - } finally { - // update number of lines processed - if (fLineNotifier != null) { -// fLineNotifier.setLinesProcessed(fDocument.getNumberOfLines() - lineDifference); - } - fUpdatingBuffer = false; - } - } - } - } - - /** - * The stream with the given identifier has had text appended to it. - * Adds a new entry to the queue. - */ - protected void streamAppended(String text, String streamIdentifier) { - synchronized (fQueue) { - if (fClosed) { - // ERROR - attempt to append after console is closed - DebugUIPlugin.logErrorMessage("An attempt was made to append text to the console, after it was closed."); //$NON-NLS-1$ - } else { - fQueue.add(new StreamEntry(text, streamIdentifier)); - } - } - } - - /** - * The streams associated with this process have been closed. - * Adds a new "stream closed" entry to the queue. - */ - protected void streamsClosed() { - synchronized (fQueue) { - if (!fClosed) { - fQueue.add(new StreamsClosedEntry()); - fClosed = true; - } - } - } - - /** - * Sets whether a runnable has been submitted to update the console - * document. - */ - protected void setAppendInProgress(boolean appending) { - fAppending = appending; - } - - /** - * Returns whether a runnable has been submitted to update the console - * document. - */ - protected boolean isAppendInProgress() { - return fAppending; - } - - /** - * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(IDebugPreferenceConstants.CONSOLE_WRAP)) { - fWrap = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP); - } else if (event.getProperty().equals(IDebugPreferenceConstants.CONSOLE_WIDTH)) { - fMaxLineLength = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.CONSOLE_WIDTH); - } - } - - /** - * Returns a collection of legal line delimiters for this partitioner's - * associated document, sorted by length in descending order. - */ - protected String[] getLegalLineDelimiters() { - if (fSortedLineDelimiters == null) { - String[] lineDelimiters = fDocument.getLegalLineDelimiters(); - List list = new ArrayList(lineDelimiters.length); - for (int i = 0; i < lineDelimiters.length; i++) { - list.add(lineDelimiters[i]); - } - Comparator comparator = new Comparator() { - /** - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - public int compare(Object a, Object b) { - String s1 = (String)a; - String s2 = (String)b; - return s2.length() - s1.length(); - } - - }; - Collections.sort(list, comparator); - fSortedLineDelimiters = (String[])list.toArray(new String[lineDelimiters.length]); - } - return fSortedLineDelimiters; - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamMonitor, java.lang.String) - */ - public void connect(IStreamMonitor streamMonitor, String streamIdentifer) { - if (streamMonitor != null) { - StreamListener listener = new StreamListener(streamIdentifer, streamMonitor); - fStreamListeners.add(listener); - listener.connect(); - // ensure we start polling for output - startReading(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamsProxy) - */ - public void connect(IStreamsProxy streamsProxy) { - fProxy = streamsProxy; - connect(streamsProxy.getOutputStreamMonitor(), IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM); - connect(streamsProxy.getErrorStreamMonitor(), IDebugUIConstants.ID_STANDARD_ERROR_STREAM); - } - - /** - * Returns whether the streams assocaited with this console's process - * have been closed. - */ - protected boolean isClosed() { - return fClosed; - } - - protected IConsoleColorProvider getColorProvider() { - return fColorProvider; - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#addLink(org.eclipse.debug.ui.console.IConsoleHyperlink, int, int) - */ - public void addLink(IConsoleHyperlink link, int offset, int length) { - HyperlinkPosition hyperlinkPosition = new HyperlinkPosition(link, offset, length); - try { - fDocument.addPosition(HyperlinkPosition.HYPER_LINK_CATEGORY, hyperlinkPosition); - } catch (BadPositionCategoryException e) { - // internal error - DebugUIPlugin.log(e); - } catch (BadLocationException e) { - // queue the link - fPendingLinks.add(hyperlinkPosition); - } - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#getDocument() - */ - public IDocument getDocument() { - return fDocument; - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#getProcess() - */ - public IProcess getProcess() { - return fProcess; - } - - /** - * Connects the given line notifier to this console document partitioner - * - * @param lineNotifier - */ - public void connectLineNotifier(ConsoleLineNotifier lineNotifier) { - fLineNotifier = lineNotifier; - lineNotifier.connect(this); - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#getRegion(org.eclipse.debug.ui.console.IConsoleHyperlink) - */ - public IRegion getRegion(IConsoleHyperlink link) { - try { - Position[] positions = getDocument().getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY); - for (int i = 0; i < positions.length; i++) { - HyperlinkPosition position = (HyperlinkPosition)positions[i]; - if (position.getHyperLink().equals(link)) { - return new Region(position.getOffset(), position.getLength()); - } - } - } catch (BadPositionCategoryException e) { - } - return null; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[]) - */ - public void handleDebugEvents(DebugEvent[] events) { - for (int i = 0; i < events.length; i++) { - DebugEvent event = events[i]; - if (event.getKind() == DebugEvent.TERMINATE && event.getSource().equals(getProcess())) { - DebugPlugin.getDefault().removeDebugEventListener(this); - streamsClosed(); - } - } - - } - - private void warnOfContentChange() { - ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(DebugUITools.getConsole(fProcess)); - } - - /* (non-Javadoc) - * @see org.eclipse.debug.ui.console.IConsole#addPatternMatchHandler(org.eclipse.ui.console.IPatternMatchListener) - */ - public void addPatternMatchListener(IPatternMatchListener matchHandler) { - // - } - public void removePatternMatchListener(IPatternMatchListener matchHandler) { - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java deleted file mode 100644 index f102a0fee..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.debug.ui.console.ConsoleColorProvider; -import org.eclipse.debug.ui.console.IConsoleColorProvider; - -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.source.IAnnotationModel; - -import org.eclipse.ui.texteditor.AbstractDocumentProvider; - -/** - * Default document provider for the processes. By default a document is created - * which is connected to the streams proxy of the associated process. - */ -public class ConsoleDocumentProvider extends AbstractDocumentProvider { - - /** - * The runnable context for that provider. - * @since 3.0 - */ - private WorkspaceOperationRunner fOperationRunner; - - /** - * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createDocument(java.lang.Object) - */ - protected IDocument createDocument(Object element) { - if (element instanceof IProcess) { - IProcess process = (IProcess)element; - IConsoleColorProvider colorProvider = getColorProvider(process); - ConsoleDocument doc= new ConsoleDocument(colorProvider); - ConsoleDocumentPartitioner partitioner = new ConsoleDocumentPartitioner(process, colorProvider); - ConsoleLineNotifier lineNotifier = getLineNotifier(process); - partitioner.connect(doc); - if (lineNotifier != null) { - partitioner.connectLineNotifier(lineNotifier); - } - return doc; - } - return null; - } - - /** - * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createAnnotationModel(java.lang.Object) - */ - protected IAnnotationModel createAnnotationModel(Object element) { - return null; - } - - /** - * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor, java.lang.Object, org.eclipse.jface.text.IDocument, boolean) - */ - protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) { - } - - /** - * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#disposeElementInfo(java.lang.Object, org.eclipse.ui.texteditor.AbstractDocumentProvider.ElementInfo) - */ - protected void disposeElementInfo(Object element, ElementInfo info) { - ConsoleDocument document = (ConsoleDocument)info.fDocument; - document.getDocumentPartitioner().disconnect(); - super.disposeElementInfo(element, info); - } - - /** - * Returns a color provider for the given process. - * - * @param process - * @return IConsoleColorProvider - */ - protected IConsoleColorProvider getColorProvider(IProcess process) { - String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE); - IConsoleColorProvider colorProvider = null; - if (type != null) { - colorProvider = getProcessConsoleManager().getColorProvider(type); - } - if (colorProvider == null) { - colorProvider = new ConsoleColorProvider(); - } - return colorProvider; - } - - /** - * Returns the line notifier for this console, or <code>null</code> if none. - * - * @param process - * @return line notifier, or <code>null</code> - */ - protected ConsoleLineNotifier getLineNotifier(IProcess process) { - String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE); - if (type != null) { - return getProcessConsoleManager().newLineNotifier(type); - } - return null; - } - - /** - * Convenience accessor - * - * @return ConsoleDocumentManager - */ - private ProcessConsoleManager getProcessConsoleManager() { - return DebugUIPlugin.getDefault().getProcessConsoleManager(); - } - - /* - * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#getOperationRunner(org.eclipse.core.runtime.IProgressMonitor) - */ - protected IRunnableContext getOperationRunner(IProgressMonitor monitor) { - if (fOperationRunner == null) - fOperationRunner = new WorkspaceOperationRunner(); - fOperationRunner.setProgressMonitor(monitor); - return fOperationRunner; - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java index 1622a7a53..cf82c6d6d 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java @@ -11,22 +11,26 @@ package org.eclipse.debug.internal.ui.views.console; -import org.eclipse.debug.ui.console.IConsole; +import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.ui.console.IConsoleLineTracker; import org.eclipse.debug.ui.console.IConsoleLineTrackerExtension; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; +import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.ListenerList; -import org.eclipse.ui.console.IPatternMatchListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.ui.console.IConsole; +import org.eclipse.ui.console.IOConsole; +import org.eclipse.ui.console.IPatternMatchListenerDelegate; import org.eclipse.ui.console.PatternMatchEvent; /** * Tracks text appended to the console and notifies listeners in terms of whole * lines. */ -public class ConsoleLineNotifier implements IPatternMatchListener { +public class ConsoleLineNotifier implements IPatternMatchListenerDelegate, IPropertyChangeListener { /** * Console listeners */ @@ -35,7 +39,7 @@ public class ConsoleLineNotifier implements IPatternMatchListener { /** * The console this notifier is tracking */ - private IConsole fConsole = null; + private ProcessConsole fConsole = null; /** * Connects this notifier to the given console. @@ -43,13 +47,17 @@ public class ConsoleLineNotifier implements IPatternMatchListener { * @param console */ public void connect(IConsole console) { - fConsole = console; - Object[] listeners = fListeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i]; - listener.init(console); - } - fConsole.addPatternMatchListener(this); + if (console instanceof ProcessConsole) { + fConsole = (ProcessConsole)console; + + IConsoleLineTracker[] lineTrackers = DebugUIPlugin.getDefault().getProcessConsoleManager().getLineTrackers(fConsole.getProcess()); + for (int i = 0; i < lineTrackers.length; i++) { + lineTrackers[i].init(fConsole); + addConsoleListener(lineTrackers[i]); + } + + fConsole.addPropertyChangeListener(this); + } } /** @@ -59,12 +67,15 @@ public class ConsoleLineNotifier implements IPatternMatchListener { if (fConsole == null) { return; //already disconnected } - fConsole.removePatternMatchListener(this); + Object[] listeners = fListeners.getListeners(); for (int i = 0; i < listeners.length; i++) { IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i]; listener.dispose(); } + + fConsole.removePropertyChangeListener(this); + fListeners = null; fConsole = null; } @@ -106,20 +117,6 @@ public class ConsoleLineNotifier implements IPatternMatchListener { public void addConsoleListener(IConsoleLineTracker listener) { fListeners.add(listener); } - - /* (non-Javadoc) - * @see org.eclipse.ui.console.IPatternMatchListener#getPattern() - */ - public String getPattern() { - return ".*\r(\n?)|.*\n"; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.ui.console.IPatternMatchListener#getModifiers() - */ - public int getCompilerFlags() { - return 0; - } /* (non-Javadoc) * @see org.eclipse.ui.console.IPatternMatchListener#matchFound(org.eclipse.ui.console.PatternMatchEvent) @@ -152,5 +149,13 @@ public class ConsoleLineNotifier implements IPatternMatchListener { } } + /* (non-Javadoc) + * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + if(event.getProperty().equals(IOConsole.P_CONSOLE_OUTPUT_COMPLETE)) { + streamsClosed(); + } + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties index d6d5d3a32..726bfa133 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties @@ -9,9 +9,6 @@ # IBM Corporation - initial API and implementation ############################################################################### -ConsoleDocumentManager.1=Invalid extension {0} - class must be an instance of IConsoleColorProvider. -ConsoleDocumentManager.2=Invalid extension {0} - class must be an instance of IConsoleLineTracker - ConsoleRemoveAllTerminatedAction.0=&Remove All Terminated ConsoleRemoveAllTerminatedAction.1=Remove All Terminated Launches diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java deleted file mode 100644 index c98fb8995..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.jface.text.ITextStore; - -public class ConsoleOutputTextStore implements ITextStore { - - private StringBuffer fBuffer; - - public ConsoleOutputTextStore(int bufferSize) { - fBuffer= new StringBuffer(bufferSize); - } - - /** - * @see ITextStore#get(int) - */ - public char get(int pos) { - return fBuffer.charAt(pos); - } - - /** - * @see ITextStore#get(int, int) - */ - public String get(int pos, int length) { - return fBuffer.substring(pos, pos + length); - } - - /** - * @see ITextStore#getLength() - */ - public int getLength() { - return fBuffer.length(); - } - - /** - * @see ITextStore#replace(int, int, String) - */ - public void replace(int pos, int length, String text) { - if (text == null) { - text= ""; //$NON-NLS-1$ - } - fBuffer.replace(pos, pos + length, text); - } - - /** - * @see ITextStore#set(String) - */ - public void set(String text) { - fBuffer= new StringBuffer(text); - } - - /** - * @see StringBuffer#ensureCapacity(int) - */ - public void setMinimalBufferSize(int bufferSize) { - fBuffer.ensureCapacity(bufferSize); - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java deleted file mode 100644 index a6fc96850..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java +++ /dev/null @@ -1,489 +0,0 @@ -///******************************************************************************* -// * Copyright (c) 2000, 2004 IBM Corporation and others. -// * All rights reserved. This program and the accompanying materials -// * are made available under the terms of the Common Public License v1.0 -// * which accompanies this distribution, and is available at -// * http://www.eclipse.org/legal/cpl-v10.html -// * -// * Contributors: -// * IBM Corporation - initial API and implementation -// *******************************************************************************/ -//package org.eclipse.debug.internal.ui.views.console; -// -// -//import org.eclipse.debug.internal.ui.DebugUIPlugin; -//import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; -//import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants; -//import org.eclipse.debug.ui.console.IConsoleColorProvider; -//import org.eclipse.debug.ui.console.IConsoleHyperlink; -//import org.eclipse.jface.resource.JFaceResources; -//import org.eclipse.jface.text.BadLocationException; -//import org.eclipse.jface.text.BadPositionCategoryException; -//import org.eclipse.jface.text.DocumentEvent; -//import org.eclipse.jface.text.IDocument; -//import org.eclipse.jface.text.IDocumentListener; -//import org.eclipse.jface.text.IDocumentPartitioner; -//import org.eclipse.jface.text.IRegion; -//import org.eclipse.jface.text.ITypedRegion; -//import org.eclipse.jface.text.Position; -//import org.eclipse.jface.text.TextViewer; -//import org.eclipse.jface.util.IPropertyChangeListener; -//import org.eclipse.jface.util.PropertyChangeEvent; -//import org.eclipse.swt.SWT; -//import org.eclipse.swt.custom.LineStyleEvent; -//import org.eclipse.swt.custom.LineStyleListener; -//import org.eclipse.swt.custom.StyleRange; -//import org.eclipse.swt.custom.StyledText; -//import org.eclipse.swt.events.MouseEvent; -//import org.eclipse.swt.events.MouseListener; -//import org.eclipse.swt.events.MouseMoveListener; -//import org.eclipse.swt.events.MouseTrackListener; -//import org.eclipse.swt.events.PaintEvent; -//import org.eclipse.swt.events.PaintListener; -//import org.eclipse.swt.events.VerifyEvent; -//import org.eclipse.swt.graphics.Color; -//import org.eclipse.swt.graphics.Cursor; -//import org.eclipse.swt.graphics.FontMetrics; -//import org.eclipse.swt.graphics.Point; -//import org.eclipse.swt.widgets.Composite; -//import org.eclipse.swt.widgets.Control; -//import org.eclipse.swt.widgets.Event; -//import org.eclipse.swt.widgets.Listener; -//import org.eclipse.ui.console.IConsoleConstants; -// -//public class ConsoleViewer extends TextViewer implements IPropertyChangeListener, MouseTrackListener, MouseMoveListener, MouseListener, PaintListener, LineStyleListener, Listener { -// -// /** -// * Hand cursor -// */ -// private Cursor fHandCursor; -// -// /** -// * Text cursor -// */ -// private Cursor fTextCursor; -// -// /** -// * The active hyperlink, or <code>null</code> -// */ -// private IConsoleHyperlink fHyperLink = null; -// -// protected InternalDocumentListener fInternalDocumentListener= new InternalDocumentListener(); -// -// /** -// * Whether the console scrolls as output is appended. -// */ -// private boolean fAutoScroll = true; -// -// /** -// * Internal document listener. -// */ -// class InternalDocumentListener implements IDocumentListener { -// /** -// * @see IDocumentListener#documentAboutToBeChanged(DocumentEvent) -// */ -// public void documentAboutToBeChanged(DocumentEvent e) { -// } -// -// /** -// * @see IDocumentListener#documentChanged(DocumentEvent) -// */ -// public void documentChanged(DocumentEvent e) { -// ConsoleDocument doc= (ConsoleDocument)getDocument(); -// if (doc == null) { -// getTextWidget().setEditable(false); -// return; -// } -// getTextWidget().setEditable(!doc.isReadOnly()); -// revealEndOfDocument(); -// } -// } -// -// /** -// * Creates a new console viewer and adds verification checking -// * to only allow text modification if the text is being modified -// * in the editable portion of the underlying document. -// * -// * @see org.eclipse.swt.events.VerifyListener -// */ -// public ConsoleViewer(Composite parent) { -// super(parent, getSWTStyles()); -// -// getTextWidget().setDoubleClickEnabled(true); -// -// DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this); -// JFaceResources.getFontRegistry().addListener(this); -// -// getTextWidget().setFont(JFaceResources.getFont(IConsoleConstants.CONSOLE_FONT)); -// getTextWidget().addMouseTrackListener(this); -// getTextWidget().addPaintListener(this); -// getTextWidget().addLineStyleListener(this); -// getTextWidget().addListener(SWT.KeyUp, this); -// getTextWidget().setTabs(DebugUIPlugin.getDefault().getPluginPreferences().getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH)); -// } -// -// /** -// * Returns the SWT style flags used when instantiating this viewer -// */ -// private static int getSWTStyles() { -// int styles= SWT.H_SCROLL | SWT.V_SCROLL; -// return styles; -// } -// -// /** -// * Reveals (makes visible) the end of the current document -// */ -// protected void revealEndOfDocument() { -// if (isAutoScroll()) { -// IDocument doc = getDocument(); -// int lines = doc.getNumberOfLines(); -// try { -// // lines are 0-based -// int lineStartOffset = doc.getLineOffset(lines - 1); -// StyledText widget= getTextWidget(); -// if (lineStartOffset > 0) { -// widget.setCaretOffset(lineStartOffset); -// widget.showSelection(); -// } -// int lineEndOffset = lineStartOffset + doc.getLineLength(lines - 1); -// if (lineEndOffset > 0) { -// widget.setCaretOffset(lineEndOffset); -// } -// } catch (BadLocationException e) { -// } -// } -// } -// -// /** -// * @see ITextViewer#setDocument(IDocument) -// */ -// public void setDocument(IDocument doc) { -// IDocument oldDoc= getDocument(); -// IDocument document= doc; -// if (oldDoc == null && document == null) { -// return; -// } -// if (oldDoc != null) { -// oldDoc.removeDocumentListener(fInternalDocumentListener); -// if (oldDoc.equals(document)) { -// document.addDocumentListener(fInternalDocumentListener); -// return; -// } -// } -// -// super.setDocument(document); -// if (document != null) { -// revealEndOfDocument(); -// document.addDocumentListener(fInternalDocumentListener); -// } -// } -// -// /** -// * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent) -// */ -// public void propertyChange(PropertyChangeEvent event) { -// String propertyName= event.getProperty(); -// if (propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR) || -// propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR) || -// propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR)) { -// getTextWidget().redraw(); -// } else if (propertyName.equals(IConsoleConstants.CONSOLE_FONT)) { -// getTextWidget().setFont(JFaceResources.getFont(IConsoleConstants.CONSOLE_FONT)); -// } else if (propertyName.equals(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH)) { -// getTextWidget().setTabs(DebugUIPlugin.getDefault().getPluginPreferences().getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH)); -// } else if (propertyName.equals(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)) { -// setAutoScroll(!DebugUIPlugin.getDefault().getPluginPreferences().getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)); -// } -// } -// -// /** -// * Dispose this viewer and resources -// */ -// public void dispose() { -// Control control = getTextWidget(); -// if (control != null) { -// control.removeMouseTrackListener(this); -// control.removePaintListener(this); -// } -// if (fHandCursor != null) { -// fHandCursor.dispose(); -// } -// if (fTextCursor != null) { -// fTextCursor.dispose(); -// } -// DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this); -// JFaceResources.getFontRegistry().removeListener(this); -// } -// -// /** -// * Only allow text to be typed at the end of the document. -// * -// * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent) -// */ -// protected void handleVerifyEvent(VerifyEvent e) { -// ConsoleDocument doc= (ConsoleDocument)getDocument(); -// if (doc != null) { -// if (doc.isReadOnly()) { -// e.doit = false; -// return; -// } -// IDocumentPartitioner partitioner = doc.getDocumentPartitioner(); -// if (partitioner != null) { -// int length = doc.getLength(); -// ITypedRegion[] partitions = partitioner.computePartitioning(length, 0); -// if (partitions.length == 0) { -// } else { -// ITypedRegion partition = partitions[partitions.length - 1]; -// if (partition.getType().equals(InputPartition.INPUT_PARTITION_TYPE)) { -// // > 1 char in the input buffer -// e.doit = (e.start >= partition.getOffset()) && (e.end <= (partition.getLength() + partition.getOffset())); -// } else { -// // first character in the input buffer -// e.doit = length == e.start; -// } -// } -// } -// } -// } -// -// /** -// * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseEnter(MouseEvent e) { -// getTextWidget().addMouseMoveListener(this); -// } -// -// /** -// * @see org.eclipse.swt.events.MouseTrackListener#mouseExit(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseExit(MouseEvent e) { -// getTextWidget().removeMouseMoveListener(this); -// if (fHyperLink != null) { -// linkExited(fHyperLink); -// } -// } -// -// /** -// * @see org.eclipse.swt.events.MouseTrackListener#mouseHover(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseHover(MouseEvent e) { -// } -// -// /** -// * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseMove(MouseEvent e) { -// int offset = -1; -// try { -// Point p = new Point(e.x, e.y); -// offset = getTextWidget().getOffsetAtLocation(p); -// } catch (IllegalArgumentException ex) { -// // out of the document range -// } -// updateLinks(offset); -// } -// -// public IConsoleHyperlink getHyperlink(int offset) { -// if (offset >= 0 && getDocument() != null) { -// Position[] positions = null; -// try { -// positions = getDocument().getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY); -// } catch (BadPositionCategoryException ex) { -// // no links have been added -// return null; -// } -// for (int i = 0; i < positions.length; i++) { -// Position position = positions[i]; -// if (offset >= position.getOffset() && offset <= (position.getOffset() + position.getLength())) { -// return ((HyperlinkPosition)position).getHyperLink(); -// } -// } -// } -// return null; -// } -// -// protected void linkEntered(IConsoleHyperlink link) { -// Control control = getTextWidget(); -// control.setRedraw(false); -// if (fHyperLink != null) { -// linkExited(fHyperLink); -// } -// fHyperLink = link; -// fHyperLink.linkEntered(); -// control.setCursor(getHandCursor()); -// control.setRedraw(true); -// control.redraw(); -// control.addMouseListener(this); -// } -// -// protected void linkExited(IConsoleHyperlink link) { -// link.linkExited(); -// fHyperLink = null; -// Control control = getTextWidget(); -// control.setCursor(getTextCursor()); -// control.redraw(); -// control.removeMouseListener(this); -// } -// /** -// * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent) -// */ -// public void paintControl(PaintEvent e) { -// if (fHyperLink != null) { -// IDocument doc = getDocument(); -// if (doc == null) { -// return; -// } -// ConsoleDocumentPartitioner partitioner = (ConsoleDocumentPartitioner)doc.getDocumentPartitioner(); -// if (partitioner == null) { -// return; -// } -// IRegion linkRegion = partitioner.getRegion(fHyperLink); -// if (linkRegion != null) { -// int start = linkRegion.getOffset(); -// int end = start + linkRegion.getLength(); -// IConsoleColorProvider colorProvider = partitioner.getColorProvider(); -// try { -// ITypedRegion partition = doc.getPartition(start); -// Color fontColor = e.gc.getForeground(); -// if (partition instanceof StreamPartition) { -// StreamPartition streamPartition = (StreamPartition)partition; -// fontColor = colorProvider.getColor(streamPartition.getStreamIdentifier()); -// } -// int startLine = doc.getLineOfOffset(start); -// int endLine = doc.getLineOfOffset(end); -// for (int i = startLine; i <= endLine; i++) { -// IRegion lineRegion = doc.getLineInformation(i); -// int lineStart = lineRegion.getOffset(); -// int lineEnd = lineStart + lineRegion.getLength(); -// Color color = e.gc.getForeground(); -// e.gc.setForeground(fontColor); -// if (lineStart < end) { -// lineStart = Math.max(start, lineStart); -// lineEnd = Math.min(end, lineEnd); -// Point p1 = getTextWidget().getLocationAtOffset(lineStart); -// Point p2 = getTextWidget().getLocationAtOffset(lineEnd); -// FontMetrics metrics = e.gc.getFontMetrics(); -// int height = metrics.getHeight(); -// e.gc.drawLine(p1.x, p1.y + height, p2.x, p2.y + height); -// } -// e.gc.setForeground(color); -// } -// } catch (BadLocationException ex) { -// } -// } -// } -// } -// -// protected Cursor getHandCursor() { -// if (fHandCursor == null) { -// fHandCursor = new Cursor(DebugUIPlugin.getStandardDisplay(), SWT.CURSOR_HAND); -// } -// return fHandCursor; -// } -// -// protected Cursor getTextCursor() { -// if (fTextCursor == null) { -// fTextCursor = new Cursor(DebugUIPlugin.getStandardDisplay(), SWT.CURSOR_IBEAM); -// } -// return fTextCursor; -// } -// -// /** -// * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseDoubleClick(MouseEvent e) { -// } -// -// /** -// * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseDown(MouseEvent e) { -// } -// -// /** -// * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent) -// */ -// public void mouseUp(MouseEvent e) { -// if (fHyperLink != null) { -// String selection = getTextWidget().getSelectionText(); -// if (selection.length() <= 0) { -// if (e.button == 1) { -// fHyperLink.linkActivated(); -// } -// } -// } -// } -// -// /** -// * @see org.eclipse.swt.custom.LineStyleListener#lineGetStyle(org.eclipse.swt.custom.LineStyleEvent) -// */ -// public void lineGetStyle(LineStyleEvent event) { -// IDocument document = getDocument(); -// if (document != null) { -// ConsoleDocumentPartitioner partitioner = (ConsoleDocumentPartitioner)document.getDocumentPartitioner(); -// if (partitioner != null) { -// IConsoleColorProvider colorProvider = partitioner.getColorProvider(); -// ITypedRegion[] regions = partitioner.computePartitioning(event.lineOffset, event.lineOffset + event.lineText.length()); -// StyleRange[] styles = new StyleRange[regions.length]; -// for (int i = 0; i < regions.length; i++) { -// StreamPartition partition = (StreamPartition)regions[i]; -// Color color = colorProvider.getColor(partition.getStreamIdentifier()); -// styles[i] = new StyleRange(partition.getOffset(), partition.getLength(), color, null); -// } -// event.styles = styles; -// } -// } -// } -// -// /** -// * Sets whether this viewer should auto-scroll as output is appended to the -// * document. -// * -// * @param scroll -// */ -// public void setAutoScroll(boolean scroll) { -// fAutoScroll = scroll; -// } -// -// /** -// * Returns whether this viewer should auto-scroll as output is appended to -// * the document. -// */ -// public boolean isAutoScroll() { -// return fAutoScroll; -// } -// -// /** -// * On KeyUp events, see if we need to enter/exit a link. -// * -// * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) -// */ -// public void handleEvent(Event event) { -// int offset = getTextWidget().getCaretOffset(); -// updateLinks(offset); -// } -// -// /** -// * The cursor has just be moved to the given offset, the mouse has -// * hovered over the given offset. Update link rendering. -// * -// * @param offset -// */ -// protected void updateLinks(int offset) { -// if (offset >= 0) { -// IConsoleHyperlink link = getHyperlink(offset); -// if (link != null) { -// if (link.equals(fHyperLink)) { -// return; -// } -// linkEntered(link); -// return; -// } -// } -// if (fHyperLink != null) { -// linkExited(fHyperLink); -// } -// } -// -//} -// diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java deleted file mode 100644 index 1d2dce43f..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.debug.ui.console.IConsoleHyperlink; -import org.eclipse.jface.text.Position; - -/** - */ -public class HyperlinkPosition extends Position { - - public static final String HYPER_LINK_CATEGORY = DebugUIPlugin.getUniqueIdentifier() + ".HYPER_LINK"; //$NON-NLS-1$ - - private IConsoleHyperlink fLink = null; - - /** - * - */ - public HyperlinkPosition(IConsoleHyperlink link, int offset, int length) { - super(offset, length); - fLink = link; - } - - public IConsoleHyperlink getHyperLink() { - return fLink; - } - - /** - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object arg) { - return arg instanceof HyperlinkPosition && super.equals(arg) && getHyperLink().equals(((HyperlinkPosition)arg).getHyperLink()); - } - - /** - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return super.hashCode() + getHyperLink().hashCode(); - } - -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java deleted file mode 100644 index 3d6f8f045..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.internal.ui.DebugUIPlugin; - -/** - * A partition in a console document that contains input from the keyboard. - */ -public class InputPartition extends StreamPartition { - - /** - * Once an input partition has been written to standard-in, it cannot - * be modified. - */ - private boolean fReadOnly = false; - - /** - * Partition type - */ - public static final String INPUT_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".INPUT_PARTITION_TYPE"; //$NON-NLS-1$ - - - public InputPartition(String streamIdentifier, int offset, int length) { - super(streamIdentifier, offset, length, INPUT_PARTITION_TYPE); - } - - /** - * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int) - */ - public StreamPartition createNewPartition(String streamIdentifier, int offset, int length) { - return new InputPartition(streamIdentifier, offset, length); - } - - /** - * Sets whether this partition is read-only. - * - * @param readOnly whether this partition is read-only - */ - public void setReadOnly(boolean readOnly) { - fReadOnly = readOnly; - } - - /** - * Returns whether this partition is read-only. - * - * @return whether this partition is read-only - */ - public boolean isReadOnly() { - return fReadOnly; - } - - /** - * Returns whether this partition is allowed to be combined with the - * given partition. Once read-only, this partition cannot be combined. - * - * @param partition - * @return boolean - */ - public boolean canBeCombinedWith(StreamPartition partition) { - return (!isReadOnly() && super.canBeCombinedWith(partition)); - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java deleted file mode 100644 index ed8ad1f12..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.internal.ui.DebugUIPlugin; - -/** - * A partition in a console document that contains output from a process. - */ -public class OutputPartition extends StreamPartition { - - /** - * Partition type - */ - public static final String OUTPUT_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".OUTPUT_PARTITION_TYPE"; //$NON-NLS-1$ - - - public OutputPartition(String streamIdentifier, int offset, int length) { - super(streamIdentifier, offset, length, OUTPUT_PARTITION_TYPE); - } - - /** - * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int) - */ - public StreamPartition createNewPartition(String streamIdetifier, int offset, int length) { - return new OutputPartition(streamIdetifier, offset, length); - } -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java index d69b03d6f..0bd7537cd 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java @@ -62,18 +62,19 @@ import org.eclipse.ui.part.IPageBookViewPage; * @since 3.0 */ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSetListener, IPropertyChangeListener { + public static final String TYPE = "org.eclipse.debug.ProcessConsole"; //$NON-NLS-1$ private IProcess fProcess = null; private List streamListeners = new ArrayList(); private IConsoleColorProvider fColorProvider; private IOConsoleInputStream in; - private ConsoleLineNotifier fLineNotifier; + /** * Proxy to a console document */ public ProcessConsole(IProcess process, IConsoleColorProvider colorProvider) { - super("", null); //$NON-NLS-1$ + super("", TYPE, null); //$NON-NLS-1$ fProcess = process; fColorProvider = colorProvider; @@ -281,36 +282,27 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[]) */ public void handleDebugEvents(DebugEvent[] events) { - for (int i = 0; i < events.length; i++) { - DebugEvent event = events[i]; - if (event.getSource().equals(getProcess())) { - - if (event.getKind() == DebugEvent.TERMINATE) { - setFinished(); - DebugPlugin.getDefault().removeDebugEventListener(this); - } - - Runnable r = new Runnable() { - public void run() { - setName(computeName()); - warnOfContentChange(); - } - }; - DebugUIPlugin.getStandardDisplay().asyncExec(r); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.console.IOConsole#partitionerFinished() - */ - public void partitionerFinished() { - super.partitionerFinished(); - if (fLineNotifier != null) { - fLineNotifier.streamsClosed(); + for (int i = 0; i < events.length; i++) { + DebugEvent event = events[i]; + if (event.getSource().equals(getProcess())) { + + if (event.getKind() == DebugEvent.TERMINATE) { + setFinished(); + DebugPlugin.getDefault().removeDebugEventListener(this); + } + + Runnable r = new Runnable() { + public void run() { + setName(computeName()); + warnOfContentChange(); + } + }; + DebugUIPlugin.getStandardDisplay().asyncExec(r); + } } } + private void warnOfContentChange() { ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(DebugUITools.getConsole(fProcess)); } @@ -435,17 +427,4 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe return Status.OK_STATUS; } } - - - /** - * @param lineNotifier - */ - public void setLineNotifier(ConsoleLineNotifier lineNotifier) { - fLineNotifier = lineNotifier; - fLineNotifier.connect(this); - if (fProcess.isTerminated()) { - setFinished(); - } - } - } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java index 30884a499..c0fa85095 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java @@ -50,7 +50,8 @@ public class ProcessConsoleManager implements ILaunchListener { private Map fColorProviders; /** - * + * The default color provider. Used if no color provider is contributed + * for the given process type. */ private IConsoleColorProvider fDefaultColorProvider; @@ -92,11 +93,6 @@ public class ProcessConsoleManager implements ILaunchListener { private void removeProcess(IProcess iProcess) { IConsole console = getConsole(iProcess); - ConsoleLineNotifier lineNotifier = getLineNotifier(iProcess); - if (lineNotifier != null) { - lineNotifier.disconnect(); - } - if (console != null) { IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); manager.removeConsoles(new IConsole[]{console}); @@ -144,11 +140,6 @@ public class ProcessConsoleManager implements ILaunchListener { //create a new console. IConsoleColorProvider colorProvider = getColorProvider(process.getAttribute(IProcess.ATTR_PROCESS_TYPE)); ProcessConsole pc = new ProcessConsole(process, colorProvider); - //connect Line Notifier - ConsoleLineNotifier lineNotifier = getLineNotifier(process); - if(lineNotifier != null) { - pc.setLineNotifier(lineNotifier); - } //add new console to console manager. ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc}); } @@ -275,30 +266,14 @@ public class ProcessConsoleManager implements ILaunchListener { return fDefaultColorProvider; } - /** - * Returns the line notifier for this console, or <code>null</code> if none. - * - * @param process - * @return line notifier, or <code>null</code> + * Returns the Line Trackers for a given process type. + * @param process The process for which line trackers are required. + * @return An array of line trackers which match the given process type. */ - protected ConsoleLineNotifier getLineNotifier(IProcess process) { + public IConsoleLineTracker[] getLineTrackers(IProcess process) { String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE); - if (type != null) { - return newLineNotifier(type); - } - return null; - } - - /** - * Creates and retuns a new line notifier for the given type of process, or - * <code>null</code> if none. The notifier will be seeded with new console - * line listeners registered for the given process type. - * - * @param type process type - * @return line notifier or <code>null</code> - */ - public ConsoleLineNotifier newLineNotifier(String type) { + if (fLineTrackers == null) { fLineTrackers = new HashMap(); IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_LINE_TRACKERS); @@ -314,26 +289,17 @@ public class ProcessConsoleManager implements ILaunchListener { list.add(extension); } } - List extensions = (List)fLineTrackers.get(type); - ConsoleLineNotifier lineNotifier = null; - if (extensions != null) { - lineNotifier = new ConsoleLineNotifier(); - Iterator iter = extensions.iterator(); - while (iter.hasNext()) { - IConfigurationElement extension = (IConfigurationElement)iter.next(); - try { - Object tracker = extension.createExecutableExtension("class"); //$NON-NLS-1$ - if (tracker instanceof IConsoleLineTracker) { - lineNotifier.addConsoleListener((IConsoleLineTracker)tracker); - } else { - DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.2"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()})); //$NON-NLS-1$ - } - } catch (CoreException e) { - DebugUIPlugin.log(e); - } - } + + ArrayList trackers = new ArrayList(); + for(Iterator i = ((List)fLineTrackers.get(type)).iterator(); i.hasNext(); ) { + IConfigurationElement element = (IConfigurationElement) i.next(); + try { + trackers.add(element.createExecutableExtension("class")); //$NON-NLS-1$ + } catch (CoreException e) { + DebugUIPlugin.log(e); + } } - return lineNotifier; + return (IConsoleLineTracker[]) trackers.toArray(new IConsoleLineTracker[0]); } /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java deleted file mode 100644 index c42f199ef..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.debug.internal.ui.DebugPluginImages; -import org.eclipse.debug.internal.ui.DebugUIPlugin; -import org.eclipse.debug.internal.ui.IDebugHelpContextIds; -import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; -import org.eclipse.debug.internal.ui.actions.ActionMessages; -import org.eclipse.debug.ui.IDebugUIConstants; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.ui.help.WorkbenchHelp; - -/** - * Toggles console auto-scroll - */ -public class ScrollLockAction extends Action implements IPropertyChangeListener { - - private IPreferenceStore fStore = DebugUIPlugin.getDefault().getPreferenceStore(); - - public ScrollLockAction() { - super(ActionMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$ - setToolTipText(ActionMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$ - setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_LOCK)); - setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_LOCK)); - setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_LOCK)); - WorkbenchHelp.setHelp( - this, - IDebugHelpContextIds.CONSOLE_SCROLL_LOCK_ACTION); - setChecked(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)); - fStore.addPropertyChangeListener(this); - } - - /** - * @see org.eclipse.jface.action.IAction#run() - */ - public void run() { - fStore.setValue(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK, isChecked()); - } - - public void dispose() { - fStore.removePropertyChangeListener(this); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)) { - setChecked(fStore.getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)); - } - - } -} - diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java deleted file mode 100644 index b1212445e..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.debug.internal.ui.views.console; - - -import org.eclipse.jface.text.TypedRegion; - -/** - * A partition from an input/output stream connected to the console. - */ -public abstract class StreamPartition extends TypedRegion { - - /** - * Stream identifier - */ - private String fStreamIdentifier; - - public StreamPartition(String streamIdentifier, int offset, int length, String type) { - super(offset, length, type); - fStreamIdentifier = streamIdentifier; - } - - - /** - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object partition) { - if (super.equals(partition)) { - fStreamIdentifier.equals(((StreamPartition)partition).getStreamIdentifier()); - } - return false; - } - - /** - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return super.hashCode() + fStreamIdentifier.hashCode(); - } - - /** - * Returns this partition's stream identifier - * - * @return this partition's stream identifier - */ - public String getStreamIdentifier() { - return fStreamIdentifier; - } - - /** - * Returns whether this partition is allowed to be combined with the - * given partition. - * - * @param partition - * @return boolean - */ - public boolean canBeCombinedWith(StreamPartition partition) { - int start = getOffset(); - int end = start + getLength(); - int otherStart = partition.getOffset(); - int otherEnd = otherStart + partition.getLength(); - boolean overlap = (otherStart >= start && otherStart <= end) || (start >= otherStart && start <= otherEnd); - return overlap && getType().equals(partition.getType()) && getStreamIdentifier().equals(partition.getStreamIdentifier()); - } - - /** - * Returns a new partition representing this and the given parition - * combined. - * - * @param partition - * @return partition - */ - public StreamPartition combineWith(StreamPartition partition) { - int start = getOffset(); - int end = start + getLength(); - int otherStart = partition.getOffset(); - int otherEnd = otherStart + partition.getLength(); - int theStart = Math.min(start, otherStart); - int theEnd = Math.max(end, otherEnd); - return createNewPartition(getStreamIdentifier(), theStart, theEnd - theStart); - } - - /** - * Creates a new patition of this type with the given color, offset, - * and length. - * - * @param streamIdentifer - * @param offset - * @param length - * @return ColorPartition - */ - public abstract StreamPartition createNewPartition(String streamIdentifier, int offset, int length); -} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java deleted file mode 100644 index e8a97abf9..000000000 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.debug.internal.ui.views.console; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; - -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.operation.IRunnableWithProgress; - -import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; -import org.eclipse.ui.texteditor.ISchedulingRuleProvider; - -/** - * @since 3.0 - */ -class WorkspaceOperationRunner implements IRunnableContext { - - private IProgressMonitor fProgressMonitor; - - public WorkspaceOperationRunner() { - } - - /** - * Sets the progress monitor. - * - * @param progressMonitor the progress monitor to set - */ - public void setProgressMonitor(IProgressMonitor progressMonitor) { - fProgressMonitor= progressMonitor; - } - - /** - * Returns the progress monitor. It there is no progress monitor the monitor\ - * is set to the <code>NullProgressMonitor</code>. - * - * @return the progress monitor - */ - public IProgressMonitor getProgressMonitor() { - if (fProgressMonitor == null) - fProgressMonitor= new NullProgressMonitor(); - return fProgressMonitor; - } - - /* - * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) - */ - public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { - if (runnable instanceof ISchedulingRuleProvider) - run(fork, cancelable, runnable, ((ISchedulingRuleProvider)runnable).getSchedulingRule()); - else - run(fork, cancelable, runnable, ResourcesPlugin.getWorkspace().getRoot()); - } - - /* - * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) - */ - public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable, ISchedulingRule schedulingRule) throws InvocationTargetException, InterruptedException { - WorkspaceModifyDelegatingOperation operation= new WorkspaceModifyDelegatingOperation(runnable, schedulingRule); - operation.run(getProgressMonitor()); - } -} diff --git a/org.eclipse.ui.console/console work.txt b/org.eclipse.ui.console/console work.txt new file mode 100644 index 000000000..9eff53b4c --- /dev/null +++ b/org.eclipse.ui.console/console work.txt @@ -0,0 +1,38 @@ +1. Extension Point: IPatternMatchListenerDelegate + id: + class: (new IPatternMatchListenerDelegate... only matchFound()) + regex: + flags: + enablement: + test consoleType + +2. IConsoleManager + #getPatternMatchExtensions(IConsole) + #getPageParticipantExtensions(IConsole) + +3. IOConsole + get/setAttribute() + ATTR_CONSOLE_TYPE + +4. IConsolePageParticipantDelegate + init(IPageBookViewPage) + dispose() + contextMenuAboutToShoe(MenuThing) + toolbar(toolbar manager) + +5. Extension Point: IConsolePageParticipantDelegate + id: + class: + enablement: + +6. Extension: ConsoleFactory + id: + class: + enablement: + label: + image: + +7. IConsoleFactory (really a delegate) + IConsole openConsole() + +8. Clean up the junk that isn't used anymore. (ConsoleDocumentPartitioner, ConsoleDocumentProvider...)
\ No newline at end of file diff --git a/org.eclipse.ui.console/plugin.properties b/org.eclipse.ui.console/plugin.properties index 5470175f3..986502caf 100644 --- a/org.eclipse.ui.console/plugin.properties +++ b/org.eclipse.ui.console/plugin.properties @@ -18,3 +18,5 @@ ViewCommand.consoleView.description=Show the Console view ConsoleFontDefinition.description= The console text font is used by the generic console ConsoleFontDefinition.label= Console Text Font + +ConsolePatternMatchListenerName= Console Pattern Match Listener
\ No newline at end of file diff --git a/org.eclipse.ui.console/plugin.xml b/org.eclipse.ui.console/plugin.xml index 16c975b4e..dac378e1d 100644 --- a/org.eclipse.ui.console/plugin.xml +++ b/org.eclipse.ui.console/plugin.xml @@ -17,7 +17,9 @@ <import plugin="org.eclipse.jface.text"/> <import plugin="org.eclipse.ui.workbench.texteditor"/> <import plugin="org.eclipse.core.runtime"/> + <import plugin="org.eclipse.core.expressions"/> </requires> + <extension-point id="consolePatternMatchListener" name="%ConsolePatternMatchListenerName" schema="schema/ConsolePatternMatchListener.exsd"/> <extension diff --git a/org.eclipse.ui.console/schema/ConsolePatternMatchListener.exsd b/org.eclipse.ui.console/schema/ConsolePatternMatchListener.exsd new file mode 100644 index 000000000..38c167bb5 --- /dev/null +++ b/org.eclipse.ui.console/schema/ConsolePatternMatchListener.exsd @@ -0,0 +1,129 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.ui.console"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.ui.console" id="ConsolePatternMatchListener" name="%ConsolePatternMatchListenerName"/> + </appInfo> + <documentation> + This extension point provides notification when console input or output matches a specified regular expression. + </documentation> + </annotation> + + <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/> + + <element name="extension"> + <complexType> + <sequence> + <element ref="consolePatternMatchListener" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + a fully qualified identifier of the target extension point + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + an optional identifier of the extension instance + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + an optional name of the extension instance + </documentation> + </annotation> + </attribute> + </complexType> + </element> + + <element name="consolePatternMatchListener"> + <complexType> + <sequence> + <element ref="enablement"/> + </sequence> + <attribute name="id" type="string" use="required"> + <annotation> + <documentation> + specifies a unique identifier for this Console Pattern Match Listener + </documentation> + </annotation> + </attribute> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + specifies a fully qualified name of a Java class that implements IPatternMatchListenerDelegate + </documentation> + </annotation> + </attribute> + <attribute name="regex" type="string" use="required"> + <annotation> + <documentation> + specifies the regular expression that should be matched + </documentation> + </annotation> + </attribute> + <attribute name="flags" type="string"> + <annotation> + <documentation> + specifies flags to be used when matching the pattern. Acceptable flags are defined in java.util.regex.Pattern and should be specified as Strings (eg "Pattern.MULTILINE" or "MULTILINE") + </documentation> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appInfo> + <meta.section type="since"/> + </appInfo> + <documentation> + 3.1 + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="examples"/> + </appInfo> + <documentation> + + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="apiInfo"/> + </appInfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="implementation"/> + </appInfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="copyright"/> + </appInfo> + <documentation> + Copyright (c) 2000, 2004 IBM Corporation and others.<br> +All rights reserved. This program and the accompanying materials are made +available under the terms of the Common Public License v1.0 which +accompanies this distribution, and is available at +<a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a> + </documentation> + </annotation> + +</schema> diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java index 5bd8bf823..58ca5d6d9 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java @@ -27,6 +27,12 @@ public interface IConsoleConstants { * Console view identifier (value <code>"org.eclipse.ui.console.ConsoleView"</code>). */ public static final String ID_CONSOLE_VIEW= "org.eclipse.ui.console.ConsoleView"; //$NON-NLS-1$ + + /** + * Type identifier for MessageConsole + * @since 3.1 + */ + public static final String MESSAGE_CONSOLE_TYPE = "org.eclipse.ui.MessageConsole"; //$NON-NLS-1$ /** * The name of the font to use for the Console (value <code>"org.eclipse.ui.console.ConsoleFont"</code>). @@ -58,4 +64,12 @@ public interface IConsoleConstants { * Status code indicating an unexpected internal error. */ public static final int INTERNAL_ERROR = 120; + + /** + * Console Pattern Match Listener extension point identifier + * (value <code>"consolePatternMatchListener"</code>). + * + * @since 3.1 + */ + public static final String EXTENSION_POINT_CONSOLE_PATTERN_MATCH_LISTENER = "consolePatternMatchListener"; //$NON-NLS-1$ } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java index db3234ec1..8fd4a0070 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.ui.console; + /** * Manages consoles. * <p> @@ -75,4 +76,13 @@ public interface IConsoleManager { * @param console the console that has changed */ public void warnOfContentChange(IConsole console); + + /** + * Returns an array of pattern match listeners which should be enabled for + * the given console. + * @param console The console for which PatternMatchListeners are required + * @return an array of IPatternMatchListner + * @since 3.1 + */ + public IPatternMatchListener[] getPatternMatchListeners(IConsole console); } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java index f929bcdc8..e43d83c32 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java @@ -13,6 +13,7 @@ package org.eclipse.ui.console; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -107,8 +108,13 @@ public class IOConsole extends AbstractConsole implements IDocumentListener { private ArrayList patterns = new ArrayList(); - public IOConsole(String name, ImageDescriptor imageDescriptor) { + private String type; + + private HashMap attributes = new HashMap(); + + public IOConsole(String name, String consoleType, ImageDescriptor imageDescriptor) { super(name, imageDescriptor); + type = consoleType; inputStream = new IOConsoleInputStream(this); partitioner = new IOConsolePartitioner(inputStream, this); Document document = new Document(); @@ -116,7 +122,42 @@ public class IOConsole extends AbstractConsole implements IDocumentListener { partitioner.connect(document); document.addDocumentListener(this); } + + public IOConsole(String name, ImageDescriptor imageDescriptor) { + this(name, null, imageDescriptor); + } + + /** + * @return Returns the type. + */ + public String getType() { + return type; + } + /** + * @param type The type to set. + */ + public void setType(String type) { + this.type = type; + } + + + /** + * @return Returns the attribute matching the specified key. + */ + public String getAttribute(String key) { + return (String)attributes.get(key); + } + /** + * @param key The key used to store the attribute + * @param value The attribute to set. + */ + public void setAttribute(String key, String value) { + synchronized(attributes) { + attributes.put(key, value); + } + } + /** * Returns the document this console writes to. * @@ -319,6 +360,9 @@ public class IOConsole extends AbstractConsole implements IDocumentListener { synchronized (patterns) { patterns.clear(); } + synchronized(attributes) { + attributes.clear(); + } } /** @@ -334,6 +378,7 @@ public class IOConsole extends AbstractConsole implements IDocumentListener { Pattern pattern = Pattern.compile(matchListener.getPattern(), matchListener.getCompilerFlags()); CompiledPatternMatchListener notifier = new CompiledPatternMatchListener(pattern, matchListener); patterns.add(notifier); + matchListener.connect(this); try { testForMatch(notifier, 0); @@ -352,6 +397,7 @@ public class IOConsole extends AbstractConsole implements IDocumentListener { CompiledPatternMatchListener element = (CompiledPatternMatchListener) iter.next(); if (element.listener == matchListener) { iter.remove(); + matchListener.disconnect(); } } } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java index 0f9039954..421413b40 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java @@ -27,6 +27,10 @@ public interface IPatternMatchListener { */ public String getPattern(); + /** + * Returns an int to be used by <code>Pattern.compile(String regex, int flags)</code> + * @return + */ public int getCompilerFlags(); /** @@ -34,6 +38,18 @@ public interface IPatternMatchListener { * * @param event event describing where the match was found */ + public void matchFound(PatternMatchEvent event); + + /** + * Connects this PatternMatchListener to the console + * @param console The console this Listener is attached to + */ + public void connect(IConsole console); + + /** + * Disconnects this PatternMatchListener from the console + */ + public void disconnect(); } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.java new file mode 100644 index 000000000..ab8d7863c --- /dev/null +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.console; + +/** + * @see org.eclipse.ui.console.IOConsole + * @since 3.1 + */ +public interface IPatternMatchListenerDelegate { + /** + * Connects the delegate to the console being monitored + * @param console the console being monitored + */ + public void connect(IConsole console); + + /** + * Disconnects the delegate from the console + */ + public void disconnect(); + + /** + * Notification that a match has been found. + * + * @param event event describing where the match was found + */ + public void matchFound(PatternMatchEvent event); +} diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java index 5af3d4be0..3a2cdc1f0 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java @@ -27,7 +27,7 @@ import org.eclipse.ui.part.IPageBookViewPage; public class MessageConsole extends IOConsole { public MessageConsole(String name, ImageDescriptor imageDescriptor) { - super(name, imageDescriptor); + super(name, IConsoleConstants.MESSAGE_CONSOLE_TYPE, imageDescriptor); } /** diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java index 0f008cf44..ddc31bdda 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java @@ -11,8 +11,12 @@ package org.eclipse.ui.internal.console; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; @@ -29,6 +33,8 @@ import org.eclipse.ui.console.IConsoleConstants; import org.eclipse.ui.console.IConsoleListener; import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.IConsoleView; +import org.eclipse.ui.console.IOConsole; +import org.eclipse.ui.console.IPatternMatchListener; /** * The singleton console manager. @@ -50,6 +56,8 @@ public class ConsoleManager implements IConsoleManager { // change notification constants private final static int ADDED = 1; private final static int REMOVED = 2; + + private List fPatternMatchListeners; /** * Notifies a console listener of additions or removals @@ -129,7 +137,14 @@ public class ConsoleManager implements IConsoleManager { public synchronized void addConsoles(IConsole[] consoles) { List added = new ArrayList(consoles.length); for (int i = 0; i < consoles.length; i++) { - IConsole console = consoles[i]; + IConsole console = consoles[i]; + if(console instanceof IOConsole) { + IOConsole ioconsole = (IOConsole)console; + IPatternMatchListener[] matchListeners = getPatternMatchListeners(ioconsole); + for (int j = 0; j < matchListeners.length; j++) { + ioconsole.addPatternMatchListener(matchListeners[j]); + } + } if (!fConsoles.contains(console)) { fConsoles.add(console); added.add(console); @@ -237,5 +252,32 @@ public class ConsoleManager implements IConsoleManager { } } } - + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IConsoleManager#getPatternMatchListenerDelegates(org.eclipse.ui.console.IConsole) + */ + public IPatternMatchListener[] getPatternMatchListeners(IConsole console) { + if (fPatternMatchListeners == null) { + fPatternMatchListeners = new ArrayList(); + IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.EXTENSION_POINT_CONSOLE_PATTERN_MATCH_LISTENER); + IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); + for (int i = 0; i < elements.length; i++) { + IConfigurationElement extension = elements[i]; + PatternMatchListenerExtension listener = new PatternMatchListenerExtension(extension); + fPatternMatchListeners.add(listener); //$NON-NLS-1$ + } + } + ArrayList list = new ArrayList(); + for(Iterator i = fPatternMatchListeners.iterator(); i.hasNext(); ) { + PatternMatchListenerExtension extension = (PatternMatchListenerExtension) i.next(); + try { + if (extension.isEnabledFor(console)) { + list.add(new PatternMatchListener(extension)); + } + } catch (CoreException e) { + ConsolePlugin.log(e); + } + } + return (PatternMatchListener[])list.toArray(new PatternMatchListener[0]); + } } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java new file mode 100644 index 000000000..b927bc620 --- /dev/null +++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.internal.console; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.ui.console.IConsole; +import org.eclipse.ui.console.IPatternMatchListener; +import org.eclipse.ui.console.IPatternMatchListenerDelegate; +import org.eclipse.ui.console.PatternMatchEvent; + +public class PatternMatchListener implements IPatternMatchListener { + + private PatternMatchListenerExtension fExtension; + private IPatternMatchListenerDelegate fDelegate; + + public PatternMatchListener(PatternMatchListenerExtension extension) throws CoreException { + fExtension = extension; + fDelegate = fExtension.createDelegate(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#getPattern() + */ + public String getPattern() { + return fExtension.getPattern(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#getCompilerFlags() + */ + public int getCompilerFlags() { + return fExtension.getCompilerFlags(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#matchFound(org.eclipse.ui.console.PatternMatchEvent) + */ + public void matchFound(PatternMatchEvent event) { + fDelegate.matchFound(event); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#connect(org.eclipse.ui.console.IConsole) + */ + public void connect(IConsole console) { + fDelegate.connect(console); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#disconnect() + */ + public void disconnect() { + fDelegate.disconnect(); + } + +} diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.java new file mode 100644 index 000000000..41fafba93 --- /dev/null +++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.internal.console; + +import java.lang.reflect.Field; + +import org.eclipse.core.expressions.EvaluationContext; +import org.eclipse.core.expressions.EvaluationResult; +import org.eclipse.core.expressions.Expression; +import org.eclipse.core.expressions.ExpressionConverter; +import org.eclipse.core.expressions.ExpressionTagNames; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.ui.IPluginContribution; +import org.eclipse.ui.console.ConsolePlugin; +import org.eclipse.ui.console.IConsole; +import org.eclipse.ui.console.IPatternMatchListenerDelegate; + +public class PatternMatchListenerExtension implements IPluginContribution { + + private IConfigurationElement fConfig; + private Expression fEnablementExpression; + private String fPattern; + private int fFlags = -1; + + public PatternMatchListenerExtension(IConfigurationElement extension) { + fConfig = extension; + } + + public int parseFlags(String flagsElement) { + int val = 0; + if (flagsElement == null) { + return val; + } + + try { + flagsElement = flagsElement.replaceAll("Pattern.", ""); //$NON-NLS-1$ //$NON-NLS-2$ + String[] tokens = flagsElement.split("\\s\\|\\s"); //$NON-NLS-1$ + Class clazz = Class.forName("java.util.regex.Pattern"); //$NON-NLS-1$ + + for (int i = 0; i < tokens.length; i++) { + Field field = clazz.getDeclaredField(tokens[i]); + val |= field.getInt(null); + } + } catch (ClassNotFoundException e) { + ConsolePlugin.log(e); + } catch (NoSuchFieldException e) { + ConsolePlugin.log(e); + } catch (IllegalAccessException e) { + ConsolePlugin.log(e); + } + return val; + } + + public boolean isEnabledFor(IConsole console) throws CoreException { + EvaluationContext context = new EvaluationContext(null, console); + EvaluationResult evaluationResult = getEnablementExpression().evaluate(context); + return evaluationResult == EvaluationResult.TRUE; + } + + public String getId() { + return fConfig.getAttribute("id"); //$NON-NLS-1$ + } + + /** + * @return + * @throws CoreException + */ + public IPatternMatchListenerDelegate createDelegate() throws CoreException { + return (IPatternMatchListenerDelegate) fConfig.createExecutableExtension("class"); //$NON-NLS-1$ + } + + public Expression getEnablementExpression() throws CoreException { + if (fEnablementExpression == null) { + IConfigurationElement[] elements = fConfig.getChildren(ExpressionTagNames.ENABLEMENT); + IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; + + if (enablement != null) { + fEnablementExpression = ExpressionConverter.getDefault().perform(enablement); + } + } + return fEnablementExpression; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#getPattern() + */ + public String getPattern() { + if (fPattern == null) { + fPattern = fConfig.getAttributeAsIs("regex"); //$NON-NLS-1$ + } + return fPattern; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.console.IPatternMatchListener#getCompilerFlags() + */ + public int getCompilerFlags() { + if(fFlags < 0) { + String flagsAttribute = fConfig.getAttributeAsIs("flags"); //$NON-NLS-1$ + fFlags = parseFlags(flagsAttribute); + } + return fFlags; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.IPluginContribution#getLocalId() + */ + public String getLocalId() { + return getId(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.IPluginContribution#getPluginId() + */ + public String getPluginId() { + return fConfig.getDeclaringExtension().getNamespace(); + } + +} |