cz.iivos.todo.components.InputComboBox.java Source code

Java tutorial

Introduction

Here is the source code for cz.iivos.todo.components.InputComboBox.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.iivos.todo.components;

import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.fieldgroup.FieldGroup;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.TextField;

import cz.iivos.todo.converter.AnyEntityConverter;
import java.util.Locale;
import java.util.Map;

import org.apache.log4j.Logger;

/**
 * Combobox, ktory ma schopnost transformovat presentation type (tj. String - to
 * co v comboboxu vidime na type, ktery reprezentuje, napr. Boolean, ale muze
 * byt i komplikovanejsi entita) Duvod, proc neni converter navazany primo na
 * obycejny COmboBox, je ten, ze na ten nejde konverter navazat primo (resp. ne
 * jednoduse). V totmo pripade se tedy vyuziva pomocnej TextField, na ktery
 * converter navazat jde.
 *
 * @author stefan
 * @param <E> tda, pedstavitel kter, se maj v comboBoxu zobrazit.
 */
public final class InputComboBox<E> extends ComboBox {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    /**
     * Konvertor mezi reprezentativnm zobrazenm dan entity v comboBoxu (String)
     * a danou entitou samotnou (E)
     */
    private Converter<String, E> converter;

    /**
     * Class tdy E 
     */
    private final Class<?> clsE;

    /**
     * Aktuln vybran objekt ze SQLcontaineru
     */
    private Item item;
    private Property<?> prop;

    //dal pomocn promnn:
    private final Logger logger = Logger.getLogger(InputComboBox.class.getName());

    /**
     * Pomocn komponenta TextField, kter, jak bylo vysvtleno v hlavi?ce 
     * slou na aplikaci konverteru. Nebude viditeln.
     */
    private final TextField tf;

    /**
     * Nzev comboBoxu, je zhodn s nzvem promnn(property), kter je typu E.
     */
    private final String fn; // field name

    /**
     * FieldGoup je nstroj na svzan vaadinovsk komponenty a njakho jinho 
     * objekty, kter dan entit poskytuje informace k zobrazen.
     */
    private final FieldGroup fg;

    /**
     * Nzev typu E, (nap java.util.Date).
     */
    private String propertyETypeName;

    /**
     * Slovnk, ve kterm je kl?em reprezentativn nzev entity a hodnotou 
     * tato entita sama.
     */
    private final Map<String, E> map;

    //0.
    /**
     *
     * Konstruktor
     *
     * @param fg fieldGtoup
     * @param fn Field name 
     * @param map Slovnk reprezentativn jmno/entita
     * @param clsE Class dan entity.
     */
    public InputComboBox(FieldGroup fg, String fn, Map<String, E> map, Class<?> clsE) {
        super(fn);
        this.fn = fn;

        this.map = map;

        this.clsE = clsE;
        this.tf = new TextField();
        this.fg = fg;
        this.involveFg();
        try {
            propertyETypeName = clsE.getCanonicalName();
            this.initConverter();
            this.initListener();
            this.initCombo();
        } catch (SecurityException e) {
            logger.warn(e.getLocalizedMessage(), e);
        }

    }

    //1.
    /**
     * Zaplete FieldGroup do struktury:
     *
     */
    private void involveFg() {
        this.fg.bind(tf, fn);
        this.setValue(tf.getValue());
    }

    // 2.
    /**
     * Inicializuje combo box.
     *
     */
    public void initCombo() {

        if (map != null) {
            for (String key : map.keySet()) {
                this.addItem(map.get(key));
                this.setItemCaption(map.get(key), key);
            }
        }

        this.initComboVal();
        this.setImmediate(true);
        this.setNewItemsAllowed(false);
        this.setNullSelectionAllowed(false);
        this.setVisible(true);
    }

    // 3.
    /**
     * Inicializace konvertoru pro pomocny TextField
     *
     */
    public void initConverter() {

        converter = new AnyEntityConverter<>(map, clsE);

        switch (propertyETypeName) {
        case "java.lang.String":
            //pozn. tenhle case je tady jen kvuli rychlosti, jinak staci na vsecno default.
        default:
            tf.setConverter(converter);
            break;

        }
    }

    // 4.
    /**
     * Inicializuje value change listener ComboBoxu
     *
     */
    @SuppressWarnings("serial")
    public void initListener() {
        this.addValueChangeListener(new ValueChangeListener() {

            /**
             *
             */
            private static final long serialVersionUID = -8428549162334253900L;

            @Override
            public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
                @SuppressWarnings("unchecked")
                E val = (E) event.getProperty().getValue();

                if (val != null) {
                    switch (propertyETypeName) {

                    case "java.lang.String":
                        //pozn. tenhle case je tady jen kvuli rychlosti, jinak staci na vsecno default.
                        tf.setValue(val.toString());
                        break;
                    default:
                        String s;
                        s = (String) converter.convertToPresentation(val, String.class, Locale.ENGLISH);
                        tf.setValue(s);
                        break;
                    }
                }
            }

        });
    }

    // 5.
    /**
     * Slouzi na nastaveni hodnoty v comboBoxe pri zobrazeni formule
     * tj pokud ji jsou hodnoty znmy, nastav je jako vchoz hodnoty.
     */
    private void initComboVal() {

        if (fg.getItemDataSource() != null) {
            item = fg.getItemDataSource();
            prop = item.getItemProperty(fn);
            if (prop.getValue() != null) {
                this.setValue(prop.getValue());
            } else {
                //do nothing;
            }
        }
    }

}