org.efaps.esjp.ui.html.dojo.charting.AbstractChart_Base.java Source code

Java tutorial

Introduction

Here is the source code for org.efaps.esjp.ui.html.dojo.charting.AbstractChart_Base.java

Source

/*
 * Copyright 2003 - 2016 The eFaps Team
 *
 * 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 org.efaps.esjp.ui.html.dojo.charting;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.efaps.admin.program.esjp.EFapsApplication;
import org.efaps.admin.program.esjp.EFapsUUID;

/**
 * TODO comment!
 *
 * @author The eFaps Team
 */
@EFapsUUID("dfe47174-e442-4244-807b-5e11f56f0630")
@EFapsApplication("eFaps-WebApp")
public abstract class AbstractChart_Base<T extends AbstractData<T>, S extends AbstractChart_Base<T, S>> {

    /** The modules. */
    private final Map<CharSequence, String> modules = new LinkedHashMap<>();

    /** The plots. */
    private final Map<String, Plot_Base<?>> plots = new LinkedHashMap<>();

    /** The orientation. */
    private Orientation orientation = Orientation.VERTICAL_CHART_LEGEND;

    /** The theme. */
    private Theme theme = Theme.JULIE;

    /** The legend. */
    private Legend legend = new Legend();

    /** The chart node id. */
    private String chartNodeId;

    /** The height. */
    private int height = 300;

    /** The width. */
    private int width = 450;

    /** The series. */
    private final List<Serie<T>> series = new ArrayList<>();

    /** The title. */
    private String title;

    /** The title pos. */
    private TitlePos titlePos = TitlePos.top;

    /** The initialized. */
    private boolean initialized = false;

    /**
     * "getThis" trick.
     * @return this
     */
    protected abstract S getThis();

    /**
     * Initialize.
     */
    protected void initialize() {
        this.initialized = true;
        addModule("dojox/charting/Chart", "Chart");
        addModule(getTheme().getAmd(), "theme");

        if (getLegend() != null) {
            if (getLegend().isSelectable()) {
                addModule("dojox/charting/widget/SelectableLegend", "Legend");
            } else {
                addModule("dojox/charting/widget/Legend", "Legend");
            }
        }
        addModule("dojox/charting/action2d/Tooltip", "Tooltip");
    }

    /**
     * Gets the html snipplet.
     *
     * @return the html snipplet
     */
    public CharSequence getHtmlSnipplet() {
        if (!this.initialized) {
            initialize();
        }
        final StringBuilder ret = new StringBuilder().append("\n<style type=\"text/css\"> ");

        addCSS(ret);

        ret.append("</style>\n").append("<script type=\"text/javascript\">\n");

        addJavaScript(ret);

        ret.append("</script> \n");

        addHtmlNodes(ret);
        return ret;
    }

    /**
     * Adds the css.
     *
     * @param _js the _js
     */
    protected void addCSS(final StringBuilder _js) {
        _js.append(".dojoxLegendNode Label {").append("font-size: 8pt;").append("}");
    }

    /**
     * Adds the java script.
     *
     * @param _js the _js
     */
    protected void addJavaScript(final StringBuilder _js) {
        // to be sure that it is the last module, add now
        addModule("dijit/registry", "registry");
        addModule("dojo/domReady!", null);

        _js.append("require(").append(Util.collectionToObjectArray(this.modules.keySet())).append(", ")
                .append("function(");
        boolean first = true;
        for (final String para : this.modules.values()) {
            if (first) {
                first = false;
                _js.append(para);
            } else if (para != null) {
                _js.append(",").append(para);
            }
        }
        _js.append(")").append(" { \n").append(" if(typeof registry.byId('").append(getChartNodeId())
                .append("') != \"undefined\"){\n").append("    registry.byId('").append(getChartNodeId())
                .append("').destroyRecursive();\n").append(" }");

        addFunctionJS(_js);

        _js.append(" });");
    }

    /**
     * Adds the function js.
     *
     * @param _js the _js
     */
    protected void addFunctionJS(final StringBuilder _js) {
        _js.append(" var chart = new Chart(\"").append(getChartNodeId()).append("\", {\n");
        addChartJS(_js, "chart");
        _js.append(" });\n");
        addBeforeRenderJS(_js, "chart");
        addRenderJS(_js, "chart");
        addAfterRenderJS(_js, "chart");
    }

