mirror of
https://github.com/apache/cloudstack.git
synced 2025-12-15 18:12:35 +01:00
188 lines
5.4 KiB
Java
188 lines
5.4 KiB
Java
/*
|
|
* 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(); }
|
|
}
|
|
}
|
|
|
|
|
|
} |