blob: 453191da5971ca1afbd60dbfac6e804d9aa0ab6f [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed 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.felix.mosgi.console.component;
import org.osgi.framework.BundleContext;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.JTree;
import javax.swing.ImageIcon;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.util.StringTokenizer;
import java.lang.StringBuffer;
import java.util.Hashtable;
public class JtreeCellRenderer extends DefaultTreeCellRenderer {
public static final String UNKNOWN_DATE="??/??/??";
public static final String UNKNOWN_TIME="??:??:??:???";
public static Hashtable ht_num2string=new Hashtable();
private boolean isLeaf=false;
private RemoteLogger_jtree rl_jtree=null;
private static final Font FONT_BIG=new Font("Monospaced",Font.BOLD,14);
private static final Font FONT_SMALL=new Font("Monospaced",Font.PLAIN,10);
private static Hashtable ht_string2color=new Hashtable();
private static Hashtable ht_string2icon=new Hashtable();
private static ImageIcon iiOldLog=null;
private static ImageIcon iiNewLog=null;
private static ImageIcon iiNull=null;
public JtreeCellRenderer(BundleContext bdlCtx, RemoteLogger_jtree rl_jtree) {
this.rl_jtree=rl_jtree;
String[] states=new String[] {
"Uninstalled",
"Installed ",
"Resolved ",
"Starting ",
"Stopping ",
"Active "
};
Color[] colors=new Color[] {
Color.black,
Color.red,
Color.orange,
Color.gray,
Color.gray,
Color.green
};
this.iiOldLog=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/OLDLOG.gif")));
this.iiNewLog=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/NEWLOG.gif")));
this.iiNull=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/NULL.gif")));
for (int i=0 ; i<states.length ; i++) {
ht_num2string.put(new Integer((int) Math.pow(2, i)), states[i]);
ht_string2color.put(states[i].trim(), colors[i]);
ht_string2icon.put(states[i].trim(), new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/"+states[i].trim()+".gif"))));
}
}
public Dimension getPreferredSize() {
Dimension dim = super.getPreferredSize();
return (isLeaf)?dim:new Dimension(800,dim.height);
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
this.isLeaf=leaf;
//super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
setText(value.toString());
setOpaque(true);
setBackground(Color.white);
setFont(FONT_BIG);
setToolTipText(null);
StringTokenizer st=null;
DefaultMutableTreeNode dmtn=(DefaultMutableTreeNode)value;
if (rl_jtree.v_ul.contains(dmtn)) {
setIcon(iiNewLog);
} else {
setIcon(iiNull);
}
int lvl=dmtn.getLevel();
switch (lvl) {
case 2: { // port / profilName / logLvl
setText(value+" (log level="+rl_jtree.getLogLvl(dmtn)+")");
break;
}
case 3: { // bundleId / symbolic name / children count
st=new StringTokenizer(dmtn.getFirstChild().toString(),"|");
if(st!=null) {
String date=st.nextToken().trim();
st.nextToken();
String state=st.nextToken().trim();
setBackground((Color) ht_string2color.get(state));
StringTokenizer st2 = new StringTokenizer(((DefaultMutableTreeNode)dmtn.getFirstChild()).toString()," | ");
StringBuffer ttt=new StringBuffer(
"<html><B>IP = </B>"+/*IP=<ip> Profil=<port>/<profil>*/dmtn.getParent().getParent()+"<B> Profil =</B>"+dmtn.getParent()+
"<br><B>Bundle : </B>"+/*Bundle : Id=<bundleId> : <bundleSymbolicName>*/dmtn+
"<br><B>Date : </B>"+/*<date> - <time>*/st2.nextToken()+" - "+st2.nextToken()+
"<br><B>State on last log : "+/*<bundleState>*/st2.nextToken()+
"<br>Event "+/*Event <eventNumber> : <logLevel> : <message>*/dmtn.getChildCount()+" : "+st2.nextToken()+" : </B><br>");
while (st2.hasMoreTokens()) {
ttt.append(st2.nextToken()+" ");
}
setToolTipText(ttt+"</html>");
}
break;
}
case 4: { // icon / date / time / state / logLvl / msg
st=new StringTokenizer(dmtn.toString(),"|");
setFont(FONT_SMALL);
if(st!=null){
String time=st.nextToken().trim();
st.nextToken();
String state=st.nextToken().trim();
ImageIcon ii=(ImageIcon) ht_string2icon.get(state);
if (time.equals(UNKNOWN_TIME)) {
ii=iiOldLog;
}
setIcon(ii);
}
break;
}
}
return this;
}
}
/*
// Introspection technique :
java.lang.Class class_bundle=org.osgi.framework.Bundle.class;
java.lang.reflect.Field[] fields=class_bundle.getFields();
for (int i=0 ; i<fields.length ; i++) {
try {
String name=fields[i].getName();
int value=fields[i].getInt(null);
System.out.println("Cst # "+i+" \""+name+"\" = "+value);
}catch (Exception oups) {
oups.printStackTrace();
}
}
*/