/*
* 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.awt.BorderLayout;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import ilog.views.chart.IlvChart;
import ilog.views.chart.IlvChartLayout;
import ilog.views.chart.IlvLegend;
import ilog.views.chart.data.IlvTreeTableDataSource;
import ilog.views.chart.datax.IlvDataColumnInfo;
import ilog.views.chart.datax.IlvDefaultDataColumnInfo;
import ilog.views.chart.datax.tree.list.IlvDefaultTreeListModel;
import ilog.views.chart.graphic.IlvDataLabelAnnotation;
import ilog.views.chart.interactor.IlvChartInfoViewInteractor;
import ilog.views.chart.renderer.IlvTreemapChartRenderer;
import ilog.views.util.IlvProductUtil;
public class Treemap extends JFrame {
static class ExpenseItem {
private String name;
private double amount2004;
private double amount2005;
/**
* Creates an expense item without associated amounts.
*/
public ExpenseItem(String name) {
this.name = name;
}
/**
* Creates an expense item with associated amounts.
*/
public ExpenseItem(String name, double amount2004, double amount2005) {
this.name = name;
this.amount2004 = amount2004;
this.amount2005 = amount2005;
}
/**
* Returns the amount for the year 2004, or 0 if none.
*/
public double getAmount2004() {
return this.amount2004;
}
/**
* Returns the amount for the year 2005, or 0 if none.
*/
public double getAmount2005() {
return this.amount2005;
}
/**
* Returns the growth factor from 2004 to 2005.
*/
public double getGrowth() {
if (this.amount2004 != 0)
return this.amount2005 / this.amount2004;
else if (this.amount2005 > 0)
return Double.POSITIVE_INFINITY;
else if (this.amount2005 < 0)
return Double.NEGATIVE_INFINITY;
else
return Double.NaN;
}
/**
* Returns the string representation of this object. For simplicity, we use
* the name here.
*/
Override
public String toString() {
return this.name;
}
}
IlvDataColumnInfo amount2004Column = new IlvDefaultDataColumnInfo("Amount 2004", Double.class);
IlvDataColumnInfo amount2005Column = new IlvDefaultDataColumnInfo("Amount 2005", Double.class);
IlvDataColumnInfo growthColumn = new IlvDefaultDataColumnInfo("Growth", Double.class);
IlvDataColumnInfo[] columns = new IlvDataColumnInfo[] { amount2004Column, amount2005Column, growthColumn };
static final int amount2004Index = 0;
static final int amount2005Index = 1;
static final int growthIndex = 2;
static class ExpensesModel extends IlvDefaultTreeListModel {
public ExpensesModel(IlvDataColumnInfo[] columns) {
super(columns);
}
Override
public double getDoubleAt(Object object, int columnIndex) {
switch (columnIndex) {
case amount2004Index:
return ((ExpenseItem) object).getAmount2004();
case amount2005Index:
return ((ExpenseItem) object).getAmount2005();
case growthIndex:
return ((ExpenseItem) object).getGrowth();
default:
throw new IllegalArgumentException("invalid column");
}
}
Override
public Object getValueAt(Object object, int columnIndex) {
switch (columnIndex) {
case amount2004Index:
case amount2005Index:
case growthIndex:
return new Double(getDoubleAt(object, columnIndex));
default:
throw new IllegalArgumentException("invalid column");
}
}
Override
public void setDoubleAt(double value, Object object, int columnIndex) {
throw new UnsupportedOperationException("the values are read-only");
}
Override
public void setValueAt(Object value, Object object, int columnIndex) {
throw new UnsupportedOperationException("the values are read-only");
}
}
/** Creates new Treemap */
public Treemap() {
super("Basic Treemap Chart");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//
// Instantiate the data model.
//
ExpensesModel model = new ExpensesModel(columns);
ExpenseItem root = new ExpenseItem("Expenses");
model.setRoot(root);
{
ExpenseItem kind;
kind = new ExpenseItem("Cost of revenues");
model.addChild(kind, root);
{
ExpenseItem purpose;
purpose = new ExpenseItem("Cost of manufacturing");
model.addChild(purpose, kind);
model.addChild(new ExpenseItem("Materials and Supplies", 580, 611), purpose);
model.addChild(new ExpenseItem("Production wages", 101, 104), purpose);
purpose = new ExpenseItem("Cost of maintenance", 271, 324);
model.addChild(purpose, kind);
purpose = new ExpenseItem("Cost of training", 110, 80);
model.addChild(purpose, kind);
purpose = new ExpenseItem("Cost of consulting", 250, 270);
model.addChild(purpose, kind);
}
kind = new ExpenseItem("Operating expenses");
model.addChild(kind, root);
{
ExpenseItem kind1;
kind1 = new ExpenseItem("Marketing and Promotion");
model.addChild(kind1, kind);
model.addChild(new ExpenseItem("Marketing employee costs", 120, 133), kind1);
model.addChild(new ExpenseItem("Marketing campaigns", 30, 30), kind1);
kind1 = new ExpenseItem("Sales employee costs");
model.addChild(kind1, kind);
model.addChild(new ExpenseItem("Sales employee salaries", 279, 291), kind1);
model.addChild(new ExpenseItem("Sales commissions", 184, 195), kind1);
kind1 = new ExpenseItem("General & Administrative");
model.addChild(kind1, kind);
model.addChild(new ExpenseItem("Finance department", 40, 43), kind1);
model.addChild(new ExpenseItem("Legal department", 11, 12), kind1);
model.addChild(new ExpenseItem("Management Information Systems", 40, 37), kind1);
{
ExpenseItem facilities = new ExpenseItem("Facilities");
model.addChild(facilities, kind1);
{
ExpenseItem office = new ExpenseItem("Office expenses");
model.addChild(office, facilities);
model.addChild(new ExpenseItem("Rental", 38, 40), office);
model.addChild(new ExpenseItem("Electricity", 2, 2), office);
model.addChild(new ExpenseItem("Other office expenses", 24, 23), office);
}
model.addChild(new ExpenseItem("Telecommunication", 13, 11), facilities);
model.addChild(new ExpenseItem("Other facilities", 9, 9), facilities);
}
}
kind = new ExpenseItem("Financial Interests", 6, 5);
model.addChild(kind, root);
kind = new ExpenseItem("Income Taxes", 0, 49);
model.addChild(kind, root);
}
//
// Create a data source.
//
IlvTreeTableDataSource dataSource = new IlvTreeTableDataSource(model);
//
// Create a treemap chart with renderers.
//
IlvChart chart = new IlvChart(IlvChart.TREEMAP);
chart.setDataSource(dataSource);
IlvTreemapChartRenderer renderer = (IlvTreemapChartRenderer) chart.getRenderer(0);
//
// Customize the treemap renderer.
//
// Set the column which determines the area.
renderer.setAreaColumn(amount2005Column);
// Set the column which determines the color.
// Small growth of expenses is green (good),
// large growth of expenses is red (bad).
renderer.setColorColumn(growthColumn);
renderer.setColorScheme(IlvTreemapChartRenderer.COLORSCHEME_DIVERGING_GREEN_RED);
// Add a label to each rectangle, and arrange to avoid label overlaps.
renderer.setAnnotation(new IlvDataLabelAnnotation());
renderer.setAnnotationVisibility(IlvTreemapChartRenderer.VISIBILITY_SMART);
// Add a legend to the chart.
// Format the growth values in the legend as percentages.
renderer.setLegendLabelFormat(new DecimalFormat("+##0%;-##0%") {
Override
public StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition) {
return super.format(number - 1, result, fieldPosition);
}
});
chart.addLegend(new IlvLegend(), IlvChartLayout.SOUTH_BOTTOM);
//
// Add an interactor to the chart that displays a tooltip.
//
chart.addInteractor(new IlvChartInfoViewInteractor());
//
// Add the chart to the frame.
//
getContentPane().setLayout(new BorderLayout());
getContentPane().add(chart, BorderLayout.CENTER);
setSize(500, 600);
}
public static void main(String[] args) {
// This sample uses JViews Charts features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Charts Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Charts_Deployment);
SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
Treemap frame = new Treemap();
frame.setVisible(true);
}
});
}
}