/**
* Logback-beagle: The logback Console Plugin for Eclipse
* Copyright (C) 2006-2012, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation.
*/
package ch.qos.logback.beagle.tree;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import ch.qos.logback.beagle.util.ResourceUtil;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.util.LoggerNameUtil;
import ch.qos.logback.core.CoreConstants;
public class LoggerTree {
final LoggerContext loggerContext;
final Tree tree;
final TreeItem rootTreeItem;
final int IMAGE_MARGIN = 4;
final Set<String> seenLoggerNames = new HashSet<String>();
public LoggerTree(LoggerContext loggerContext, Tree tree) {
this.loggerContext = loggerContext;
this.tree = tree;
this.rootTreeItem = makeRootTreeItem(tree);
addListeners();
}
private TreeItem makeRootTreeItem(Tree aTree) {
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
TreeItem ti = new TreeItem(aTree, SWT.NONE);
ti.setText(Logger.ROOT_LOGGER_NAME);
ti.setData(rootLogger);
return ti;
}
private Image levelForItem(TreeItem item) {
Logger logger = (Logger) item.getData();
Image trailingImage = levelToImage(logger.getLevel());
return trailingImage;
}
void addListeners() {
tree.addListener(SWT.MeasureItem, new Listener() {
public void handleEvent(Event event) {
TreeItem item = (TreeItem) event.item;
Image trailingImage = levelForItem(item);
if (trailingImage != null) {
event.width += trailingImage.getBounds().width + IMAGE_MARGIN;
}
}
});
tree.addListener(SWT.PaintItem, new Listener() {
public void handleEvent(Event event) {
TreeItem item = (TreeItem) event.item;
Image trailingImage = levelForItem(item);
if (trailingImage != null) {
int x = event.x + event.width + IMAGE_MARGIN;
int itemHeight = tree.getItemHeight();
int imageHeight = trailingImage.getBounds().height;
int y = event.y + (itemHeight - imageHeight) / 2;
event.gc.drawImage(trailingImage, x, y);
}
}
});
}
Image levelToImage(Level level) {
if (level == null)
return null;
switch (level.levelInt) {
case Level.TRACE_INT:
return ResourceUtil.getImage(ResourceUtil.T_IMG_KEY);
case Level.DEBUG_INT:
return ResourceUtil.getImage(ResourceUtil.D_IMG_KEY);
case Level.INFO_INT:
return ResourceUtil.getImage(ResourceUtil.I_IMG_KEY);
case Level.WARN_INT:
return ResourceUtil.getImage(ResourceUtil.W_IMG_KEY);
case Level.ERROR_INT:
return ResourceUtil.getImage(ResourceUtil.E_IMG_KEY);
default:
throw new IllegalArgumentException("Level " + level + " unsupported");
}
}
public void update(String loggerName) {
if (!seenLoggerNames.contains(loggerName)) {
seenLoggerNames.add(loggerName);
// create the logger
Logger logger = loggerContext.getLogger(loggerName);
createTreeItemByLogger(logger);
}
}
private void createTreeItemByLogger(Logger logger) {
List<String> partList = LoggerNameUtil.computeNameParts(logger.getName());
TreeItem parentTreeItem = rootTreeItem;
StringBuilder loggerNameBuilder = new StringBuilder();
for (String partStr : partList) {
appendPart(loggerNameBuilder, partStr);
TreeItem child = findChild(parentTreeItem, partStr);
if (child == null) {
child = buildChildTreeItem(parentTreeItem,
loggerNameBuilder.toString(), partStr);
}
parentTreeItem = child;
}
}
private TreeItem buildChildTreeItem(TreeItem parentTreeItem,
String loggerName, String partName) {
TreeItem child = new TreeItem(parentTreeItem, SWT.NONE);
child.setText(partName);
child.setData(loggerContext.getLogger(loggerName));
return child;
}
private void appendPart(StringBuilder loggerNameBuilder, String partStr) {
// add . only not under root
if (loggerNameBuilder.length() != 0)
loggerNameBuilder.append(CoreConstants.DOT);
loggerNameBuilder.append(partStr);
}
private TreeItem findChild(TreeItem parentTreeItem, String partStr) {
TreeItem[] children = parentTreeItem.getItems();
for (TreeItem child : children) {
if (partStr.equals(child.getText()))
return child;
}
return null;
}
public void handleMenuItemSlection(MenuItem menuItem) {
Level level = (Level) menuItem.getData();
setLevelForSelectedLogger(level);
}
private void setLevelForSelectedLogger(Level level) {
TreeItem[] selectedItems = tree.getSelection();
if (selectedItems.length == 1) {
TreeItem selectedItem = selectedItems[0];
Logger logger = (Logger) selectedItem.getData();
if (level == null
&& Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(logger.getName())) {
return;
} else {
logger.setLevel(level);
tree.redraw();
}
}
}
}