package enterpriseapp.ui.crud;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.exception.ConstraintViolationException;
import org.vaadin.dialogs.ConfirmDialog;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.util.BeanItem;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.event.ShortcutAction;
import com.vaadin.server.UserError;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Notification;
import enterpriseapp.Utils;
import enterpriseapp.hibernate.CustomHbnContainer.EntityItem;
import enterpriseapp.hibernate.dto.Dto;
import enterpriseapp.hibernate.exception.CrudException;
import enterpriseapp.ui.Constants;
/**
* This class listen to CRUD events and performs actions on CrudComponent.
*
* @author Alejandro Duarte
*
* @param <T> Entity class.
*/
public class CrudListener<T extends Dto> implements ValueChangeListener, ItemClickListener, ClickListener, Handler {
private static final long serialVersionUID = 1L;
public final Action ACTION_REFRESH = new Action(Constants.uiRefresh);
public final Action ACTION_EXPORT_TO_EXCEL = new Action(Constants.uiExportToExcel);
public final ShortcutAction ACTION_IMPORT_FROM_CLIPBOARD = new ShortcutAction(Constants.uiImportFromClipboard + "", ShortcutAction.KeyCode.V, new int[] {ShortcutAction.ModifierKey.CTRL});
public final Action ACTION_SHOW_COUNT = new Action(Constants.uiShowCount);
protected CrudComponent<T> crudComponent;
/**
* @param crudComponent CrudComponent to listen to.
*/
public CrudListener(CrudComponent<T> crudComponent) {
this.crudComponent = crudComponent;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void valueChange(ValueChangeEvent event) {
Set<T> set = (Set<T>) crudComponent.table.getValue();
if(set.size() == 0) {
crudComponent.form.setItemDataSource(null);
} else if(set.size() == 1) {
Item item = crudComponent.getNewInstanceOfContainer().getItem(set.iterator().next());
if(item instanceof EntityItem) {
EntityItem entityItem = (EntityItem) item;
T pojo = (T) entityItem.getPojo();
item = new BeanItem<T>(pojo);
}
crudComponent.form.setItemDataSource(item);
crudComponent.form.setReadOnly(true);
} else {
crudComponent.form.setItemDataSource(null);
crudComponent.form.setReadOnly(true);
crudComponent.form.deleteButton.setVisible(true);
}
crudComponent.table.refreshRowCache();
}
@Override
public void itemClick(ItemClickEvent event) {
if(event.isDoubleClick() && !crudComponent.isReadOnly()) {
crudComponent.table.setValue(event.getItemId());
formUpdateButtonClicked();
}
}
@Override
public void buttonClick(ClickEvent event) {
if(event.getButton().equals(crudComponent.form.newButton)) {
formNewButtonClicked();
} else if(event.getButton().equals(crudComponent.table.newButton)) {
tableNewButtonClicked();
} else if(event.getButton().equals(crudComponent.form.updateButton)) {
formUpdateButtonClicked();
} else if(event.getButton().equals(crudComponent.form.deleteButton)) {
formDeleteButtonClicked();
} else if(event.getButton().equals(crudComponent.table.deleteButton)) {
tableDeleteButtonClicked();
} else if(event.getButton().equals(crudComponent.form.saveButton)) {
formSaveButtonClicked(true);
} else if(event.getButton().equals(crudComponent.form.cancelButton)) {
cancelButtonClicked();
} else if(event.getButton().equals(crudComponent.form.firstButton)) {
firstButtonClicked();
} else if(event.getButton().equals(crudComponent.form.previousButton)) {
previousButtonClicked();
} else if(event.getButton().equals(crudComponent.form.nextButton)) {
nextButtonClicked();
} else if(event.getButton().equals(crudComponent.form.lastButton)) {
lastButtonClicked();
}
}
@Override
public Action[] getActions(Object target, Object sender) {
Action[] actions;
if(crudComponent.isReadOnly()) {
actions = new Action[] {
ACTION_REFRESH,
ACTION_EXPORT_TO_EXCEL,
ACTION_SHOW_COUNT
};
} else {
actions = new Action[] {
ACTION_REFRESH,
ACTION_IMPORT_FROM_CLIPBOARD,
ACTION_EXPORT_TO_EXCEL,
ACTION_SHOW_COUNT
};
}
return actions;
}
@Override
public void handleAction(Action action, Object sender, Object target) {
if(action == ACTION_REFRESH) {
crudComponent.table.updateTable();
} else if(action == ACTION_EXPORT_TO_EXCEL) {
crudComponent.exportToExcel();
} else if(action == ACTION_IMPORT_FROM_CLIPBOARD) {
if(!crudComponent.getTable().isReadOnly()) {
crudComponent.showImportFromClipboardWindow();
}
} else if(action == ACTION_SHOW_COUNT) {
crudComponent.showCount();
}
}
/**
* Called when Form's "new" button is clicked.
*/
public void formNewButtonClicked() {
try {
crudComponent.table.setValue(null);
crudComponent.form.setItemDataSource(new BeanItem<T>(crudComponent.type.newInstance()));
crudComponent.form.setReadOnly(false);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* Called when Table's "new" button is clicked.
*/
public void tableNewButtonClicked() {
crudComponent.getContainer().addItem(null);
}
/**
* Called when the Form's "delete" button is clicked.
*/
public void formDeleteButtonClicked() {
Utils.yesNoDialog(crudComponent, Constants.uiConfirmDeletion, new ConfirmDialog.Listener() {
public void onClose(ConfirmDialog dialog) {
try {
if(dialog.isConfirmed()) {
crudComponent.remove(crudComponent.form.getItemDataSource());
Notification.show(Constants.uiDeleted);
cancelButtonClicked();
}
} catch(ConstraintViolationException e) {
crudComponent.form.setComponentError(new UserError(Constants.uiConstraintViolationErrorOnDelete));
} catch(CrudException e) {
crudComponent.form.setComponentError(new UserError(e.getMessage()));
}
}
});
}
/**
* Called when Table's "delete" button is clicked.
*/
public void tableDeleteButtonClicked() {
crudComponent.remove(null);
}
/**
* Called when the Form's "save" button is clicked.
* @param showNotification if true, a notification will be shown to the user.
* @return true if the value is saved.
*/
public boolean formSaveButtonClicked(boolean showNotification) {
try {
crudComponent.form.setComponentError(null);
crudComponent.form.commit();
crudComponent.saveOrUpdate((T) crudComponent.form.getItemDataSource().getBean());
crudComponent.form.setReadOnly(true);
if(showNotification) {
Notification.show(Constants.uiSaved);
}
} catch(InvalidValueException e) {
return false;
} catch(ConstraintViolationException e) {
crudComponent.form.setComponentError(new UserError(Constants.uiConstraintViolationErrorOnSave));
return false;
} catch(CrudException e) {
crudComponent.form.setComponentError(new UserError(e.getMessage()));
return false;
}
return true;
}
/**
* Called when Form's "cancel" button is clicked.
*/
public void cancelButtonClicked() {
crudComponent.form.discard();
if(crudComponent.form != null && crudComponent.form.getItemDataSource() != null) {
T bean = crudComponent.form.getItemDataSource().getBean();
if(bean == null || bean.getId() == null) {
crudComponent.form.setItemDataSource(null);
}
}
crudComponent.form.setReadOnly(true);
}
public void firstButtonClicked() {
HashSet<Object> value = new HashSet<Object>();
value.add(crudComponent.table.firstItemId());
crudComponent.table.setValue(value);
}
@SuppressWarnings("rawtypes")
public void previousButtonClicked() {
Set set = (Set) crudComponent.table.getValue();
if(set != null && !set.isEmpty()) {
Object id = set.iterator().next();
Object prevItemId = crudComponent.table.prevItemId(id);
prevItemId = crudComponent.table.prevItemId(id); // needed, wierd bug
if(prevItemId != null) {
HashSet<Object> value = new HashSet<Object>();
value.add(prevItemId);
crudComponent.table.setValue(value);
}
}
}
@SuppressWarnings("rawtypes")
public void nextButtonClicked() {
Set set = (Set) crudComponent.table.getValue();
if(set != null && !set.isEmpty()) {
Object id = set.iterator().next();
Object nextItemId = crudComponent.table.nextItemId(id);
nextItemId = crudComponent.table.nextItemId(id); // needed, wierd bug
if(nextItemId != null) {
HashSet<Object> value = new HashSet<Object>();
value.add(nextItemId);
crudComponent.table.setValue(value);
}
}
}
public void lastButtonClicked() {
HashSet<Object> value = new HashSet<Object>();
value.add(crudComponent.table.lastItemId());
crudComponent.table.setValue(value);
}
/**
* Called when Form's "update" button is clicked.
*/
public void formUpdateButtonClicked() {
if(!crudComponent.getForm().hideUpdateButton) {
crudComponent.form.setReadOnly(false);
}
}
}