cimav.client.view.catalogos.departamentos.DeptosEditorUi.java Source code

Java tutorial

Introduction

Here is the source code for cimav.client.view.catalogos.departamentos.DeptosEditorUi.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 cimav.client.view.catalogos.departamentos;

import cimav.client.view.common.EMethod;
import cimav.client.view.common.ETypeResult;
import cimav.client.view.common.MethodEvent;
import cimav.client.data.domain.Departamento;
import cimav.client.data.domain.EmpleadoBase;
import cimav.client.view.catalogos.empleados.ICellListResources;
import cimav.client.view.common.EmpleadoListCell;
import cimav.client.view.provider.DeptosProvider;
import cimav.client.view.provider.EmpleadosBaseProvider;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.Label;
import org.gwtbootstrap3.client.ui.TabListItem;
import org.gwtbootstrap3.client.ui.TextBox;
import org.gwtbootstrap3.extras.growl.client.ui.Growl;
import org.jboss.errai.databinding.client.api.DataBinder;
import org.jboss.errai.databinding.client.api.handler.property.PropertyChangeEvent;
import org.jboss.errai.databinding.client.api.handler.property.PropertyChangeHandler;

/**
 *
 * @author juan.calderon
 */
public class DeptosEditorUi extends Composite {

    private static DeptosEditorUiUiBinder uiBinder = GWT.create(DeptosEditorUiUiBinder.class);

    interface DeptosEditorUiUiBinder extends UiBinder<Widget, DeptosEditorUi> {
    }

    @UiField
    HTMLPanel panelEditorGlass;

    @UiField
    FlexTable flexEditorGeneral;
    public @UiField ScrollPanel scrollPanel;

    @UiField
    Button saveBtn;
    @UiField
    Button cancelBtn;

    @UiField
    com.google.gwt.user.client.ui.Label txtStatus;
    @UiField
    TabListItem tabEditorMiembros;

    private final Label nombreLbl;
    private final TextBox nombreTxtBox;
    private final CellList<EmpleadoBase> cellListEmpleados;

    // Model & DataBinder
    private Departamento selected;
    private DataBinder<Departamento> binder;

    private EmpleadosBaseProvider empleadosBaseProvider;

    public DeptosEditorUi() {
        initWidget(uiBinder.createAndBindUi(this));

        empleadosBaseProvider = new EmpleadosBaseProvider();

        FlexTable.FlexCellFormatter cellFormatterGeneral = flexEditorGeneral.getFlexCellFormatter();

        flexEditorGeneral.setCellSpacing(0);
        flexEditorGeneral.setCellPadding(0);
        //        flexEditorGeneral.getColumnFormatter().setWidth(0, "50px;");

        nombreLbl = new Label();
        nombreLbl.addStyleName("code-label");
        nombreLbl.getElement().getStyle().setFontSize(100.0, Style.Unit.PCT);
        nombreLbl.getElement().getStyle().setDisplay(Style.Display.INLINE_BLOCK);
        nombreTxtBox = new TextBox();
        nombreTxtBox.setWidth("600px");

        String htmlColSpc = "<span style='margin-right: 10px;'></span>";
        String htmlRowSpc = "<span style='margin-bottom: 10px; display: block;'></span>";

        flexEditorGeneral.setWidget(0, 0, new HTML("<strong>Cdigo</strong>"));
        flexEditorGeneral.setWidget(1, 0, nombreLbl);
        flexEditorGeneral.setWidget(2, 0, new HTML(htmlRowSpc));

        flexEditorGeneral.setWidget(3, 0, new HTML("<strong>Nombre</strong>"));
        flexEditorGeneral.setWidget(4, 0, nombreTxtBox);

        CellList.Resources cellListResources = GWT.create(ICellListResources.class);
        cellListEmpleados = new CellList<>(new EmpleadoListCell(null), cellListResources,
                empleadosBaseProvider.getDataProvider());
        //        cellList.setKeyboardSelectionPolicy(HasKeyboardSelectionPolicy.KeyboardSelectionPolicy.ENABLED);
        //        cellList.setSelectionModel(selectionModel);
        //        selectionModel.addSelectionChangeHandler(new EmpleadosUI.SelectionHandler());
        cellListEmpleados.setPageSize(260); // mximo son 400 empleados. Al mostrarlos todos, no se requiere Pager.
        scrollPanel.add(cellListEmpleados);

        //                SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class);
        //        pager = new SimplePager(SimplePager.TextLocation.CENTER, pagerResources, false, 0, true);
        //        pager.setDisplay(dataGrid);
        /* Inyectarle style absolute al Abuelo para que funcione el scroll del cellList */
        Element divAbue = cellListEmpleados.getElement().getParentElement().getParentElement();
        divAbue.getStyle().setPosition(Style.Position.ABSOLUTE);
        divAbue.getStyle().setTop(0, Style.Unit.PX);
        divAbue.getStyle().setLeft(0, Style.Unit.PX);
        divAbue.getStyle().setBottom(0, Style.Unit.PX);
        divAbue.getStyle().setRight(0, Style.Unit.PX);

        // Add the CellList to the adapter in the database.
        empleadosBaseProvider.addDataDisplay(cellListEmpleados);

        saveBtn.addClickHandler(new SaveClickHandler());
        cancelBtn.addClickHandler(new CancelClickHandler());

        DeptosProvider.get().addMethodExecutedListener(new ProviderMethodExecutedListener());
        empleadosBaseProvider.addMethodExecutedListener(new EmpleadosProviderMethodExecutedListener());

        /* Binding */
        try {
            binder = DataBinder.forType(Departamento.class);
            selected = binder.bind(nombreLbl, "code").bind(nombreTxtBox, "name").getModel();

            binder.addPropertyChangeHandler(new BinderPropertyChange());

        } catch (Exception e) {
            Window.alert("DeptosEditorUI DataBinder.bind:> " + e.getMessage());
        }

    }

