blob: 358430e6cb02801e315fe5fde0ce0ca6b318cb09 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.ant.debugger;
import java.io.IOException;
import java.util.Hashtable;
import java.util.LinkedList;
import javax.swing.SwingUtilities;
import org.openide.awt.StatusDisplayer;
import org.openide.util.Exceptions;
import org.openide.util.RequestProcessor;
import org.openide.windows.IOProvider;
import org.openide.windows.InputOutput;
import org.openide.windows.OutputEvent;
import org.openide.windows.OutputListener;
import org.openide.windows.OutputWriter;
public class IOManager {
// variables ...............................................................
protected InputOutput debuggerIO = null;
private OutputWriter debuggerOut;
private OutputWriter debuggerErr;
private String name;
private boolean closed = false;
/** output writer Thread */
private Hashtable<String, Object> lines = new Hashtable<>();
private Listener listener = new Listener ();
// init ....................................................................
public IOManager (
String title
) {
debuggerIO = IOProvider.getDefault ().getIO (title, true);
debuggerIO.setFocusTaken (false);
debuggerOut = debuggerIO.getOut ();
debuggerErr = debuggerIO.getErr ();
}
// public interface ........................................................
private final LinkedList buffer = new LinkedList ();
private RequestProcessor.Task task;
/**
* Prints given text to the output.
*/
public void println (
final String text,
final Object line
) {
println(text, line, false);
}
/**
* Prints given text to the output.
*/
public void println (
final String text,
final Object line,
final boolean important
) {
if (text == null)
throw new NullPointerException ();
synchronized (buffer) {
buffer.addLast (new Text (text, line, important));
}
if (task == null)
task = RequestProcessor.getDefault ().post (new Runnable () {
@Override
public void run () {
synchronized (buffer) {
int i, k = buffer.size ();
for (i = 0; i < k; i++) {
Text t = (Text) buffer.removeFirst ();
try {
OutputWriter ow = (t.important) ? debuggerErr : debuggerOut;
if (t.line != null) {
ow.println (t.text, listener, t.important);
lines.put (t.text, t.line);
} else
ow.println (t.text, null, t.important);
ow.flush ();
if (t.important) {
debuggerIO.select();
}
if (closed)
debuggerOut.close ();
StatusDisplayer.getDefault ().setStatusText (t.text);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
}, 100, Thread.MIN_PRIORITY);
else
task.schedule (100);
}
void closeStream () {
debuggerOut.close ();
closed = true;
close();
}
void close () {
debuggerIO.closeInputOutput ();
}
// innerclasses ............................................................
private class Listener implements OutputListener {
@Override
public void outputLineSelected (OutputEvent ev) {
}
@Override
public void outputLineAction (final OutputEvent ev) {
SwingUtilities.invokeLater (new Runnable () {
@Override
public void run () {
String t = ev.getLine ();
Object a = lines.get (t);
if (a == null) return;
Utils.showLine (a);
}
});
}
@Override
public void outputLineCleared (OutputEvent ev) {
lines = new Hashtable ();
}
}
private static class Text {
private final String text;
private final Object line;
private final boolean important;
private Text (String text, Object line, boolean important) {
this.text = text;
this.line = line;
this.important = important;
}
}
}