pt.ist.vaadinframework.ui.fields.ContainerEditor.java Source code

Java tutorial

Introduction

Here is the source code for pt.ist.vaadinframework.ui.fields.ContainerEditor.java

Source

/*
 * Copyright 2010 Instituto Superior Tecnico
 * 
 *      https://fenix-ashes.ist.utl.pt/
 * 
 *   This file is part of the vaadin-framework.
 *
 *   The vaadin-framework Infrastructure is free software: you can
 *   redistribute it and/or modify it under the terms of the GNU Lesser General
 *   Public License as published by the Free Software Foundation, either version
 *   3 of the License, or (at your option) any later version.*
 *
 *   vaadin-framework 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 Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with vaadin-framework. If not, see <http://www.gnu.org/licenses/>.
 * 
 */
package pt.ist.vaadinframework.ui.fields;

import java.util.ArrayList;

import org.apache.commons.lang.StringUtils;

import pt.ist.vaadinframework.VaadinResourceConstants;
import pt.ist.vaadinframework.VaadinResources;
import pt.ist.vaadinframework.data.AbstractBufferedContainer;
import pt.ist.vaadinframework.ui.TransactionalTable;

import com.vaadin.data.Container;
import com.vaadin.data.Container.Indexed;
import com.vaadin.data.Container.ItemSetChangeEvent;
import com.vaadin.data.Property;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.FieldWrapper;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.ColumnGenerator;
import com.vaadin.ui.TableFieldFactory;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.BaseTheme;

public class ContainerEditor<PC> extends FieldWrapper<PC> {
    public static class OrderChanger extends CustomComponent {
        private final Button up = new Button();

        private final Button down = new Button();

        public OrderChanger(final Indexed container, final Object itemId) {
            HorizontalLayout layout = new HorizontalLayout();
            layout.addComponent(up);
            up.setIcon(new ThemeResource("../runo/icons/32/arrow-up.png"));
            up.addStyleName(BaseTheme.BUTTON_LINK);
            up.addListener(new ClickListener() {
                @Override
                public void buttonClick(ClickEvent event) {
                    int newIndex = container.indexOfId(itemId) - 1;
                    container.removeItem(itemId);
                    container.addItemAt(newIndex, itemId);
                    up.setEnabled(newIndex > 0);
                }
            });
            up.setEnabled(container.indexOfId(itemId) > 0);

            layout.addComponent(down);
            down.setIcon(new ThemeResource("../runo/icons/32/arrow-down.png"));
            down.addStyleName(BaseTheme.BUTTON_LINK);
            down.addListener(new ClickListener() {
                @Override
                public void buttonClick(ClickEvent event) {
                    int newIndex = container.indexOfId(itemId) + 1;
                    container.removeItem(itemId);
                    container.addItemAt(newIndex, itemId);
                    down.setEnabled(newIndex < container.size() - 1);
                }
            });
            down.setEnabled(container.indexOfId(itemId) < container.size() - 1);

            setCompositionRoot(layout);
        }
    }

    public static class ContainerEditorTable extends TransactionalTable {
        public ContainerEditorTable(TableFieldFactory factory, String bundlename) {
            super(bundlename);
            setWidth(100, UNITS_PERCENTAGE);
            setPageLength(0);
            setTableFieldFactory(factory);
            setEditable(true);
            addGeneratedColumn("index", new ColumnGenerator() {
                @Override
                public Component generateCell(Table source, Object itemId, Object columnId) {
                    return new OrderChanger((Indexed) getContainerDataSource(), itemId);
                }
            });
            addGeneratedColumn(StringUtils.EMPTY, new ColumnGenerator() {
                @Override
                public Component generateCell(final Table source, final Object itemId, Object columnId) {
                    Button delete = new Button(
                            VaadinResources.getString(VaadinResourceConstants.COMMONS_ACTION_DELETE));
                    delete.addStyleName(BaseTheme.BUTTON_LINK);
                    delete.addListener(new ClickListener() {
                        @Override
                        public void buttonClick(ClickEvent event) {
                            source.getContainerDataSource().removeItem(itemId);
                        }
                    });
                    return delete;
                }
            });
            // setVisible(size() > 0);
            addListener(new ItemSetChangeListener() {
                @Override
                public void containerItemSetChange(ItemSetChangeEvent event) {
                    setVisible(event.getContainer().size() > 0);
                }
            });
        }

        @Override
        protected boolean isEmpty() {
            return getContainerDataSource().size() == 0;
        }

        @Override
        public void setPropertyDataSource(Property newDataSource) {
            if (newDataSource instanceof Container) {
                super.setContainerDataSource((Container) newDataSource);
                ArrayList<Object> columns = new ArrayList<Object>();
                if (newDataSource instanceof Indexed) {
                    columns.add("index");
                    setColumnWidth("index", 77);
                }
                columns.addAll(((Container) newDataSource).getContainerPropertyIds());
                columns.add(StringUtils.EMPTY);
                setVisibleColumns(columns.toArray(new Object[0]));
            }
        }
    }

    public ContainerEditor(TableFieldFactory factory, String bundlename, Class<? extends PC> type) {
        super(new ContainerEditorTable(factory, bundlename), null, type);

        final VerticalLayout layout = new VerticalLayout();
        layout.setSpacing(true);
        layout.addComponent(getWrappedField());
        Button add = new Button(VaadinResources.getString(VaadinResourceConstants.COMMONS_ACTION_ADD));
        add.addStyleName(BaseTheme.BUTTON_LINK);
        layout.addComponent(add);
        add.addListener(new ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                if (getWrappedField().getContainerDataSource() instanceof AbstractBufferedContainer) {
                    AbstractBufferedContainer<PC, ?, ?> container = (AbstractBufferedContainer<PC, ?, ?>) getWrappedField()
                            .getContainerDataSource();
                    container.addItem(container.getElementType());
                } else {
                    getWrappedField().getContainerDataSource().addItem();
                }
            }
        });
        setCompositionRoot(layout);
    }

    @Override
    protected boolean isEmpty() {
        return getWrappedField().getContainerDataSource().size() == 0;
    }

    @Override
    protected ContainerEditorTable getWrappedField() {
        return (ContainerEditorTable) super.getWrappedField();
    }

    public void setColumnHeaderMode(int columnHeaderMode) {
        getWrappedField().setColumnHeaderMode(columnHeaderMode);
    }

    public void setColumnExpandRatio(Object propertyId, float expandRatio) {
        getWrappedField().setColumnExpandRatio(propertyId, expandRatio);
    }

    public void setColumnWidth(Object propertyId, int width) {
        getWrappedField().setColumnWidth(propertyId, width);
    }

    public void addGeneratedColumn(Object id, ColumnGenerator generatedColumn) {
        getWrappedField().addGeneratedColumn(id, generatedColumn);
    }
}