/*
* Copyright (C) 2015 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.grocery.client.local;
import static com.google.gwt.dom.client.Style.Unit.PX;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.validation.Validator;
import org.jboss.errai.databinding.client.api.DataBinder;
import org.jboss.errai.databinding.client.api.StateSync;
import org.jboss.errai.demo.grocery.client.shared.Department;
import org.jboss.errai.demo.grocery.client.shared.GroceryList;
import org.jboss.errai.demo.grocery.client.shared.Item;
import org.jboss.errai.demo.grocery.client.shared.User;
import org.jboss.errai.ui.shared.api.annotations.AutoBound;
import org.jboss.errai.ui.shared.api.annotations.Bound;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import com.google.gwt.animation.client.Animation;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextBox;
public abstract class Form extends Composite {
@Inject
protected EntityManager em;
@Inject
protected Validator validator;
@Inject
protected User user;
@Inject
protected GroceryList groceryList;
@Inject
@AutoBound
protected DataBinder<Item> itemBinder;
@Inject
@DataField
protected Label overallErrorMessage;
@Inject
@Bound
@DataField
protected SuggestBox name;
@Inject
@Bound
@DataField
protected TextBox comment;
@Inject
@Bound(property = "department.name")
@DataField
protected SuggestBox department;
@Inject
@DataField
protected Button saveButton;
@Inject
@DataField
protected Button clearButton;
@DataField
protected Element otherFields = DOM.createDiv();
protected Runnable afterSaveAction;
protected HandlerRegistration handlerRegistration;
public Form() {
super();
}
@PostConstruct
protected void setupSuggestions() {
MultiWordSuggestOracle iso = (MultiWordSuggestOracle) name.getSuggestOracle();
for (Item i : em.createNamedQuery("allItems", Item.class).getResultList()) {
iso.add(i.getName());
}
MultiWordSuggestOracle dso = (MultiWordSuggestOracle) department.getSuggestOracle();
for (Department d : em.createNamedQuery("allDepartments", Department.class).getResultList()) {
dso.add(d.getName());
}
name.getValueBox().addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
if ("0px".equals(otherFields.getStyle().getHeight())) {
new Animation() {
@Override
protected void onUpdate(double progress) {
otherFields.getStyle().setHeight(Window.getClientWidth() > 768 ? 215 : 145 * progress, PX);
}
}.run(1000);
}
}
});
hideOtherFields();
handlerRegistration = addEnterKeyHandler();
}
@PreDestroy
void cleanup() {
itemBinder.unbind();
handlerRegistration.removeHandler();
}
@EventHandler("saveButton")
public abstract void onSaveButtonClicked(ClickEvent event);
@EventHandler("clearButton")
public abstract void onClearButtonClicked(ClickEvent event);
protected void onNewItem(@Observes Item newItem) {
System.out.println("ItemForm@" + System.identityHashCode(this) + " got new item event");
((MultiWordSuggestOracle) name.getSuggestOracle()).add(newItem.getName());
}
/**
* Gives keyboard focus to the appropriate widget in this form.
*/
protected void grabKeyboardFocus() {
name.setFocus(true);
}
protected void hideOtherFields() {
otherFields.getStyle().setHeight(0, PX);
}
protected HandlerRegistration addEnterKeyHandler() {
return this.addDomHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER)
saveButton.click();
}
}, KeyUpEvent.getType());
}
protected boolean isValidName() {
if (name.getText() == null)
return false;
else if (name.getText().isEmpty())
return false;
else if (name.getText().matches(".*\\w.*")) //if name.getText() contains at least one word character
return true;
return false;
}
public void setItem(Item item) {
if (item.getDepartment() == null) {
item.setDepartment(new Department());
}
itemBinder.setModel(item, StateSync.FROM_MODEL);
}
/**
* Returns the store instance that is permanently associated with this form. The returned instance is bound to this
* store's fields: updates to the form fields will cause matching updates in the returned object's state, and
* vice-versa.
*
* @return the Item instance that is bound to the fields of this form.
*/
public Item getItem() {
return itemBinder.getModel();
}
public DataBinder<Item> getItemBinder() {
return itemBinder;
}
}