dhbw.ka.mwi.businesshorizon2.ui.process.scenario.ScenarioViewImpl.java Source code

Java tutorial

Introduction

Here is the source code for dhbw.ka.mwi.businesshorizon2.ui.process.scenario.ScenarioViewImpl.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.process.scenario;

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.terminal.Sizeable;
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.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

/**
 * Diese Klasse implementiert das GUI fuer den Prozessschritt "Methoden" in Vaadin.
 * 
 * @author Julius Hacker
 *
 */
public class ScenarioViewImpl extends HorizontalSplitPanel implements ScenarioViewInterface {
    private static final long serialVersionUID = 1L;

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

    @Autowired
    private ScenarioPresenter presenter;

    private VerticalLayout vlScenarios;

    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
     */
    private void generateUi() {
        VerticalLayout content = new VerticalLayout();

        this.vlScenarios = new VerticalLayout();
        this.setLocked(true);
        this.setStyleName("small");
        this.setMargin(true);

        Button newScenario = new Button("Weiteres Szenario");

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

            @Override
            public void buttonClick(ClickEvent event) {
                presenter.addScenario();
            }
        });
        content.addComponent(this.vlScenarios);
        content.addComponent(newScenario);
        setFirstComponent(content);

        VerticalLayout infoBox = new VerticalLayout();
        infoBox.setMargin(true);
        Label infoText1 = new Label("<h3>Eingabe der Szenarien</h3>");
        infoText1.setContentMode(Label.CONTENT_XHTML);
        Label infoText2 = new Label(
                "Sie knnen verschiedene Szenarien fr die Berechnung erstellen. ber die Checkbox Berechnung einbeziehen, knnen Sie selbst festlegen, fr welche Szenarien eine Berechnung durchgefhrt werden soll. "
                        + " ber den Button 'Weiteres Szenario' kann man beliebig viele weitere Szenarien anlegen. Fr jedes Szenario knnen Sie unterschiedliche Berechnungswerte fr die Eigen- und Fremdkapitalrendite, sowie die einzelnen Steuerstze angeben. "
                        + " Info: Bei dem Flow-to-Equity Verfahren beschrnken sich die geforderten Werte auf die Eigenkapitalkosten."
                        + " Sie mssen mindestens ein Szenario in die Berechnung einbeziehen. Des Weiteren knnen Sie jedes Szenario ber den 'Szenario entfernen'-Button lschen. Dabei muss jedoch mindestens ein Szenario angelegt bleiben. "
                        + "ber den Button 'Nchster Schritt' knnen Sie die Berechnung starten.");
        infoBox.addComponent(infoText1);
        infoBox.addComponent(infoText2);
        setSecondComponent(infoBox);

    }

    /**
     * Die Methode fuegt der View ein Szenario hinzu. Sie baut hierzu saemtliche
     * notwendigen GUI-Elemente und entsprecheenden Listener hinzu.
     * 
     * @author Julius Hacker
     * @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, 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));
            }
        };

        HorizontalLayout hlScenario = new HorizontalLayout();
        hlScenario.setSizeFull();

        FormLayout formLeft = new FormLayout();
        FormLayout formRight = new FormLayout();
        hlScenario.addComponent(formLeft);
        //hlScenario.addComponent(formRight);

        final Label scenarioName = new Label("<strong>Szenario " + number + "</strong>");
        scenarioName.setContentMode(Label.CONTENT_XHTML);
        scenarioComponents.put("label", scenarioName);
        formLeft.addComponent(scenarioName);
        scenarioName.setWidth(Sizeable.SIZE_UNDEFINED, 0);

        final CheckBox cbBerechnungEinbezug = new CheckBox("In Berechnung einbeziehen");
        cbBerechnungEinbezug.setValue(isIncludeInCalculation);
        cbBerechnungEinbezug.setImmediate(true);
        cbBerechnungEinbezug.addListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                presenter.updateScenario(number);
                logger.debug("ChangeListener " + System.identityHashCode(this));
            }

        });
        scenarioComponents.put("isIncludeInCalculation", cbBerechnungEinbezug);
        formLeft.addComponent(cbBerechnungEinbezug);

        final TextField tfEigenkapital = new TextField("Renditeforderung Eigenkapital: ");
        if (!"0.0".equals(rateReturnEquity)) {
            tfEigenkapital.setValue(rateReturnEquity);
        }
        tfEigenkapital.setImmediate(true);
        tfEigenkapital.addListener(changeListener);
        scenarioComponents.put("rateReturnEquity", tfEigenkapital);
        formLeft.addComponent(tfEigenkapital);

        final TextField tfFremdkapital = new TextField("Renditeforderung Fremdkapital: ");
        if (!"0.0".equals(rateReturnCapitalStock)) {
            tfFremdkapital.setValue(rateReturnCapitalStock);
        }
        tfFremdkapital.setImmediate(true);
        tfFremdkapital.addListener(changeListener);
        scenarioComponents.put("rateReturnCapitalStock", tfFremdkapital);
        formLeft.addComponent(tfFremdkapital);

        final TextField tfGewerbesteuer = new TextField("Gewerbesteuer: ");
        if (!"0.0".equals(businessTax)) {
            tfGewerbesteuer.setValue(businessTax);
        }
        tfGewerbesteuer.setImmediate(true);
        tfGewerbesteuer.addListener(changeListener);
        scenarioComponents.put("businessTax", tfGewerbesteuer);
        formLeft.addComponent(tfGewerbesteuer);

        final TextField tfKoerperschaftssteuer = new TextField(
                "K\u00F6rperschaftssteuer mit Solidarit\u00E4tszuschlag: ");
        if (!"0.0".equals(corporateAndSolitaryTax)) {
            tfKoerperschaftssteuer.setValue(corporateAndSolitaryTax);
        }
        tfKoerperschaftssteuer.setImmediate(true);
        tfKoerperschaftssteuer.addListener(changeListener);
        scenarioComponents.put("corporateAndSolitaryTax", tfKoerperschaftssteuer);
        formLeft.addComponent(tfKoerperschaftssteuer);

        final Button removeScenario = new Button("Szenario entfernen");
        removeScenario.addListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

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

        });
        formLeft.addComponent(removeScenario);

        formLeft.setWidth(Sizeable.SIZE_UNDEFINED, 0);
        formLeft.setWidth(Sizeable.SIZE_UNDEFINED, 0);

        scenarioComponents.put("scenario", hlScenario);

        this.scenarios.add(scenarioComponents);
        this.vlScenarios.addComponent(hlScenario);
    }

    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);
    }

    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 (Boolean) ((CheckBox) this.scenarios.get(scenarioNumber - 1).get("isIncludeInCalculation"))
                .getValue();
    }

    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);
    }

    /**
     * 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();
    }
}