dhbw.ka.mwi.businesshorizon2.ui.scenarioscreen.ScenarioScreenViewImpl.java Source code

Java tutorial

Introduction

Here is the source code for dhbw.ka.mwi.businesshorizon2.ui.scenarioscreen.ScenarioScreenViewImpl.java

Source

/*******************************************************************************
 * BusinessHorizon2
 *
 * Copyright (C) 
 * 2012-2013 Christian Gahlert, Florian Stier, Kai Westerholz,
 * Timo Belz, Daniel Dengler, Katharina Huber, Christian Scherer, Julius Hacker
 * 2013-2014 Marcel Rosenberger, Mirko Gpfrich, Annika Weis, Katharina Narlock, 
 * Volker Meier
 * 
 *
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

package dhbw.ka.mwi.businesshorizon2.ui.scenarioscreen;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.PostConstruct;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.event.LayoutEvents.LayoutClickEvent;
import com.vaadin.event.LayoutEvents.LayoutClickListener;
import com.vaadin.event.MouseEvents.ClickEvent;
import com.vaadin.event.MouseEvents.ClickListener;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.terminal.UserError;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

/**
 * Diese Klasse implementiert das GUI fuer den Prozessschritt "Szenario" in Vaadin.
 * 
 * @author Julius Hacker, Tobias Lindner, Markus Baader, Thomas Zapf
 *
 */
public class ScenarioScreenViewImpl extends VerticalLayout implements ScenarioScreenViewInterface {
    private static final long serialVersionUID = 1L;

    private static final Logger logger = Logger.getLogger("ScenarioScreenViewImpl.class");

    @Autowired
    private ScenarioScreenPresenter presenter;

    private Label gap3;
    private Label gap4;

    private Label addLabel;

    private Embedded addIcon;
    private Embedded deleteIcon;

    private VerticalLayout vlScenarios;
    private HorizontalLayout addScenarioLayout;

    private List<HashMap<String, AbstractComponent>> scenarios = new ArrayList<HashMap<String, AbstractComponent>>();

    /**
     * Dies ist der Konstruktor, der von Spring nach der Initialierung der Dependencies 
     * aufgerufen wird. Er registriert sich selbst beim Presenter und initialisiert die 
     * View-Komponenten.
     * 
     * @author Julius Hacker
     */
    @PostConstruct
    public void init() {
        presenter.setView(this);
        generateUi();
    }

    /**
     * Erstelle das GUI zum Prozessschritt "Szenarien"
     * 
     * @author Julius Hacker, Tobias Lindner
     */
    private void generateUi() {

        addScenarioLayout = new HorizontalLayout();

        addIcon = new Embedded(null,
                new ThemeResource("./images/icons/newIcons/1418766077_circle_add_plus_-128_green.png"));
        addIcon.setHeight(30, UNITS_PIXELS);

        addLabel = new Label("Szenario hinzufgen");
        addLabel.addStyleName("scenarios");
        addLabel.addStyleName("addScenario");

        addScenarioLayout.addComponent(addIcon);

        gap3 = new Label();
        gap3.setWidth(10, UNITS_PIXELS);

        addScenarioLayout.addComponent(gap3);
        addScenarioLayout.addComponent(addLabel);
        addScenarioLayout.setComponentAlignment(addLabel, Alignment.MIDDLE_CENTER);

        addScenarioLayout.addListener(new LayoutClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void layoutClick(LayoutClickEvent event) {
                presenter.addScenario();
            }
        });

        gap4 = new Label();
        gap4.setHeight(15, UNITS_PIXELS);

        this.vlScenarios = new VerticalLayout();
        this.vlScenarios.setSizeFull();
        this.setMargin(true);

        addComponent(addScenarioLayout);
        setComponentAlignment(addScenarioLayout, Alignment.MIDDLE_LEFT);
        addComponent(gap4);
        addComponent(this.vlScenarios);

