blob: a126de8f35d11aa9a42c19e443f4601498a4d50c [file] [log] [blame]
package org.eclipse.debug.internal.ui.views.console;
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. All rights reserved.
This file is 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
**********************************************************************/
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.console.IConsole;
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;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.util.ListenerList;
/**
* Tracks text appended to the console and notifies listeners in terms of whole
* lines.
*/
public class ConsoleLineNotifier {
/**
* Number of lines processed in the console
*/
private int fLinesProcessed = 0;
/**
* Console listeners
*/
private ListenerList fListeners = new ListenerList(2);
/**
* The console this notifier is tracking
*/
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(DocumentEvent event) {
IDocument document = event.getDocument();
int lines = document.getNumberOfLines();
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) {
// 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?
}
/**
* Adds the given listener to the list of listeners notified when a line of
* text is appended to the console.
*
* @param listener
*/
public void addConsoleListener(IConsoleLineTracker listener) {
fListeners.add(listener);
}
protected void setLinesProcessed(int linesProcessed) {
fLinesProcessed = linesProcessed;
}
protected int getLinesProcessed() {
return fLinesProcessed;
}
}