org.polymap.kaps.ui.form.WohnungGrunddatenFormEditorPage.java Source code

Java tutorial

Introduction

Here is the source code for org.polymap.kaps.ui.form.WohnungGrunddatenFormEditorPage.java

Source

/*
 * polymap.org Copyright 2013 Polymap GmbH. All rights reserved.
 * 
 * This is free software; you can redistribute it and/or modify it under the terms of
 * the GNU Lesser General Public License as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any later
 * version.
 * 
 * This software 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 Lesser General Public License for more details.
 */
package org.polymap.kaps.ui.form;

import java.util.TreeMap;
import java.beans.PropertyChangeListener;

import org.geotools.data.FeatureStore;
import org.opengis.feature.Feature;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.qi4j.api.entity.Entity;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.core.runtime.IProgressMonitor;
import org.polymap.core.runtime.event.EventManager;
import org.polymap.core.workbench.PolymapWorkbench;
import org.polymap.rhei.data.entityfeature.AssociationAdapter;
import org.polymap.rhei.data.entityfeature.PropertyAdapter;
import org.polymap.rhei.field.FormFieldEvent;
import org.polymap.rhei.field.IFormFieldLabel;
import org.polymap.rhei.field.IFormFieldListener;
import org.polymap.rhei.field.PicklistFormField;
import org.polymap.rhei.field.StringFormField;
import org.polymap.rhei.field.TextFormField;
import org.polymap.rhei.form.FormEditor;
import org.polymap.rhei.form.IFormEditorPageSite;
import org.polymap.kaps.KapsPlugin;
import org.polymap.kaps.model.KapsRepository;
import org.polymap.kaps.model.data.AusstattungBewertungComposite;
import org.polymap.kaps.model.data.AusstattungComposite;
import org.polymap.kaps.model.data.EigentumsartComposite;
import org.polymap.kaps.model.data.ErmittlungModernisierungsgradComposite;
import org.polymap.kaps.model.data.EtageComposite;
import org.polymap.kaps.model.data.FlurstueckComposite;
import org.polymap.kaps.model.data.GebaeudeComposite;
import org.polymap.kaps.model.data.HimmelsrichtungComposite;
import org.polymap.kaps.model.data.ImmobilienArtStaBuComposite;
import org.polymap.kaps.model.data.RichtwertzoneComposite;
import org.polymap.kaps.model.data.RichtwertzoneZeitraumComposite;
import org.polymap.kaps.model.data.StockwerkStaBuComposite;
import org.polymap.kaps.model.data.VertragComposite;
import org.polymap.kaps.model.data.VertragsdatenErweitertComposite;
import org.polymap.kaps.model.data.WohnungComposite;
import org.polymap.kaps.ui.ActionButton;
import org.polymap.kaps.ui.BooleanFormField;
import org.polymap.kaps.ui.FieldCalculation;
import org.polymap.kaps.ui.FieldListener;
import org.polymap.kaps.ui.InterEditorListener;
import org.polymap.kaps.ui.InterEditorPropertyChangeEvent;
import org.polymap.kaps.ui.MyNumberValidator;
import org.polymap.kaps.ui.NotNullMyNumberValidator;

/**
 * @author <a href="http://www.polymap.de">Steffen Stundzig</a>
 */
public class WohnungGrunddatenFormEditorPage extends WohnungFormEditorPage {

    private static Log log = LogFactory.getLog(WohnungGrunddatenFormEditorPage.class);

    private PropertyChangeListener compositeListener;

    private IFormFieldListener publisher;

    private FieldCalculation riwezuschlag;

    private FieldCalculation riweabschlag;

    private FieldCalculation preisunbebaut;

    private FieldCalculation bebabschlag;

    private FieldCalculation bodenpreisbebaut;

    private IFormFieldListener richtwertzone;

    private ActionButton baujahrBerechneAction;

    private FieldListener gndbjListener;

    private FormEditor formEditor;

    private final InterEditorListener editorListener;

    private ActionButton bewertungAction;

    private IFormFieldListener ausstattungListener;

    private IFormFieldListener flurstueckListener;

