package org.ovirt.engine.ui.common.widget.uicommon.popup;
import java.util.Set;
import org.gwtbootstrap3.client.ui.TabListItem;
import org.ovirt.engine.ui.common.widget.VisibilityRenderer;
import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab;
import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel;
import org.ovirt.engine.ui.common.widget.uicommon.popup.vm.PopupWidgetConfig;
import org.ovirt.engine.ui.common.widget.uicommon.popup.vm.PopupWidgetConfigMap;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import com.google.gwt.user.client.ui.Widget;
public abstract class AbstractModeSwitchingPopupWidget<T extends Model> extends AbstractModelBoundPopupWidget<T> {
private PopupWidgetConfigMap widgetConfiguration;
private boolean createInstanceMode = false;
private T model;
// the tab which is always here
private DialogTab defaultTab;
protected void initializeModeSwitching(DialogTab defaultTab) {
this.defaultTab = defaultTab;
widgetConfiguration = createWidgetConfiguration();
}
protected PopupWidgetConfigMap createWidgetConfiguration() {
// by default empty
return new PopupWidgetConfigMap();
}
protected void hideAlwaysHiddenFields() {
for (Widget hiddenWidget : widgetConfiguration.getAlwaysHidden().keySet()) {
hiddenWidget.setVisible(false);
}
}
public void switchMode(boolean advanced) {
Set<Widget> allConfiguredWidgets = widgetConfiguration.getAll().keySet();
for (Widget widget : allConfiguredWidgets) {
widget.setVisible(widgetConfiguration.get(widget).isCurrentlyVisible(advanced, createInstanceMode));
}
TabListItem activeTab = ((DialogTabPanel) getWidget()).getActiveTab();
// select the first tab if the selected tab has been hidden
if (!advanced && widgetConfiguration.getVisibleInAdvanceMode().keySet().contains(activeTab)) {
((DialogTabPanel) getWidget()).switchTab(defaultTab);
}
}
protected void changeApplicationLevelVisibility(Widget widget, boolean visible) {
widget.setVisible(evaluateNewVisibility(widget, visible));
}
private boolean evaluateNewVisibility(Widget source, boolean desiredVisibility) {
// it is not configured explicitly - change to the desired visibility and terminate
if (!widgetConfiguration.containsKey(source)) {
return desiredVisibility;
}
// it is always hidden, ignore any app change
PopupWidgetConfig vmPopupWidgetConfig = widgetConfiguration.get(source);
if (vmPopupWidgetConfig.isAlwaysHidden()) {
return false;
}
vmPopupWidgetConfig.setApplicationLevelVisible(desiredVisibility);
boolean advancedMode = model.getAdvancedMode().getEntity();
return vmPopupWidgetConfig.isCurrentlyVisible(advancedMode, createInstanceMode);
}
@Override
public void edit(T model) {
this.model = model;
}
class ModeSwitchingVisibilityRenderer implements VisibilityRenderer {
@Override
public boolean render(Widget source, boolean desiredVisibility) {
return evaluateNewVisibility(source, desiredVisibility);
}
}
public PopupWidgetConfigMap getWidgetConfiguration() {
return widgetConfiguration;
}
public void setCreateInstanceMode(boolean createInstanceMode) {
this.createInstanceMode = createInstanceMode;
}
}