package org.ovirt.engine.ui.webadmin.editor;
import java.util.Map;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.core.compat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.editor.client.impl.BaseEditorDriver;
/**
* A base implementation class for generated SimpleBeanEditorDriver implementations based on EntityModel and ListModel
* instances.
*
* @param <T>
* the type being edited
* @param <E>
* the Editor type
*/
public abstract class AbstractUiCommonModelEditorDriver<T extends Model, E extends Editor<T>>
extends BaseEditorDriver<T, E> implements SimpleBeanEditorDriver<T, E> {
/**
* {@inheritDoc} <BR>
* Register listeners for EntityModel changes, according to the Event Map created by the Driver
*/
@Override
public void edit(T object) {
doEdit(object);
final UiCommonListenerMap listenerMap = getListenerMap();
// Register a "PropertyChangedEvent" to get Model changes
object.getPropertyChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
String propName = ((PropertyChangedEventArgs) args).PropertyName;
listenerMap.callListener(propName, "PropertyChanged");
}
});
// Visit editors
accept(new UiCommonEditorVisitor<T>(getEventMap(), getOwnerModels()));
}
@Override
public T flush() {
doFlush();
return getObject();
}
@Override
public void initialize(E editor) {
doInitialize(editor);
}
/**
* Returns a {@link UiCommonListenerMap} that contains a PropertyChanged Listener for each Property in the edited
* Model
*
* @return
*/
protected abstract UiCommonListenerMap getListenerMap();
/**
* Returns a {@link UiCommonEventMap} for the edited Model
*
* @return
*/
protected abstract UiCommonEventMap getEventMap();
/**
* Returns a Map of the parent ListModel for all the ListModelBoxes being edited.
*
* @param absolutePath
* @return
*/
protected abstract Map<String, EntityModel> getOwnerModels();
}