blob: 56b989aede55983a4e9eeb852aa6b995e3317f3f [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.apache.log4j.gui;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.text.StyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Enumeration;
import java.util.ArrayList;
import org.apache.log4j.*;
public class LogTextPanel extends JPanel {
private JScrollBar scrollBar;
private JTextPane textPane;
private JCheckBox cbxTail;
private StyledDocument doc;
private Hashtable fontAttributes;
private int eventBufferMaxSize = 10000;
private ArrayList eventBuffer = new ArrayList(eventBufferMaxSize);
private int eventViewIndex = 0;
public LogTextPanel() {
constructComponents();
createDefaultFontAttributes();
}
private void constructComponents() {
// setup the panel's additional components...
this.setLayout(new BorderLayout());
cbxTail = new JCheckBox();
cbxTail.setSelected(true);
cbxTail.setText("Tail log events");
JPanel bottomPanel = new JPanel();
bottomPanel.add(cbxTail, null);
textPane = new JTextPane();
textPane.setEditable(false);
textPane.setText("");
doc = textPane.getStyledDocument();
scrollBar = new JScrollBar(JScrollBar.VERTICAL);
this.add(bottomPanel, BorderLayout.SOUTH);
this.add(scrollBar, BorderLayout.EAST);
this.add(textPane, BorderLayout.CENTER);
}
public
void setTextBackground(Color color) {
textPane.setBackground(color);
}
public
void setTextBackground(String v) {
textPane.setBackground(parseColor(v));
}
private void createDefaultFontAttributes() {
Priority[] prio = Priority.getAllPossiblePriorities();
fontAttributes = new Hashtable();
for (int i=0; i<prio.length;i++) {
MutableAttributeSet att = new SimpleAttributeSet();
fontAttributes.put(prio[i], att);
//StyleConstants.setFontSize(att,11);
}
setTextColor(Priority.FATAL, Color.red);
setTextColor(Priority.ERROR, Color.magenta);
setTextColor(Priority.WARN, Color.orange);
setTextColor(Priority.INFO, Color.blue);
setTextColor(Priority.DEBUG, Color.black);
}
private
Color parseColor (String v) {
StringTokenizer st = new StringTokenizer(v,",");
int val[] = {255,255,255,255};
int i=0;
while (st.hasMoreTokens()) {
val[i]=Integer.parseInt(st.nextToken());
i++;
}
return new Color(val[0],val[1],val[2],val[3]);
}
void setTextColor(Priority p, String v) {
StyleConstants.setForeground(
(MutableAttributeSet)fontAttributes.get(p),parseColor(v));
}
void setTextColor(Priority p, Color c) {
StyleConstants.setForeground(
(MutableAttributeSet)fontAttributes.get(p),c);
}
void setTextFontSize(int size) {
Enumeration e = fontAttributes.elements();
while (e.hasMoreElements()) {
StyleConstants.setFontSize((MutableAttributeSet)e.nextElement(),size);
}
return;
}
void setTextFontName(String name) {
Enumeration e = fontAttributes.elements();
while (e.hasMoreElements()) {
StyleConstants.setFontFamily((MutableAttributeSet)e.nextElement(),name);
}
return;
}
void setEventBufferSize(int bufferSize) {
eventBufferMaxSize = bufferSize;
}
void newEvents(EventBufferElement[] evts) {
if((eventBuffer.size() + evts.length) >= eventBufferMaxSize) {
for(int i=0; i < evts.length; i++) {
eventBuffer.remove(0);
}
eventViewIndex -= evts.length;
if(eventViewIndex < 0)
eventViewIndex = 0;
}
for(int i=0; i < evts.length; i++)
eventBuffer.add(evts[i]);
if((eventBuffer.size() > maxR) && cbxTail.isSelected()) {
eventViewIndex = (eventBuffer.size() - maxR);
}
// only redraw if new line is visible...
if((maxR < 0) || (eventBuffer.size() >= eventViewIndex && eventBuffer.size() <= (eventViewIndex + maxR)))
drawText();
}
int maxR = -1;
void drawText() {
if(maxR < 0)
maxR = textPane.getHeight() / textPane.getFontMetrics(textPane.getFont()).getHeight();
try {
doc.remove(0, doc.getLength());
} catch(Exception e) { e.printStackTrace(); }
for(int i=eventViewIndex; (i < eventBuffer.size()) && (i < (eventViewIndex + maxR)); i++) {
EventBufferElement evt = (EventBufferElement)eventBuffer.get(i);
try {
doc.insertString(doc.getLength(), evt.text, (MutableAttributeSet)fontAttributes.get(evt.prio));
} catch(Exception e) { e.printStackTrace(); }
}
}
}