| /* |
| * 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(); } |
| } |
| } |
| |
| |
| } |