/* * Copyright (C) 2015 maartenl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package awesomeness.vaadin; import awesomeness.vaadin.utils.IntegerProperty; import awesomeness.vaadin.utils.Utilities; import com.vaadin.addon.jpacontainer.JPAContainer; import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.fieldgroup.FieldGroup; import com.vaadin.data.util.BeanItem; import com.vaadin.data.util.converter.StringToIntegerConverter; import com.vaadin.data.util.filter.Compare; import com.vaadin.server.Sizeable; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.persistence.Query; import mmud.database.entities.characters.Person; import mmud.database.entities.game.Admin; import mmud.database.entities.game.Method; import mmud.database.entities.game.Room; import mmud.rest.services.LogBean; /** * * @author maartenl */ public class Events extends VerticalLayout implements Property.ValueChangeListener { private static final Logger logger = Logger.getLogger(Events.class.getName()); private final CheckBox filterOnOwner; private final Table eventsTable; private final TextField month; private final TextField dayofmonth; private final Label owner; private final Button commit; private FieldGroup binder; private final Admin currentUser; private final Button discard; private final Button disown; private final FormLayout layout; private Item item; private boolean busyCreatingNewItem = false; private mmud.database.entities.game.Event newInstance; private final TextField hour; private final TextField minute; private final TextField dayofweek; private final TextField eventid; private final TextField person; private final TextField room; private final TextField method; private final LogBean logBean; Events(final Admin currentUser, final LogBean logBean) { this.currentUser = currentUser; this.logBean = logBean; // And there we have it final JPAContainer<mmud.database.entities.game.Event> attributes = Utilities.getJPAContainer(mmud.database.entities.game.Event.class); final Container.Filter filter = new Compare.Equal("owner", currentUser); Panel searchPanel = new Panel(); addComponent(searchPanel); HorizontalLayout searchLayout = new HorizontalLayout(); searchPanel.setContent(searchLayout); final TextField filterOnId = new TextField("Id", new IntegerProperty()); filterOnId.setConverter(new StringToIntegerConverter()); filterOnId.setDescription("Does not allows wildcards."); filterOnId.addValueChangeListener(new Property.ValueChangeListener() { private Container.Filter filter; @Override public void valueChange(Property.ValueChangeEvent event) { if (filter != null) { attributes.removeContainerFilter(filter); filter = null; } // Integer eventId = (Integer) event.getProperty().getValue(); Integer eventId = (Integer) filterOnId.getPropertyDataSource().getValue(); if (eventId == null) { return; } filter = new Compare.Equal("eventid", eventId); attributes.addContainerFilter(filter); } }); searchLayout.addComponent(filterOnId); TextField filterOnMethodName = new TextField("Filter on methodname"); filterOnMethodName.setDescription("Does not allows wildcards."); filterOnMethodName.addValueChangeListener(new Property.ValueChangeListener() { private Container.Filter filter; @Override public void valueChange(Property.ValueChangeEvent event) { if (filter != null) { attributes.removeContainerFilter(filter); filter = null; } String methodName = (String) event.getProperty().getValue(); if (methodName == null || methodName.trim().equals("")) { return; } Query methodQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Method.findByName"); methodQuery.setParameter("name", methodName); Method foundMethod = (Method) methodQuery.getSingleResult(); if (foundMethod != null) { filter = new Compare.Equal("method", foundMethod); attributes.addContainerFilter(filter); } } }); searchLayout.addComponent(filterOnMethodName); TextField filterOnPerson = new TextField("Filter on person"); filterOnPerson.setDescription("Does not allows wildcards."); filterOnPerson.addValueChangeListener(new Property.ValueChangeListener() { private Container.Filter filter; @Override public void valueChange(Property.ValueChangeEvent event) { if (filter != null) { attributes.removeContainerFilter(filter); filter = null; } String personName = (String) event.getProperty().getValue(); if (personName == null || personName.trim().equals("")) { return; } Query personQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Person.findByName"); personQuery.setParameter("name", personName); Person foundPerson = (Person) personQuery.getSingleResult(); if (foundPerson != null) { filter = new Compare.Equal("person", foundPerson); attributes.addContainerFilter(filter); } } }); searchLayout.addComponent(filterOnPerson); final TextField filterOnRoom = new TextField("Filter on room", new IntegerProperty()); filterOnRoom.setConverter(new StringToIntegerConverter()); filterOnRoom.setDescription("Does not allows wildcards."); filterOnRoom.addValueChangeListener(new Property.ValueChangeListener() { private Container.Filter filter; @Override public void valueChange(Property.ValueChangeEvent event) { if (filter != null) { attributes.removeContainerFilter(filter); filter = null; } // Integer eventId = (Integer) event.getProperty().getValue(); Integer roomId = (Integer) filterOnRoom.getPropertyDataSource().getValue(); if (roomId == null) { return; } Query roomQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Room.findById"); roomQuery.setParameter("id", roomId); Room foundRoom = (Room) roomQuery.getSingleResult(); if (foundRoom != null) { filter = new Compare.Equal("room", foundRoom); attributes.addContainerFilter(filter); } } }); searchLayout.addComponent(filterOnRoom); filterOnOwner = new CheckBox("Filter on owner"); filterOnOwner.addValueChangeListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { if (event.getProperty().getValue().equals(Boolean.TRUE)) { attributes.addContainerFilter(filter); } else { attributes.removeContainerFilter(filter); } } }); searchLayout.addComponent(filterOnOwner); Panel tablePanel = new Panel(); addComponent(tablePanel); eventsTable = new Table("Events", attributes); eventsTable.setVisibleColumns("eventid", "person", "room", "month", "dayofmonth", "hour", "minute", "dayofweek", "method", "owner", "creation"); // eventsTable.setVisibleColumns("eventid", "person", "room", "month", "dayofmonth", "hour", "minute", "dayofweek", "callable", "method", "owner", "creation"); Utilities.setTableSize(eventsTable); eventsTable.setSelectable(true); eventsTable.addValueChangeListener(this); eventsTable.setImmediate(true); tablePanel.setContent(eventsTable); Panel formPanel = new Panel(); addComponent(formPanel); layout = new FormLayout(); formPanel.setContent(layout); eventid = new TextField("Eventid"); layout.addComponent(eventid); month = new TextField("Month"); layout.addComponent(month); dayofmonth = new TextField("Day of month"); layout.addComponent(dayofmonth); hour = new TextField("Hour"); layout.addComponent(hour); minute = new TextField("Minute"); layout.addComponent(minute); dayofweek = new TextField("Day of week"); layout.addComponent(dayofweek); person = new TextField("Person"); layout.addComponent(person); room = new TextField("Room", new IntegerProperty()); room.setConverter(new StringToIntegerConverter()); layout.addComponent(room); method = new TextField("Methodname"); method.setWidth(50, Sizeable.Unit.EM); layout.addComponent(method); owner = new Label(); owner.setCaption("Owner"); layout.addComponent(owner); HorizontalLayout buttonsLayout = new HorizontalLayout(); layout.addComponent(buttonsLayout); commit = new Button("Save", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { logger.log(Level.FINEST, "commit clicked."); item.getItemProperty("owner").setValue(currentUser); String methodName = (String) method.getValue(); Query methodQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Method.findByName"); methodQuery.setParameter("name", methodName); Method foundMethod = (Method) methodQuery.getSingleResult(); item.getItemProperty("method").setValue(foundMethod); setPerson("person", person, item); setRoom("room", room, item); try { binder.commit(); if (busyCreatingNewItem == true) { Object itemId = attributes.addEntity(newInstance); eventsTable.setValue(itemId); logBean.writeDeputyLog(currentUser, "New event '" + itemId + "' created."); } else { logBean.writeDeputyLog(currentUser, "Event '" + eventsTable.getValue() + "' updated."); } } catch (FieldGroup.CommitException ex) { logger.log(Level.SEVERE, null, ex); } busyCreatingNewItem = false; } private void setRoom(String direction, TextField roomTextfield, Item item) throws Property.ReadOnlyException { if (roomTextfield.getPropertyDataSource() == null) { item.getItemProperty(direction).setValue(null); } Integer roomId = (Integer) roomTextfield.getPropertyDataSource().getValue(); if (roomId != null) { Query roomQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Room.findById"); roomQuery.setParameter("id", roomId); item.getItemProperty(direction).setValue((Room) roomQuery.getSingleResult()); } else { item.getItemProperty(direction).setValue(null); } } private void setPerson(String person, TextField personTextfield, Item item) { if (personTextfield.getValue() == null) { item.getItemProperty(person).setValue(null); } String personName = (String) personTextfield.getValue(); if (personName != null && !personName.trim().equals("")) { Query personQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Person.findByName"); personQuery.setParameter("name", personName); item.getItemProperty(person).setValue((Person) personQuery.getSingleResult()); } else { item.getItemProperty(person).setValue(null); } } }); buttonsLayout.addComponent(commit); discard = new Button("Cancel", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { logger.log(Level.FINEST, "discard clicked."); binder.discard(); } }); buttonsLayout.addComponent(discard); Button create = new Button("Create", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { busyCreatingNewItem = true; newInstance = new mmud.database.entities.game.Event(); newInstance.setOwner(currentUser); newInstance.setCreation(new Date()); item = new BeanItem(newInstance); binder = new FieldGroup(item); binder.setBuffered(true); binder.setEnabled(true); binder.setReadOnly(false); month.setReadOnly(true); month.setEnabled(false); binder.bind(eventid, "eventid"); binder.bind(month, "month"); binder.bind(dayofmonth, "dayofmonth"); binder.bind(hour, "hour"); binder.bind(minute, "minute"); binder.bind(dayofweek, "dayofweek"); // Object itemId = attributes.addEntity(newInstance); // eventsTable.setValue(itemId); } }); buttonsLayout.addComponent(create); Button delete = new Button("Delete", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { attributes.removeItem(eventsTable.getValue()); logBean.writeDeputyLog(currentUser, "Event '" + eventsTable.getValue() + "' deleted."); } }); buttonsLayout.addComponent(delete); disown = new Button("Disown", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { logger.log(Level.FINEST, "disown clicked."); item.getItemProperty("owner").setValue(null); // try // { // binder.commit(); // } catch (FieldGroup.CommitException ex) // { // logger.log(Level.SEVERE, null, ex); // } } }); buttonsLayout.addComponent(disown); } @Override public void valueChange(Property.ValueChangeEvent event) { Object itemId = event.getProperty().getValue(); item = eventsTable.getItem(itemId); boolean entitySelected = item != null; if (entitySelected) { busyCreatingNewItem = false; binder = new FieldGroup(item); binder.setBuffered(true); binder.setEnabled(true); binder.setReadOnly(false); month.setReadOnly(true); month.setEnabled(false); binder.bind(eventid, "eventid"); binder.bind(month, "month"); binder.bind(dayofmonth, "dayofmonth"); binder.bind(hour, "hour"); binder.bind(minute, "minute"); binder.bind(dayofweek, "dayofweek"); Property personProperty = item.getItemProperty("person"); if (personProperty != null && personProperty.getValue() != null) { Person personName = (Person) personProperty.getValue(); person.setValue(personName.getName()); } else { person.setValue(null); } Property roomProperty = item.getItemProperty("room"); if (roomProperty != null && roomProperty.getValue() != null) { Room roomroom = (Room) roomProperty.getValue(); room.setPropertyDataSource(new IntegerProperty(roomroom.getId())); } else { room.setPropertyDataSource(new IntegerProperty()); } Property methodProperty = item.getItemProperty("method"); if (methodProperty != null && methodProperty.getValue() != null) { method.setValue(((Method) methodProperty.getValue()).getName()); } else { method.setValue(null); } Property itemProperty = item.getItemProperty("owner"); boolean enabled = false; if (itemProperty == null || itemProperty.getValue() == null) { owner.setValue(""); enabled = true; } else { Admin admin = (Admin) itemProperty.getValue(); owner.setValue(admin.getName()); if (admin.getName().equals(currentUser.getName())) { enabled = true; } } layout.setEnabled(enabled); } } }