com.github.gwtbootstrap.showcase.client.CellTables.java Source code

Java tutorial

Introduction

Here is the source code for com.github.gwtbootstrap.showcase.client.CellTables.java

Source

/*
 *  Copyright 2012 GWT-Bootstrap
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.github.gwtbootstrap.showcase.client;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;

import com.github.gwtbootstrap.client.ui.ButtonCell;
import com.github.gwtbootstrap.client.ui.CellTable;
import com.github.gwtbootstrap.client.ui.ControlGroup;
import com.github.gwtbootstrap.client.ui.DataGrid;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.Form.SubmitEvent;
import com.github.gwtbootstrap.client.ui.HelpInline;
import com.github.gwtbootstrap.client.ui.IntegerBox;
import com.github.gwtbootstrap.client.ui.NavLink;
import com.github.gwtbootstrap.client.ui.Pagination;
import com.github.gwtbootstrap.client.ui.SubmitButton;
import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.TooltipCellDecorator;
import com.github.gwtbootstrap.client.ui.ValueListBox;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.ControlGroupType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.github.gwtbootstrap.datepicker.client.ui.DateBox;
import com.github.gwtbootstrap.showcase.client.util.DisplayLabelRenderer;
import com.github.gwtbootstrap.showcase.client.util.Person;
import com.github.gwtbootstrap.showcase.client.util.Person.Favorite;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.editor.client.adapters.SimpleEditor;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.cellview.client.AbstractCellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;

public class CellTables extends Composite implements Editor<Person> {

    SimpleEditor<Integer> id = SimpleEditor.of();

    @UiField
    TextBox userName;

    @UiField
    IntegerBox age;

    @UiField
    ControlGroup ageControlGroup;

    @UiField
    @Editor.Ignore
    HelpInline ageHelpInline;

    @UiField
    ControlGroup userNameControlGroup;

    @UiField
    @Editor.Ignore
    HelpInline userNameHelpInline;

    @UiField(provided = true)
    ValueListBox<Person.Favorite> favorite;

    @UiField(provided = true)
    CellTable<Person> exampleTable = new CellTable<Person>(5,
            GWT.<CellTable.SelectableResources>create(CellTable.SelectableResources.class));

    @UiField(provided = true)
    DataGrid<Person> exampleDataGrid = new DataGrid<Person>(20,
            GWT.<DataGrid.SelectableResources>create(DataGrid.SelectableResources.class));

    @UiField
    SubmitButton saveButton;

    @UiField
    DateBox birthDay;

    //@UiField
    Pagination pagination = new Pagination();

    @UiField
    Pagination dataGridPagination;

    @UiField
    Form submitExampleForm;

    @UiField
    Tab dataGridTab;

    SimplePager pager = new SimplePager();
    SimplePager dataGridPager = new SimplePager();

    ListDataProvider<Person> dataProvider = new ListDataProvider<Person>();

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

    interface CellTablesUiBinder extends UiBinder<Widget, CellTables> {
    }

    interface Driver extends SimpleBeanEditorDriver<Person, CellTables> {
    }

    Driver driver = GWT.create(Driver.class);

    public CellTables() {

        favorite = new ValueListBox<Person.Favorite>(new DisplayLabelRenderer<Person.Favorite>());

        initWidget(uiBinder.createAndBindUi(this));

        driver.initialize(this);

        setPerson(new Person());

        favorite.setAcceptableValues(Arrays.asList(Favorite.values()));

        initTable(exampleTable, pager, pagination);
        initTable(exampleDataGrid, dataGridPager, dataGridPagination);
    }

    private void initTable(AbstractCellTable<Person> exampleTable, final SimplePager pager,
            final Pagination pagination) {
        exampleTable.setEmptyTableWidget(new Label("Please add data."));

        TextColumn<Person> idCol = new TextColumn<Person>() {

            @Override
            public String getValue(Person object) {
                return String.valueOf(object.getId());
            }
        };

        idCol.setSortable(true);

        exampleTable.addColumn(idCol, "#");

        ListHandler<Person> idColHandler = new ListHandler<Person>(dataProvider.getList());

        idColHandler.setComparator(idCol, new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                return o1.getId().compareTo(o2.getId());
            }
        });

        exampleTable.addColumnSortHandler(idColHandler);

        exampleTable.getColumnSortList().push(idCol);

        TextColumn<Person> userNameCol = new TextColumn<Person>() {

            @Override
            public String getValue(Person object) {
                return object.getUserName();
            }
        };
        userNameCol.setSortable(true);
        exampleTable.addColumn(userNameCol, "User Name");

        ListHandler<Person> userNameColHandler = new ListHandler<Person>(dataProvider.getList());

        userNameColHandler.setComparator(userNameCol, new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                return o1.getUserName().compareTo(o2.getUserName());
            }
        });

        exampleTable.addColumnSortHandler(userNameColHandler);

        TextColumn<Person> ageCol = new TextColumn<Person>() {

            @Override
            public String getValue(Person object) {
                return object.getAge() != null ? String.valueOf(object.getAge()) : "";
            }
        };
        ageCol.setSortable(true);
        exampleTable.addColumn(ageCol, "Age");

        ListHandler<Person> ageColHandler = new ListHandler<Person>(dataProvider.getList());

        ageColHandler.setComparator(ageCol, new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                if (o2.getAge() == null) {
                    return 1;
                }

                if (o1.getAge() == null) {
                    return -1;
                }
                return o1.getAge().compareTo(o2.getAge());
            }
        });

        exampleTable.addColumnSortHandler(ageColHandler);

        TextColumn<Person> birthDayCol = new TextColumn<Person>() {

            @Override
            public String getValue(Person object) {
                if (object.getBirthDay() != null) {
                    return DateTimeFormat.getFormat("dd/MM/yyyy").format(object.getBirthDay());
                } else {
                    return "";
                }
            }
        };

        exampleTable.addColumn(birthDayCol, "Birth Day");

        birthDayCol.setSortable(true);

        ListHandler<Person> birthDayColHandler = new ListHandler<Person>(dataProvider.getList());
        birthDayColHandler.setComparator(birthDayCol, new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                if (o2.getBirthDay() == null) {
                    return 1;
                }

                if (o1.getBirthDay() == null) {
                    return -1;
                }

                return o1.getBirthDay().compareTo(o2.getBirthDay());
            }
        });

        exampleTable.addColumnSortHandler(birthDayColHandler);

        TextColumn<Person> favoriteCol = new TextColumn<Person>() {

            @Override
            public String getValue(Person object) {
                return object.getFavorite().getDisplayLabel();
            }
        };

        favoriteCol.setSortable(true);
        exampleTable.addColumn(favoriteCol, "Favorite");

        ListHandler<Person> favoriteColHandler = new ListHandler<Person>(dataProvider.getList());

        favoriteColHandler.setComparator(favoriteCol, new Comparator<Person>() {

            @Override
            public int compare(Person o1, Person o2) {
                return o1.getFavorite().compareTo(o2.getFavorite());
            }
        });

        exampleTable.addColumnSortHandler(favoriteColHandler);

        exampleTable.addRangeChangeHandler(new RangeChangeEvent.Handler() {

            @Override
            public void onRangeChange(RangeChangeEvent event) {
                rebuildPager(pagination, pager);
            }
        });

        ButtonCell buttonCell = new ButtonCell(IconType.REMOVE, ButtonType.DANGER);

        final TooltipCellDecorator<String> decorator = new TooltipCellDecorator<String>(buttonCell);
        decorator.setText("delete row, if click");

        Column<Person, String> buttonCol = new Column<Person, String>(decorator) {

            @Override
            public String getValue(Person object) {
                return "delete";
            }
        };

        buttonCol.setFieldUpdater(new FieldUpdater<Person, String>() {

            @Override
            public void update(int index, Person object, String value) {
                dataProvider.getList().remove(object);
                dataProvider.flush();
                dataProvider.refresh();
                rebuildPager(pagination, pager);
                rebuildPager(dataGridPagination, dataGridPager);

            }
        });

        exampleTable.addColumn(buttonCol);

        final SingleSelectionModel<Person> selectionModel = new SingleSelectionModel<Person>();

        selectionModel.addSelectionChangeHandler(new Handler() {

            @Override
            public void onSelectionChange(SelectionChangeEvent event) {
                Person person = selectionModel.getSelectedObject();

                CellTables.this.driver.edit(person);
            }
        });

        exampleTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);

        exampleTable.setSelectionModel(selectionModel);

        pager.setDisplay(exampleTable);

        pagination.clear();

        dataProvider.addDataDisplay(exampleTable);
    }

    @UiHandler("age")
    public void onAgeUpdate(KeyPressEvent event) {

        if (event.getCharCode() < '0' || event.getCharCode() > '9') {
            ageControlGroup.setType(ControlGroupType.ERROR);
            ageHelpInline.setText("Age should be numeric.");

            event.preventDefault();
        } else {
            ageControlGroup.setType(ControlGroupType.NONE);
            ageHelpInline.setText("");

        }

    }

    @UiHandler("submitExampleForm")
    public void onSubmitForm(SubmitEvent e) {

        Person person = driver.flush();

        boolean hasError = false;

        if (person.getUserName() == null || person.getUserName().isEmpty()) {

            userNameControlGroup.setType(ControlGroupType.ERROR);
            userNameHelpInline.setText("UserName should be input");
            hasError = true;
        }

        if (person.getAge() == null) {
            ageControlGroup.setType(ControlGroupType.ERROR);
            ageHelpInline.setText("Age should be numeric.");
            hasError = true;
        }

        if (hasError) {
            e.cancel();
            return;
        }

        addPerson(person);

        setPerson(new Person());
        e.cancel();
    }

    private void addPerson(Person person) {
        if (person.getId() == null) {
            person.setId(dataProvider.getList().size() + 1);
            dataProvider.getList().add(person);
        } else {
            exampleTable.getSelectionModel().setSelected(person, false);
            exampleDataGrid.getSelectionModel().setSelected(person, false);
            dataProvider.refresh();
        }

        dataProvider.flush();

        rebuildPager(pagination, pager);
        rebuildPager(dataGridPagination, dataGridPager);

    }

    private void rebuildPager(final Pagination pagination, final SimplePager pager) {
        pagination.clear();

        if (pager.getPageCount() == 0) {
            return;
        }

        NavLink prev = new NavLink("<");

        prev.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                GWT.log(String.valueOf("prev"));
                pager.previousPage();
            }
        });

        prev.setDisabled(!pager.hasPreviousPage());

        pagination.add(prev);

        int before = 2;
        int after = 2;

        while (!pager.hasPreviousPages(before) && before > 0) {
            before--;
            if (pager.hasNextPages(after + 1)) {
                after++;
            }
        }

        while (!pager.hasNextPages(after) && after > 0) {
            after--;
            if (pager.hasPreviousPages(before + 1)) {
                before++;
            }
        }

        for (int i = pager.getPage() - before; i <= pager.getPage() + after; i++) {

            final int index = i + 1;

            NavLink page = new NavLink(String.valueOf(index));

            page.addClickHandler(new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    pager.setPage(index - 1);
                }
            });

            if (i == pager.getPage()) {
                page.setActive(true);
            }

            pagination.add(page);
        }

        NavLink next = new NavLink(">");

        next.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                GWT.log(String.valueOf("next"));
                pager.nextPage();
            }
        });

        next.setDisabled(!pager.hasNextPage());

        pagination.add(next);
    }

    @UiHandler("add5Entity")
    public void onClickAdd5Entity(ClickEvent e) {

        Date date = new Date();

        for (int i = 0; i < 5; i++) {

            Person p = new Person();
            p.setAge(exampleTable.getRowCount());
            p.setFavorite(Favorite.values()[Random.nextInt(Favorite.values().length)]);
            p.setUserName("userName" + exampleTable.getRowCount());
            p.setBirthDay(date);
            addPerson(p);
            date.setTime(date.getTime() + 24 * 60 * 60 * (exampleTable.getRowCount() + 1) * 1000);
        }

    }

    public void setPerson(Person person) {
        driver.edit(person);

        ageControlGroup.setType(ControlGroupType.NONE);
        ageHelpInline.setText("");

        userNameControlGroup.setType(ControlGroupType.NONE);
        userNameHelpInline.setText("");
    }

    @UiHandler("cancelButton")
    public void onCancelClick(ClickEvent e) {
        submitExampleForm.reset();

    }

    @UiHandler("dataGridTab")
    public void onClickDataGridTab(ClickEvent e) {
        exampleDataGrid.onResize();
    }

}