All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.mateu.mdd.vaadin.components.fieldBuilders.JPAOutputFieldBuilder Maven / Gradle / Ivy

There is a newer version: 1.1.60
Show newest version
package io.mateu.mdd.vaadin.components.fieldBuilders;

import com.vaadin.data.Binder;
import com.vaadin.data.HasValue;
import com.vaadin.data.Validator;
import com.vaadin.data.validator.BeanValidator;
import com.vaadin.server.ExternalResource;
import com.vaadin.server.Resource;
import com.vaadin.shared.Registration;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.ui.*;
import com.vaadin.ui.themes.ValoTheme;
import io.mateu.mdd.core.app.AbstractAction;
import io.mateu.mdd.core.interfaces.AbstractStylist;
import io.mateu.mdd.core.interfaces.Card;
import io.mateu.mdd.core.ui.MDDUIAccessor;
import io.mateu.mdd.shared.CSS;
import io.mateu.mdd.shared.annotations.DataProvider;
import io.mateu.mdd.shared.annotations.FullWidth;
import io.mateu.mdd.shared.annotations.Money;
import io.mateu.mdd.shared.annotations.UseTable;
import io.mateu.mdd.shared.interfaces.IResource;
import io.mateu.mdd.shared.reflection.FieldInterfaced;
import io.mateu.mdd.vaadin.components.views.ListViewComponent;
import io.mateu.mdd.vaadin.data.MDDBinder;
import io.mateu.reflection.ReflectionHelper;
import io.mateu.util.notification.Notifier;
import org.javamoney.moneta.FastMoney;

