Java tutorial
/* * 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 sk.stefan.mvps.view.components; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.fieldgroup.FieldGroup; import com.vaadin.ui.ComboBox; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import sk.stefan.interfaces.Filterable; import sk.stefan.utils.ToolsDao; /** * Je to svojbytny objekt, tj. nieje napojeny na vonkajsie EntityServisy. * * * 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, preco nieni converter naviazany priamo na * obycejny ComboBox, je ten, ze na ten konverter navazat priamo jednoducho nejde * (resp. nie jednoduse). V totmo pripade se tedy vyuziva pomocnej TextField, na ktory * converter naviazat jde. * * @author stefan * @param <E> tda, pedstavitel kter, se maj v comboBoxu zobrazit. */ public final class InputClassComboBox<E> extends ComboBox implements Filterable { private static final long serialVersionUID = 1234324324L; private static final Logger log = Logger.getLogger(InputClassComboBox.class); /** * Nzev comboBoxu, je zhodn s nzvem promnn(property), kter je typu E. */ private final String fn; /** * FieldGoup je nstroj na svzan vaadinovsk komponenty a njakho jinho * objekty, kter dan entit poskytuje informace k zobrazen. */ private final FieldGroup fg; private final Map<String, Integer> mapAll; private final Class<E> clsE; private Map<String, Integer> map; //0. /** * * Konstruktor * * @param fg fieldGtoup * @param fn Field name * @param cls Slovnk reprezentativn jmno/entita */ public InputClassComboBox(FieldGroup fg, String fn, Class<E> cls) { super(fn); this.fn = fn; this.fg = fg; this.clsE = cls; this.mapAll = ToolsDao.findAllByClass(clsE); this.map = mapAll; this.involveFg(); this.initCombo(); this.initComboValues(map, getInitVal()); } //1. /** * Zaplete FieldGroup do struktury: * */ @SuppressWarnings({ "unchecked", "unchecked" }) private void involveFg() { //fn - fieldname is name of property in Item. //it corresponds with the name of property of relevant entity this.fg.bind(this, fn); fg.setBuffered(false); } // 2. /** * Inicializuje combo box. * */ public void initCombo() { this.setImmediate(true); this.setNewItemsAllowed(false); this.setNullSelectionAllowed(false); this.setVisible(true); } // 5. /** * Slouzi na nastaveni hodnoty v comboBoxe pri zobrazeni formule tj pokud * ji jsou hodnoty znmy, nastav je jako vchoz hodnoty. */ private Integer getInitVal() { //pociatocna hodnota: Integer val = 1;//null - prednastavenie hodnoty. if (fg.getItemDataSource() != null) { Item item = fg.getItemDataSource(); Property<?> prop = item.getItemProperty(fn); if (prop.getValue() != null) { val = (Integer) prop.getValue(); } else { //do nothing; } } return val; } //6. /** * Inicializuje hodnoty v comboboxe: */ private void initComboValues(Map<String, Integer> mapa, Integer val) { this.removeAllItems(); if (mapa != null) { for (String key : mapa.keySet()) { this.addItem(mapa.get(key)); this.setItemCaption(mapa.get(key), key); } if (mapa.values() != null && mapa.values().contains(val)) { this.setValue(val); } } else { // this.setValue(x); //pokial je to not null, tak vloz inicializacnu hodnotu } } // 5. /** * Slouzi na novyh hodnot ve vyberu. * * @param newIds */ private void setNewValues(List<Integer> newIds) { //pre uchovanie tej istej entity Integer val = (Integer) this.getValue(); if (val == null) { //val = 1; nastavit hodnotu pre not null polozky, neskvor komplexne vyriesit. } if (newIds != null) { Map<String, Integer> newMap = new HashMap<>(); //tvorba novej mapy. for (Map.Entry<String, Integer> e : mapAll.entrySet()) { if (newIds.contains(e.getValue())) { newMap.put(e.getKey(), e.getValue()); } } this.map = newMap; } else { this.map = mapAll; } //zatial staci takto, keby dany combobox bol spolocny pre rozne filtre, //museli by sa vytvorit separatne mapy, ktore by sa aplikovali a deaplikovali. //napr. skrz map collector: tj. tiedu ktorej instancia by patrila //do danej skupiny(podla retazca zavislosti) a na ktoru by mali odkaz comboboxy dotknute. this.initComboValues(map, val); } /** * pomocna funkcia. * * @return */ public String getTableName() { return ToolsDao.getTableName(clsE); } @Override public void applyFilter(List<Integer> ids) { this.setNewValues(ids); } }