    private class BinderPropertyChange implements PropertyChangeHandler<Object> {
        @Override
        public void onPropertyChange(PropertyChangeEvent<Object> event) {
            DeptosProvider.get().dataProvider.refresh();

            // becomes Dirty
            selected.becomesDirty();
            updateWidgets();
        }
    }

    private class SaveClickHandler implements ClickHandler {

        @Override
        public void onClick(ClickEvent event) {

            if (selected == null) {
                Window.alert("DeptosEditorUI.SaveClickHandler selected es NULL.");
                return;
            }

            if (isValid()) {
                boolean isNuevo = selected == null || selected.getId() == null || selected.getId() <= 0;
                if (isNuevo) {
                    // add
                    DeptosProvider.get().add(selected);
                } else {
                    // update
                    DeptosProvider.get().update(selected);
                }
            }

        }
    }

    private boolean isValid() {
        boolean result = true;

        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<Departamento>> violations = validator.validate(selected);
        if (!violations.isEmpty()) {
            result = false;
            StringBuilder builder = new StringBuilder();
            for (ConstraintViolation<Departamento> violation : violations) {
                //                    builder.append(violation.getMessage());
                //                    builder.append(" : <i>(");
                //                    builder.append(violation.getPropertyPath().toString());
                //                    builder.append(" = ");
                //                    builder.append("" + violation.getInvalidValue());
                //                    builder.append(")</i>");
                //                    builder.append("<br/>");
                builder.append(" ").append(violation.getMessage()).append("\n");
                builder.append("  ").append(violation.getPropertyPath().toString()).append(" = ")
                        .append(violation.getInvalidValue()).append("\n\n");

            }
            Window.alert(builder.toString());
        }

        return result;
    }

    private class CancelClickHandler implements ClickHandler {

        @Override
        public void onClick(ClickEvent event) {
            if (selected == null) {
                Window.alert("DeptosEditorUI.SaveClickHandler selected es NULL.");
                return;
            }
            boolean isNuevo = selected == null || selected.getId() == null || selected.getId() <= 0;
            if (isNuevo) {
                setSelectedBean(null);
            } else {
                // cancelar update
                DeptosProvider.get().reloadById(selected.getId());
            }
        }
    }

    /**
     * Si el panel es activo, esconde el glass. Si el panel no es activo,
     * muestra el glass. El glass es un panel que se antepone o pospone segun
     * sea el caso.
     */
    private void setActive(boolean active) {
        int z_index_val = active ? -200 : 200;
        panelEditorGlass.getElement().getStyle().setZIndex(z_index_val);
    }

    private class ProviderMethodExecutedListener implements DeptosProvider.MethodExecutedListener {

        @Override
        public void onMethodExecuted(MethodEvent methodEvent) {
            if (EMethod.UPDATE.equals(methodEvent.getMethod())) {
                if (ETypeResult.SUCCESS.equals(methodEvent.getTypeResult())) {
                    Growl.growl("Departamento actualizado");

                    // Si actualiz bien:
                    // toma el Bean
                    // limpia el Bean
                    selected.cleanDirty();
                    // lo pasa al Provider

                } else {
                    Window.alert("Fall actualizacin de Departamento. " + methodEvent.getReason());
                }

                updateWidgets();

            } else if (EMethod.FIND_BY_ID.equals(methodEvent.getMethod())) {
                if (ETypeResult.SUCCESS.equals(methodEvent.getTypeResult())) {
                    Growl.growl("Departamento cancelado");
                    Departamento cancelado = (Departamento) methodEvent.getResult();
                    // recarga  desde la DB
                    // viene clean
                    // lo asigna al Bean
                    setSelectedBean(cancelado);

                } else {
                    Window.alert("Fall cancelacin de departamento. " + methodEvent.getReason());
                }

                updateWidgets();
            }

        }
    }

    private class EmpleadosProviderMethodExecutedListener implements EmpleadosBaseProvider.MethodExecutedListener {

        @Override
        public void onMethodExecuted(MethodEvent methodEvent) {
            if (EMethod.FIND_EMPLEADO_BASE_BY_ID_DEPTO.equals(methodEvent.getMethod())) {

                tabEditorMiembros
                        .setText("Miembros (" + empleadosBaseProvider.getDataProvider().getList().size() + ")");
            }
        }

    }

    public void setSelectedBean(Departamento selected) {
        this.selected = selected;

        this.updateWidgets();

        this.binder.setModel(this.selected != null ? this.selected : new Departamento());//, InitialState.FROM_MODEL, true);

        if (this.selected != null) {
            this.nombreTxtBox.setFocus(true);
        }

        int deptoId = selected != null && selected.getId() != null ? selected.getId() : 0;
        empleadosBaseProvider.findAllBaseByDepto(deptoId);
    }

    private void updateWidgets() {
        boolean selNotNull = selected != null;

        this.setActive(selNotNull);

        if (selected != null && (selected.getId() == null || selected.getId() <= 0)) {
            // cuando es nuevo, hacerlo dirty
            selected.becomesDirty();
        }

        this.saveBtn.setEnabled(selNotNull && this.selected.isDirty());
        this.cancelBtn.setEnabled(selNotNull && this.selected.isDirty());

        this.txtStatus.setVisible(this.saveBtn.isEnabled());

        if (selNotNull) {
            String strStatus = selected.getId() != null && selected.getId() > 0 ? "Actualizacin" : "Insercin";
            this.txtStatus.setText(strStatus);
        }

    }

}