        vlScenarios.addStyleName("scenarios");
    }

    /**
     * Die Methode fuegt der View ein Szenario hinzu. Sie baut hierzu saemtliche
     * notwendigen GUI-Elemente und entsprechenden Listener hinzu.
     * 
     * Auf ein GridLayout umgestellt.
     * 
     * @author Julius Hacker, Tobias Lindner
     * @param rateReturnEquity Standardwert fuer die Renditeforderung Eigenkapital
     * @param rateReturnCapitalStock Standardwert fuer die Renditeforderung Fremdkapital
     * @param businessTax Standardwert fuer die Gewerbesteuer
     * @param corporateAndSolitaryTax Standardwert fuer die Koerperschaftssteuer mit Solidaritaetszuschlag.
     */

    @Override
    public void addScenario(String rateReturnEquity, String rateReturnCapitalStock, String corporateAndSolitaryTax,
            String businessTax, String personalTaxRate, boolean isIncludeInCalculation, final int number) {
        HashMap<String, AbstractComponent> scenarioComponents = new HashMap<String, AbstractComponent>();

        Property.ValueChangeListener changeListener = new Property.ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                presenter.updateScenario(number);
                logger.debug("TextChange ausgeloest");
                logger.debug("ChangeListener " + System.identityHashCode(this));
                presenter.isValid();
            }
        };

        final GridLayout gl = new GridLayout(3, 7);
        gl.addStyleName("gridLayoutScenarios");
        gl.setSizeFull();
        gl.setColumnExpandRatio(0, 2);
        gl.setColumnExpandRatio(1, 1);
        gl.setColumnExpandRatio(2, 1);

        final Label scenarioName = new Label("<strong>Szenario " + number + "</strong>");
        scenarioName.setContentMode(Label.CONTENT_XHTML);
        scenarioComponents.put("label", scenarioName);

        logger.debug("SzenarioName: " + scenarioName);
        gl.addComponent(scenarioName, 0, 0);

        //EK Rendite
        final Label textEigenkapital = new Label("Renditeforderung Eigenkapital: ");
        textEigenkapital.setSizeFull();

        final TextField tfEigenkapital = new TextField();

        if (!"0.0".equals(rateReturnEquity)) {
            tfEigenkapital.setValue(rateReturnEquity);
        }

        tfEigenkapital.setImmediate(true);
        tfEigenkapital.addStyleName("scenario");
        tfEigenkapital.addListener(changeListener);

        gl.addComponent(textEigenkapital, 0, 1);
        gl.addComponent(tfEigenkapital, 1, 1);

        scenarioComponents.put("rateReturnEquity", tfEigenkapital);

        // Fremdkapital      
        final Label textFremdkapitel = new Label("Renditeforderung FK: ");

        final TextField tfFremdkapital = new TextField();

        if (!"0.0".equals(rateReturnCapitalStock)) {
            tfFremdkapital.setValue(rateReturnCapitalStock);
        }

        tfFremdkapital.setImmediate(true);
        tfFremdkapital.addStyleName("scenario");
        tfFremdkapital.addListener(changeListener);

        gl.addComponent(textFremdkapitel, 0, 2);
        gl.addComponent(tfFremdkapital, 1, 2);

        scenarioComponents.put("rateReturnCapitalStock", tfFremdkapital);

        //Gewerbesteuer
        final Label textGewerbesteuer = new Label("Gewerbesteuer:");
        final TextField tfGewerbesteuer = new TextField();

        if (!"0.0".equals(businessTax)) {
            tfGewerbesteuer.setValue(businessTax);
        }

        tfGewerbesteuer.setImmediate(true);
        tfGewerbesteuer.addStyleName("scenario");
        tfGewerbesteuer.addListener(changeListener);

        gl.addComponent(textGewerbesteuer, 0, 3);
        gl.addComponent(tfGewerbesteuer, 1, 3);

        scenarioComponents.put("businessTax", tfGewerbesteuer);

        //Krperschaftssteuer
        final Label textKoerperschaftssteuer = new Label("Krperschaftssteuer mit Solidarittszuschlag: ");

        final TextField tfKoerperschaftssteuer = new TextField();

        if (!"0.0".equals(corporateAndSolitaryTax)) {
            tfKoerperschaftssteuer.setValue(corporateAndSolitaryTax);
        }

        tfKoerperschaftssteuer.setImmediate(true);
        tfKoerperschaftssteuer.addStyleName("scenario");
        tfKoerperschaftssteuer.addListener(changeListener);

        gl.addComponent(textKoerperschaftssteuer, 0, 4);
        gl.addComponent(tfKoerperschaftssteuer, 1, 4);

        scenarioComponents.put("corporateAndSolitaryTax", tfKoerperschaftssteuer);

        // Persnlicher Steuersatz
        final Label textPersonalTaxRate = new Label("pers\u00F6nlicher Steuersatz: ");
        final TextField tfPersonalTaxRate = new TextField();
        if (!"0.0".equals(personalTaxRate)) {
            tfPersonalTaxRate.setValue(personalTaxRate);
        }
        tfPersonalTaxRate.setImmediate(true);
        tfPersonalTaxRate.addStyleName("scenario");
        tfPersonalTaxRate.addListener(changeListener);

        gl.addComponent(textPersonalTaxRate, 0, 5);
        gl.addComponent(tfPersonalTaxRate, 1, 5);

        scenarioComponents.put("personalTaxRate", tfPersonalTaxRate);

        deleteIcon = new Embedded(null,
                new ThemeResource("./images/icons/newIcons/1418766003_editor_trash_delete_recycle_bin_-128.png"));
        deleteIcon.setHeight(60, UNITS_PIXELS);
        deleteIcon.addStyleName("deleteScenario");

        deleteIcon.addListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void click(ClickEvent event) {
                presenter.removeScenario(number);
            }

        });

        gl.addComponent(deleteIcon, 2, 0, 2, 6);
        gl.setComponentAlignment(deleteIcon, Alignment.MIDDLE_CENTER);

        final Label gap = new Label();
        gap.setHeight(20, UNITS_PIXELS);

        gl.addComponent(gap, 0, 6);

        scenarioComponents.put("scenario", gl);

        this.scenarios.add(scenarioComponents);
        this.vlScenarios.addComponent(gl);

        //Button bei 3 Scenarios deaktivieren
        if (number == 3) {
            deactivateAddScenario();
        }
    }

    public void updateLabels() {
        int number = 1;

        for (HashMap<String, AbstractComponent> scenarioComponents : this.scenarios) {
            ((Label) scenarioComponents.get("label")).setValue("<strong>Szenario " + number + "</strong>");
            number++;
        }
    }

    public void removeScenario(final int number) {
        logger.debug("Removing scenario from view");
        this.vlScenarios.removeComponent(this.scenarios.get(number).get("scenario"));
        this.scenarios.remove(number);

        activateAddScenario();
    }

    public boolean getIncludedInCalculation(int scenarioNumber) {
        return (boolean) ((CheckBox) this.scenarios.get(scenarioNumber - 1).get("isIncludeInCalculation"))
                .getValue();
    }

    public String getValue(int scenarioNumber, String identifier) {
        return (String) ((AbstractField) this.scenarios.get(scenarioNumber - 1).get(identifier)).getValue();
    }

    public Boolean getIncludeInCalculation(int scenarioNumber) {
        return true; //Die Checkbox zum ausschlieen eines Szenarios aus der Berechnung ist im neuen UI nicht mehr vorhanden.
    }

    public void setIncludedInCalculation(int scenarioNumber, boolean newValue) {
        ((CheckBox) this.scenarios.get(scenarioNumber - 1).get("isIncludeInCalculation")).setValue(newValue);
    }

    public void setRateReturnEquity(int scenarioNumber, String newValue) {
        ((Button) this.scenarios.get(scenarioNumber - 1).get("rateReturnEquity")).setValue(newValue);
    }

    public void setRateReturnCapitalStock(int scenarioNumber, String newValue) {
        ((Button) this.scenarios.get(scenarioNumber - 1).get("rateReturnCapitalStock")).setValue(newValue);
    }

    public void setBusinessTax(int scenarioNumber, String newValue) {
        ((Button) this.scenarios.get(scenarioNumber - 1).get("businessTax")).setValue(newValue);
    }

    public void setCorporateAndSolitaryTax(int scenarioNumber, String newValue) {
        ((Button) this.scenarios.get(scenarioNumber - 1).get("corporateAndSolitaryTax")).setValue(newValue);
    }

    public void setPersonalTaxRate(int scenarioNumber, String newValue) {
        ((Button) this.scenarios.get(scenarioNumber - 1).get("personalTaxRate")).setValue(newValue);
    }

    /**
     * Diese Methode setzt das betreffende Eingabefeld auf den Status ungueltig.
     * Hierbei wird neben dem Eingabefeld ein kleins Fehlericon mit entsprechendem Tooltip-Fehlertext angezeigt.
     * 
     * @author Julius Hacker
     * @param scenarioNumber Die Nummer des Szenarios, zu dem das Eingabefeld gehoert
     * @param identifier Der Eingabewert (Renditeforderungen, Steuern, ...), zu dem das Eingabefeld gehoert.
     */
    public void setInvalid(int scenarioNumber, String identifier) {
        this.scenarios.get(scenarioNumber - 1).get(identifier).setComponentError(
                new UserError("Nur Zahlen gr\u00F6\u00DFer gleich 0 und kleiner gleich 100 sind erlaubt!"));
    }

    /**
     * Diese Methode setzt das betreffende Eingabefeld auf den Status gueltig.
     * 
     * @author Julius Hacker
     * @param scenarioNumber Die Nummer des Szenarios, zu dem das Eingabefeld gehoert
     * @param identifier Der Eingabewert (Renditeforderungen, Steuern, ...), zu dem das Eingabefeld gehoert.
     */
    public void setValid(int scenarioNumber, String identifier) {
        this.scenarios.get(scenarioNumber - 1).get(identifier).setComponentError(null);
    }

    /**
     * Diese Methode entfernt alle GUI-Elemente aus der View. Diese Methode kann so zur Vorbereitung
     * des Neuaufbaus der View dienen.
     * 
     * @author Julius Hacker
     */
    public void clear() {
        vlScenarios.removeAllComponents();
        scenarios.clear();
    }

    /**
     * Diese Methode deaktiviert den Button, um ein neues Szenario hinzuzufgen.
     * 
     * @author Tobias Lindner
     */
    public void deactivateAddScenario() {
        addScenarioLayout.setEnabled(false);
    }

    /**
     * Diese Methode aktiviert den Button, um ein neues Szenario hinzuzufgen.
     * 
     * @author Tobias Lindner
     */
    public void activateAddScenario() {
        addScenarioLayout.setEnabled(true);
    }

}