package org.ovirt.engine.ui.userportal.client.modalpanels; import java.util.LinkedHashMap; import java.util.List; import java.util.Map.Entry; import org.ovirt.engine.core.common.businessentities.BootSequence; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VmOsType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.VolumeType; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.businessentities.storage_pool; 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.uicommon.UICommand; import org.ovirt.engine.ui.uicommon.models.EntityModel; import org.ovirt.engine.ui.uicommon.models.Model; import org.ovirt.engine.ui.uicommon.models.templates.TemplateListModel; import org.ovirt.engine.ui.uicommon.models.userportal.UserPortalListModel; import org.ovirt.engine.ui.uicommon.models.vms.DiskModel; import org.ovirt.engine.ui.uicommon.models.vms.UnitVmModel; import org.ovirt.engine.ui.userportal.client.binders.FormConstructor; import org.ovirt.engine.ui.userportal.client.binders.ObjectNameIdResolver; import org.ovirt.engine.ui.userportal.client.components.CheckboxItemModelBinded; import org.ovirt.engine.ui.userportal.client.components.ComboBoxListModelBinded; import org.ovirt.engine.ui.userportal.client.components.GridController; import org.ovirt.engine.ui.userportal.client.components.GridRefreshManager; import org.ovirt.engine.ui.userportal.client.components.NonDraggableModalPanel; import org.ovirt.engine.ui.userportal.client.components.SelectBoxListModelBinded; import org.ovirt.engine.ui.userportal.client.components.SliderItemRangeModelBinded; import org.ovirt.engine.ui.userportal.client.components.TextItemEntityModelBinded; import org.ovirt.engine.ui.userportal.client.parsers.SizeParser; import com.google.gwt.core.client.GWT; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CheckboxItem; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.HeaderItem; import com.smartgwt.client.widgets.form.fields.RadioGroupItem; import com.smartgwt.client.widgets.form.fields.SpacerItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; public class NewVmModalPanel extends NonDraggableModalPanel { private UnitVmModel userVmModel; private static final int windowWidth = 460; private static final int windowHeight = 500; private static String noDatacenterAvailableMessage = "There are no active Data-Centers you can create your VM on. Please contact your administrator."; private static String vncConsoleSelectedMessage = "VNC is the selected Display Protocol and is not supported from the Power User Portal."; TabButton selectedButton; VLayout buttonsSide = new VLayout(); final VLayout tabPaneContainer = new VLayout(); UICommand cancelCommand; TabButton generalTabButton; TabButton windowsSysPrepTabButton; TabButton consoleTabButton; TabButton hostTabButton; TabButton highAvailabilityButton; TabButton resourceAllocationTabButton; TabButton bootOptionsTabButton; WarningLabel noDatacenterAvailableLabel; FormItem focusedItem; DynamicForm focusedForm; boolean isServer; boolean isTemplate; public NewVmModalPanel(final GridController gridController, UnitVmModel model, final Model parentModel) { super(windowWidth, windowHeight, model.getTitle(), 0); userVmModel = model; isTemplate = parentModel instanceof TemplateListModel; isServer = userVmModel.getVmType().equals(VmType.Server); generalTabButton = new TabButton("General", new GeneralTabPane()); windowsSysPrepTabButton = new TabButton("Windows Sysprep", new WindowsSysPrepTabPane()); consoleTabButton = new TabButton("Console", new ConsoleTabPane()); hostTabButton = new TabButton("Host", new HostTabPane()); highAvailabilityButton = new TabButton("High Availability", new HighAvailabilityTabPane()); resourceAllocationTabButton = new TabButton("Resource Allocation", new ResourceAllocationTabPane()); bootOptionsTabButton = new TabButton("Boot Options", new BootOptionsTabPane()); if (isTemplate) { hostTabButton.hide(); resourceAllocationTabButton.hide(); } final UICommand saveCommand = (parentModel instanceof UserPortalListModel) ? ((UserPortalListModel)parentModel).getSaveCommand() : new UICommand("OnSave", parentModel); cancelCommand = new UICommand("Cancel", parentModel); parentModel.getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { String propertyName = ((PropertyChangedEventArgs)args).PropertyName; GWT.log("DERBA: " + propertyName); if (propertyName.equals("Window") || propertyName.equals("VmModel")) { parentModel.getPropertyChangedEvent().removeListener(this); destroy(); } } }); org.ovirt.engine.ui.userportal.client.components.Button cancelButton = new org.ovirt.engine.ui.userportal.client.components.Button ("Cancel"); cancelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { onClose(); } }); org.ovirt.engine.ui.userportal.client.components.Button okButton = new org.ovirt.engine.ui.userportal.client.components.Button("OK"); okButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { saveCommand.Execute(); gridController.gridChangePerformed(); } }); setFooterButtons(Alignment.RIGHT, okButton, cancelButton); // By default those tabs are hidden until a Windows os or a non blank template is selected respectively if (!userVmModel.getIsWindowsOS()) windowsSysPrepTabButton.hide(); if (!isTemplate && !isServer) highAvailabilityButton.hide(); hostTabButton.setDisabled(!userVmModel.getIsHostAvailable()); HLayout inPanel = new HLayout(); inPanel.setHeight100(); inPanel.setWidth100(); buttonsSide.setStyleName("newVmDialogTabButtons"); buttonsSide.setWidth(150); tabPaneContainer.setAutoWidth(); tabPaneContainer.setHeight100(); tabPaneContainer.setPadding(4); userVmModel.getPropertyChangedEvent().addListener(new UserVmModelPropertyChangedListener()); inPanel.addMember(buttonsSide); inPanel.addMember(tabPaneContainer); addItem(inPanel); } @Override public void draw() { super.draw(); // Initialize the tab container to show the general tab first selectedButton = generalTabButton; selectedButton.select(); GridRefreshManager.getInstance().suspendRefresh(); subscribeProgressChangedEvent(userVmModel, focusedItem, tabPaneContainer); } // Supertypes for all components class TabPaneSkeletal extends VLayout { public TabPaneSkeletal() { setHeight100(); setWidth100(); } } class TabButton extends Button { private Canvas pane; public TabButton(String title, Canvas pane) { super(title); setBaseStyle("tabButton"); setWidth100(); setHeight(27); this.pane = pane; pane.setVisible(false); buttonsSide.addMember(this); tabPaneContainer.addMember(pane); addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (selectedButton != TabButton.this) { selectedButton.deselect(); selectedButton = TabButton.this; selectedButton.select(); } } }); } @Override public void select() { super.select(); pane.show(); } @Override public void deselect() { super.deselect(); pane.hide(); } public void setIsValid(boolean isValid) { setStyleName(isValid ? "newVmTabButtonValid" : "newVmTabButtonInvalid"); } } // Tab panes class GeneralTabPane extends TabPaneSkeletal { public GeneralTabPane() { final SelectBoxListModelBinded dataCenterBox = new SelectBoxListModelBinded("Data Center", userVmModel.getDataCenter(), storage_pool.class); final SelectBoxListModelBinded hostClusterBox = new SelectBoxListModelBinded("Host Cluster", userVmModel.getCluster(), VDSGroup.class); final TextItemEntityModelBinded nameInput = new TextItemEntityModelBinded("Name", userVmModel.getName()); final TextItemEntityModelBinded descriptionInput = new TextItemEntityModelBinded("Description", userVmModel.getDescription()); final SelectBoxListModelBinded basedOnTemplateBox = new SelectBoxListModelBinded("Based on Template", userVmModel.getTemplate(), VmTemplate.class); final TextItemEntityModelBinded memoryInput = new TextItemEntityModelBinded("Memory Size", userVmModel.getMemSize(), true, new SizeParser()); final SliderItemRangeModelBinded totalCoresSlider = new SliderItemRangeModelBinded("Total Cores", 140, userVmModel.getTotalCPUCores(), "coresSlider"); final SliderItemRangeModelBinded cpuSocketsSlider = new SliderItemRangeModelBinded("CPU Sockets", 140, userVmModel.getNumOfSockets(), "socketsSlider"); //final TextItemEntityModelBinded totalCoresInput = new TextItemEntityModelBinded("Total Cores", userVmModel.getTotalCPUCores(), true); //final TextItemEntityModelBinded cpuSocketsInput = new TextItemEntityModelBinded("CPU Sockets", userVmModel.getNumOfSockets(), true); final SelectBoxListModelBinded operatingSystemBox = new SelectBoxListModelBinded(false, "Operating System", userVmModel.getOSType(), VmOsType.class); CheckboxItemModelBinded statelessCheckBox = new CheckboxItemModelBinded("Stateless", userVmModel.getIsStateless()); DynamicForm f = new DynamicForm(); if (isTemplate) f.setItems(dataCenterBox, hostClusterBox, nameInput, descriptionInput, memoryInput, totalCoresSlider, cpuSocketsSlider, operatingSystemBox, statelessCheckBox); else f.setItems(dataCenterBox, hostClusterBox, nameInput, descriptionInput, basedOnTemplateBox, memoryInput, totalCoresSlider, cpuSocketsSlider, operatingSystemBox, statelessCheckBox); focusedItem = nameInput; focusedForm = f; f.focusInItem(nameInput); //Not sure why this is needed as according to spec focusInItem should be enough, but does not work without setAutoFocus=true f.setAutoFocus(true); addMember(f); // Add 'no data-center is available' error message noDatacenterAvailableLabel = new WarningLabel(noDatacenterAvailableMessage); // Add warning panel WarningPanel warningPanel = new WarningPanel(); warningPanel.addMember(noDatacenterAvailableLabel); warningPanel.addMember(createVncConsoleSelectedMessageLabel()); addMember(warningPanel); } } class WindowsSysPrepTabPane extends TabPaneSkeletal { public WindowsSysPrepTabPane() { DynamicForm f = new DynamicForm(); ComboBoxListModelBinded domainInput = new ComboBoxListModelBinded("Domain", userVmModel.getDomain(), String.class); SelectBoxListModelBinded timeZoneBox = new SelectBoxListModelBinded("Time Zone", userVmModel.getTimeZone(), Entry.class); domainInput.setWidth(200); timeZoneBox.setWidth(200); f.setItems(domainInput, timeZoneBox); addChild(f); } } class ConsoleTabPane extends TabPaneSkeletal{ public ConsoleTabPane() { SelectBoxListModelBinded protocolBox = new SelectBoxListModelBinded(false, "Protocol", userVmModel.getDisplayProtocol(), new ObjectNameIdResolver() { public String getItemId(Object o) { return ((DisplayType)(((EntityModel)o).getEntity())).name(); } public String getItemName(Object o) { return ((EntityModel)o).getTitle(); } }); final SelectBoxListModelBinded usbPolicyBox = new SelectBoxListModelBinded(false, "USB Policy", userVmModel.getUsbPolicy(), UsbPolicy.class); final SelectBoxListModelBinded monitorsBox = new SelectBoxListModelBinded(false, "Monitors", userVmModel.getNumOfMonitors(), Integer.class); DynamicForm f; if (!isServer) f = FormConstructor.constructForm(protocolBox, usbPolicyBox, monitorsBox); else f = FormConstructor.constructForm(protocolBox, usbPolicyBox); addChild(f); // Add warning panel WarningPanel warningPanel = new WarningPanel(); warningPanel.addMember(createVncConsoleSelectedMessageLabel()); addMember(warningPanel); } } class HostTabPane extends TabPaneSkeletal{ public HostTabPane() { DynamicForm f = new DynamicForm(); HeaderItem runOnLabel = new HeaderItem(); runOnLabel.setDefaultValue("Run On:"); runOnLabel.setTextBoxStyle("generalLabel"); final RadioGroupItem specificHostRadio = new RadioGroupItem(); LinkedHashMap<String,String> specificHostOptions = new LinkedHashMap<String, String>(); specificHostOptions.put("true", "Any Host in Cluster"); specificHostOptions.put("false", "Specific"); specificHostRadio.setValueMap(specificHostOptions); specificHostRadio.setShowTitle(false); specificHostRadio.setWrap(false); specificHostRadio.setDefaultValue(((Boolean)userVmModel.getIsAutoAssign().getEntity()) == true ? "true" : "false"); specificHostRadio.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { userVmModel.getIsAutoAssign().setEntity(event.getValue().equals("true") ? true : false); } }); // TODO: Create 'RadiobuttonItemModelBinded' userVmModel.getIsAutoAssign().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { specificHostRadio.setValue(((Boolean)userVmModel.getIsAutoAssign().getEntity()) == true ? "true" : "false"); } }); SelectBoxListModelBinded defaultHostBox = new SelectBoxListModelBinded("Default Host", userVmModel.getDefaultHost(), VDS.class); defaultHostBox.setShowTitle(false); defaultHostBox.setRowSpan(2); // Due to a bug in SmartGWT (Issue 206) the label of a checkboxitem does not wrap thus we have to wrap it ourselves and indent correctly in both checkboxes CheckboxItemModelBinded runOnlyOnSelectedHost = new CheckboxItemModelBinded("Run VM on the selected host <br/><span class=\"checkBoxWrapIndent\">(No migration allowed)</span>", userVmModel.getRunVMOnSpecificHost()); CheckboxItemModelBinded dontMigrateVM = new CheckboxItemModelBinded("Allow VM migration only upon Administrator <br/><span class=\"checkBoxWrapIndent\">specific request (System will not trigger</span><br/><span class=\"checkBoxWrapIndent\">automatic migration of this VM)</span>", userVmModel.getDontMigrateVM()); HeaderItem h = new HeaderItem(); h.setDefaultValue("Run/Migration Options:"); h.setTextBoxStyle("generalLabel"); f.setItems(runOnLabel, specificHostRadio, defaultHostBox, new SpacerItem(), h, runOnlyOnSelectedHost, dontMigrateVM); addMember(f); } } class HighAvailabilityTabPane extends TabPaneSkeletal{ public HighAvailabilityTabPane() { CheckboxItemModelBinded highlyAvailableCheckBox = new CheckboxItemModelBinded("Highly Available", userVmModel.getIsHighlyAvailable()); SelectBoxListModelBinded priorityBox = new SelectBoxListModelBinded("Priority for Run/Migrate Queue", userVmModel.getPriority(), new ObjectNameIdResolver() { @Override public String getItemName(Object o) { return ((EntityModel)o).getTitle(); } @Override public String getItemId(Object o) { return ((EntityModel)o).getEntity().toString(); } }); priorityBox.setWidth(100); DynamicForm f = FormConstructor.constructForm(highlyAvailableCheckBox, priorityBox); addChild(f); } } class ResourceAllocationTabPane extends TabPaneSkeletal{ Label disksLabel; VLayout disksListLayout; Label storageAllacationLabelRemark; public ResourceAllocationTabPane() { DynamicForm f = new DynamicForm(); DynamicForm f2 = new DynamicForm(); f.setNumCols(3); f2.setNumCols(3); SpacerItem indentSpacer = new SpacerItem(); indentSpacer.setWidth(3); Label storageAllocationLabel = new Label("<nobr>Storage Allocation:</nobr>"); storageAllocationLabel.setAutoFit(true); storageAllocationLabel.setStyleName("generalLabel"); storageAllacationLabelRemark = new Label("<nobr>(Available only when a template is selected)</nobr>"); storageAllacationLabelRemark.setAutoFit(true); storageAllacationLabelRemark.setStyleName("generalLabelRemark"); VLayout storageAllacationLabelLayout = new VLayout(); storageAllacationLabelLayout.setAutoHeight(); storageAllacationLabelLayout.setAutoWidth(); storageAllacationLabelLayout.addMember(storageAllocationLabel); storageAllacationLabelLayout.addMember(storageAllacationLabelRemark); SelectBoxListModelBinded storageDomainBox = new SelectBoxListModelBinded("Storage Domain", userVmModel.getStorageDomain(), storage_domains.class); SelectBoxListModelBinded provisioningBox = new SelectBoxListModelBinded(false, "Provisioning", userVmModel.getProvisioning(), new ObjectNameIdResolver() { public String getItemName(Object o) { return ((EntityModel)o).getTitle(); } public String getItemId(Object o) { return (Boolean)((EntityModel)o).getEntity() ? "true" : "false"; } }); HeaderItem memoryAllocationLabel = new HeaderItem(); memoryAllocationLabel.setDefaultValue("Memory Allocation:"); memoryAllocationLabel.setTextBoxStyle("generalLabel"); TextItemEntityModelBinded minAllocatedMemoryInput = new TextItemEntityModelBinded("Physical Memory Guaranteed", userVmModel.getMinAllocatedMemory(), true, new SizeParser()); minAllocatedMemoryInput.setWidth(100); disksLabel = new Label("<nobr>Disks:</nobr>"); disksLabel.setAutoFit(true); disksLabel.setStyleName("generalLabel"); disksListLayout = new VLayout(); disksListLayout.setAutoHeight(); disksLabel.hide(); disksListLayout.hide(); f.setItems(indentSpacer, storageDomainBox, indentSpacer, provisioningBox, indentSpacer); f2.setItems(memoryAllocationLabel, indentSpacer, minAllocatedMemoryInput); addMember(storageAllacationLabelLayout); addMember(f); addMember(disksLabel); addMember(disksListLayout); addMember(f2); } public void setDisksLabelVisibility() { if (userVmModel.getIsDisksAvailable()) { disksLabel.show(); disksListLayout.show(); } else { disksLabel.hide(); disksListLayout.hide(); } } public void setStorageLabelRemarkVisibility() { if (userVmModel.getIsBlankTemplate()) { storageAllacationLabelRemark.show(); } else { storageAllacationLabelRemark.hide(); } } public void updateDisksList() { disksListLayout.removeMembers(disksListLayout.getMembers()); List<DiskModel> diskModelList = userVmModel.getDisks(); if (diskModelList == null) { return; } for (DiskModel dm : userVmModel.getDisks()) { HLayout diskLayout = new HLayout(); SelectBoxListModelBinded diskAllocationBox = new SelectBoxListModelBinded(false, "Disk " + dm.getName() + " - " + dm.getSize().getEntity().toString() + "GB", dm.getVolumeType(), VolumeType.class); diskLayout.addMember(FormConstructor.constructForm(diskAllocationBox)); diskLayout.setAutoHeight(); diskLayout.setAutoWidth(); disksListLayout.addMember(diskLayout); } } } class BootOptionsTabPane extends TabPaneSkeletal{ public TextItemEntityModelBinded kernelPathInput, initrdPathCDInput, kernelParametersInput; public HeaderItem linuxBootOptionsLabel; public BootOptionsTabPane() { DynamicForm f = new DynamicForm(); f.setNumCols(3); SpacerItem indentSpacer = new SpacerItem(); indentSpacer.setWidth(3); final SelectBoxListModelBinded firstDeviceBox = new SelectBoxListModelBinded(false, "First Device", userVmModel.getFirstBootDevice(), new ObjectNameIdResolver() { public String getItemId(Object o) { if (((EntityModel)o).getEntity() == null) return null; return (((BootSequence)((EntityModel)o).getEntity())).name(); } public String getItemName(Object o) { if (((EntityModel)o).getEntity() == null) return "[None]"; return ((EntityModel)o).getTitle(); } }); final SelectBoxListModelBinded secondDeviceBox = new SelectBoxListModelBinded(false, "Second Device", userVmModel.getSecondBootDevice(), new ObjectNameIdResolver() { public String getItemId(Object o) { if (o == null) return null; if (((EntityModel)o).getEntity() == null) return "[None]"; return (((BootSequence)((EntityModel)o).getEntity())).name(); } public String getItemName(Object o) { return ((EntityModel)o).getTitle(); } }); final CheckboxItem attachCdCheckBox = new CheckboxItem(); attachCdCheckBox.setValue(userVmModel.getCdImage().getIsChangable()); attachCdCheckBox.setShowTitle(false); attachCdCheckBox.setTitle("Attach CD"); attachCdCheckBox.setWidth(5); // bind 'attachCdCheckBox' to the entity model userVmModel.getCdImage().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { String property = ((PropertyChangedEventArgs)args).PropertyName; if (property.equals("IsChangable")) { attachCdCheckBox.setValue(userVmModel.getCdImage().getIsChangable()); } } }); final SelectBoxListModelBinded cdImageBox = new SelectBoxListModelBinded("Attach CD", userVmModel.getCdImage(), String.class); cdImageBox.setDisabled(!userVmModel.getCdImage().getIsChangable()); cdImageBox.setShowTitle(false); attachCdCheckBox.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { Boolean attachCd = (Boolean)((CheckboxItem)event.getSource()).getValue(); if (!attachCd) { userVmModel.getCdImage().setSelectedItem(null); } userVmModel.getCdImage().setIsChangable(attachCd); cdImageBox.setDisabled(!attachCd); } }); kernelPathInput = new TextItemEntityModelBinded("kernel path", userVmModel.getKernel_path()); initrdPathCDInput = new TextItemEntityModelBinded("initrd path", userVmModel.getInitrd_path()); kernelParametersInput = new TextItemEntityModelBinded("kernel parameters", userVmModel.getKernel_parameters()); HeaderItem bootSequenceLabel = new HeaderItem(); bootSequenceLabel.setDefaultValue("<nobr>Boot Sequence:</nobr>"); bootSequenceLabel.setTextBoxStyle("generalLabel"); linuxBootOptionsLabel = new HeaderItem(); linuxBootOptionsLabel.setDefaultValue("<nobr>Linux Boot Options:</nobr>"); linuxBootOptionsLabel.setTextBoxStyle("generalLabel"); f.setItems(bootSequenceLabel, indentSpacer, firstDeviceBox, indentSpacer, secondDeviceBox, indentSpacer, attachCdCheckBox, cdImageBox, indentSpacer, linuxBootOptionsLabel, indentSpacer, kernelPathInput, indentSpacer, initrdPathCDInput, indentSpacer, kernelParametersInput); addMember(f); } public void setLinuxBootOptionsVisibility(boolean visible) { if (visible) { linuxBootOptionsLabel.show(); } else { linuxBootOptionsLabel.hide(); } } } class CustomPropertiesTabPane extends TabPaneSkeletal{ public CustomPropertiesTabPane() { DynamicForm f = new DynamicForm(); TextItemEntityModelBinded customPropertiesInput = new TextItemEntityModelBinded("Custom Properties", userVmModel.getCustomProperties()); f.setItems(customPropertiesInput); addChild(f); } } class WarningPanel extends VLayout { public WarningPanel() { setHeight100(); setWidth(260); setAlign(VerticalAlignment.BOTTOM); } } class WarningLabel extends Label { public WarningLabel(String contents) { super(contents); setStyleName("warningLabel"); setVisible(false); setAutoHeight(); setPadding(5); setWrap(true); } } // Create a warning label indicating VNC display protocol is selected // (add a listener to DisplayPotocol list model for determining visibility) private WarningLabel createVncConsoleSelectedMessageLabel() { final WarningLabel vncConsoleSelectedMessageLabel = new WarningLabel(vncConsoleSelectedMessage); userVmModel.getDisplayProtocol().getSelectedItemChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { EntityModel selectedDisplayProtocol = (EntityModel)userVmModel.getDisplayProtocol().getSelectedItem(); boolean isVncProtocolSelected = selectedDisplayProtocol != null && selectedDisplayProtocol.getEntity().equals(DisplayType.vnc); vncConsoleSelectedMessageLabel.setVisible(isVncProtocolSelected); } }); return vncConsoleSelectedMessageLabel; } class UserVmModelPropertyChangedListener implements IEventListener { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { String changedPropertyName = ((PropertyChangedEventArgs)args).PropertyName; if (changedPropertyName.equals("IsWindowsOS")) { if (!userVmModel.getIsWindowsOS()) { windowsSysPrepTabButton.hide(); } else { windowsSysPrepTabButton.show(); } } else if (changedPropertyName.equals("IsBlankTemplate")) { ((ResourceAllocationTabPane)resourceAllocationTabButton.pane).setStorageLabelRemarkVisibility(); } else if (changedPropertyName.equals("IsLinux_Unassign_UnknownOS")) { ((BootOptionsTabPane)bootOptionsTabButton.pane).setLinuxBootOptionsVisibility(userVmModel.getIsLinux_Unassign_UnknownOS()); } else if (changedPropertyName.equals("IsDisksAvailable")) { ((ResourceAllocationTabPane)resourceAllocationTabButton.pane).setDisksLabelVisibility(); } else if (changedPropertyName.equals("Disks")) { ((ResourceAllocationTabPane)resourceAllocationTabButton.pane).updateDisksList(); } else if (changedPropertyName.equals("IsHostAvailable")){ hostTabButton.setDisabled(!userVmModel.getIsHostAvailable()); } else if (changedPropertyName.equals("IsDatacenterAvailable")){ noDatacenterAvailableLabel.setVisible(!userVmModel.getIsDatacenterAvailable()); } else if (changedPropertyName.equals("IsGeneralTabValid")) { generalTabButton.setIsValid(userVmModel.getIsGeneralTabValid()); } else if (changedPropertyName.equals("IsDisplayTabValid")) { consoleTabButton.setIsValid(userVmModel.getIsDisplayTabValid()); } else if (changedPropertyName.equals("IsFirstRunTabValid")) { windowsSysPrepTabButton.setIsValid(userVmModel.getIsFirstRunTabValid()); } else if (changedPropertyName.equals("IsAllocationTabValid")) { resourceAllocationTabButton.setIsValid(userVmModel.getIsAllocationTabValid()); } else if (changedPropertyName.equals("IsHostTabValid")) { hostTabButton.setIsValid(userVmModel.getIsHostTabValid()); } else if (changedPropertyName.equals("IsBootSequenceTabValid")) { bootOptionsTabButton.setIsValid(userVmModel.getIsBootSequenceTabValid()); } } } @Override public void onClose() { cancelCommand.Execute(); } }