/* * 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.Filter; 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.ComboBox; 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.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.persistence.NoResultException; import javax.persistence.Query; import mmud.database.entities.game.Admin; import mmud.database.entities.game.Area; import mmud.database.entities.game.Room; import mmud.rest.services.LogBean; /** * * @author maartenl */ public class Rooms extends VerticalLayout implements Property.ValueChangeListener { private static final Logger logger = Logger.getLogger(Rooms.class.getName()); private final CheckBox filterOnOwner; private final Table roomsTable; 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.Room newInstance; private final TextField id; private final TextField picture; private final TextField title; private final TextArea contents; private final ComboBox area; private final TextField north; private final TextField south; private final TextField east; private final TextField west; private final TextField up; private final TextField down; private final LogBean logBean; Rooms(final Admin currentUser, final LogBean logBean) { this.currentUser = currentUser; this.logBean = logBean; final JPAContainer<mmud.database.entities.game.Room> attributes = Utilities.getJPAContainer(mmud.database.entities.game.Room.class); final Filter filter = new Compare.Equal("owner", currentUser); 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); } } }); addComponent(filterOnOwner); Panel tablePanel = new Panel(); addComponent(tablePanel); roomsTable = new Table("Rooms", attributes); roomsTable.setVisibleColumns("id", "title", "area", "owner", "creation"); Utilities.setTableSize(roomsTable); roomsTable.setSelectable(true); roomsTable.addValueChangeListener(this); roomsTable.setImmediate(true); tablePanel.setContent(roomsTable); Panel formPanel = new Panel(); addComponent(formPanel); layout = new FormLayout(); formPanel.setContent(layout); id = new TextField("Roomid"); id.setReadOnly(true); id.setEnabled(false); layout.addComponent(id); picture = new TextField("Picture"); picture.setWidth(50, Sizeable.Unit.EM); layout.addComponent(picture); title = new TextField("Title"); title.setWidth(50, Sizeable.Unit.EM); layout.addComponent(title); // Create a selection component area = new ComboBox("Area"); // Add items with given item IDs Query areas = attributes.getEntityProvider().getEntityManager().createNamedQuery("Area.findAll"); List<Area> foundareas = areas.getResultList(); for (Area found : foundareas) { area.addItem(found.getArea()); } layout.addComponent(area); contents = new TextArea("Description"); contents.setRows(15); contents.setWidth(80, Sizeable.Unit.EM); layout.addComponent(contents); north = new TextField("North", new IntegerProperty()); north.setConverter(new StringToIntegerConverter()); layout.addComponent(north); south = new TextField("South", new IntegerProperty()); south.setConverter(new StringToIntegerConverter()); layout.addComponent(south); east = new TextField("East", new IntegerProperty()); east.setConverter(new StringToIntegerConverter()); layout.addComponent(east); west = new TextField("West", new IntegerProperty()); west.setConverter(new StringToIntegerConverter()); layout.addComponent(west); up = new TextField("Up", new IntegerProperty()); up.setConverter(new StringToIntegerConverter()); layout.addComponent(up); down = new TextField("Down", new IntegerProperty()); down.setConverter(new StringToIntegerConverter()); layout.addComponent(down); 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 areaname = (String) area.getValue(); Query areaQuery = attributes.getEntityProvider().getEntityManager().createNamedQuery("Area.findByArea"); areaQuery.setParameter("area", areaname); try { Area foundArea = (Area) areaQuery.getSingleResult(); item.getItemProperty("area").setValue(foundArea); } catch (NoResultException e) { // so we have no area, no problem. } setRoom("north", north, item); setRoom("south", south, item); setRoom("west", west, item); setRoom("east", east, item); setRoom("up", up, item); setRoom("down", down, item); try { binder.commit(); if (busyCreatingNewItem == true) { Object itemId = attributes.addEntity(newInstance); roomsTable.setValue(itemId); logBean.writeDeputyLog(currentUser, "New room '" + itemId + "' created."); } else { logBean.writeDeputyLog(currentUser, "Room '" + roomsTable.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 { 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); } } }); 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 Room(); newInstance.setOwner(currentUser); newInstance.setCreation(new Date()); item = new BeanItem(newInstance); binder = new FieldGroup(item); binder.setBuffered(true); binder.setEnabled(true); binder.setReadOnly(false); binder.bind(id, "id"); binder.bind(title, "title"); binder.bind(picture, "picture"); //binder.bind(area, "area"); binder.bind(contents, "contents"); // Object itemId = attributes.addEntity(newInstance); // roomsTable.setValue(itemId); } }); buttonsLayout.addComponent(create); Button delete = new Button("Delete", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { attributes.removeItem(roomsTable.getValue()); logBean.writeDeputyLog(currentUser, "Room '" + roomsTable.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 = roomsTable.getItem(itemId); boolean entitySelected = item != null; if (entitySelected) { busyCreatingNewItem = false; binder = new FieldGroup(item); binder.setBuffered(true); binder.setEnabled(true); binder.setReadOnly(false); binder.bind(id, "id"); binder.bind(title, "title"); binder.bind(picture, "picture"); //binder.bind(area, "area"); Property northProperty = item.getItemProperty("north"); if (northProperty != null && northProperty.getValue() != null) { Room room = (Room) northProperty.getValue(); north.setPropertyDataSource(new IntegerProperty(room.getId())); } else { north.setPropertyDataSource(new IntegerProperty()); } Property southProperty = item.getItemProperty("south"); if (southProperty != null && southProperty.getValue() != null) { Room room = (Room) southProperty.getValue(); south.setPropertyDataSource(new IntegerProperty(room.getId())); } else { south.setPropertyDataSource(new IntegerProperty()); } Property westProperty = item.getItemProperty("west"); if (westProperty != null && westProperty.getValue() != null) { Room room = (Room) westProperty.getValue(); west.setPropertyDataSource(new IntegerProperty(room.getId())); } else { west.setPropertyDataSource(new IntegerProperty()); } Property eastProperty = item.getItemProperty("east"); if (eastProperty != null && eastProperty.getValue() != null) { Room room = (Room) eastProperty.getValue(); east.setPropertyDataSource(new IntegerProperty(room.getId())); } else { east.setPropertyDataSource(new IntegerProperty()); } Property upProperty = item.getItemProperty("up"); if (upProperty != null && upProperty.getValue() != null) { Room room = (Room) upProperty.getValue(); up.setPropertyDataSource(new IntegerProperty(room.getId())); } else { up.setPropertyDataSource(new IntegerProperty()); } Property downProperty = item.getItemProperty("down"); if (downProperty != null && downProperty.getValue() != null) { Room room = (Room) downProperty.getValue(); down.setPropertyDataSource(new IntegerProperty(room.getId())); } else { down.setPropertyDataSource(new IntegerProperty()); } Property areaProperty = item.getItemProperty("area"); if (areaProperty != null && areaProperty.getValue() != null) { area.setValue(((Area) areaProperty.getValue()).getArea()); } else { area.setValue(null); } binder.bind(contents, "contents"); 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); } } }