/*
* Created on 27-Apr-2004
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program 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.
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.pluginsimpl.local.ui.components;
/**
* @author parg
*
*/
import java.io.*;
import java.util.Iterator;
import java.util.LinkedList;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.AETemporaryFileHandler;
import org.gudy.azureus2.core3.util.FileUtil;
import org.gudy.azureus2.core3.util.FrequencyLimitedDispatcher;
import org.gudy.azureus2.plugins.ui.components.*;
public class
UITextAreaImpl
extends UIComponentImpl
implements UITextArea
{
private int max_size = DEFAULT_MAX_SIZE;
PrintWriter pw;
File file;
boolean useFile = true;
AEMonitor file_mon = new AEMonitor("filemon");
LinkedList delay_text = new LinkedList();
int delay_size = 0;
FrequencyLimitedDispatcher dispatcher =
new FrequencyLimitedDispatcher(
new AERunnable()
{
public void
runSupport()
{
delayAppend();
}
},
500 );
public
UITextAreaImpl()
{
setText("");
}
public void
setText(
String text )
{
if (useFile) {
try {
file_mon.enter();
if (pw == null) {
try {
file = AETemporaryFileHandler.createTempFile();
FileWriter fr = new FileWriter(file);
pw = new PrintWriter(fr);
pw.print(text);
pw.flush();
return;
} catch (IOException e) {
}
}
} finally {
file_mon.exit();
}
}
// has property change listener, or error while doing file (fallthrough)
if ( text.length() > max_size ){
int size_to_show = max_size - 10000;
if ( size_to_show < 0 ){
size_to_show = max_size;
}
text = text.substring( text.length() - size_to_show );
}
setProperty( PT_VALUE, text );
}
public void
appendText(
String text )
{
if (useFile && pw != null) {
try {
file_mon.enter();
pw.print(text);
pw.flush();
return;
} finally {
file_mon.exit();
}
}
synchronized( this ){
delay_text.addLast( text );
delay_size += text.length();
while( delay_size > max_size ){
if ( delay_text.size() == 0 ){
break;
}
String s = (String)delay_text.removeFirst();
delay_size -= s.length();
}
}
dispatcher.dispatch();
}
protected void
delayAppend()
{
String str = getText();
String text;
synchronized( this ){
if ( delay_text.size() == 1 ){
text = (String)delay_text.get(0);
}else{
StringBuffer sb = new StringBuffer( delay_size );
Iterator it = delay_text.iterator();
while( it.hasNext()){
sb.append((String)it.next());
}
text = sb.toString();
}
delay_text.clear();
delay_size = 0;
}
if ( str == null ){
setText( text );
}else{
setText( str + text );
}
}
public String
getText()
{
if (useFile && pw != null) {
return getFileText();
}
return((String)getProperty( PT_VALUE ));
}
public void
setMaximumSize(
int _max_size )
{
max_size = _max_size;
}
private String getFileText() {
boolean recreate = pw != null;
try {
file_mon.enter();
if (recreate) {
pw.close();
}
String text = null;
try {
text = FileUtil.readFileEndAsString(file, max_size);
} catch (IOException e) {
e.printStackTrace();
}
if (text == null) {
text = "";
}
if (recreate) {
try {
FileWriter fr = new FileWriter(file, true);
pw = new PrintWriter(fr);
} catch (IOException e) {
useFile = false;
e.printStackTrace();
}
}
return text;
} finally {
file_mon.exit();
}
}
public void addPropertyChangeListener(UIPropertyChangeListener l) {
if (useFile) {
if (pw != null) {
try {
file_mon.enter();
pw.close();
pw = null;
} finally {
file_mon.exit();
}
}
useFile = false;
setText(getFileText());
}
super.addPropertyChangeListener(l);
}
}