package de.dhbw.humbuch.view;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.Property.ValueChangeNotifier;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import de.davherrmann.mvvm.ActionHandler;
import de.davherrmann.mvvm.ActionWrapper;
import de.davherrmann.mvvm.SourceWrapper;
import de.davherrmann.mvvm.State;
import de.davherrmann.mvvm.StateChangeListener;
import de.davherrmann.mvvm.StateChangeWrapper;
import de.davherrmann.mvvm.ViewModelComposer;
/**
* Configures the MVVM binding between Views and ViewModels during instantiation
*
* @author davherrmann
*/
public class MVVMConfig {
private final static Logger LOG = LoggerFactory
.getLogger(MVVMConfig.class);
@Inject
public MVVMConfig(ViewModelComposer viewModelComposer) {
viewModelComposer.addStateChangeWrapper(AbstractField.class,
new StateChangeWrapper() {
@Override
public StateChangeListener getStateChangeListener(
final Object notified) {
return new StateChangeListener() {
@SuppressWarnings("unchecked")
@Override
public void stateChange(Object value) {
((AbstractField<Object>) notified)
.setValue(value);
}
};
}
});
viewModelComposer.addSourceWrapper(AbstractField.class,
new SourceWrapper<Object>() {
@SuppressWarnings("unchecked")
@Override
public Object get(Object source) {
return ((AbstractField<Object>) source).getValue();
}
});
viewModelComposer.addSourceWrapper(State.class,
new SourceWrapper<Object>() {
@SuppressWarnings("unchecked")
@Override
public Object get(Object source) {
return ((State<Object>) source).get();
}
});
viewModelComposer.addActionWrapper(ValueChangeNotifier.class,
new ActionWrapper() {
@Override
public void addActionHandler(Object notifier,
final ActionHandler actionHandler) {
((ValueChangeNotifier) notifier)
.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -854400079672018869L;
@Override
public void valueChange(
ValueChangeEvent event) {
try {
actionHandler.handle(event
.getProperty().getValue());
} catch (UnsupportedOperationException e) {
LOG.error("valueChange error", e);
}
}
});
}
});
viewModelComposer.addActionWrapper(Button.class, new ActionWrapper() {
@Override
public void addActionHandler(Object notifier,
final ActionHandler actionHandler) {
((Button) notifier).addClickListener(new ClickListener() {
private static final long serialVersionUID = 3154305342571215268L;
@Override
public void buttonClick(ClickEvent event) {
actionHandler.handle(event.getButton().getData());
}
});
}
});
viewModelComposer.addStateChangeWrapper(State.class,
new StateChangeWrapper() {
@Override
public StateChangeListener getStateChangeListener(
final Object notified) {
return new StateChangeListener() {
@SuppressWarnings("unchecked")
@Override
public void stateChange(Object value) {
((State<Object>) notified).set(value);
}
};
}
});
}
}