You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

359 lines
7.2 KiB

//==============================================================================
//
// Copyright (c) 2002-
// Authors:
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford, formerly University of Birmingham)
// * Andrew Hinton <ug60axh@cs.bham.ac.uk> (University of Birmingham)
//
//------------------------------------------------------------------------------
//
// This file is part of PRISM.
//
// PRISM is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// PRISM is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PRISM; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//==============================================================================
package userinterface.log;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import prism.*;
import userinterface.GUIPlugin;
import userinterface.util.GUIEvent;
public class GUIWindowLog implements PrismLog
{
// text area swing object where all text will be echoed
private JTextArea textArea;
// update thread
private GUIWindowLogUpdater updater;
// buffer
private String buffer;
// clear flag
private boolean clearFlag;
private GUILog logPlugin;
public GUIWindowLog()
{
buffer = "";
clearFlag = false;
textArea = null;
updater = null;
}
public GUIWindowLog(JTextArea ta, GUILog logPlugin)
{
buffer = "";
clearFlag = false;
open(ta, logPlugin);
}
public void open(JTextArea ta, GUILog logPlugin)
{
this.logPlugin = logPlugin;
textArea = ta;
textArea.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
if (GUIWindowLog.this.logPlugin != null)
GUIWindowLog.this.logPlugin.getSelectionChangeHandler().notifyListeners(new GUIEvent(1));
}
});
updater = new GUIWindowLogUpdater(this, textArea);
updater.start();
}
public boolean ready()
{
return (textArea != null);
}
public void print(boolean b)
{
addToBuffer("" + b);
}
public void print(char c)
{
addToBuffer("" + c);
}
public void print(double d)
{
addToBuffer("" + d);
}
public void print(float f)
{
addToBuffer("" + f);
}
public void print(int i)
{
addToBuffer("" + i);
}
public void print(long l)
{
addToBuffer("" + l);
}
public void print(Object obj)
{
addToBuffer("" + obj);
}
public void print(String s)
{
addToBuffer(s);
}
public void println()
{
addToBuffer("\n");
}
public void println(boolean b)
{
addToBuffer("" + b + "\n");
}
public void println(char c)
{
addToBuffer("" + c + "\n");
}
public void println(double d)
{
addToBuffer("" + d + "\n");
}
public void println(float f)
{
addToBuffer("" + f + "\n");
}
public void println(int i)
{
addToBuffer("" + i + "\n");
}
public void println(long l)
{
addToBuffer("" + l + "\n");
}
public void println(Object obj)
{
addToBuffer("" + obj + "\n");
}
public void println(String s)
{
addToBuffer(s + "\n");
}
public long getFilePointer()
{
return -1;
}
public void flush()
{
}
public void clear()
{
setClearFlag();
}
public void close()
{
}
public int getMaxTextLength()
{
return updater.getMaxTextLength();
}
public void setMaxTextLength(int i)
{
updater.setMaxTextLength(i);
}
// add string to buffer
public synchronized void addToBuffer(String s)
{
buffer += s;
}
// remove contents of buffer
public synchronized String takeBuffer()
{
String s = buffer;
buffer = "";
return s;
}
// set clear flag
public synchronized void setClearFlag()
{
clearFlag = true;
}
// get (and reset) clear flag
public synchronized boolean getClearFlag()
{
boolean b = clearFlag;
clearFlag = false;
return b;
}
// thread which periodically checks for any pending input to log and adds it to window
class GUIWindowLogUpdater extends Thread
{
private GUIWindowLog gwl;
private JTextArea textArea;
private String text;
private int textLen = 0;
private int maxTextLen = 10000;
private int updateDelay = 1000;
public GUIWindowLogUpdater(GUIWindowLog gwl, JTextArea textArea)
{
super();
this.gwl = gwl;
this.textArea = textArea;
text = "";
}
public int getMaxTextLength()
{
return maxTextLen;
}
public void setMaxTextLength(int i)
{
maxTextLen = i;
}
public void run()
{
String s;
int newStart, i;
while (true) {
// sleep
try { Thread.sleep(updateDelay); } catch (InterruptedException e) {}
// clear log if asked to
if (gwl.getClearFlag()) {
// remove (but don't display) and input pending
gwl.takeBuffer();
// clear log
text = "";
textLen += 0;
// update text area
SwingUtilities.invokeLater(new SetWindowLogText(textArea, text));
}
// get any new input to log
s = gwl.takeBuffer();
// if there actually is any...
if (s.length() > 0) {
// add to text
text += s;
textLen += s.length();
// truncate text if necessary
if (textLen > maxTextLen) {
// trim to max text length
newStart = textLen - maxTextLen;
// remove any partial line at start (i.e. cut to next new line)
i = text.indexOf('\n', newStart);
if (i != -1) newStart = i + 1;
text = text.substring(newStart);
textLen = text.length();
}
// update text area
SwingUtilities.invokeLater(new SetWindowLogText(textArea, text));
}
}
}
}
// inner class to actually write to the text area
// must be done as a thread because code is called using invokeLater
private class SetWindowLogText extends Thread
{
private JTextArea textArea;
private String s;
public SetWindowLogText(JTextArea textArea, String s)
{
super();
this.textArea = textArea;
this.s = s;
}
public void run()
{
try {
// replace all current contents with string s
textArea.replaceRange(s, 0, textArea.getLineEndOffset(textArea.getLineCount()-1));
}
catch (BadLocationException e) {}
}
}
// receive notification of settings info
public void notifySettings(PrismSettings settings)
{
textArea.setFont(settings.getFontColorPair(PrismSettings.LOG_FONT).f);
//textArea.setSelectionColor(settings.getColor(PrismSettings.LOG_SELECTION_COLOUR));
textArea.setBackground(settings.getColor(PrismSettings.LOG_BG_COLOUR));
setMaxTextLength(settings.getInteger(PrismSettings.LOG_BUFFER_LENGTH));
}
public boolean hasSelectedText()
{
return (textArea != null && textArea.getSelectedText() != null);
}
public void copy()
{
if (textArea != null)
textArea.copy();
}
public void selectAll()
{
if (textArea != null)
textArea.selectAll();
}
}
//------------------------------------------------------------------------------