/*
* Copyright (C) 2013 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.demo.jpa.client.local;
import javax.persistence.EntityManager;
import org.jboss.errai.demo.jpa.client.shared.Album;
import org.jboss.errai.demo.jpa.client.shared.Artist;
import org.jboss.errai.demo.jpa.client.shared.Format;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.datepicker.client.DatePicker;
/**
* A form for editing an instance of Album.
*
* @author Jonathan Fuerth <jfuerth@gmail.com>
*/
public class AlbumForm extends Composite {
// Note: for simplicity, and to keep this JPA demo on-topic, we are using
// plain GWT programmatic layout rather than ErraiUI, UIBinder, or Errai Data
// Binding. See the grocery list demo for the full-on Errai development experience.
private final EntityManager em;
private final Album album;
private final TextBox name = new TextBox();
private final ListBox artist = new ListBox();
private final ListBox format = new ListBox();
private final DatePicker releaseDate = new DatePickerWithYearSelector();
private final Button saveButton = new Button("Save");
private RowOperationHandler<Album> saveHandler;
public AlbumForm(final Album album, EntityManager em) {
this.album = album;
this.em = em;
for (Artist a : em.createNamedQuery("allArtistsByName", Artist.class).getResultList()) {
artist.addItem(a.getName(), String.valueOf(a.getId()));
}
for (Format f : Format.values()) {
format.addItem(f.name());
}
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
updateAlbumFromUI();
if (saveHandler != null) {
saveHandler.handle(album);
}
}
});
updateUIFromAlbum();
final Grid g = new Grid(5, 2);
int row = 0;
g.setText(row, 0, "Name:");
g.setWidget(row, 1, name);
row++;
g.setText(row, 0, "Artist:");
g.setWidget(row, 1, artist);
row++;
g.setText(row, 0, "Format:");
g.setWidget(row, 1, format);
row++;
g.setText(row, 0, "Release Date:");
g.setWidget(row, 1, releaseDate);
row++;
g.setWidget(row, 1, saveButton);
initWidget(g);
}
protected void updateAlbumFromUI() {
album.setName(name.getText());
long artistId = Long.parseLong(artist.getValue(artist.getSelectedIndex()));
album.setArtist(em.find(Artist.class, artistId));
album.setFormat(Format.valueOf(format.getValue(format.getSelectedIndex())));
album.setReleaseDate(releaseDate.getValue());
}
private void updateUIFromAlbum() {
// Note: with Errai Data Sync, the code in this method would be unnecessary. See the Grocery List demo for an example.
name.setText(album.getName());
if (album.getArtist() != null) {
for (int i = 0; i < artist.getItemCount(); i++) {
if (Long.parseLong(artist.getValue(i)) == album.getArtist().getId()) {
artist.setSelectedIndex(i);
}
}
}
if (album.getFormat() != null) {
format.setSelectedIndex(album.getFormat().ordinal());
}
else {
format.setSelectedIndex(Format.LP.ordinal());
}
if (album.getReleaseDate() != null) {
releaseDate.setValue(album.getReleaseDate());
releaseDate.setCurrentMonth(album.getReleaseDate());
}
}
public void setSaveHandler(RowOperationHandler<Album> handler) {
this.saveHandler = handler;
}
public void grabFocus() {
name.setFocus(true);
}
}