diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java | 1003 |
1 files changed, 0 insertions, 1003 deletions
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) { - } -} |