/* * Licensed Materials - Property of Perforce Software, Inc. * © Copyright Perforce Software, Inc. 2014, 2021 * © 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. */ package treemap; import java.awt.Point; import java.awt.Rectangle; import ilog.views.chart.IlvChart; import ilog.views.chart.IlvChartDataPicker; import ilog.views.chart.IlvDataInterval; import ilog.views.chart.IlvDataWindow; import ilog.views.chart.IlvDisplayObjectArea; import ilog.views.chart.data.IlvDataSetPoint; import ilog.views.chart.faces.dhtml.interactor.IlvChartObjectSelectedFinder; /** * A chart object selected finder that returns the tree path of the picked * element of the treemap. */ public class TreemapPathFinder extends IlvChartObjectSelectedFinder { private IlvChartDataPicker dataPicker; private boolean isDoubleParamValid(String param) { return param != null && param != ""; } private IlvDataWindow getRequestedVisibleWindow(IlvChart chart, String[] params) { IlvDataInterval xRange = chart.getXAxis().getVisibleRange(); IlvDataInterval yRange = chart.getYAxis(0).getVisibleRange(); IlvDataWindow dw = new IlvDataWindow(new IlvDataInterval(xRange), new IlvDataInterval(yRange)); IlvDataInterval newXRange = dw.xRange; IlvDataInterval newYRange = dw.yRange; if (isDoubleParamValid(params[2])) newXRange.min = Double.valueOf(params[2]).doubleValue(); if (isDoubleParamValid(params[3])) newXRange.max = Double.valueOf(params[3]).doubleValue(); if (isDoubleParamValid(params[4])) newYRange.min = Double.valueOf(params[4]).doubleValue(); if (isDoubleParamValid(params[5])) newYRange.max = Double.valueOf(params[5]).doubleValue(); return dw; } private static boolean isTranslation(double delta, double newv, double oldv) { return (delta >= newv - oldv - 1E-9) && (delta <= newv - oldv + 1E-9); } private void prepareVisibleWindow(IlvChart chart, String[] params) { IlvDataWindow dw = getRequestedVisibleWindow(chart, params); IlvDataInterval xRange = chart.getXAxis().getVisibleRange(); IlvDataInterval yRange = chart.getYAxis(0).getVisibleRange(); IlvDataInterval newXRange = dw.xRange; IlvDataInterval newYRange = dw.yRange; double deltax = newXRange.max - xRange.max; double deltay = newYRange.max - yRange.max; if ((deltax != 0 && isTranslation(deltax, newXRange.min, xRange.min)) && (deltay != 0 && isTranslation(deltay, newYRange.min, yRange.min))) { chart.scroll(deltax, deltay, 0); } else if (!newXRange.equals(xRange) || !newYRange.equals(yRange)) { chart.zoom(new IlvDataWindow(newXRange, newYRange), 0); } } private IlvChartDataPicker getDataPicker(int x, int y) { if (dataPicker == null) return createDataPicker(x, y); return dataPicker; } Override public Object computeObjectSelected(IlvChart chart, String[] params, String chartId) { if (chart == null) return null; Object res = null; int width = Integer.parseInt(params[6]); int height = Integer.parseInt(params[7]); IlvChart.IlvChartPaintContext context = new IlvChart.IlvChartPaintContext(width, height, chart); synchronized (chart.getLock()) { chart.startSession(context); prepareVisibleWindow(chart, params); int xpos = Integer.parseInt(params[0]); int ypos = Integer.parseInt(params[1]); Rectangle rect = (Rectangle) context.getBounds().get(chart.getChartArea()); Point pt = new Point(xpos, ypos); Point ptTranslated = new Point(pt.x - rect.x, pt.y - rect.y); IlvDataSetPoint dsp = null; if (getMode() == ITEM_PICKING) dsp = chart.getDisplayItem(getDataPicker(ptTranslated.x, ptTranslated.y)); else dsp = chart.getNearestPoint(getDataPicker(ptTranslated.x, ptTranslated.y)); IlvDisplayObjectArea da = (IlvDisplayObjectArea) dsp; res = da != null ? da.getPath() : null; chart.endSession(context); } return res; } }