001 package com.croftsoft.core.gui;
002
003 import java.awt.*;
004
005 import javax.swing.*;
006
007 import com.croftsoft.core.lang.StringLib;
008 import com.croftsoft.core.lang.ThrowableLib;
009 import com.croftsoft.core.util.log.Log;
010
011 /*********************************************************************
012 * A Log that records events to a JTextArea in a JPanel.
013 *
014 * @version
015 * $Id: LogPanel.java,v 1.6 2006/11/15 22:39:35 croft Exp $
016 * @since
017 * 2001-07-30
018 * @author
019 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
020 *********************************************************************/
021
022 public class LogPanel
023 extends JPanel
024 implements Log
025 //////////////////////////////////////////////////////////////////////
026 //////////////////////////////////////////////////////////////////////
027 {
028
029 private static final long serialVersionUID = 0L;
030
031 //
032
033 public static final int DEFAULT_LINES_MAX = 100;
034
035 //
036
037 private final int linesMax;
038
039 private final JTextArea jTextArea;
040
041 //////////////////////////////////////////////////////////////////////
042 //////////////////////////////////////////////////////////////////////
043
044 public LogPanel (
045 int linesMax,
046 Color panelBackgroundColor,
047 // Color textFieldBackgroundColor,
048 Font textAreaFont )
049 //////////////////////////////////////////////////////////////////////
050 {
051 super ( new BorderLayout ( ), true ); // isDoubleBuffered
052
053 if ( linesMax < 1 )
054 {
055 throw new IllegalArgumentException ( "linesMax < 1" );
056 }
057
058 this.linesMax = linesMax;
059
060 if ( panelBackgroundColor != null )
061 {
062 setBackground ( panelBackgroundColor );
063 }
064
065 add ( jTextArea = new JTextArea ( ), BorderLayout.CENTER );
066
067 jTextArea.setEditable ( false );
068
069 jTextArea.setLineWrap ( true );
070
071 jTextArea.setWrapStyleWord ( true );
072
073 if ( textAreaFont != null )
074 {
075 jTextArea.setFont ( textAreaFont );
076 }
077
078 jTextArea.setBorder (
079 BorderFactory.createEmptyBorder ( 4, 6, 4, 6 ) );
080 }
081
082 public LogPanel ( final int linesMax )
083 //////////////////////////////////////////////////////////////////////
084 {
085 this ( linesMax, null, null );
086 }
087
088 public LogPanel ( )
089 //////////////////////////////////////////////////////////////////////
090 {
091 this ( DEFAULT_LINES_MAX, null, null );
092 }
093
094 //////////////////////////////////////////////////////////////////////
095 //////////////////////////////////////////////////////////////////////
096
097 public synchronized void record ( String message )
098 //////////////////////////////////////////////////////////////////////
099 {
100 String [ ] newTextStringArray
101 = StringLib.toStringArray ( message );
102
103 String oldText = jTextArea.getText ( );
104
105 String [ ] oldTextStringArray
106 = StringLib.toStringArray ( oldText );
107
108 int lineCount = oldTextStringArray.length;
109
110 if ( oldText.trim ( ).equals ( "" ) )
111 {
112 lineCount = 0;
113 }
114
115 if ( lineCount + newTextStringArray.length > linesMax )
116 {
117 String newText2
118 = newTextStringArray [ newTextStringArray.length - 1 ];
119
120 int lineCount2 = 1;
121
122 for (
123 int i = newTextStringArray.length - 2;
124 ( i > -1 ) && ( ++lineCount2 <= linesMax );
125 i-- )
126 {
127 newText2 = newTextStringArray [ i ] + "\n" + newText2;
128 }
129
130 for (
131 int i = oldTextStringArray.length - 1;
132 ( i > -1 ) && ( ++lineCount2 <= linesMax );
133 i-- )
134 {
135 newText2 = oldTextStringArray [ i ] + "\n" + newText2;
136 }
137
138 jTextArea.setText ( newText2 );
139 }
140 else if ( oldText.trim ( ).equals ( "" ) )
141 {
142 jTextArea.setText ( message );
143 }
144 else
145 {
146 jTextArea.setText ( oldText + "\n" + message );
147 }
148 }
149
150 public synchronized void record ( Throwable throwable )
151 //////////////////////////////////////////////////////////////////////
152 {
153 record ( ThrowableLib.getStackTrace ( throwable ) );
154 }
155
156
157 public synchronized void record (
158 String message, Throwable throwable )
159 //////////////////////////////////////////////////////////////////////
160 {
161 record ( message + '\n'
162 + ThrowableLib.getStackTrace ( throwable ) );
163 }
164
165 //////////////////////////////////////////////////////////////////////
166 //////////////////////////////////////////////////////////////////////
167
168 public void clear ( )
169 //////////////////////////////////////////////////////////////////////
170 {
171 jTextArea.setText ( "" );
172 }
173
174 //////////////////////////////////////////////////////////////////////
175 //////////////////////////////////////////////////////////////////////
176 }