    public WohnungGrunddatenFormEditorPage(FormEditor formEditor, Feature feature, FeatureStore featureStore) {
        super(WohnungGrunddatenFormEditorPage.class.getName(), "Grunddaten", feature, featureStore);
        this.formEditor = formEditor;
        EventManager.instance().subscribe(
                editorListener = new InterEditorListener(wohnung.bereinigtesBaujahr(), wohnung.bewertungsPunkte()) {

                    @Override
                    protected void onChangedValue(IFormEditorPageSite site, Entity entity, String fieldName,
                            Object value) {
                        if (fieldName.equals(wohnung.bereinigtesBaujahr().qualifiedName().name())) {
                            pageSite.setFieldValue(fieldName,
                                    value != null ? getFormatter(0, false).format(value) : null);
                        } else if (fieldName.equals(wohnung.bewertungsPunkte().qualifiedName().name())) {
                            pageSite.setFieldValue(fieldName,
                                    value != null ? getFormatter(0, false).format(value) : null);
                        }
                    }

                }, new InterEditorListener.EventFilter(wohnung));
    }

    @Override
    public void dispose() {
        super.dispose();
        EventManager.instance().unsubscribe(editorListener);
    }

    @Override
    public void afterDoLoad(IProgressMonitor monitor) throws Exception {
        editorListener.flush(pageSite);
        pageSite.addFieldListener(flurstueckListener = new IFormFieldListener() {

            @Override
            public void fieldChange(FormFieldEvent ev) {
                if (ev.getEventCode() == IFormFieldListener.VALUE_CHANGE
                        && ev.getFieldName().endsWith(wohnung.flurstueck().qualifiedName().name())) {
                    updateBodenPreis((FlurstueckComposite) ev.getNewValue());
                }
            }
        });
        updateBodenPreis(wohnung.flurstueck().get());
        updateKaufpreis();
    }

    private void updateKaufpreis() {
        VertragComposite vertrag = wohnung.vertrag().get();
        Double kaufpreis = null;
        if (vertrag != null) {
            if (vertrag.erweiterteVertragsdaten().get() != null) {
                VertragsdatenErweitertComposite vertragsdatenErweitertComposite = vertrag.erweiterteVertragsdaten()
                        .get();
                kaufpreis = vertragsdatenErweitertComposite.bereinigterVollpreis().get();
            }
            // erweiterte Daten kann leer sein
            if (kaufpreis == null || kaufpreis == 0.0d) {
                kaufpreis = vertrag.vollpreis().get();
            }
        }
        if (kaufpreis != null && !kaufpreis.equals(wohnung.kaufpreis().get())) {
            pageSite.fireEvent(this, wohnung.kaufpreis().qualifiedName().name(), IFormFieldListener.VALUE_CHANGE,
                    kaufpreis);
        }
    }

