/*
* Copyright 2007 Sun Microsystems, Inc.
*
* This file is part of jVoiceBridge.
*
* jVoiceBridge is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation and distributed hereunder
* to you.
*
* jVoiceBridge is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Sun designates this particular file as subject to the "Classpath"
* exception as provided by Sun in the License file that accompanied this
* code.
*/
package com.sun.voip;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import java.io.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class PerfObservable extends Observable {
public void notifyObservers(Object b) {
setChanged();
super.notifyObservers(b);
}
}
class PerfMonCanvas extends Canvas implements Observer {
int maxElements;
Vector rateVector = new Vector();
// Vector highestAllowedVector = new Vector();
Vector windowSizeVector = new Vector();
Graphics g;
PerfMonCanvas(Observable notifier, int width) {
this.maxElements = width;
notifier.addObserver(this);
}
public void paint() {
paint(getGraphics());
}
public void paint(Graphics g) {
draw(rateVector, g, Color.blue);
// draw(highestAllowedVector, g, Color.red);
draw(windowSizeVector, g, Color.green);
}
private void draw(Vector v, Graphics g, Color c) {
g.setColor(c);
Dimension d = getSize();
int height = d.height;
Point previousPoint = null;
int size = v.size();
for (int i = 0; i < size; i++) {
try {
Point point1 = previousPoint;
Point point2 = new Point(i, ((Point)v.elementAt(i)).y);
if (point1 == null)
point1 = point2;
previousPoint = point2;
g.drawLine(point1.x, height - point1.y,
point2.x, height - point2.y);
} catch (NoSuchElementException e) {
break;
}
}
}
public void addElement(Vector v, int y) {
while (v.size() >= getSize().width) {
v.removeElementAt(0);
}
v.addElement(new Point(0, y));
}
public void update(Observable o, Object arg) {
paint(g);
}
public void erase() {
g = getGraphics();
g.clearRect(0, 0, getSize().width, getSize().height);
}
}
public class PerfMon extends Frame implements Runnable {
class DWAdapter extends WindowAdapter {
public void windowClosing(WindowEvent event) {
setVisible(false);
updater.windowClosed();
}
}
private PerfMonCanvas pmc;
private Thread dispThread;
private int height;
private int width;
private boolean quit = false;
private DataUpdater updater;
private String title;
public PerfMon(String title, DataUpdater updater, Point location, int width,
int height) {
super(title);
this.title = title;
this.updater = updater;
this.width = width;
this.height = height;
if (location != null) {
setLocation(location);
}
addWindowListener(new DWAdapter());
setBackground(Color.white);
setLayout(new BorderLayout());
pmc = new PerfMonCanvas(new PerfObservable(), width);
ScrollPane sp = new ScrollPane();
sp.add("Center", pmc);
add(sp);
setSize(width, height);
setVisible(true);
//show();
dispThread = new Thread(this);
dispThread.setDaemon(true);
dispThread.start();
}
public void stop() {
quit = true;
setVisible(false);
}
public void run() {
while (quit == false) {
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
pmc.erase();
int data = updater.getData();
setTitle(title + " " + data);
pmc.addElement(pmc.windowSizeVector, data);
pmc.paint();
}
}
}