import javax.money.MonetaryAmount;
import javax.persistence.Entity;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class JPAOutputFieldBuilder extends AbstractFieldBuilder {


    public boolean isSupported(FieldInterfaced field) {
        return String.class.equals(field.getType());
    }

    @Override
    public Component build(VerticalLayout fieldGroup, HorizontalLayout fieldGroupHeader, FieldInterfaced field, Object object, Layout container, MDDBinder binder, Map> validators, AbstractStylist stylist, Map allFieldContainers, boolean forSearchFilter, Map> attachedActions) {

        Component r = null;

        if (!forSearchFilter) {

            if (URL.class.equals(field.getType())) {

                VerticalLayout hl = new VerticalLayout();

                Link l = new Link();
                l.addStyleName("test-" + field.getId());
                hl.addStyleName(CSS.NOPADDING);
                hl.addComponent(l);

                hl.setCaption(ReflectionHelper.getCaption(field));

                addComponent(container, hl, attachedActions.get(field.getName()));

                bind(binder, l, field);

                if (allFieldContainers != null) allFieldContainers.put(field, hl);

            } else if (IResource.class.isAssignableFrom(field.getType())) {

                VerticalLayout hl = new VerticalLayout();

                Label l;
                hl.addComponent(l = new Label("", ContentMode.HTML));
                l.addStyleName("collectionlinklabel");
                l.addStyleName("test-" + field.getId());
                hl.addStyleName(CSS.NOPADDING);

                hl.setCaption(ReflectionHelper.getCaption(field));

                addComponent(container, hl, attachedActions.get(field.getName()));

                bindResourcesList(binder, l, field);

                if (allFieldContainers != null) allFieldContainers.put(field, hl);


            } else if (Collection.class.isAssignableFrom(field.getType())) {


                Method mh;
                if (Set.class.isAssignableFrom(field.getType())) {
                    Label l;
                    l = new Label("", ContentMode.HTML);
                    l.setCaption(ReflectionHelper.getCaption(field));
                    l.addStyleName("test-" + field.getId());

                    addComponent(container, l, attachedActions.get(field.getName()));

                    if (allFieldContainers != null) allFieldContainers.put(field, l);

                    JPAOneToManyFieldBuilder.bindSet(binder, l, field);
                } else if (false && field.isAnnotationPresent(UseTable.class)) {
                    VerticalLayout hl = new VerticalLayout();
                    hl.addStyleName("onetomanytable");
                    hl.addStyleName("output");

                    Label l;
                    hl.addComponent(l = new Label("", ContentMode.HTML));
                    hl.addStyleName(CSS.NOPADDING);

                    hl.setCaption(ReflectionHelper.getCaption(field));

                    addComponent(container, hl, attachedActions.get(field.getName()));

                    if (allFieldContainers != null) allFieldContainers.put(field, hl);

                    JPAOneToManyFieldBuilder.bind(binder, l, field);
                } else if ((mh = ReflectionHelper.getMethod(field.getDeclaringClass(), ReflectionHelper.getGetter(field.getName()) + "Html")) != null) {
                    VerticalLayout hl = new VerticalLayout();
                    hl.addStyleName("collectionlinklabel");

                    Label l;
                    hl.addComponent(l = new Label("", ContentMode.HTML));
                    hl.addStyleName(CSS.NOPADDING);
                    l.addStyleName("test-" + field.getId());

                    hl.setCaption(ReflectionHelper.getCaption(field));

                    addComponent(container, hl, attachedActions.get(field.getName()));

                    if (allFieldContainers != null) allFieldContainers.put(field, hl);

                    JPAOneToManyFieldBuilder.bind(binder, l, field, mh);
                } else if (Card.class.isAssignableFrom(field.getGenericClass())) {

                    CssLayout hl = new CssLayout();
                    hl.addStyleName("collectionlinklabel");

                    hl.setCaption(ReflectionHelper.getCaption(field));

                    addComponent(container, hl, attachedActions.get(field.getName()));

                    JPAOneToManyFieldBuilder.bind(binder, hl, field, mh, true);

                    if (allFieldContainers != null) allFieldContainers.put(field, hl);

                } else {

                    Grid g = new Grid();

                    g.addStyleName("gridonetomany");
                    g.addStyleName("output");

                    String colsFilter = "";
                    if (field.isAnnotationPresent(UseTable.class)) colsFilter = field.getAnnotation(UseTable.class).fields();

                    List colFields = JPAOneToManyFieldBuilder.getColumnFields(field, colsFilter);

                    Class targetClass = field.getGenericClass();

                    boolean inline = false;

                    ListViewComponent.buildColumns(g, colFields, false, inline, binder, field);

                    g.setSelectionMode(attachedActions != null && attachedActions.size() > 0?Grid.SelectionMode.MULTI:Grid.SelectionMode.NONE);

                    g.setCaption(ReflectionHelper.getCaption(field));


                    int ancho = 0;
                    for (Grid.Column col : (List) g.getColumns()) ancho += col.getWidth();
                    if (ancho <= 0) ancho = 500;


                    boolean anchoCompleto = field.isAnnotationPresent(FullWidth.class) || ancho > 900;
                    anchoCompleto = false;

                    if (anchoCompleto) g.setWidth("100%");
                    else {
                        g.setWidth("" + (ancho + 60) + "px");
                    }

                    // añadimos columna para que no haga feo
                    if (anchoCompleto) {
                        if (g.getColumns().size() == 1) ((Grid.Column) g.getColumns().get(0)).setExpandRatio(1);
                        else g.addColumn((d) -> null).setWidthUndefined().setCaption("");
                    }

                    g.setHeightMode(HeightMode.UNDEFINED);


                    DataProvider dpa = (field.isAnnotationPresent(DataProvider.class)) ? field.getAnnotation(DataProvider.class) : null;

                    if (dpa == null) {

                        Method mdp = ReflectionHelper.getMethod(field.getDeclaringClass(), ReflectionHelper.getGetter(field.getName()) + "DataProvider");

                    }


                    JPAOneToManyFieldBuilder.bind(binder, g, field, targetClass, null);

                    if (allFieldContainers != null) allFieldContainers.put(field, g);

                    addComponent(container, g, attachedActions.get(field.getName()));

                }

            } else {

                Button botonLink = null;
                Label tf = new Label();
                tf.setContentMode(ContentMode.HTML);
                tf.addStyleName("outputlabel");
                tf.addStyleName("test-" + field.getId());


                if (Integer.class.equals(field.getType()) || int.class.equals(field.getType())
                        || Long.class.equals(field.getType()) || long.class.equals(field.getType())
                        || Double.class.equals(field.getType()) || double.class.equals(field.getType())
                        || FastMoney.class.equals(field.getType()) || MonetaryAmount.class.equals(field.getType())) {
                    tf.addStyleName("alinearderecha");
                }


                if (field.getType().isAnnotationPresent(Entity.class)) {

                    HorizontalLayout hl = new HorizontalLayout();
                    hl.addStyleName(CSS.NOPADDING);
                    container.addComponent(hl);
                    hl.setWidthUndefined();

                    tf.setValue("None");

                    hl.addComponent(tf);

                    if (container.getComponentCount() > 0) hl.setCaption(ReflectionHelper.getCaption(field));

                    botonLink = new Button("None");
                    botonLink.addStyleName(ValoTheme.BUTTON_LINK);
                    botonLink.addClickListener(e -> MDDUIAccessor.go(field.getName()));
                    botonLink.setVisible(false);
                    hl.addComponent(botonLink);

                    if (allFieldContainers != null) allFieldContainers.put(field, hl);

                } else {

                    container.addComponent(tf);

                    if (container.getComponentCount() > 0) tf.setCaption(ReflectionHelper.getCaption(field));

                    if (allFieldContainers != null) allFieldContainers.put(field, tf);

                }

                bind(binder, tf, botonLink, field);
                r = tf;
            }

        }

        return  r;
    }

    private void bindResourcesList(MDDBinder binder, Label l, FieldInterfaced field) {
        Binder.BindingBuilder aux = binder.forField(new HasValue() {
            @Override
            public void setValue(Object o) {
                if (o == null || ((Collection)o).size() == 0) l.setValue("Empty list");
                else {
                    try {

                        String h = "
"; for (Object i : (Collection)o) { IResource l = (IResource) i; h += "
"; h += "" + l.getName() + ""; h += "
"; } h += "
"; l.setValue(h); } catch (Exception e) { Notifier.alert(e); } } } @Override public Object getValue() { return null; } @Override public Registration addValueChangeListener(ValueChangeListener valueChangeListener) { return null; } @Override public void setRequiredIndicatorVisible(boolean b) { } @Override public boolean isRequiredIndicatorVisible() { return false; } @Override public void setReadOnly(boolean b) { } @Override public boolean isReadOnly() { return false; } }); aux.withValidator(new BeanValidator(field.getDeclaringClass(), field.getName())); aux.bind(field.getName()); } protected void bind(MDDBinder binder, Label tf, Button botonLink, FieldInterfaced field) { binder.forField(new AbstractField() { Object v; @Override protected void doSetValue(Object o) { v = o; if (field.isAnnotationPresent(Money.class)) o = new DecimalFormat("##,###,###,###,###,###.00").format(o != null?o:0); tf.setValue((o != null)?objectToString(o):"None"); if (botonLink != null) { tf.setVisible(o == null); botonLink.setVisible(o != null); botonLink.setCaption((o != null)?objectToString(o):"None"); } } @Override public Object getValue() { return v; } }).bind(o -> { try { return ReflectionHelper.getValue(field, o); } catch (Exception e) { Notifier.alert(e); return ""; } }, (o, v) -> {}); } protected void bind(MDDBinder binder, Link tf, FieldInterfaced field) { binder.forField(new AbstractField() { URL v; @Override protected void doSetValue(Object o) { v = (URL) o; tf.setResource(new ExternalResource(v)); tf.setCaption(v == null?"--":v.toString()); } @Override public Object getValue() { return v; } }).bind(o -> { try { return ReflectionHelper.getValue(field, o); } catch (Exception e) { Notifier.alert(e); return ""; } }, (o, v) -> {}); } private String objectToString(Object o) { if (o instanceof Collection) { String s = ""; for (Object x : (Collection) o) { if (!"".equals(s)) s += "
"; s += x.toString(); } if ("".equals(s)) s += "Empty list"; return s; } else { return o.toString(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy