tad.grupo7.ccamistadeslargas.EventosLayout.java Source code

Java tutorial

Introduction

Here is the source code for tad.grupo7.ccamistadeslargas.EventosLayout.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 tad.grupo7.ccamistadeslargas;

import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.event.ShortcutAction;
import com.vaadin.server.Page;
import com.vaadin.server.Sizeable;
import static com.vaadin.server.Sizeable.UNITS_PERCENTAGE;
import com.vaadin.shared.Position;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
import java.util.List;
import java.util.ArrayList;
import tad.grupo7.ccamistadeslargas.DAO.EventoDAO;
import tad.grupo7.ccamistadeslargas.DAO.GastoDAO;
import tad.grupo7.ccamistadeslargas.DAO.ParticipanteDAO;
import tad.grupo7.ccamistadeslargas.modelo.Evento;
import tad.grupo7.ccamistadeslargas.modelo.Gasto;
import tad.grupo7.ccamistadeslargas.modelo.Participante;
import tad.grupo7.ccamistadeslargas.modelo.ResumenPagoPorPersona;
import tad.grupo7.ccamistadeslargas.modelo.ResumenPlusvalia;
import tad.grupo7.ccamistadeslargas.modelo.Usuario;

/**
 *
 * @author cayetano
 */
class EventosLayout extends HorizontalSplitPanel {

    private final Usuario usuario;

    public EventosLayout() {
        usuario = (Usuario) Session.getAttribute("usuario");
        mostrarEventos();
    }

    /**
     * Muestra una tabla con todos los eventos y un botn para aadir ms.
     */
    private void mostrarEventos() {
        removeAllComponents();
        //BOTN PARA AADIR OTRO EVENTO
        Button addEventoBoton = new Button("Aadir Evento");
        addEventoBoton.addClickListener(clickEvent -> {
            mostrarFormularioAddEvento();
        });
        //TABLA DE LOS EVENTOS
        Table table = getTablaEventos();
        //AADIMOS LOS COMPONENTES
        VerticalLayout col1 = new VerticalLayout(addEventoBoton, table);
        col1.setMargin(true);
        setFirstComponent(col1);
    }

    /**
     * Se muestra el evento en el vertical layout derecho del splitpanel.
     *
     * @param e Recoge el evento que se quiere mostrar.
     */
    private void mostrarEvento(Evento e) {
        removeAllComponents();
        //T?TULO
        CssLayout labels = new CssLayout();
        labels.addStyleName("labels");
        Label l = new Label("Evento " + e.getNombre());
        l.setSizeUndefined();
        l.addStyleName(ValoTheme.LABEL_H2);
        l.addStyleName(ValoTheme.LABEL_COLORED);
        //FORMULARIO POR SI SE QUIERE EDITAR EL EVENTO
        TextField nombre = new TextField("Nombre");
        nombre.setValue(e.getNombre());
        nombre.setRequired(true);
        ComboBox divisa = new ComboBox("Divisa");
        divisa.setNullSelectionAllowed(false);
        divisa.setRequired(true);
        divisa.addItem("");
        divisa.addItem("$");

        HorizontalLayout layouth = new HorizontalLayout();
        HorizontalLayout layouth2 = new HorizontalLayout();
        layouth.setSpacing(true);
        layouth2.setSpacing(true);

        final Button actualizar = new Button("Actualizar Evento");
        final Button eliminar = new Button("Eliminar Evento");
        final Button addPago = new Button("Aadir Pago");
        final Button addParticipante = new Button("Aadir Participante");
        layouth.addComponents(actualizar, eliminar);
        layouth2.addComponents(addPago, addParticipante);
        final Button hacerCuentas = new Button("Hacer las cuentas");
        //BOTN PARA ACTUALIZAR EL EVENTO
        actualizar.addClickListener(clickEvent -> {
            try {
                nombre.validate();
                divisa.validate();
                if (EventoDAO.readDBObject(nombre.getValue(), usuario.getId()) == null) {
                    EventoDAO.update(e.getId(), nombre.getValue(), divisa.getValue().toString());
                    Notification n = new Notification("Evento actualizado",
                            Notification.Type.ASSISTIVE_NOTIFICATION);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                    mostrarEventos();
                } else {
                    Notification n = new Notification("Ya existe un evento con ese nombre",
                            Notification.Type.WARNING_MESSAGE);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                }
            } catch (Validator.InvalidValueException ex) {
                Notification n = new Notification("Error con los campos", Notification.Type.WARNING_MESSAGE);
                n.setPosition(Position.TOP_CENTER);
                n.show(Page.getCurrent());
            }

        });
        //BOTN PARA QUE SALGA UNA VENTANA EMERGENTE PARA AADIR UN GASTO AL EVENTO
        addPago.addClickListener(clickEvent -> {
            mostrarFormularioAddGasto(e);
        });
        //BOTN PARA ELIMINAR EL EVENTO
        eliminar.addClickListener(clickEvent -> {
            EventoDAO.delete(e.getId());
            removeAllComponents();
            mostrarEventos();
        });
        //BOTN PARA AADIR PARTICIPANTES
        addParticipante.addClickListener(clickEvent -> {
            mostrarFormularioAddParticipante(e);
        });
        //BOTN PARA HACER LAS CUENTAS
        hacerCuentas.addClickListener(clickEvent -> {
            removeAllComponents();
            VerticalLayout vl = new VerticalLayout();
            Table tablaResumenPlusvalia = getTablaResumenPlusvalia(e);
            HorizontalLayout hl1 = new HorizontalLayout(tablaResumenPlusvalia);
            hl1.setMargin(true);
            hl1.setSpacing(true);
            vl.addComponent(hl1);
            for (Participante p : ParticipanteDAO.readAllFromEvento(e.getId())) {
                HorizontalLayout hl = new HorizontalLayout(getTablaResumenGastosPorPersona(e, p));
                hl.setMargin(true);
                hl.setSpacing(true);
                vl.addComponent(hl);
            }
            setSplitPosition(100, Sizeable.UNITS_PERCENTAGE);
            setFirstComponent(vl);
        });
        //TABLA CON TODOS LOS GASTOS DEL EVENTO
        Table tablaGastos = getTablaGastos(e);
        //TABLA CON TODOS LOS PARTICIPANTES DEL EVENTO
        Table tablaParticipantes = getTablaParticipantes(e);
        //AADIMOS LOS COMPONENTES
        FormLayout form = new FormLayout(nombre, divisa, layouth, layouth2, hacerCuentas);
        VerticalLayout vl = new VerticalLayout(l, form, tablaGastos, tablaParticipantes);
        vl.setMargin(true);
        setFirstComponent(vl);
    }

    /**
     * Se muestra un gasto para poder actualizarlo o eliminarlo.
     *
     * @param e Recoge el evento al que pertenece el gasto.
     */
    private void mostrarGasto(Gasto g, Evento e) {
        //T?TULO
        CssLayout labels = new CssLayout();
        labels.addStyleName("labels");
        Label l = new Label("Gasto " + g.getNombre());
        l.setSizeUndefined();
        l.addStyleName(ValoTheme.LABEL_H2);
        l.addStyleName(ValoTheme.LABEL_COLORED);
        //FORMULARIO POR SI SE QUIERE EDITAR EL GASTO
        TextField nombre = new TextField("Titulo");
        nombre.setValue(g.getNombre());
        nombre.setRequired(true);
        TextField precio = new TextField("Precio");
        precio.setValue(g.getPrecio().toString());
        precio.setRequired(true);
        final Button actualizar = new Button("Actualizar Gasto");
        final Button eliminar = new Button("Eliminar Gasto");
        //BOTN PARA ACTUALIZAR EL GASTO
        actualizar.addClickListener(clickEvent -> {
            try {
                nombre.validate();
                precio.validate();
                GastoDAO.update(g.getId(), nombre.getValue(), Double.valueOf(precio.getValue()), g.getIdEvento(),
                        g.getIdPagador(), g.getDeudores());
                Notification n = new Notification("Gasto actualizado", Notification.Type.ASSISTIVE_NOTIFICATION);
                n.setPosition(Position.TOP_CENTER);
                n.show(Page.getCurrent());
                setSecondComponent(null);
                mostrarEvento(e);
            } catch (Validator.InvalidValueException ex) {
                Notification n = new Notification("Error con los campos", Notification.Type.WARNING_MESSAGE);
                n.setPosition(Position.TOP_CENTER);
                n.show(Page.getCurrent());
            }
        });
        //BOTN PARA ELIMINAR EL GASTO
        eliminar.addClickListener(clickEvent -> {
            GastoDAO.delete(g.getId());
            removeAllComponents();
            mostrarEvento(e);
        });
        //AADIMOS LOS COMPONENTES
        FormLayout form = new FormLayout(nombre, precio, actualizar, eliminar);
        VerticalLayout vl = new VerticalLayout(l, form);
        vl.setMargin(true);
        setSecondComponent(vl);
    }

    /**
     * Se muestra el formulario de aadir un nuevo evento.
     */
    private void mostrarFormularioAddEvento() {
        //T?TULO
        CssLayout labels = new CssLayout();
        labels.addStyleName("labels");
        Label l = new Label("Aadir Evento");
        l.setSizeUndefined();
        l.addStyleName(ValoTheme.LABEL_H2);
        l.addStyleName(ValoTheme.LABEL_COLORED);
        //FORMULARIO
        TextField nombre = new TextField("Nombre");
        nombre.setRequired(true);
        ComboBox divisa = new ComboBox("Divisa");
        divisa.setRequired(true);
        divisa.addItem("");
        divisa.addItem("$");
        final Button add = new Button("Crear evento");
        add.addStyleName(ValoTheme.BUTTON_PRIMARY);
        add.setClickShortcut(ShortcutAction.KeyCode.ENTER);
        FormLayout form = new FormLayout(nombre, divisa, add);
        //BOTN PARA AADIR EVENTO
        add.addClickListener(clickEvent -> {
            try {
                nombre.validate();
                divisa.validate();
                if (EventoDAO.readDBObject(nombre.getValue(), usuario.getId()) == null) {
                    EventoDAO.create(nombre.getValue(), divisa.getValue().toString(), usuario);
                    mostrarEventos();
                } else {
                    Notification n = new Notification("Ya existe un evento con ese nombre",
                            Notification.Type.WARNING_MESSAGE);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                }

            } catch (Validator.InvalidValueException ex) {
                Notification n = new Notification("Error con los campos", Notification.Type.WARNING_MESSAGE);
                n.setPosition(Position.TOP_CENTER);
                n.show(Page.getCurrent());
            }
        });
        //AADIMOS COMPONENTES
        form.setMargin(true);
        setSecondComponent(form);
    }

    /**
     * Se muestra el formulario para aadir un participante al evento.
     *
     * @param e Recoge el evento.
     */
    private void mostrarFormularioAddParticipante(Evento e) {
        //T?TULO
        CssLayout labels = new CssLayout();
        labels.addStyleName("labels");
        Label l = new Label("Aadir Participante");
        l.setSizeUndefined();
        l.addStyleName(ValoTheme.LABEL_H2);
        l.addStyleName(ValoTheme.LABEL_COLORED);
        //FORMULARIO
        List<Participante> participantes = ParticipanteDAO.readAllFromUsuario(usuario.getId());
        ComboBox nuevoParticipante = new ComboBox("Participante Nuevo");
        nuevoParticipante.setRequired(true);
        for (Participante p : participantes) {
            nuevoParticipante.addItem(p.getNombre());
        }
        final Button add = new Button("Aadir participante");
        add.addStyleName(ValoTheme.BUTTON_PRIMARY);
        add.setClickShortcut(ShortcutAction.KeyCode.ENTER);
        add.addClickListener(clickEvent -> {
            try {
                nuevoParticipante.validate();
                Participante p = ParticipanteDAO.read(nuevoParticipante.getValue().toString(), usuario.getId());
                if (!EventoDAO.esParticipante(e, p)) {
                    EventoDAO.addParticipante(e.getId(), p.getId());
                    Notification n = new Notification("Participante aadido",
                            Notification.Type.ASSISTIVE_NOTIFICATION);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                    setSecondComponent(null);
                    mostrarEvento(e);
                } else {
                    Notification n = new Notification("El participante ya se encuentra en el evento",
                            Notification.Type.WARNING_MESSAGE);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                }

            } catch (Validator.InvalidValueException ex) {
                Notification n = new Notification("Error con los campos", Notification.Type.WARNING_MESSAGE);
                n.setPosition(Position.TOP_CENTER);
                n.show(Page.getCurrent());
            }
        });
        FormLayout form = new FormLayout(l, nuevoParticipante, add);
        form.setMargin(true);
        setSecondComponent(form);
    }