    /**
     * Adds the before render js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addBeforeRenderJS(final StringBuilder _js, final String _chartVarName) {
        _js.append(" chart.setTheme(theme);\n");
        addPlotJS(_js, _chartVarName);
        addSeriesJS(_js, _chartVarName);
        _js.append(" new Tooltip(chart, \"default\");\n");
    }

    /**
     * Adds the render js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addRenderJS(final StringBuilder _js, final String _chartVarName) {
        _js.append(" chart.render();\n");
    }

    /**
     * Adds the after render js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addAfterRenderJS(final StringBuilder _js, final String _chartVarName) {
        getLegend().addLegendJS(_js);
    }

    /**
     * Adds the chart js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addChartJS(final StringBuilder _js, final String _chartVarName) {
        _js.append(getTitleJS());
    }

    /**
     * Adds the plot js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addPlotJS(final StringBuilder _js, final String _chartVarName) {
        for (final Plot_Base<?> plot : getPlots().values()) {
            plot.addJS(_js, _chartVarName);
        }
    }

    /**
     * Gets the title js.
     *
     * @return the title js
     */
    protected CharSequence getTitleJS() {
        final StringBuilder ret = new StringBuilder();
        final String titleTmp = getTitle();
        if (titleTmp != null) {
            ret.append("title: \"").append(StringEscapeUtils.escapeEcmaScript(titleTmp)).append("\",")
                    .append("titlePos: \"").append(getTitlePos()).append("\",")
                    .append("titleFont: \"bold 8pt Tahoma\"");
        }
        //titleGap: 25,

        //titleFontColor: "orange"
        return ret;
    }

    /**
     * Adds the series js.
     *
     * @param _js the _js
     * @param _chartVarName the _chart var name
     */
    protected void addSeriesJS(final StringBuilder _js, final String _chartVarName) {
        for (final Serie<T> serie : getSeries()) {
            serie.addJS(_js, _chartVarName);
        }
    }

    /**
     * Adds the html nodes.
     *
     * @param _js the _js
     */
    protected void addHtmlNodes(final StringBuilder _js) {
        switch (getOrientation()) {
        case HORIZONTAL_CHART_LEGEND:
            _js.append(" <div style=\"display: table-row\">").append(" <div style=\"display: table-cell\">")
                    .append(" <div id=\"").append(getChartNodeId()).append("\" style=\"width: ").append(getWidth())
                    .append("px; height: ").append(getHeight()).append("px;\"></div>\n").append(" </div>")
                    .append(" <div style=\"display: table-cell\">").append(" <div id=\"")
                    .append(getLegend().getNodeId()).append("\"></div>\n").append(" </div>").append(" </div>");
            break;
        case HORIZONTAL_LEGEND_CHART:
            _js.append(" <div style=\"display: table-row\">").append(" <div style=\"display: table-cell\">")
                    .append(" <div id=\"").append(getLegend().getNodeId()).append("\"></div>\n").append(" </div>")
                    .append(" <div style=\"display: table-cell\">").append(" <div id=\"").append(getChartNodeId())
                    .append("\" style=\"width: ").append(getWidth()).append("px; height: ").append(getHeight())
                    .append("px;\"></div>\n").append(" </div>").append(" </div>");
            break;
        case VERTICAL_CHART_LEGEND:
            _js.append(" <div id=\"").append(getChartNodeId()).append("\" style=\"width: ").append(getWidth())
                    .append("px; height: ").append(getHeight()).append("px;\"></div>\n").append(" <div id=\"")
                    .append(getLegend().getNodeId()).append("\"></div>\n");

            break;
        case VERTICAL_LEGEND_CHART:
            _js.append(" <div id=\"").append(getLegend().getNodeId()).append("\"></div>\n").append(" <div id=\"")
                    .append(getChartNodeId()).append("\" style=\"width: ").append(getWidth()).append("px; height: ")
                    .append(getHeight()).append("px;\"></div>\n");
            break;

        case CHART_ONLY:
            _js.append(" <div id=\"").append(getChartNodeId()).append("\" style=\"width: ").append(getWidth())
                    .append("px; height: ").append(getHeight()).append("px;\"></div>\n");
            break;
        default:
            break;
        }
    }

