/* AWE - Amanzi Wireless Explorer * http://awe.amanzi.org * (C) 2008-2009, AmanziTel AB * * This library is provided under the terms of the Eclipse Public License * as described at http://www.eclipse.org/legal/epl-v10.html. Any use, * reproduction or distribution of the library constitutes recipient's * acceptance of this agreement. * * This library is distributed WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ package org.amanzi.awe.charts.builder; import org.amanzi.awe.charts.builder.dataset.dto.IChartDatasetContainer; import org.amanzi.awe.charts.model.IChartModel; import org.amanzi.awe.charts.model.IRangeAxis; import org.amanzi.neo.models.exceptions.ModelException; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.Axis; import org.jfree.chart.plot.Plot; import org.jfree.chart.renderer.AbstractRenderer; import org.jfree.data.general.Dataset; /** * <p> * contains common finctional for charts which can contains more than one axis * </p> * * @author Vladislav_Kondratenko * @since 1.0.0 */ public abstract class AbstractMultiAxisChartBuilder<P extends Plot, D extends IChartDatasetContainer, R extends AbstractRenderer, R2 extends AbstractRenderer, X extends Axis, Y extends Axis> extends AbstractChartBuilder { private JFreeChart chart; private D datasets; private X domainAxis; private Y mainRangeAxis; private R mainRenderer; private R2 subRenderer; private Y secondAxis; private P plot; protected AbstractMultiAxisChartBuilder(IChartModel model) { super(model); } @SuppressWarnings("unchecked") @Override public JFreeChart createChart() throws ModelException { datasets = createDataset(getModel()); datasets.computeDatasets(); this.chart = createDefaultChart(); if (chart != null) { plot = (P)chart.getPlot(); } domainAxis = configDomainAxis(getModel().getDomainAxisName()); mainRangeAxis = configRangeAxis(getModel().getMainRangeAxis()); mainRenderer = configMainRenderer(); plot = plotSetup(datasets.getDataset(getModel().getMainRangeAxis()), domainAxis, mainRangeAxis, mainRenderer); if (datasets.isMultyAxis()) { subRenderer = configSubRenderer(); secondAxis = configRangeAxis(getModel().getSecondRangeAxis()); setSecondAxisForPlot(plot, datasets.getDataset(getModel().getSecondRangeAxis()), subRenderer, secondAxis); } domainAxis.setTickLabelFont(getDefaulTickLabelFont()); domainAxis.setLabelFont(getDefaultAxisFont()); chart = finishUp(chart); return chart; } /** * set second axis for prepared plot * * @param plot * @param dataset * @param subRenderer * @param secondAxis */ protected abstract void setSecondAxisForPlot(P plot, Dataset dataset, R2 subRenderer, Y secondAxis); /** * config or create new range axis * * @param axis * @return */ protected abstract Y configRangeAxis(IRangeAxis axis); /** * config or create new domain axis * * @param domainAxisName * @return */ protected abstract X configDomainAxis(String domainAxisName); /** * create dataset containr * * @param model * @return */ protected abstract D createDataset(IChartModel model); /** * setup plot or create new one * * @param dataset * @param domainAxis2 * @param mainRangeAxis2 * @param mainRenderer2 * @return */ protected abstract P plotSetup(Dataset dataset, X domainAxis2, Y mainRangeAxis2, R mainRenderer2); /** * if it possible to create default chart -than create it; else this method should be empty * * @return */ protected abstract JFreeChart createDefaultChart(); /** * create or config main renderer * * @return */ protected abstract R configMainRenderer(); /** * config sub renderer * * @return */ protected abstract R2 configSubRenderer(); /** * get datasets container * * @return */ protected D getDatasets() { return datasets; } /** * @return Returns the plot. */ protected P getPlot() { return plot; } /** * final actions for create chart this method also can me invoked for creation chart with early * setup components * * @param chart * @return */ protected JFreeChart finishUp(JFreeChart chart) { return chart; } /** * @return Returns the chart. */ protected JFreeChart getChart() { return chart; } }