/* * Copyright 2014 TWO SIGMA OPEN SOURCE, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.twosigma.beaker.chart.categoryplot.plotitem; import com.twosigma.beaker.chart.ChartUtils; import com.twosigma.beaker.chart.Color; import com.twosigma.beaker.chart.Graphics; import com.twosigma.beaker.chart.categoryplot.CategoryPlot; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public abstract class CategoryGraphics extends Graphics { protected Number[][] value; protected List<String> seriesNames; protected Color baseColor; private List<Object> colors; private Object itemLabelBuilder; private String[][] itemLabels; private boolean showItemLabel = false; private boolean centerSeries = false; private boolean useToolTip = true; protected List<Number> getBases(){ return null; } protected Number getBase(){ return null; } public void createItemLabels(CategoryPlot plot) { if (itemLabelBuilder == null || value == null) { this.itemLabels = null; return; } int itemCategoriesNumber = value[0].length; int itemSeriesNumber = value.length; String[][] itemLabels = new String[itemCategoriesNumber][itemSeriesNumber]; try { Class<?> clazz = itemLabelBuilder.getClass(); Method getMaximumNumberOfParameters = clazz.getMethod("getMaximumNumberOfParameters"); getMaximumNumberOfParameters.setAccessible(true); int numberOfParameters = (int) getMaximumNumberOfParameters.invoke(itemLabelBuilder); for (int column = 0; column < itemCategoriesNumber; column++) { List<String> categoryNames = plot.getCategoryNames(); String category = categoryNames != null && categoryNames.size() > column ? categoryNames.get(column) : null; for (int row = 0; row < itemSeriesNumber; row++) { Number _value = value[row][column]; String series = seriesNames != null && seriesNames.size() > row ? seriesNames.get(row) : null; Method call; if (numberOfParameters == 1) { call = clazz.getMethod("call", Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value)); } else { Object base = getBases() != null ? getBases().get(row) instanceof List ? ((List) getBases().get(row)).get(column) : getBases().get(row) : getBase(); if (numberOfParameters == 2) { call = clazz.getMethod("call", Object.class, Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value, base)); } else if (numberOfParameters == 3) { call = clazz.getMethod("call", Object.class, Object.class, Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value, base, series)); } else if (numberOfParameters == 4) { call = clazz.getMethod("call", Object.class, Object.class, Object.class, Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value, base, series, category)); } else if (numberOfParameters == 5) { call = clazz.getMethod("call", Object.class, Object.class, Object.class, Object.class, Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value, base, series, category, row)); } else if (numberOfParameters == 6) { call = clazz.getMethod("call", Object.class, Object.class, Object.class, Object.class, Object.class, Object.class); call.setAccessible(true); itemLabels[column][row] = String.valueOf(call.invoke(itemLabelBuilder, _value, base, series, category, row, column)); } } } } } catch (Throwable x) { throw new RuntimeException("Can not create item labels.", x); } this.itemLabels = itemLabels; } public String[][] getItemLabels() { return itemLabels; } public void setItemLabel(Object itemLabel) { itemLabelBuilder = itemLabel; } public void setColor(Object color) { if (color instanceof Color) { this.baseColor = (Color) color; } else if (color instanceof java.awt.Color) { this.baseColor = new Color((java.awt.Color) color); } else if (color instanceof List) { @SuppressWarnings("unchecked") List<Object> cs = (List<Object>) color; setColors(cs); } else { throw new IllegalArgumentException( "setColor takes Color or List of Color"); } } private void setColors(List<Object> colors) { if (colors != null) { this.colors = ChartUtils.convertColors(colors, "setColor takes Color or List of Color"); } else { this.colors = null; } } public List<Object> getColors() { return this.colors; } @Override public void setColori(Color color) { this.baseColor = color; } @Override public Color getColor() { return this.baseColor; } public Number[][] getValue() { return value; } public void setValue(Object[] value) { if(value != null && ArrayUtils.isNotEmpty(value)){ if(value[0] instanceof List){ this.value = new Number[value.length][]; for(int i=0; i < value.length; i++){ List<?> a = (List<?>)value[i]; this.value[i] = a.toArray(new Number[a.size()]); } }else{ this.value = new Number[][]{Arrays.copyOf(value, value.length, Number[].class)}; } } } public List<String> getSeriesNames() { return seriesNames; } public void setSeriesNames(List<String> seriesNames) { this.seriesNames = seriesNames; } public boolean getShowItemLabel() { return showItemLabel; } public void setShowItemLabel(boolean showItemLabel) { this.showItemLabel = showItemLabel; } public boolean getCenterSeries() { return centerSeries; } public void setCenterSeries(boolean centerSeries) { this.centerSeries = centerSeries; } public void setUseToolTip(boolean useToolTip) { this.useToolTip = useToolTip; } public Boolean getUseToolTip() { return this.useToolTip; } }