/* * 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(); } }