    private void updateBodenPreis(FlurstueckComposite flurstueck) {
        // refresh bodenpreis aus richtwertzone vom flurstck
        if (flurstueck != null) {
            RichtwertzoneComposite richtwertzoneComposite = flurstueck.richtwertZone().get();
            VertragComposite vertrag = flurstueck.vertrag().get();
            if (vertrag != null && richtwertzoneComposite != null) {
                RichtwertzoneZeitraumComposite zeitraum = RichtwertzoneZeitraumComposite.Mixin
                        .findZeitraumFor(richtwertzoneComposite, vertrag.vertragsDatum().get());
                if (zeitraum != null) {
                    pageSite.fireEvent(this, wohnung.bodenrichtwert().qualifiedName().name(),
                            IFormFieldListener.VALUE_CHANGE, zeitraum.euroQm().get());
                    if (wohnung.bodenpreis().get() == null) {
                        // set the bodenpreis also to this default value
                        pageSite.fireEvent(this, wohnung.bodenpreis().qualifiedName().name(),
                                IFormFieldListener.VALUE_CHANGE, zeitraum.euroQm().get());
                    }
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public void createFormContent(final IFormEditorPageSite site) {
        super.createFormContent(site);

        Composite newLine, lastLine = null;
        Composite parent = pageSite.getPageBody();

        newLine = newFormField(IFormFieldLabel.NO_LABEL).setToolTipText("Objektnummer")
                .setProperty(new PropertyAdapter(wohnung.objektNummer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new NotNullMyNumberValidator(Integer.class))
                .setEnabled(wohnung.objektNummer().get() == null).setLayoutData(left().left(0).right(15).create())
                .create();

        lastLine = newLine;
        Composite gebaeudeNummer = newFormField(IFormFieldLabel.NO_LABEL).setToolTipText("Gebudenummer")
                .setProperty(new PropertyAdapter(wohnung.gebaeudeNummer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new NotNullMyNumberValidator(Integer.class))
                .setEnabled(wohnung.objektNummer().get() == null).setLayoutData(left().left(16).right(31).create())
                .create();

        final ActionButton openGebaeude = new ActionButton(parent, new Action("Gebude bearbeiten") {

            @Override
            public void run() {
                GebaeudeComposite gebaeude = GebaeudeComposite.Mixin.forKeys(wohnung.objektNummer().get(),
                        wohnung.gebaeudeNummer().get());
                if (gebaeude != null) {
                    KapsPlugin.openEditor(fs, GebaeudeComposite.NAME, gebaeude);
                }
            }
        });
        openGebaeude.setLayoutData(left().left(32).right(63).height(25).create());
        openGebaeude.setEnabled(wohnung.objektNummer().get() != null && wohnung.objektNummer().get() != null);

        lastLine = newLine;
        newLine = newFormField(IFormFieldLabel.NO_LABEL).setToolTipText("Wohnungsnummer")
                .setProperty(new PropertyAdapter(wohnung.wohnungsNummer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new NotNullMyNumberValidator(Integer.class))
                // .setEnabled( wohnung.wohnungsNummer().get() == null )
                .setLayoutData(left().left(64).right(79).create()).create();

        newFormField(IFormFieldLabel.NO_LABEL).setToolTipText("Fortfhrung")
                .setProperty(new PropertyAdapter(wohnung.wohnungsFortfuehrung()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new NotNullMyNumberValidator(Integer.class))
                .setEnabled(wohnung.wohnungsNummer().get() == null)
                .setLayoutData(left().left(80).right(95).create()).create();

        // flurstcke
        lastLine = newLine;
        TreeMap<String, FlurstueckComposite> flurstuecke = new TreeMap<String, FlurstueckComposite>();

        if (wohnung.gebaeudeNummer().get() != null) {
            // its not a new wohnung without a gebaeude
            Iterable<FlurstueckComposite> iterable = WohnungComposite.Mixin.findFlurstueckeFor(wohnung);
            for (FlurstueckComposite flurstueck : iterable) {
                flurstuecke.put(flurstueck.name().get(), flurstueck);
            }
        }
        if (wohnung.flurstueck().get() != null) {
            flurstuecke.put(wohnung.flurstueck().get().name().get(), wohnung.flurstueck().get());
        }
        newLine = newFormField("Lage")
                .setProperty(new AssociationAdapter<FlurstueckComposite>(wohnung.flurstueck()))
                .setField(new PicklistFormField(flurstuecke.descendingMap()))
                .setLayoutData(left().top(lastLine).right(RIGHT).create()).setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Eigentumsnr.").setToolTipText("Wohnungseigentumsnummer")
                .setProperty(new PropertyAdapter(wohnung.wohnungseigentumsNummer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setLayoutData(left().top(lastLine).create()).setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Eigentum").setToolTipText("Eigentum am Grundstck")
                .setProperty(new AssociationAdapter<EigentumsartComposite>(wohnung.eigentumsArt()))
                .setField(namedAssocationsPicklist(EigentumsartComposite.class))
                .setLayoutData(left().top(lastLine).create()).setParent(parent).create();
        newFormField("Anzahl Zimmer").setProperty(new PropertyAdapter(wohnung.anzahlZimmer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Double.class))
                .setLayoutData(right().right(75).top(lastLine).create()).setParent(parent).create();

        lastLine = newLine;
        newLine = createFlaecheField("Wohn-/Nutzflche", "Woh-/Nutzflche in m", wohnung.wohnflaeche(),
                left().top(lastLine), parent, true);

        lastLine = newLine;
        newLine = newFormField("Gesamtnutzungsdauer").setToolTipText("Gesamtnutzungsdauer in Jahren")
                .setProperty(new PropertyAdapter(wohnung.gesamtNutzungsDauer()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Double.class)).setLayoutData(left().top(lastLine).create())
                .setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Baujahr tatschlich").setToolTipText("Baujahr tatschlich")
                .setProperty(new PropertyAdapter(wohnung.baujahr()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Double.class)).setLayoutData(left().top(lastLine).create())
                .setParent(parent).create();
        Composite baujahrField = newFormField("Baujahr bereinigt").setToolTipText("Baujahr bereinigt")
                .setProperty(new PropertyAdapter(wohnung.bereinigtesBaujahr()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Double.class))
                .setLayoutData(right().right(75).top(lastLine).create()).setParent(parent).create();

        site.addFieldListener(
                gndbjListener = new NonFiringFieldListener(wohnung.gesamtNutzungsDauer(), wohnung.baujahr()));

        // berechnen knopf
        baujahrBerechneAction = new ActionButton(parent, new Action("Berechnen") {

            @Override
            public void run() {
                if (gndbjListener.get(wohnung.gesamtNutzungsDauer()) == null
                        || gndbjListener.get(wohnung.baujahr()) == null) {
                    MessageDialog.openError(PolymapWorkbench.getShellToParentOn(), "Fehlende Daten",
                            "Bitte geben Sie Gesamtnutzungsdauer und das tatschliche Baujahr ein, bevor Sie diese Berechnung starten.");
                }
                if (wohnung.vertrag().get() == null) {
                    MessageDialog.openError(PolymapWorkbench.getShellToParentOn(), "Fehlende Daten",
                            "Zu dieser Wohnung wurde kein Vertrag gefunden.");
                } else {
                    ErmittlungModernisierungsgradComposite ermittlung = ErmittlungModernisierungsgradComposite.Mixin
                            .forWohnung(wohnung);
                    if (ermittlung == null) {
                        ermittlung = repository.newEntity(ErmittlungModernisierungsgradComposite.class, null);
                        ermittlung.wohnung().set(wohnung);
                        ermittlung.vertrag().set(wohnung.vertrag().get());
                        ermittlung.objektNummer().set(wohnung.objektNummer().get());
                        ermittlung.gebaeudeNummer().set(wohnung.gebaeudeNummer().get());
                        ermittlung.wohnungsNummer().set(wohnung.wohnungsNummer().get());
                        ermittlung.wohnungsFortfuehrung().set(wohnung.wohnungsFortfuehrung().get());
                        ermittlung.alterObergrenzeZeile1().set(20.0d);
                        ermittlung.alterObergrenzeZeile2().set(20.0d);
                        ermittlung.alterObergrenzeZeile3().set(20.0d);
                        ermittlung.alterObergrenzeZeile4().set(20.0d);
                        ermittlung.alterObergrenzeZeile5().set(20.0d);
                        ermittlung.alterObergrenzeZeile6().set(20.0d);
                        ermittlung.alterObergrenzeZeile7().set(20.0d);
                        ermittlung.alterObergrenzeZeile8().set(20.0d);
                    }
                    // ermittlung.gesamtNutzungsDauer().set( gndbjListener.get(
                    // wohnung.gesamtNutzungsDauer() ) );
                    // ermittlung.tatsaechlichesBaujahr().set( gndbjListener.get(
                    // wohnung.baujahr() ) );
                    FormEditor targetEditor = KapsPlugin.openEditor(fs, ErmittlungModernisierungsgradComposite.NAME,
                            ermittlung);
                    EventManager.instance()
                            .publish(new InterEditorPropertyChangeEvent(formEditor, targetEditor, ermittlung,
                                    ermittlung.gesamtNutzungsDauer().qualifiedName().name(),
                                    ermittlung.gesamtNutzungsDauer().get(),
                                    gndbjListener.get(wohnung.gesamtNutzungsDauer())));
                    EventManager.instance().publish(new InterEditorPropertyChangeEvent(formEditor, targetEditor,
                            ermittlung, ermittlung.tatsaechlichesBaujahr().qualifiedName().name(),
                            ermittlung.tatsaechlichesBaujahr().get(), gndbjListener.get(wohnung.baujahr())));
                }
            }
        });
        baujahrBerechneAction.setLayoutData(right().left(baujahrField).top(lastLine).height(25).create());
        baujahrBerechneAction.setEnabled(true);

        lastLine = newLine;
        newLine = newFormField("Etage").setProperty(new AssociationAdapter<EtageComposite>(wohnung.etage()))
                .setField(namedAssocationsPicklist(EtageComposite.class))
                .setLayoutData(left().top(lastLine).create()).setParent(parent).create();
        newFormField("Bemerkung").setToolTipText("Bemerkung zur Etage")
                .setProperty(new PropertyAdapter(wohnung.etageBeschreibung())).setField(new StringFormField())
                .setLayoutData(right().top(lastLine).create()).setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Stockwerk").setToolTipText("Stockwerk entsprechend Statistischem Bundesamt")
                .setProperty(new AssociationAdapter<StockwerkStaBuComposite>(wohnung.stockwerkStaBu()))
                .setField(namedAssocationsPicklist(StockwerkStaBuComposite.class))
                .setLayoutData(left().top(lastLine).create()).setParent(parent).create();

        newLine = newFormField("Art").setToolTipText("Art entsprechend Statistischem Bundesamt")
                .setProperty(new AssociationAdapter<ImmobilienArtStaBuComposite>(wohnung.immobilienArtStaBu()))
                .setField(namedAssocationsPicklist(ImmobilienArtStaBuComposite.class))
                .setLayoutData(right().top(lastLine).create()).setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Himmelsrichtung")
                .setProperty(new AssociationAdapter<HimmelsrichtungComposite>(wohnung.himmelsrichtung()))
                .setField(namedAssocationsPicklist(HimmelsrichtungComposite.class))
                .setLayoutData(left().top(lastLine).create()).setParent(parent).create();
        newFormField("Umbau").setToolTipText("Jahr des letzen Umbaus")
                .setProperty(new PropertyAdapter(wohnung.umbau()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Integer.class)).setLayoutData(right().top(lastLine).create())
                .setParent(parent).create();

        lastLine = newLine;
        newLine = newFormField("Bemerkung").setProperty(new PropertyAdapter(wohnung.bemerkung()))
                .setField(new TextFormField()).setLayoutData(left().right(RIGHT).height(50).top(lastLine).create())
                .setParent(parent).create();

        Section section = newSection(newLine, "Ausstattung");
        Composite client = (Composite) section.getClient();

        lastLine = newLine;
        newLine = newFormField("Balkon").setToolTipText("wertrelevanter Balkon?")
                .setProperty(new PropertyAdapter(wohnung.balkon())).setField(new BooleanFormField())
                .setLayoutData(left().top(lastLine).create()).setParent(client).create();
        newFormField("Terrasse").setToolTipText("wertrelevante Terrasse?")
                .setProperty(new PropertyAdapter(wohnung.terrasse())).setField(new BooleanFormField())
                .setLayoutData(right().top(lastLine).create()).setParent(client).create();

        lastLine = newLine;
        newLine = newFormField("Punkte").setToolTipText("Bewertungspunkte der Ausstattung")
                .setProperty(new PropertyAdapter(wohnung.bewertungsPunkte()))
                .setField(new StringFormField(StringFormField.Style.ALIGN_RIGHT))
                .setValidator(new MyNumberValidator(Double.class))
                .setLayoutData(left().right(40).top(lastLine).bottom(100).create()).setParent(client).create();

        Composite schluessel = newFormField("Schlssel")
                .setProperty(new AssociationAdapter<AusstattungComposite>(wohnung.ausstattungSchluessel()))
                .setField(namedAssocationsPicklist(AusstattungComposite.class))
                .setLayoutData(right().left(newLine).right(75).top(lastLine).create()).setParent(client).create();
        site.addFieldListener(ausstattungListener = new IFormFieldListener() {

            @Override
            public void fieldChange(FormFieldEvent ev) {
                if (ev.getEventCode() == IFormFieldListener.VALUE_CHANGE
                        && ev.getFieldName().equals(wohnung.bewertungsPunkte().qualifiedName().name())) {
                    site.setFieldValue(wohnung.ausstattungSchluessel().qualifiedName().name(),
                            AusstattungComposite.Mixin.forWert((Double) ev.getNewValue()));
                }
            }
        });

        // berechnen knopf
        bewertungAction = new ActionButton(client, new Action("Ermitteln") {

            @Override
            public void run() {
                AusstattungBewertungComposite aust = AusstattungBewertungComposite.Mixin.forWohnung(wohnung);

                if (aust == null) {
                    aust = repository.newEntity(AusstattungBewertungComposite.class, null);
                    aust.wohnung().set(wohnung);
                }
                FormEditor targetEditor = KapsPlugin.openEditor(fs, AusstattungBewertungComposite.NAME, aust);
            }

        });
        bewertungAction.setLayoutData(right().left(schluessel).top(lastLine).height(25).create());
        bewertungAction.setEnabled(true);
    }
}