Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarin Wright2002-11-28 22:09:29 +0000
committerDarin Wright2002-11-28 22:09:29 +0000
commit82401c0a0cdb8515c7a2b0baea7f237c1524740a (patch)
treec2f8381f9d32dc60ed7c87e321a4491c5c3a900b /org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console
parente43e0342f97439a15a02d5f33185c730a120e258 (diff)
downloadeclipse.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.java69
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java21
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java20
-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);
- }
}

Back to the top