    /**
     * Muestra el formulario para aadir un gasto al evento.
     *
     * @param e Evento al que aadir el gasto.
     */
    private void mostrarFormularioAddGasto(Evento e) {
        //T?TULO
        CssLayout labels = new CssLayout();
        labels.addStyleName("labels");
        Label l = new Label("Aadir Gasto");
        l.setSizeUndefined();
        l.addStyleName(ValoTheme.LABEL_H2);
        l.addStyleName(ValoTheme.LABEL_COLORED);
        //FORMULARIO
        TextField titulo = new TextField("Ttulo");
        titulo.setRequired(true);
        TextField precio = new TextField("Precio");
        precio.setRequired(true);
        List<Participante> participantes = ParticipanteDAO.readAllFromEvento(e.getId());
        ComboBox pagador = new ComboBox("Pagador");
        List<Participante> deudores = new ArrayList<>();
        Label d = new Label("Deudores");
        FormLayout form = new FormLayout(l, titulo, precio, pagador, d);
        for (Participante p : participantes) {
            pagador.addItem(p.getNombre());
            CheckBox c = new CheckBox(p.getNombre());
            c.addValueChangeListener(evento -> {
                deudores.add(p);
            });
            form.addComponent(c);
        }
        final Button add = new Button("Aadir Gasto");
        add.addStyleName(ValoTheme.BUTTON_PRIMARY);
        add.setClickShortcut(ShortcutAction.KeyCode.ENTER);
        //SI SE CLICA EN AADIR PAGO SE CREA EL PAGO A LA VEZ QUE SE CIERRA LA VENTANA
        add.addClickListener(new Button.ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent event) {
                try {
                    titulo.validate();
                    precio.validate();
                    pagador.validate();
                    GastoDAO.create(titulo.getValue(), Double.valueOf(precio.getValue()), e.getId(),
                            ParticipanteDAO.read(pagador.getValue().toString(), usuario.getId()).getId(), deudores);
                    mostrarEvento(e);
                } catch (Validator.InvalidValueException ex) {
                    Notification n = new Notification("Rellena todos los campos",
                            Notification.Type.WARNING_MESSAGE);
                    n.setPosition(Position.TOP_CENTER);
                    n.show(Page.getCurrent());
                }
            }
        });
        //AADIMOS LOS COMPONENTES
        form.addComponent(add);
        setSecondComponent(form);
    }

    /**
     * Obtiene la tabla de los eventos creados por el usuario.
     *
     * @return Table
     */
    private Table getTablaEventos() {
        List<Evento> eventos = EventoDAO.readAll(usuario.getId());
        Table table = new Table("");
        table.addContainerProperty("Nombre", String.class, null);
        table.addContainerProperty("Divisa", String.class, null);
        for (Evento e : eventos) {
            table.addItem(e.getArray(), null);
        }
        table.setPageLength(table.size());
        table.setWidth(100, UNITS_PERCENTAGE);
        table.setSelectable(true);
        table.setImmediate(true);
        //SI CLICAMOS EN UN EVENTO DE LA TABLA SE MUESTRA
        table.addValueChangeListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(Property.ValueChangeEvent event) {
                try {
                    Evento e = eventos.get(((int) table.getValue()) - 1);
                    mostrarEvento(e);
                } catch (Exception e) {
                }
            }
        });
        return table;
    }

    /**
     * Obtiene la tabla de los gastos de un evento.
     *
     * @param e Evento
     * @return Table
     */
    private Table getTablaGastos(Evento e) {
        List<Gasto> gastos = GastoDAO.readAll(e.getId());
        Table table = new Table("Gastos");
        table.addContainerProperty("Nombre", String.class, null);
        table.addContainerProperty("Precio", Double.class, null);
        table.addContainerProperty("Pagador", String.class, null);
        table.addContainerProperty("Deudores", String.class, null);
        for (Gasto g : gastos) {
            table.addItem(g.getArray(), null);
        }
        table.setPageLength(table.size());
        table.setWidth(100, UNITS_PERCENTAGE);
        table.setSelectable(true);
        table.setImmediate(true);
        //SI CLICAMOS EN UN GASTO DE LA TABLA SE MUESTRA
        table.addValueChangeListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(Property.ValueChangeEvent event) {
                try {
                    Gasto g = gastos.get(((int) table.getValue()) - 1);
                    mostrarGasto(g, e);
                } catch (Exception e) {
                }
            }
        });
        return table;
    }

    /**
     * Obtiene la tabla de los participantes de un evento.
     *
     * @param e Evento
     * @return Table
     */
    private Table getTablaParticipantes(Evento e) {
        List<Participante> participantes = ParticipanteDAO.readAllFromEvento(e.getId());
        Table table = new Table("Participantes");
        table.addContainerProperty("Nombre", String.class, null);
        for (Participante p : participantes) {
            table.addItem(p.getArray(), null);
        }
        table.setPageLength(table.size());
        table.setWidth(100, UNITS_PERCENTAGE);
        return table;
    }

    /**
     * Obtiene la tabla resumen del reajuste de cuentas tras terminar el evento.
     *
     * @param e Evento
     * @return Table
     */
    private Table getTablaResumenPlusvalia(Evento e) {
        List<ResumenPlusvalia> resumenPlusvalia = EventoDAO.getResumenPlusvalia(e);
        Table table = new Table("Resumen Cuentas");
        table.addContainerProperty("Nombre", String.class, null);
        table.addContainerProperty("debePoner", String.class, null);
        table.addContainerProperty("debeRecibir", String.class, null);
        table.addContainerProperty("Gastos pagados", Integer.class, null);
        table.addContainerProperty("Gastos", Integer.class, null);
        for (ResumenPlusvalia p : resumenPlusvalia) {
            table.addItem(p.getArray(), null);
        }
        table.setPageLength(table.size());
        table.setWidth(100, UNITS_PERCENTAGE);
        return table;
    }

    /**
     * Obtiene la tabla resumen de los pagos de cada persona.
     *
     * @param e Evento
     * @param p Participante
     * @return Table
     */
    private Table getTablaResumenGastosPorPersona(Evento e, Participante p) {
        List<ResumenPagoPorPersona> resumenGastosPorPersona = EventoDAO.getResumenGastosPorPersona(e, p);
        Table table = new Table("Resumen Gastos: " + p.getNombre());
        table.addContainerProperty("Ha pagado", String.class, null);
        table.addContainerProperty("Ha gastado", String.class, null);
        for (ResumenPagoPorPersona rppp : resumenGastosPorPersona) {
            table.addItem(rppp.getArray(), null);
        }
        table.setPageLength(table.size());
        table.setWidth(100, UNITS_PERCENTAGE);
        table.setColumnWidth("Ha pagado", 500);
        table.setColumnWidth("Ha gastado", 500);
        return table;
    }

    //---------------------------------------------------------------------------------------------------------
    /*
    private void mostrarFormularioAddGasto(Evento e) {
    //SE CREA LA VENTANA EMERGENTE
    final Window subWindow = new Window("Aadir Pago");
    VerticalLayout subContent = new VerticalLayout();
    subContent.setMargin(true);
    subWindow.setContent(subContent);
    FormLayout form = new FormLayout(titulo, precio, pagador);
        
    //SI SE CLICA EN AADIR PAGO SE CREA EL PAGO A LA VEZ QUE SE CIERRA LA VENTANA
    add.addClickListener(new Button.ClickListener() {
        @Override
        public void buttonClick(Button.ClickEvent event) {
                subWindow.close(); // Close the sub-window
                mostrarEvento(e);
                
    //AADIMOS LOS COMPONENTES
    form.addComponent(add);
    subContent.addComponent(form);
    subWindow.center();
    UI.getCurrent().addWindow(subWindow);
    }
        
     */
}