package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
import org.gwtbootstrap3.client.ui.Alert;
import org.gwtbootstrap3.client.ui.Container;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.profiles.CpuProfile;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.ui.common.CommonApplicationTemplates;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.gin.AssetProvider;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.widget.Align;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.ListModelTypeAheadListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.renderer.NameRenderer;
import org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractModelBoundPopupWidget;
import org.ovirt.engine.ui.common.widget.uicommon.storage.DisksAllocationView;
import org.ovirt.engine.ui.uicommonweb.models.vms.DataCenterWithCluster;
import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
public class VmMakeTemplatePopupWidget extends AbstractModelBoundPopupWidget<UnitVmModel> {
interface Driver extends UiCommonEditorDriver<UnitVmModel, VmMakeTemplatePopupWidget> {
}
interface ViewUiBinder extends UiBinder<Container, VmMakeTemplatePopupWidget> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<VmMakeTemplatePopupWidget> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
@UiField
@Path(value = "name.entity")
@WithElementId("name")
StringEntityModelTextBoxEditor nameEditor;
@UiField
@Path(value = "description.entity")
@WithElementId("description")
StringEntityModelTextBoxEditor descriptionEditor;
@UiField
@Path(value = "comment.entity")
@WithElementId("comment")
StringEntityModelTextBoxEditor commentEditor;
@UiField(provided = true)
@Path(value = "dataCenterWithClustersList.selectedItem")
@WithElementId("dataCenterWithCluster")
public ListModelTypeAheadListBoxEditor<DataCenterWithCluster> clusterEditor;
@UiField(provided = true)
@Path(value = "isSubTemplate.entity")
@WithElementId("isSubTemplate")
EntityModelCheckBoxEditor isSubTemplateEditor;
@UiField
@Ignore
Panel subTemplateExpanderContent;
@UiField(provided = true)
@Path(value = "baseTemplate.selectedItem")
@WithElementId("baseTemplate")
public ListModelTypeAheadListBoxEditor<VmTemplate> baseTemplateEditor;
@UiField
@Path(value = "templateVersionName.entity")
@WithElementId("templateVersionName")
StringEntityModelTextBoxEditor templateVersionNameEditor;
@UiField(provided = true)
@Ignore
@WithElementId("disksAllocation")
DisksAllocationView disksAllocationView;
@UiField(provided = true)
@Path(value = "quota.selectedItem")
@WithElementId("quota")
ListModelListBoxEditor<Quota> quotaEditor;
@UiField(provided = true)
@Path(value = "isTemplatePublic.entity")
@WithElementId("isTemplatePublic")
EntityModelCheckBoxEditor isTemplatePublicEditor;
@UiField(provided = true)
@Path(value = "copyPermissions.entity")
@WithElementId("copyVmPermissions")
EntityModelCheckBoxEditor copyVmPermissions;
@UiField(provided = true)
@Path(value = "sealTemplate.entity")
@WithElementId("sealTemplate")
EntityModelCheckBoxEditor sealTemplateEditor;
@UiField(provided = true)
@Path(value = "cpuProfiles.selectedItem")
@WithElementId("cpuProfiles")
public ListModelListBoxEditor<CpuProfile> cpuProfilesEditor;
@UiField
@Ignore
Alert messagePanel;
private final Driver driver = GWT.create(Driver.class);
private static final CommonApplicationTemplates templates = AssetProvider.getTemplates();
public VmMakeTemplatePopupWidget() {
initListBoxEditors();
initCheckBoxEditors();
disksAllocationView = new DisksAllocationView();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
ViewIdHandler.idHandler.generateAndSetIds(this);
driver.initialize(this);
}
void initListBoxEditors() {
clusterEditor = new ListModelTypeAheadListBoxEditor<>(
new ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<DataCenterWithCluster>() {
@Override
public String getReplacementStringNullSafe(DataCenterWithCluster data) {
return data.getCluster().getName() + "/" //$NON-NLS-1$
+ data.getDataCenter().getName();
}
@Override
public String getDisplayStringNullSafe(DataCenterWithCluster data) {
String clusterName = data.getCluster().getName();
String dcName = data.getDataCenter().getName();
String dcDescription = data.getDataCenter().getdescription();
// description takes priority
String dcString = !StringHelper.isNullOrEmpty(dcDescription) ? dcDescription : dcName;
return templates.typeAheadNameDescription(clusterName == null ? "" : clusterName,
dcString == null ? "" : dcName).asString();
}
});
quotaEditor = new ListModelListBoxEditor<>(new NameRenderer<Quota>());
baseTemplateEditor = new ListModelTypeAheadListBoxEditor<>(
new ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate>() {
@Override
public String getReplacementStringNullSafe(VmTemplate data) {
return data.getName();
}
@Override
public String getDisplayStringNullSafe(VmTemplate data) {
return typeAheadNameDescriptionTemplateNullSafe(
data.getName(),
data.getDescription()
);
}
});
cpuProfilesEditor = new ListModelListBoxEditor<>(new NameRenderer<CpuProfile>());
}
private String typeAheadNameDescriptionTemplateNullSafe(String name, String description) {
return templates.typeAheadNameDescription(
name != null ? name : "",
description != null ? description : "")
.asString();
}
void initCheckBoxEditors() {
isTemplatePublicEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
copyVmPermissions = new EntityModelCheckBoxEditor(Align.RIGHT);
sealTemplateEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
isSubTemplateEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
}
@Override
public void edit(final UnitVmModel model) {
driver.edit(model);
model.getStorageDomain().getItemsChangedEvent().addListener((ev, sender, args) -> addDiskAllocation(model));
model.getPropertyChangedEvent().addListener((ev, sender, args) -> {
String propName = args.propertyName;
if ("Message".equals(propName)) { //$NON-NLS-1$
appendMessage(model.getMessage());
}
});
subTemplateExpanderContent.setVisible(false);
model.getIsSubTemplate().getEntityChangedEvent().addListener((ev, sender, args) -> subTemplateExpanderContent.setVisible(model.getIsSubTemplate().getEntity()));
}
private void addDiskAllocation(UnitVmModel model) {
if (model.getDisks().size() > 0) {
disksAllocationView.edit(model.getDisksAllocationModel());
model.getDisksAllocationModel().setDisks(model.getDisks());
}
}
@Override
public UnitVmModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
@Override
public void focusInput() {
nameEditor.setFocus(true);
}
@Override
public int setTabIndexes(int nextTabIndex) {
nameEditor.setTabIndex(nextTabIndex++);
descriptionEditor.setTabIndex(nextTabIndex++);
commentEditor.setTabIndex(nextTabIndex++);
clusterEditor.setTabIndex(nextTabIndex++);
cpuProfilesEditor.setTabIndex(nextTabIndex++);
quotaEditor.setTabIndex(nextTabIndex++);
isSubTemplateEditor.setTabIndex(nextTabIndex++);
baseTemplateEditor.setTabIndex(nextTabIndex++);
templateVersionNameEditor.setTabIndex(nextTabIndex++);
nextTabIndex = disksAllocationView.setTabIndexes(nextTabIndex);
isTemplatePublicEditor.setTabIndex(nextTabIndex++);
copyVmPermissions.setTabIndex(nextTabIndex++);
sealTemplateEditor.setTabIndex(nextTabIndex++);
return nextTabIndex;
}
public void appendMessage(String message) {
if (message == null) {
return;
}
messagePanel.add(new Label(message));
}
}