org.jacp.demo.components.ContactChartViewComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.jacp.demo.components.ContactChartViewComponent.java

Source

/*
 * Copyright (C) 2010 - 2014.
 * AHCP Project (http://code.google.com/p/jacp)
 * All rights reserved.
 *
 * 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.jacp.demo.components;

import java.util.Arrays;
import java.util.List;

import javafx.collections.FXCollections;
import javafx.event.Event;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jacp.demo.enums.BarChartAction;
import org.jacpfx.api.annotations.component.View;
import org.jacp.demo.entity.Contact;
import org.jacp.demo.main.Util;
import org.jacpfx.api.message.Message;
import org.jacpfx.rcp.component.FXComponent;
import org.jacpfx.rcp.util.FXUtil.MessageUtil;

/**
 * The chart view displays a faked consumer chart for each contact; The chart
 * data will be generated by the AnalyticsCallback component
 * 
 * @author Andy Moncsek Patrick Symmangk
 */
@View(id = "id003", name = "contactDemoChartView", active = true, initialTargetLayoutId = "PmainContentBottom")
public class ContactChartViewComponent implements FXComponent {
    private final static Log LOGGER = LogFactory.getLog(ContactChartViewComponent.class);
    private GridPane root;
    private CategoryAxis xAxis;
    private NumberAxis yAxis;
    private BarChart<String, Number> bc;
    private XYChart.Series<String, Number> series1;
    private XYChart.Series<String, Number> series2;
    private XYChart.Series<String, Number> series3;
    private XYChart.Series<String, Number> series4;
    public static final String[] YEARS = { "2006", "2007", "2008", "2009", "2010", "2011" };

    @Override
    public Node handle(final Message<Event, Object> message) throws Exception {
        if (message.getMessageBody().equals(MessageUtil.INIT)) {
            this.root = this.createRoot();
            this.root.getChildren().add(this.createChart());
        }
        LOGGER.debug("ContactChartViewComponent handlemessage message: " + message.getMessageBody());
        return null;
    }

    @Override
    public Node postHandle(final Node node, final Message<Event, Object> message) throws Exception {
        if (message.getMessageBody() instanceof BarChartAction) {
            if (BarChartAction.RESET.equals(message.getMessageBody())) {
                this.clearChartPane();
            }
        }
        if (message.getMessageBody() instanceof Contact) {
            final Contact contact = (Contact) message.getMessageBody();
            this.refreshChartPane(contact);
            final List<Data<String, Number>> data = contact.getDto().getSeriesOneData();
            this.addData(this.series1, data);
            this.addData(this.series2, contact.getDto().getSeriesTwoData());
            this.addData(this.series3, contact.getDto().getSeriesThreeData());
            this.addData(this.series4, contact.getDto().getSeriesFourData());

        }
        return this.root;
    }

    private GridPane createRoot() {
        final GridPane myRoot = new GridPane();
        myRoot.getStyleClass().addAll("dark", "bar-chart-root");
        myRoot.setAlignment(Pos.CENTER);
        GridPane.setHgrow(myRoot, Priority.ALWAYS);
        GridPane.setVgrow(myRoot, Priority.ALWAYS);
        return myRoot;
    }

    protected BarChart<String, Number> createChart() {

        this.xAxis = new CategoryAxis();
        this.yAxis = new NumberAxis();
        this.yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(this.yAxis, "$", null));
        this.bc = new BarChart<String, Number>(this.xAxis, this.yAxis);
        this.bc.setAnimated(true);
        this.bc.setTitle(" ");

        this.xAxis.getStyleClass().add("jacp-bar");
        this.yAxis.getStyleClass().add("jacp-bar");
        this.xAxis.setLabel("Year");
        this.yAxis.setLabel("Price");

        this.series1 = new XYChart.Series<String, Number>();
        this.series1.setName("electronic");
        this.series2 = new XYChart.Series<String, Number>();
        this.series2.setName("clothes");
        this.series3 = new XYChart.Series<String, Number>();
        this.series3.setName("hardware");
        this.series4 = new XYChart.Series<String, Number>();
        this.series4.setName("books");

        GridPane.setHalignment(this.bc, HPos.CENTER);
        GridPane.setVgrow(this.bc, Priority.ALWAYS);
        GridPane.setHgrow(this.bc, Priority.ALWAYS);
        GridPane.setMargin(this.bc, new Insets(0, 6, 0, 0));
        return this.bc;
    }

    private void refreshChartPane(final Contact contact) {
        this.root.getChildren().clear();
        this.bc = this.createChart();
        this.root.getChildren().add(this.bc);
        this.bc.setTitle(contact.getFirstName() + " " + contact.getLastName() + " consumer Chart");

        this.xAxis.setCategories(FXCollections.<String>observableArrayList(Arrays.asList(Util.YEARS)));
    }

    private void clearChartPane() {
        this.root.getChildren().clear();
        this.bc = this.createChart();
        this.root.getChildren().add(this.bc);
    }

    private void addData(final XYChart.Series<String, Number> series, final List<Data<String, Number>> data) {
        this.bc.getData().add(series);
        series.getData().addAll(data);
    }

}