package org.ovirt.engine.ui.common.editor; import java.util.Map; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import com.google.gwt.editor.client.Editor; import com.google.gwt.editor.client.EditorVisitor; import com.google.gwt.editor.client.impl.BaseEditorDriver; /** * Base class for generated UiCommonEditorDriver implementations for editing 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 UiCommonEditorDriver<T, E> { private IEventListener<PropertyChangedEventArgs> propertyChangeListener; private EditorVisitor visitor; /** * {@inheritDoc} <BR> * Register listeners for EntityModel changes, according to the Event Map created by the Driver */ @Override public void edit(T object) { doEdit(object); if (propertyChangeListener != null) { object.getPropertyChangedEvent().removeListener(propertyChangeListener); } final UiCommonListenerMap listenerMap = getListenerMap(); propertyChangeListener = (ev, sender, args) -> { String propName = args.propertyName; listenerMap.callListener(propName, "PropertyChanged"); //$NON-NLS-1$ }; // Register a "PropertyChangedEvent" to get Model changes object.getPropertyChangedEvent().addListener(propertyChangeListener); accept(getEditorVisitor()); } /** * Get the {@code EditorVisitor}, creating one if it doesn't exist yet. * @return THe {@code EditorVisitor} */ protected EditorVisitor getEditorVisitor() { // Visit editors if (visitor == null) { visitor = new UiCommonEditorVisitor<>(getEventMap(), getOwnerModels()); } return visitor; } @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 */ protected abstract UiCommonListenerMap getListenerMap(); /** * Returns a {@link UiCommonEventMap} for the edited Model */ protected abstract UiCommonEventMap getEventMap(); /** * Returns a Map of the parent ListModel for all the ListModelBoxes being edited. */ protected abstract Map<String, Model> getOwnerModels(); }