/* based on eclipse code */
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package monolipse.nunit.views;
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.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;
/**
* A progress bar with a red/green indication for success or failure.
*/
public class NUnitProgressBar extends Canvas {
private static final int DEFAULT_WIDTH = 160;
private static final int DEFAULT_HEIGHT = 18;
private int _currentTickCount= 0;
private int _maxTickCount= 0;
private int _colorBarWidth= 0;
private Color _oKColor;
private Color _failureColor;
private Color _stoppedColor;
private boolean _error;
private boolean _stopped= false;
public NUnitProgressBar(Composite parent) {
super(parent, SWT.NONE);
addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
_colorBarWidth= scale(_currentTickCount);
redraw();
}
});
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
paint(e);
}
});
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
_failureColor.dispose();
_oKColor.dispose();
_stoppedColor.dispose();
}
});
Display display= parent.getDisplay();
_failureColor= new Color(display, 159, 63, 63);
_oKColor= new Color(display, 95, 191, 95);
_stoppedColor= new Color(display, 120, 120, 120);
}
public void setMaximum(int max) {
_maxTickCount= max;
}
public void reset() {
_error= false;
_stopped= false;
_currentTickCount= 0;
_colorBarWidth= 0;
_maxTickCount= 0;
redraw();
}
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);
gc.dispose();
}
private void setStatusColor(GC gc) {
if (_stopped)
gc.setBackground(_stoppedColor);
else if (_error)
gc.setBackground(_failureColor);
else if (_stopped)
gc.setBackground(_stoppedColor);
else
gc.setBackground(_oKColor);
}
public void stopped() {
_stopped= true;
redraw();
}
private int scale(int value) {
if (_maxTickCount > 0) {
Rectangle r= getClientArea();
if (r.width != 0)
return Math.max(0, value*(r.width-2)/_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);
_colorBarWidth= Math.min(rect.width-2, _colorBarWidth);
gc.fillRectangle(1, 1, _colorBarWidth, rect.height-2);
}
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 hasFailures) {
_currentTickCount++;
int x= _colorBarWidth;
_colorBarWidth= scale(_currentTickCount);
if (!_error && hasFailures) {
_error= true;
x= 1;
}
if (_currentTickCount == _maxTickCount)
_colorBarWidth= getClientArea().width-1;
paintStep(x, _colorBarWidth);
}
public void refresh(boolean hasErrors) {
_error= hasErrors;
redraw();
}
}