    /**
     * Getter method for the instance variable {@link #charNodeId}.
     *
     * @return value of instance variable {@link #charNodeId}
     */
    public String getChartNodeId() {
        if (this.chartNodeId == null) {
            this.chartNodeId = RandomStringUtils.randomAlphabetic(8);
        }
        return this.chartNodeId;
    }

    /**
     * Setter method for instance variable {@link #charNodeId}.
     *
     * @param _charNodeId value for instance variable {@link #charNodeId}
     */
    public S setChartNodeId(final String _chartNodeId) {
        this.chartNodeId = _chartNodeId;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #height}.
     *
     * @return value of instance variable {@link #height}
     */
    public int getHeight() {
        return this.height;
    }

    /**
     * Setter method for instance variable {@link #height}.
     *
     * @param _height value for instance variable {@link #height}
     */
    public S setHeight(final int _height) {
        this.height = _height;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #width}.
     *
     * @return value of instance variable {@link #width}
     */
    public int getWidth() {
        return this.width;
    }

    /**
     * Setter method for instance variable {@link #width}.
     *
     * @param _width value for instance variable {@link #width}
     */
    public S setWidth(final int _width) {
        this.width = _width;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #series}.
     *
     * @return value of instance variable {@link #series}
     */
    public List<Serie<T>> getSeries() {
        return this.series;
    }

    /**
     * @param _serie
     */
    public S addSerie(final Serie<T> _serie) {
        this.series.add(_serie);
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #theme}.
     *
     * @return value of instance variable {@link #theme}
     */
    public Theme getTheme() {
        return this.theme;
    }

    /**
     * Setter method for instance variable {@link #theme}.
     *
     * @param _theme value for instance variable {@link #theme}
     */
    public S setTheme(final Theme _theme) {
        this.theme = _theme;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #legend}.
     *
     * @return value of instance variable {@link #legend}
     */
    public Legend getLegend() {
        return this.legend;
    }

    /**
     * Setter method for instance variable {@link #legend}.
     *
     * @param _legend value for instance variable {@link #legend}
     */
    public S setLegend(final Legend _legend) {
        this.legend = _legend;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #orientation}.
     *
     * @return value of instance variable {@link #orientation}
     */
    public Orientation getOrientation() {
        return this.orientation;
    }

    /**
     * Setter method for instance variable {@link #orientation}.
     *
     * @param _orientation value for instance variable {@link #orientation}
     */
    public S setOrientation(final Orientation _orientation) {
        if (_orientation.equals(Orientation.HORIZONTAL_CHART_LEGEND)
                || _orientation.equals(Orientation.HORIZONTAL_LEGEND_CHART)) {
            getLegend().setVertical(true);
        }
        this.orientation = _orientation;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #title}.
     *
     * @return value of instance variable {@link #title}
     */
    public String getTitle() {
        return this.title;
    }

    /**
     * Setter method for instance variable {@link #title}.
     *
     * @param _title value for instance variable {@link #title}
     */
    public S setTitle(final String _title) {
        this.title = _title;
        return getThis();
    }

    /**
     * Getter method for the instance variable {@link #titlePos}.
     *
     * @return value of instance variable {@link #titlePos}
     */
    public TitlePos getTitlePos() {
        return this.titlePos;
    }

    /**
     * Setter method for instance variable {@link #titlePos}.
     *
     * @param _titlePos value for instance variable {@link #titlePos}
     */
    public S setTitlePos(final TitlePos _titlePos) {
        this.titlePos = _titlePos;
        return getThis();
    }

    protected void addModule(final String _module, final String _var) {
        this.modules.put("\"" + _module + "\"", _var);
    }

    /**
     * @param _string
     * @param _string2
     */
    public void addPlot(final Plot_Base<?> _plot) {
        getPlots().put(_plot.getName(), _plot);
    }

    /**
     * Getter method for the instance variable {@link #plots}.
     *
     * @return value of instance variable {@link #plots}
     */
    public Map<String, Plot_Base<?>> getPlots() {
        return this.plots;
    }
}