/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.testng.eclipse.ui;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.testng.ITestResult;
/**
* A progress bar with a red/green indication for success or failure.
*/
public class ProgressBar extends Canvas {
private static final int DEFAULT_WIDTH = 160;
private static final int DEFAULT_HEIGHT = 16;
private int m_currentTickCount = 0;
private int m_maxTickCount = 0;
private int m_colorBarWidth = 0;
private Color m_oKColor;
private Color m_failureColor;
private Color m_stoppedColor;
private Color m_skippedColor;
private Color m_messageColor;
// Defined in ITestResult
private int m_error;
private boolean m_stopped = false;
private int m_totalTestsCounter;
private int m_testCounter;
private int m_totalMethodsCounter;
private int m_methodsCounter;
private String m_currentMessage = "Tests: 0/0 Methods: 0/0";
private String m_timeMessage= "";
public ProgressBar(Composite parent) {
super(parent, SWT.NONE);
addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
m_colorBarWidth = scale(m_currentTickCount);
redraw();
}
});
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
paint(e);
}
});
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
m_failureColor.dispose();
m_oKColor.dispose();
m_stoppedColor.dispose();
}
});
Display display = parent.getDisplay();
m_failureColor = new Color(display, 159, 63, 63);
m_oKColor = new Color(display, 95, 191, 95);
m_skippedColor = new Color(display, 255, 193, 37);
m_stoppedColor = new Color(display, 120, 120, 120);
m_messageColor = display.getSystemColor(SWT.COLOR_BLACK);
}
public void setMaximum(int max, int totalMethods) {
// ppp("setMaximum:[" + fMaxTickCount + "," + fColorBarWidth + "," + max + "," + totalMethods + "]");
m_maxTickCount = max;
m_colorBarWidth = scale(m_currentTickCount);
// ppp("setMaximum:rescaled:" + fColorBarWidth);
m_totalMethodsCounter = totalMethods;
paintStep(1, m_colorBarWidth);
}
public void reset(int testcounter) {
m_error = ITestResult.FAILURE;
m_stopped = false;
m_currentTickCount = 0;
m_colorBarWidth = 0;
m_maxTickCount = 0;
m_totalTestsCounter = testcounter;
m_testCounter = 0;
m_totalMethodsCounter = 0;
m_methodsCounter = 0;
m_timeMessage= "";
m_currentMessage = getCurrentMessage();
redraw();
// ppp("reset");
}
private String getCurrentMessage() {
StringBuilder buf = new StringBuilder();
buf.append("Tests: ").append(m_testCounter).append('/').append(m_totalTestsCounter)
.append(" Methods: ").append(m_methodsCounter).append(m_timeMessage);
return buf.toString();
}
private void paintStep(int startX, int endX) {
GC gc = new GC(this);
setStatusColor(gc);
Rectangle rect = getClientArea();
startX = Math.max(1, startX);
gc.fillRectangle(startX, 1, endX - startX, rect.height - 2);
String string = getCurrentMessage();
m_currentMessage = string;
gc.setFont(JFaceResources.getDefaultFont());
FontMetrics fontMetrics = gc.getFontMetrics();
int stringWidth = fontMetrics.getAverageCharWidth() * string.length();
int stringHeight = fontMetrics.getHeight();
gc.setForeground(m_messageColor);
gc.drawString(string, (rect.width - stringWidth) / 2, (rect.height - stringHeight) / 2, true);
gc.dispose();
}
private void setStatusColor(GC gc) {
if (m_stopped) {
gc.setBackground(m_stoppedColor);
}
else if (m_error == ITestResult.FAILURE || m_error == ITestResult.SUCCESS_PERCENTAGE_FAILURE) {
gc.setBackground(m_failureColor);
}
else if (m_error == ITestResult.SKIP) {
gc.setBackground(m_skippedColor);
}
else {
gc.setBackground(m_oKColor);
}
}
public void stopped() {
m_stopped = true;
redraw();
}
private int scale(int value) {
if (m_maxTickCount > 0) {
Rectangle r = getClientArea();
// ppp("scale:[" + r + "][" + value + "][" + fMaxTickCount + "]");
if (r.width != 0) {
return Math.max(0, value * (r.width - 2) / m_maxTickCount);
}
}
return value;
}
private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) {
gc.setForeground(topleft);
gc.drawLine(x, y, x + w - 1, y);
gc.drawLine(x, y, x, y + h - 1);
gc.setForeground(bottomright);
gc.drawLine(x + w, y, x + w, y + h);
gc.drawLine(x, y + h, x + w, y + h);
}
private void paint(PaintEvent event) {
GC gc = event.gc;
Display disp = getDisplay();
Rectangle rect = getClientArea();
gc.fillRectangle(rect);
drawBevelRect(gc,
rect.x,
rect.y,
rect.width - 1,
rect.height - 1,
disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW),
disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
setStatusColor(gc);
m_colorBarWidth = Math.min(rect.width - 2, m_colorBarWidth);
gc.fillRectangle(1, 1, m_colorBarWidth, rect.height - 2);
gc.setFont(JFaceResources.getDefaultFont());
FontMetrics fontMetrics = gc.getFontMetrics();
final String msg= getCurrentMessage();
int stringWidth = fontMetrics.getAverageCharWidth() * msg.length();
int stringHeight = fontMetrics.getHeight();
gc.setForeground(m_messageColor);
gc.drawString(msg,
(rect.width - stringWidth) / 2,
(rect.height - stringHeight) / 2,
true);
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
checkWidget();
Point size = new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT);
if (wHint != SWT.DEFAULT) {
size.x = wHint;
}
if (hHint != SWT.DEFAULT) {
size.y = hHint;
}
return size;
}
public void step(boolean isSuccess) {
m_currentTickCount++;
m_methodsCounter++;
int x = m_colorBarWidth;
m_colorBarWidth = scale(m_currentTickCount);
if (m_error == ITestResult.SUCCESS && !isSuccess) {
m_error = ITestResult.FAILURE;
x = 1;
}
if (m_currentTickCount == m_maxTickCount) {
m_colorBarWidth = getClientArea().width - 1;
}
// paintStep(x, m_colorBarWidth);
}
public void stepTests() {
m_testCounter++;
m_currentMessage = getCurrentMessage();
redraw();
}
public void refresh(int status, String msg) {
m_error = status;
m_timeMessage= msg;
redraw();
}
}