/**
* Copyright 2009-2013 Oy Vaadin Ltd
*
* 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.vaadin.addon.jpacontainer.itest.addressbook;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.JPAContainerFactory;
import com.vaadin.addon.jpacontainer.itest.TestLauncherUI;
import com.vaadin.addon.jpacontainer.itest.addressbook.PersonEditor.EditorSavedEvent;
import com.vaadin.addon.jpacontainer.itest.addressbook.PersonEditor.EditorSavedListener;
import com.vaadin.addon.jpacontainer.itest.domain.Department;
import com.vaadin.addon.jpacontainer.itest.domain.Person;
import com.vaadin.v7.data.Property;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.data.util.filter.Compare.Equal;
import com.vaadin.v7.data.util.filter.Like;
import com.vaadin.v7.data.util.filter.Or;
import com.vaadin.v7.event.FieldEvents.TextChangeEvent;
import com.vaadin.v7.event.FieldEvents.TextChangeListener;
import com.vaadin.v7.event.ItemClickEvent;
import com.vaadin.v7.event.ItemClickEvent.ItemClickListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.v7.ui.HorizontalLayout;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.v7.ui.Table;
import com.vaadin.v7.ui.TextField;
import com.vaadin.v7.ui.Tree;
import com.vaadin.ui.UI;
import com.vaadin.v7.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class AddressBookMainView extends HorizontalSplitPanel implements
ComponentContainer {
private Tree groupTree;
private Table personTable;
private TextField searchField;
private Button newButton;
private Button deleteButton;
private Button editButton;
private JPAContainer<Department> departments;
private JPAContainer<Person> persons;
private Department departmentFilter;
private String textFilter;
public AddressBookMainView() {
departments = new HierarchicalDepartmentContainer();
persons = JPAContainerFactory.make(Person.class,
TestLauncherUI.PERSISTENCE_UNIT);
buildTree();
buildMainArea();
setSplitPosition(30);
}
private void buildMainArea() {
VerticalLayout verticalLayout = new VerticalLayout();
setSecondComponent(verticalLayout);
personTable = new Table(null, persons);
personTable.setSelectable(true);
personTable.setImmediate(true);
personTable.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
setModificationsEnabled(event.getProperty().getValue() != null);
}
private void setModificationsEnabled(boolean b) {
deleteButton.setEnabled(b);
editButton.setEnabled(b);
}
});
personTable.setSizeFull();
// personTable.setSelectable(true);
personTable.addItemClickListener(new ItemClickListener() {
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
personTable.select(event.getItemId());
}
}
});
personTable.setVisibleColumns(new Object[] { "firstName", "lastName",
"department", "phoneNumber", "street", "city", "zipCode" });
HorizontalLayout toolbar = new HorizontalLayout();
newButton = new Button("Add");
newButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
final BeanItem<Person> newPersonItem = new BeanItem<Person>(
new Person());
PersonEditor personEditor = new PersonEditor(newPersonItem);
personEditor.addListener(new EditorSavedListener() {
@Override
public void editorSaved(EditorSavedEvent event) {
persons.addEntity(newPersonItem.getBean());
persons.commit();
}
});
addSubWindow(personEditor);
}
});
deleteButton = new Button("Delete");
deleteButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
persons.removeItem(personTable.getValue());
}
});
deleteButton.setEnabled(false);
editButton = new Button("Edit");
editButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
addSubWindow(new PersonEditor(personTable.getItem(personTable
.getValue())));
}
});
editButton.setEnabled(false);
Button refreshButton = new Button("Refresh");
refreshButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
JPAContainer<?> container = (JPAContainer<?>) personTable.getContainerDataSource();
container.refresh();
}
});
searchField = new TextField();
searchField.setInputPrompt("Search by name");
searchField.addTextChangeListener(new TextChangeListener() {
@Override
public void textChange(TextChangeEvent event) {
String text = event.getText();
textFilter = sanitizeInputText(text);
updateFilters();
}
private String sanitizeInputText(String text) {
if (text != null) {
return text.replaceAll("[^a-zA-Z0-9 ]", "");
}
return null;
}
});
toolbar.addComponent(newButton);
toolbar.addComponent(deleteButton);
toolbar.addComponent(editButton);
toolbar.addComponent(refreshButton);
toolbar.addComponent(searchField);
toolbar.setWidth("100%");
toolbar.setExpandRatio(searchField, 1);
toolbar.setComponentAlignment(searchField, Alignment.TOP_RIGHT);
verticalLayout.addComponent(toolbar);
verticalLayout.addComponent(personTable);
verticalLayout.setExpandRatio(personTable, 1);
verticalLayout.setSizeFull();
}
private void addSubWindow(Window w) {
UI.getCurrent().addWindow(w);
}
private void buildTree() {
groupTree = new Tree(null, departments);
groupTree.setItemCaptionPropertyId("name");
groupTree.setImmediate(true);
groupTree.setSelectable(true);
groupTree.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Object id = event.getProperty().getValue();
if (id != null) {
Department entity = departments.getItem(id).getEntity();
departmentFilter = entity;
} else if (departmentFilter != null) {
departmentFilter = null;
}
updateFilters();
}
});
setFirstComponent(groupTree);
}
private void updateFilters() {
persons.setApplyFiltersImmediately(false);
persons.removeAllContainerFilters();
if (departmentFilter != null) {
// two level hierarchy at max in our demo
if (departmentFilter.getParent() == null) {
persons.addContainerFilter(new Equal("department.parent",
departmentFilter));
} else {
persons.addContainerFilter(new Equal("department",
departmentFilter));
}
}
if (textFilter != null && !textFilter.equals("")) {
Or or = new Or(new Like("firstName", textFilter + "%", false),
new Like("lastName", textFilter + "%", false));
persons.addContainerFilter(or);
}
persons.applyFilters();
}
}