Java tutorial
/** * Copyright 2013 Universidad Icesi * * This file is part of ACADEM. * * ACADEM is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ACADEM 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ACADEM. If not, see <http://www.gnu.org/licenses/>. **/ package co.edu.icesi.academ.client.perfiles.propietario; import java.util.ArrayList; import java.util.List; import co.edu.icesi.academ.bo.EvaluacionBO; import co.edu.icesi.academ.bo.FactorDeImpactoBO; import co.edu.icesi.academ.bo.RolBO; import co.edu.icesi.academ.bo.TemaBO; import com.vaadin.annotations.AutoGenerated; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.AbsoluteLayout; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Table; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.Table.Align; import com.vaadin.ui.TextField; public class FactoresDeImpacto extends CustomComponent { /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ /** * */ private static final long serialVersionUID = 1L; @AutoGenerated private AbsoluteLayout mainLayout; @AutoGenerated private Button button_guardar; @AutoGenerated private Button button_cargar; @AutoGenerated private Table table_1; // Contiene los roles desplegados en pantalla private List<RolBO> rolesActuales; // Contiene los temas desplegados en pantalla private List<TemaBO> temasActuales; // Contiene el id de la evaluacion actual private int idEvaluacion; /** * The constructor should first build the main layout, set the composition * root and then do any custom initialization. * * The constructor will not be automatically regenerated by the visual * editor. */ public FactoresDeImpacto() { buildMainLayout(); setCompositionRoot(mainLayout); // TODO add user code here } public void cargarRoles(final List<RolBO> roles, List<TemaBO> temas, List<FactorDeImpactoBO> factoresDeImpacto, EvaluacionBO evaluacionBO) { initTable(); // Guarda los roles obtenidos en la consulta rolesActuales = roles; // Guarda los temas obtenidos en la consulta temasActuales = temas; // Guarda el identificador de la evaluacion actual idEvaluacion = evaluacionBO.getId(); int columns = 0; // Adiciona una columna por cada rol for (RolBO rolBO : roles) { table_1.addContainerProperty(rolBO.getNombre(), TextField.class, null); table_1.setColumnAlignment(rolBO.getNombre(), Align.CENTER); columns++; } // Agrega la columna TOTAL table_1.addContainerProperty("Total", Label.class, null); table_1.setColumnAlignment("Total", Align.CENTER); // Recorre todos los temas y por cada uno, adiciona los respectivos // valores a cada columna for (TemaBO temaBO : temas) { ArrayList<Object> item = new ArrayList<>(); item.add(temaBO.getId()); item.add(temaBO.getNombre()); int total = 0; for (int i = 0; i < columns; i++) { final TextField tf = new TextField(); // Carga el valor del factor de impacto FactorDeImpactoBO factor = new FactorDeImpactoBO(); factor.setEvaluacion(evaluacionBO.getId()); factor.setRol(roles.get(i).getNombre()); factor.setTema(temaBO.getId()); int index = getFactorDeImpactoIndex(factoresDeImpacto, factor); if (index != -1) { tf.setValue("" + (int) factoresDeImpacto.get(index).getFactorDeImpacto()); total += factoresDeImpacto.get(index).getFactorDeImpacto(); } tf.setColumns(3); tf.setData(temaBO); tf.setId(temaBO.getId() + "-" + i); // Adiciona listener para recalcular el total de la fila cada // vez que se cambie un factor de impacto tf.addTextChangeListener(new TextChangeListener() { private static final long serialVersionUID = 1L; @Override public void textChange(TextChangeEvent event) { // TODO Auto-generated method stub TemaBO tema = (TemaBO) tf.getData(); int tfId = Integer.parseInt(tf.getId().split("-")[1]); int total = 0; // Obtiene el valor de todos los factores de impacto de // la fila y los suma for (int j = 0; j < roles.size(); j++) { try { if (j != tfId) total += Integer.parseInt(table_1.getItem(tema) .getItemProperty(roles.get(j).getNombre()).getValue().toString()); else total += Integer.parseInt(event.getText()); } catch (Exception e) { total += 0; } } Label l = getLabelColor(total); table_1.getItem(tema).getItemProperty("Total").setValue(l); } }); item.add(tf); } item.add(getLabelColor(total)); table_1.addItem(item.toArray(), temaBO); } } public List<FactorDeImpactoBO> guardarFactoresDeImpacto() throws Exception { List<FactorDeImpactoBO> factoresDeImpacto = new ArrayList<>(); int factorDeImpacto = 0; for (TemaBO temaBO : temasActuales) { for (int j = 0; j < rolesActuales.size(); j++) { try { factorDeImpacto = Integer.parseInt(table_1.getItem(temaBO) .getItemProperty(rolesActuales.get(j).getNombre()).getValue().toString()); FactorDeImpactoBO nuevoFactor = new FactorDeImpactoBO(); nuevoFactor.setEvaluacion(idEvaluacion); nuevoFactor.setFactorDeImpacto(factorDeImpacto); nuevoFactor.setRol(rolesActuales.get(j).getNombre()); nuevoFactor.setTema(temaBO.getId()); factoresDeImpacto.add(nuevoFactor); } catch (Exception e) { FactorDeImpactoBO nuevoFactor = new FactorDeImpactoBO(); nuevoFactor.setEvaluacion(idEvaluacion); nuevoFactor.setFactorDeImpacto(0); nuevoFactor.setRol(rolesActuales.get(j).getNombre()); nuevoFactor.setTema(temaBO.getId()); factoresDeImpacto.add(nuevoFactor); } } } return factoresDeImpacto; } private Label getLabelColor(int total) { Label l; if (total != 100) { l = new Label("<font color=\"red\">" + total + "% </font>", ContentMode.HTML); } else l = new Label("<font color=\"green\">" + total + "% </font>", ContentMode.HTML); return l; } private int getFactorDeImpactoIndex(List<FactorDeImpactoBO> factoresDeImpacto, FactorDeImpactoBO factor) { int index = -1; boolean go = true; for (int i = 0; i < factoresDeImpacto.size() && go; i++) { if (factoresDeImpacto.get(i).equals(factor)) { index = i; go = false; } } return index; } @AutoGenerated private AbsoluteLayout buildMainLayout() { // common part: create layout mainLayout = new AbsoluteLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("100%"); mainLayout.setHeight("100%"); // top-level component properties setWidth("100.0%"); setHeight("100.0%"); // table_1 initTable(); // button_cargar button_cargar = new Button(); button_cargar.setCaption("Cargar Factores"); button_cargar.setImmediate(false); button_cargar.setWidth("-1px"); button_cargar.setHeight("-1px"); button_cargar.addClickListener(new ClickListener() { /** * */ private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { // TODO Auto-generated method stub ControladorPropietario.getInstance().cargarFactoresImpacto(); } }); mainLayout.addComponent(button_cargar, "top:20.0px;left:10.0px;"); // button_guardar button_guardar = new Button(); button_guardar.setCaption("Guardar Factores"); button_guardar.setImmediate(false); button_guardar.setWidth("-1px"); button_guardar.setHeight("-1px"); button_guardar.addClickListener(new ClickListener() { /** * */ private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { try { List<FactorDeImpactoBO> factoresDeImpacto = guardarFactoresDeImpacto(); ControladorPropietario.getInstance().guardarFactoresDeImpacto(factoresDeImpacto); } catch (Exception e) { Notification.show("Error", "Debe cargar primero los factores de impacto", Type.TRAY_NOTIFICATION); } } }); mainLayout.addComponent(button_guardar, "top:20.0px;left:150.0px;"); return mainLayout; } private void initTable() { table_1 = new Table(); table_1.setImmediate(false); table_1.setWidth("100.0%"); table_1.setHeight("100.0%"); mainLayout.addComponent(table_1, "top:60.0px;right:10.0px;bottom:10.0px;left:10.0px;"); table_1.addContainerProperty("Numeral", String.class, null); table_1.addContainerProperty("Tema", String.class, null); table_1.setSelectable(false); table_1.setImmediate(true); } }