diff options
author | Darin Wright | 2002-11-28 22:09:29 +0000 |
---|---|---|
committer | Darin Wright | 2002-11-28 22:09:29 +0000 |
commit | 82401c0a0cdb8515c7a2b0baea7f237c1524740a (patch) | |
tree | c2f8381f9d32dc60ed7c87e321a4491c5c3a900b /org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console | |
parent | e43e0342f97439a15a02d5f33185c730a120e258 (diff) | |
download | eclipse.platform.debug-82401c0a0cdb8515c7a2b0baea7f237c1524740a.tar.gz eclipse.platform.debug-82401c0a0cdb8515c7a2b0baea7f237c1524740a.tar.xz eclipse.platform.debug-82401c0a0cdb8515c7a2b0baea7f237c1524740a.zip |
bug 26830
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java | 69 | ||||
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java | 21 | ||||
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java | 20 | ||||
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java (renamed from org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentLineTracker.java) | 84 |
4 files changed, 146 insertions, 48 deletions
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 index ba9529e01..c9191ae78 100644 --- 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 @@ -8,7 +8,10 @@ http://www.eclipse.org/legal/cpl-v10.html **********************************************************************/ 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; @@ -56,7 +59,12 @@ public class ConsoleDocumentManager implements ILaunchListener { /** * Console document content provider extensions, keyed by extension id
*/ - private Map fContentProviders; + private Map fColorProviders; + + /** + * Console line trackers; keyed by process type to list of trackers (1:N) + */ + private Map fLineTrackers; /** * Default document provider.
*/ @@ -307,21 +315,21 @@ public class ConsoleDocumentManager implements ILaunchListener { } /** - * Returns a new console document content provider extension for the given + * 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 getContentProvider(String type) { - if (fContentProviders == null) { - fContentProviders = new HashMap(); + public IConsoleColorProvider getColorProvider(String type) { + if (fColorProviders == null) { + fColorProviders = new HashMap(); IPluginDescriptor descriptor = DebugUIPlugin.getDefault().getDescriptor(); IExtensionPoint extensionPoint = descriptor.getExtensionPoint(IDebugUIConstants.EXTENSION_POINT_CONSOLE_COLOR_PROVIDERS); IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); for (int i = 0; i < elements.length; i++) { IConfigurationElement extension = elements[i]; - fContentProviders.put(extension.getAttributeAsIs("processType"), extension); + fColorProviders.put(extension.getAttributeAsIs("processType"), extension); } } - IConfigurationElement extension = (IConfigurationElement)fContentProviders.get(type); + IConfigurationElement extension = (IConfigurationElement)fColorProviders.get(type); if (extension != null) { try { Object contentProvider = extension.createExecutableExtension("class"); //$NON-NLS-1$ @@ -336,4 +344,51 @@ public class ConsoleDocumentManager implements ILaunchListener { } 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(); + IPluginDescriptor descriptor = DebugUIPlugin.getDefault().getDescriptor(); + IExtensionPoint extensionPoint = descriptor.getExtensionPoint(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"); + 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("Invalid extension {0} - class must be an instance of IConsoleLineTracker",new String[]{extension.getDeclaringExtension().getUniqueIdentifier()})); + } + } catch (CoreException e) { + DebugUIPlugin.log(e); + } + } + } + return lineNotifier; + } } 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 index 5a646c3c4..c3879428c 100644 --- 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 @@ -185,6 +185,11 @@ public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocume * 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) @@ -205,6 +210,9 @@ public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocume */ public void disconnect() { kill(); + if (fLineNotifier != null) { + fLineNotifier.disconnect(); + } fContentProvider.disconnect(); fDocument.setDocumentPartitioner(null); } @@ -286,6 +294,9 @@ public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocume 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(); @@ -714,5 +725,15 @@ public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocume 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); + } } 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 index ac69ba1ca..35d6a54fd 100644 --- 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 @@ -10,9 +10,9 @@ http://www.eclipse.org/legal/cpl-v10.html import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.ui.console.*; +import org.eclipse.debug.ui.console.ConsoleColorProvider; +import org.eclipse.debug.ui.console.IConsoleColorProvider; import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.ui.texteditor.AbstractDocumentProvider; @@ -30,8 +30,12 @@ public class ConsoleDocumentProvider extends AbstractDocumentProvider { IProcess process = (IProcess)element; IConsoleColorProvider contentProvider = getContentProvider(process); ConsoleDocument doc= new ConsoleDocument(contentProvider); - IDocumentPartitioner partitioner = new ConsoleDocumentPartitioner(process, contentProvider); + ConsoleDocumentPartitioner partitioner = new ConsoleDocumentPartitioner(process, contentProvider); + ConsoleLineNotifier lineNotifier = getLineNotifier(process); partitioner.connect(doc); + if (lineNotifier != null) { + partitioner.connectLineNotifier(lineNotifier); + } return doc; } return null; @@ -72,7 +76,7 @@ public class ConsoleDocumentProvider extends AbstractDocumentProvider { String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE); IConsoleColorProvider contentProvider = null; if (type != null) { - contentProvider = ConsoleDocumentManager.getDefault().getContentProvider(type); + contentProvider = ConsoleDocumentManager.getDefault().getColorProvider(type); } if (contentProvider == null) { contentProvider = new ConsoleColorProvider(); @@ -81,15 +85,15 @@ public class ConsoleDocumentProvider extends AbstractDocumentProvider { } /** - * Returns the line tracker for this console, or <code>null</code> if none. + * Returns the line notifier for this console, or <code>null</code> if none. * * @param process - * @return line tracker, or <code>null</code> + * @return line notifier, or <code>null</code> */ - protected ConsoleDocumentLineTracker getLineTracker(IProcess process) { + protected ConsoleLineNotifier getLineNotifier(IProcess process) { String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE); if (type != null) { - // TODO: + return ConsoleDocumentManager.getDefault().newLineNotifier(type); } return null; } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentLineTracker.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java index 30c020fe9..99a547c9d 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentLineTracker.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java @@ -9,7 +9,7 @@ http://www.eclipse.org/legal/cpl-v10.html import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.ui.console.IConsole; -import org.eclipse.debug.ui.console.IConsoleListener; +import org.eclipse.debug.ui.console.IConsoleLineTracker; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; @@ -20,7 +20,7 @@ import org.eclipse.jface.util.ListenerList; * Tracks text appended to the console and notifies listeners in terms of whole * lines. */ -public class ConsoleDocumentLineTracker { +public class ConsoleLineNotifier { /** * Number of lines processed in the console @@ -33,40 +33,67 @@ public class ConsoleDocumentLineTracker { private ListenerList fListeners = new ListenerList(2); /** - * Constructor for ConsoleDocumentLineTracker. + * The console this notifier is tracking */ - public ConsoleDocumentLineTracker() { - super(); + private IConsole fConsole = null; + + /** + * Connects this notifier to the given console. + * + * @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); + } } - + + /** + * Disposes this notifier + */ + public void disconnect() { + Object[] listeners = fListeners.getListeners(); + for (int i = 0; i < listeners.length; i++) { + IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i]; + listener.dispose(); + } + fListeners = null; + fConsole = null; + } + /** * Notification the console has changed based on the given event */ - public void consoleChanged(IConsole console, DocumentEvent event) { + public void consoleChanged(DocumentEvent event) { IDocument document = event.getDocument(); int lines = document.getNumberOfLines(); - for (int line = fLinesProcessed; line <= lines; line++) { - String delimiter; + Object[] listeners = fListeners.getListeners(); + for (int line = fLinesProcessed; line < lines; line++) { + String delimiter = null; try { delimiter = document.getLineDelimiter(line); } catch (BadLocationException e) { DebugUIPlugin.log(e); return; } - if (delimiter != null) { - fLinesProcessed++; - IRegion lineRegion = null; - try { - lineRegion = document.getLineInformation(line); - } catch (BadLocationException e) { - DebugUIPlugin.log(e); - return; - } - Object[] listeners = fListeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - IConsoleListener listener = (IConsoleListener)listeners[i]; - listener.lineAppended(console, lineRegion); - } + if (delimiter == null) { + // line not complete yet + return; + } + fLinesProcessed++; + IRegion lineRegion = null; + try { + lineRegion = document.getLineInformation(line); + } catch (BadLocationException e) { + DebugUIPlugin.log(e); + return; + } + for (int i = 0; i < listeners.length; i++) { + IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i]; + listener.lineAppended(lineRegion); } } // TODO: what about the last line? @@ -78,17 +105,8 @@ public class ConsoleDocumentLineTracker { * * @param listener */ - public void addConsoleListener(IConsoleListener listener) { + public void addConsoleListener(IConsoleLineTracker listener) { fListeners.add(listener); } - /** - * Removes the given listener from the list of listeners notified when a - * line of text is appended to the console. - * - * @param listener - */ - public void removeConsoleListener(IConsoleListener listener) { - fListeners.remove(listener); - } } |