/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import java.io.IOException;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import ilog.views.dashboard.IlvDashboardContext;
import ilog.views.dashboard.IlvDashboardDiagram;
import ilog.views.diagrammer.IlvDiagrammerException;
import ilog.views.util.swing.IlvSwingUtil;
/**
* This is the entry point of the BAM demo.
*/
public class BAMCockpit extends JRootPane implements Runnable {
/**
* Entry point: loads the dashboard and display it
* @param args (unused)
*/
public static void main(String[] args) {
IlvSwingUtil.invokeAndWait(new Runnable() {
Override
public void run() {
BAMCockpit dashboard = new BAMCockpit();
dashboard.init();
dashboard.start();
}
});
}
/////////////////////////////////////////////////////////////
// delay between refreshes, in ms
public long ANIM_DELAY = 1000l; // real time: try 0l
// max variation at each refresh
public double DELTA = 10d; // real time: try 2d
// visitor array, each entry between 0 and 100
public double[] _visitors = {10d, 20d, 30d, 20d};
private IlvDashboardDiagram _dashboard;
private Thread _animationThread;
/**
* Creates the BAM dashboard.
*/
public BAMCockpit() {}
/**
* Initializes app.
*/
public void init() {
IlvSwingUtil.invokeAndWait(new Runnable() {
Override
public void run() {
createGUI();
}
});
}
public void createGUI() {
// the path to the idbd file (which defines the dashboard)
String path = "data/bam.idbd";
IlvDashboardContext context = new IlvDashboardContext();
// create the diagram
_dashboard = new IlvDashboardDiagram(context);
URL url = null;
try {
url = new URL("file:./" + path);
_dashboard.readDashboard(url);
} catch (IlvDiagrammerException e) {
e.printStackTrace();
System.exit(1);
} catch (IOException e) {
System.err.println("Could not read the file " + url);
e.printStackTrace();
System.exit(1);
}
// no need for scrollbars
_dashboard.setScrollable(false);
// display the diagram
JFrame frame = new JFrame();
frame.getContentPane().add(_dashboard);
frame.setTitle(path);
frame.setBounds(0, 0, 787, 558);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* Starts the animation.
*/
public void start() {
_animationThread = new Thread(this);
_animationThread.start();
}
/**
* Stops the animation.
*/
public void stop() {
_animationThread.interrupt();
}
/////////////////////////////////////////////////////////////////
// called by the animation thread
Override
public void run() {
while (true) {
// animate the diagram
changeRandomValues();
// update GUI
updateDashBoard(); // no need to invoke within a SwingUtilities.invokeAndWait()
try {
Thread.sleep(ANIM_DELAY);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
break;
}
}
}
/**
* Animates the dashboard by changing some values
*/
private void changeRandomValues() {
for (int i = 0; i < 4; i++) {
double delta = DELTA * (Math.random() - .5d);
_visitors[i] += delta;
// bound changes
if (_visitors[i] < 0)
_visitors[i] -= delta * 2d;
if (_visitors[i] > 100)
_visitors[i] -= delta * 2d;
}
}
// update the dashboard symbols, by changing properties on the model.
private void updateDashBoard() {
_dashboard.setAdjusting(true);
// update the 4 bar charts
Object visitors = _dashboard.getObject("visitors");
double totalVisitors = 0d;
for (int i = 0; i < 4; i++) {
_dashboard.setObjectProperty(visitors, "value" + (i + 1), new Double(_visitors[i]));
totalVisitors += _visitors[i];
}
// update total gauge
Object yty1 = _dashboard.getObject("yty_visitors");
// normalize value
int total = (int) (totalVisitors / 40d * 1000d);
_dashboard.setObjectProperty(yty1, "value", new Double(total / 1000d));
_dashboard.setObjectProperty(yty1, "preset", new Double((Math.random() - 0.5) + total / 1000d));
// update funnel1
Object f1 = _dashboard.getObject("website");
total = (int) totalVisitors * 550;
_dashboard.setObjectProperty(f1, "value1", new Integer(total));
_dashboard.setObjectProperty(f1, "value2", new Integer(total / 4));
_dashboard.setObjectProperty(f1, "value3", new Integer(total / 5));
_dashboard.setObjectProperty(f1, "value4", new Integer(total / 50));
// update opportunities
Object o1 = _dashboard.getObject("opportunities");
total = (int) totalVisitors;
_dashboard.setObjectProperty(o1, "value1", new Integer(total));
_dashboard.setObjectProperty(o1, "value2", new Integer(total / 4));
_dashboard.setObjectProperty(o1, "value3", new Integer(total / 5));
_dashboard.setObjectProperty(o1, "value4", new Integer(total / 50));
// update opportunity gauge
Object yty2 = _dashboard.getObject("yty_business");
// normalize value
Object old = _dashboard.getObjectProperty(yty2, "value");
int val = ((Number) old).intValue();
// add last opportunities
val = (val + total / 50) % 500;
_dashboard.setObjectProperty(yty2, "value", new Integer(val));
_dashboard.setObjectProperty(yty2, "preset", new Double((Math.random() - 0.5) * 20 + val));
// update the pie chart
Object revenues = _dashboard.getObject("revenues");
double rev_value = Math.random() * 1000;
_dashboard.setObjectProperty(revenues, "USA", new Double(rev_value * 3 + Math.random() * 50));
_dashboard.setObjectProperty(revenues, "Europe",
new Double(rev_value * 2 + Math.random() * 50));
_dashboard.setObjectProperty(revenues, "APAC", new Double(rev_value * 1 + Math.random() * 50));
_dashboard.setObjectProperty(revenues, "ROW", new Double(rev_value * 1 + Math.random() * 50));
_dashboard.setAdjusting(false);
}
}