package org.ovirt.engine.ui.userportal.client.views.basic;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.DiskImage;
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.models.userportal.UserPortalBasicListModel;
import org.ovirt.engine.ui.uicommon.models.userportal.UserPortalItemModel;
import org.ovirt.engine.ui.userportal.client.components.UPLabel;
import org.ovirt.engine.ui.userportal.client.modalpanels.ConsoleEditPanel;
import org.ovirt.engine.ui.userportal.client.protocols.Protocol;
import org.ovirt.engine.ui.userportal.client.protocols.ProtocolOptionContainer;
import org.ovirt.engine.ui.userportal.client.views.basic.components.VmTvLayout;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.types.Visibility;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
public class VmBasicInfoLayout extends VLayout implements ProtocolOptionContainer {
private UPLabel vmNameLabel;
private UPLabel vmDescriptionLabel;
private Img osImage;
private StyledStaticTextItem osText;
private StyledStaticTextItem memoryText;
private StyledStaticTextItem cpuCoresText;
private VLayout disksLayout = new VLayout();
private VmBasicInfoLayout vmBasicInfoLayout = this;
private UserPortalItemModel currentItem;
private ProtocolOptionContainer currentItemLayout;
private UPLabel consoleMessage;
private StyledStaticTextItem consoleText;
private StyledStaticTextItem consoleEditText;
boolean selectionInit = false;
Img vmTypeImage;
private static final int OS_TYPE_IMAGE_SIZE = 50;
private UserPortalBasicListModel model;
public VmBasicInfoLayout(final UserPortalBasicListModel model) {
this.model = model;
setMinWidth(100);
setPadding(10);
setStyleName("basicViewInfoLayout");
setOverflow(Overflow.AUTO);
HLayout generalInfoLayout = new HLayout(10);
generalInfoLayout.setWidth100();
generalInfoLayout.setShowEdges(true);
generalInfoLayout.setEdgeImage("edges/detailpanel.png");
generalInfoLayout.setEdgeSize(7);
generalInfoLayout.setEdgeBackgroundColor("white");
generalInfoLayout.setHeight(78);
generalInfoLayout.setWidth100();
osImage = new Img();
osImage.setSize(OS_TYPE_IMAGE_SIZE);
osImage.setVisibility(Visibility.HIDDEN);
osImage.setPadding(5);
vmTypeImage = new Img();
vmTypeImage.setLayoutAlign(VerticalAlignment.BOTTOM);
osImage.addChild(vmTypeImage);
generalInfoLayout.addMember(osImage);
vmNameLabel = new UPLabel();
vmNameLabel.setStyleName("basicInfoVmNameLabel");
vmDescriptionLabel = new UPLabel();
vmDescriptionLabel.setStyleName("basicInfoVmDescriptionLabel");
vmDescriptionLabel.setWrap(true);
vmDescriptionLabel.setWidth100();
VLayout nameDescLayout = new VLayout();
nameDescLayout.setLayoutAlign(Alignment.CENTER);
nameDescLayout.addMember(vmNameLabel);
nameDescLayout.addMember(vmDescriptionLabel);
nameDescLayout.setAutoHeight();
generalInfoLayout.addMember(nameDescLayout);
osText = new StyledStaticTextItem("Operating System");
memoryText = new StyledStaticTextItem("Defined Memory");
cpuCoresText = new StyledStaticTextItem("Number of Cores");
FormIconItem osIcon = new FormIconItem("general/basic_os_icon.png");
FormIconItem memoryIcon = new FormIconItem("general/basic_memory_icon.png");
FormIconItem cpuIcon = new FormIconItem("general/basic_cpu_icon.png");
DynamicForm generalDetailsForm = new DynamicForm();
generalDetailsForm.setNumCols(3);
generalDetailsForm.setCellPadding(5);
generalDetailsForm.setItems(osIcon, osText, memoryIcon, memoryText, cpuIcon, cpuCoresText);
generalDetailsForm.setAutoHeight();
generalDetailsForm.setWidth100();
generalDetailsForm.setPadding(20);
generalDetailsForm.setColWidths("40", "*", "*");
disksLayout.setLayoutLeftMargin(20);
disksLayout.setLayoutBottomMargin(20);
disksLayout.setAutoHeight();
HLayout drivesTitleLayout = new HLayout(5);
drivesTitleLayout.setLayoutLeftMargin(25);
drivesTitleLayout.setLayoutTopMargin(20);
drivesTitleLayout.setLayoutBottomMargin(10);
drivesTitleLayout.setAutoHeight();
Img driveImg = new Img("general/basic_drive_icon.png", 33, 33);
UPLabel drivesTitle = new UPLabel("Drives :", "basicInfoDetailsTitle");
drivesTitle.setLayoutAlign(VerticalAlignment.CENTER);
drivesTitleLayout.setMembers(driveImg, drivesTitle);
DynamicForm consoleForm = new DynamicForm();
FormIconItem consoleIcon = new FormIconItem("general/basic_console_icon.png");
consoleText = new StyledStaticTextItem("Console");
consoleText.setTextBoxStyle("basicInfoDetailsTitle");
consoleEditText = new StyledStaticTextItem("");
consoleEditText.setTextBoxStyle("basicInfoDetailsLink");
consoleEditText.setShowTitle(false);
consoleEditText.setValue("(Edit)");
consoleEditText.setDisabled(true);
consoleEditText.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
ConsoleEditPanel editPanel = new ConsoleEditPanel(currentItem, vmBasicInfoLayout);
editPanel.draw();
}
});
consoleForm.setItems(consoleIcon, consoleText, consoleEditText);
consoleForm.setNumCols(4);
consoleForm.setAutoHeight();
consoleForm.setWidth100();
consoleForm.setPadding(25);
consoleForm.setCellPadding(0);
consoleForm.setColWidths("40", "*", "50", "40");
consoleMessage = new UPLabel("basicInfoVncMessage");
consoleMessage.setWrap(true);
consoleMessage.setWidth100();
consoleMessage.hide();
addMember(generalInfoLayout);
addMember(generalDetailsForm);
addMember(getSeparator());
addMember(drivesTitleLayout);
addMember(disksLayout);
addMember(getSeparator());
addMember(consoleForm);
addMember(consoleMessage);
model.getPropertyChangedEvent().addListener(new DiskListDetailModelInit());
}
private HLayout getSeparator() {
HLayout separator = new HLayout();
separator.setWidth100();
separator.setHeight(1);
separator.setOverflow(Overflow.HIDDEN);
separator.setStyleName("basicViewInfoLayoutSeparator");
return separator;
}
public void updateValues(UserPortalItemModel item, VmTvLayout selectedItemLayout) {
if (item == null) {
initInfoLayout();
}
else {
currentItem = item;
currentItemLayout = selectedItemLayout;
setOsImage(item.getOsType().name());
setVmTypeImage(item);
setVmName(item.getName());
setVmDescription(item.getDescription());
osText.setValue(item.getOsType().name());
memoryText.setValue((String)model.getSelectedItemDefinedMemory().getEntity());
cpuCoresText.setValue((String)model.getSelectedItemNumOfCpuCores().getEntity());
if (!currentItem.getIsPool()) {
if (currentItemLayout.getProtocol() == null) {
consoleMessage.setHtmlContents(currentItemLayout.getProtocolMessage());
consoleMessage.show();
consoleEditText.disable();
consoleText.setValue("");
}
else {
consoleMessage.hide();
consoleEditText.enable();
consoleText.setValue(currentItemLayout.getProtocol() == null ? "" : currentItemLayout.getProtocol().displayName);
}
}
else {
consoleEditText.disable();
consoleText.setValue("");
}
}
}
public void setVmName(String name) {
if (!vmNameLabel.getContents().equals(name))
vmNameLabel.setContents(name);
}
public void setVmDescription(String description) {
if (!vmDescriptionLabel.getContents().equals(description))
vmDescriptionLabel.setContents(description);
}
public void setOsImage(String imageName) {
if (!osImage.getSrc().equals(imageName)) {
osImage.setSrc("os/" + imageName + ".jpg");
}
if (!osImage.isVisible())
osImage.show();
}
public void setVmTypeImage(UserPortalItemModel item) {
String imageName;
int width;
int height;
if (item.getIsPool()) {
imageName = "pool_icon";
width = 24;
height = 19;
}
else if (item.getIsServer()) {
imageName = "server_vm_icon";
width = 14;
height = 21;
}
else {
imageName = "desktop_vm_icon";
width = 16;
height = 14;
}
if (!vmTypeImage.getSrc().equals(imageName)) {
vmTypeImage.setSrc("vmtypes/" + imageName + ".png");
vmTypeImage.setLeft(OS_TYPE_IMAGE_SIZE + 5 - width/2);
vmTypeImage.setTop(OS_TYPE_IMAGE_SIZE - height/2);
vmTypeImage.setHeight(height);
vmTypeImage.setWidth(width);
}
}
private void initInfoLayout() {
vmNameLabel.setContents(null);
vmDescriptionLabel.setContents(null);
osImage.hide();
osText.setValue("");
memoryText.setValue("");
cpuCoresText.setValue("");
vmTypeImage.hide();
for (Canvas c : disksLayout.getMembers()) {
c.hide();
}
}
class DiskListDetailModelInit implements IEventListener {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
PropertyChangedEventArgs pcArgs = (PropertyChangedEventArgs)args;
if (pcArgs.PropertyName.equals("DetailModels")) {
model.getvmBasicDiskListModel().getItemsChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
updateDisks((List<DiskImage>)model.getvmBasicDiskListModel().getItems());
}
});
}
}
}
class StyledStaticTextItem extends StaticTextItem {
public StyledStaticTextItem(String title) {
setTitle(title);
setWrap(false);
setWrapTitle(false);
setTitleStyle("basicInfoDetailsTitle");
setTextBoxStyle("basicInfoDetailsValue");
}
}
class FormIconItem extends CanvasItem {
public FormIconItem(String imgName) {
setColSpan(1);
setShowTitle(false);
Img image = new Img(imgName, 33, 33);
setCanvas(image);
}
}
class DiskEntry extends HLayout {
UPLabel sizeLabel;
UPLabel diskNameLabel;
long diskSize = -1;
public DiskEntry() {
setLayoutLeftMargin(70);
setLayoutRightMargin(25);
setAutoHeight();
setWidth100();
sizeLabel = new UPLabel("basicInfoDetailsValue");
sizeLabel.setWidth100();
diskNameLabel = new UPLabel("basicInfoDetailsValueBold");
setMembers(diskNameLabel, sizeLabel);
}
public void setDiskSize(long size) {
if (diskSize != size) {
diskSize = size;
sizeLabel.setHtmlContents("<b>" + diskSize + "GB</b>");
}
}
public void setDiskName(String name) {
if (!diskNameLabel.getContents().equals(name))
diskNameLabel.setContents(name);
}
}
private ArrayList<DiskEntry> diskEntries = new ArrayList<DiskEntry>();
private void updateDisks(List<DiskImage> disks) {
if (disks.size() > diskEntries.size()) {
for (int i=diskEntries.size(); i<disks.size(); i++) {
DiskEntry diskEntry = new DiskEntry();
disksLayout.addMember(diskEntry);
diskEntries.add(diskEntry);
}
}
else {
for (int i=disks.size(); i<diskEntries.size(); i++) {
diskEntries.get(i).hide();
}
}
for (int i=0; i<disks.size(); i++) {
DiskEntry currEntry = diskEntries.get(i);
if (!currEntry.isVisible())
currEntry.show();
DiskImage currDisk = disks.get(i);
//currEntry.setSizeLabel((diskSize == 0 ? "Less than <b>1" : "<b>" + diskSize) + "GB</b> out of <b>" + currDisk.getSizeInGigabytes() + "GB</b>");
//currEntry.setDiskName("Disk " + currDisk.getinternal_drive_mapping() + ':');
currEntry.setDiskSize(currDisk.getSizeInGigabytes());
currEntry.setDiskName("Disk " + currDisk.getinternal_drive_mapping() + ':');
}
}
@Override
public void setProtocol(Protocol protocol) {
currentItemLayout.setProtocol(protocol);
consoleText.setValue(currentItemLayout.getProtocol() == null ? "None" : currentItemLayout.getProtocol().displayName);
}
@Override
public Protocol getProtocol() {
return currentItemLayout.getProtocol();
}
@Override
public void setProtocolMessage(String message) {
currentItemLayout.setProtocolMessage(message);
}
@Override
public String getProtocolMessage() {
return currentItemLayout.getProtocolMessage();
}
}