package org.ovirt.engine.ui.common.widget.popup;
import java.util.List;
import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
import org.ovirt.engine.ui.common.presenter.popup.numa.NumaSupportPopupPresenterWidget;
import org.ovirt.engine.ui.common.system.ClientStorage;
import org.ovirt.engine.ui.common.utils.ValidationTabSwitchHelper;
import org.ovirt.engine.ui.common.view.TabbedView;
import org.ovirt.engine.ui.common.widget.HasUiCommandClickHandlers;
import org.ovirt.engine.ui.common.widget.HasValidation;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.models.hosts.numa.NumaSupportModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
import com.google.gwt.event.logical.shared.HasAttachHandlers;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.HasVisibility;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class AbstractVmBasedPopupPresenterWidget<V extends AbstractVmBasedPopupPresenterWidget.ViewDef> extends
AbstractModelBoundPopupPresenterWidget<UnitVmModel, V> {
public interface ViewDef extends AbstractModelBoundPopupPresenterWidget.ViewDef<UnitVmModel>, TabbedView {
void switchMode(boolean isAdvanced);
void initToCreateInstanceMode();
void setSpiceProxyOverrideExplanation(String explanation);
void switchAttachToInstanceType(boolean isAttached);
List<HasValidation> getInvalidWidgets();
HasUiCommandClickHandlers getNumaSupportButton();
}
private final ClientStorage clientStorage;
private Provider<NumaSupportPopupPresenterWidget> numaSupportProvider;
@Inject
public AbstractVmBasedPopupPresenterWidget(EventBus eventBus, V view, ClientStorage clientStorage) {
super(eventBus, view);
this.clientStorage = clientStorage;
}
public AbstractVmBasedPopupPresenterWidget(EventBus eventBus,
V view,
ClientStorage clientStorage,
Provider<NumaSupportPopupPresenterWidget> numaSupportProvider) {
this(eventBus, view, clientStorage);
this.numaSupportProvider = numaSupportProvider;
}
@Override
public void init(UnitVmModel model) {
super.init(model);
initAdvancedModeFromLocalStorage(model);
swithAccordingToMode(model);
initToCreateInstanceMode(model);
initListeners(model);
}
private void initToCreateInstanceMode(UnitVmModel model) {
if (model.isCreateInstanceOnly()) {
// hide the admin-only widgets only for non-admin users
getView().initToCreateInstanceMode();
}
}
@Override
public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(UnitVmModel source,
UICommand lastExecutedCommand,
Model windowModel) {
if (numaSupportProvider != null && windowModel instanceof NumaSupportModel) {
return numaSupportProvider.get();
}
return super.getModelPopup(source, lastExecutedCommand, windowModel);
}
@Override
public void onBind() {
super.onBind();
registerHandler(ValidationTabSwitchHelper.registerValidationHandler((EventBus) getEventBus(), this,
getView()));
}
private void initListeners(final UnitVmModel model) {
model.getAdvancedMode().getPropertyChangedEvent().addListener((ev, sender, args) -> {
storeAdvancedModeToLocalStorage(model);
swithAccordingToMode(model);
});
model.getAttachedToInstanceType().getPropertyChangedEvent().addListener((ev, sender, args) -> swithAttachToInstanceType(model));
model.getValid().getPropertyChangedEvent().addListener((ev, sender, args) -> switchToAdvancedIfNeeded(model));
registerHandler(getView().getNumaSupportButton().addClickHandler(event -> getView().getNumaSupportButton().getCommand().execute()));
}
private void switchToAdvancedIfNeeded(final UnitVmModel model) {
if (model.getAdvancedMode().getEntity() || model.getValid().getEntity()) {
return;
}
List<HasValidation> invalidWidgets = getView().getInvalidWidgets();
if (invalidWidgets.size() == 0) {
return;
}
for (HasValidation invalidWidget : invalidWidgets) {
boolean isVisible = invalidWidget instanceof HasVisibility && ((HasVisibility) invalidWidget).isVisible();
boolean isAttached = invalidWidget instanceof HasAttachHandlers && ((HasAttachHandlers) invalidWidget).isAttached();
if (!isVisible || !isAttached) {
model.getAdvancedMode().setEntity(true);
break;
}
}
}
private void swithAttachToInstanceType(final UnitVmModel model) {
getView().switchAttachToInstanceType(model.getAttachedToInstanceType().getEntity());
}
private void swithAccordingToMode(final UnitVmModel model) {
getView().switchMode(model.getAdvancedMode().getEntity());
}
private void storeAdvancedModeToLocalStorage(UnitVmModel model) {
if (model.getIsAdvancedModeLocalStorageKey() == null) {
return;
}
clientStorage.setLocalItem(model.getIsAdvancedModeLocalStorageKey(), Boolean.toString(model.getAdvancedMode().getEntity()));
}
private void initAdvancedModeFromLocalStorage(UnitVmModel model) {
if (model.getIsAdvancedModeLocalStorageKey() == null) {
return;
}
boolean isAdvancedMode = Boolean.parseBoolean(clientStorage.getLocalItem(model.getIsAdvancedModeLocalStorageKey()));
model.getAdvancedMode().setEntity(isAdvancedMode);
}
}