package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StorageFormatType;
import org.ovirt.engine.core.common.businessentities.StorageType;
import org.ovirt.engine.core.common.businessentities.VDS;
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.ui.uicommonweb.models.storage.IStorageModel;
import org.ovirt.engine.ui.uicommonweb.models.storage.StorageModel;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.webadmin.idhandler.WithElementId;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StoragePopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.webadmin.widget.dialog.SimpleDialogPanel;
import org.ovirt.engine.ui.webadmin.widget.editor.EntityModelTextBoxEditor;
import org.ovirt.engine.ui.webadmin.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.webadmin.widget.renderer.EnumRenderer;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.text.shared.AbstractRenderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.inject.Inject;
public class StoragePopupView extends AbstractModelBoundPopupView<StorageModel>
implements StoragePopupPresenterWidget.ViewDef {
interface Driver extends SimpleBeanEditorDriver<StorageModel, StoragePopupView> {
Driver driver = GWT.create(Driver.class);
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, StoragePopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<StoragePopupView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
@UiField
WidgetStyle style;
@UiField
@Path(value = "name.entity")
@WithElementId("name")
EntityModelTextBoxEditor nameEditor;
@UiField(provided = true)
@Path(value = "dataCenter.selectedItem")
@WithElementId("dataCenter")
ListModelListBoxEditor<Object> datacenterListEditor;
@UiField(provided = true)
@Path(value = "availableStorageItems.selectedItem")
@WithElementId("availableStorageItems")
ListModelListBoxEditor<Object> storageTypeListEditor;
@UiField(provided = true)
@Path(value = "format.selectedItem")
@WithElementId("format")
ListModelListBoxEditor<Object> formatListEditor;
@UiField(provided = true)
@Path(value = "host.selectedItem")
@WithElementId("host")
ListModelListBoxEditor<Object> hostListEditor;
@Ignore
@UiField
FlowPanel specificStorageTypePanel;
@SuppressWarnings("rawtypes")
@Ignore
AbstractStorageView storageView;
@Inject
public StoragePopupView(EventBus eventBus, ApplicationResources resources, ApplicationConstants constants) {
super(eventBus, resources);
initListBoxEditors();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
ViewIdHandler.idHandler.generateAndSetIds(this);
localize(constants);
addStyles();
Driver.driver.initialize(this);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
void initListBoxEditors() {
datacenterListEditor = new ListModelListBoxEditor<Object>(new AbstractRenderer<Object>() {
@Override
public String render(Object object) {
String formattedString = "";
if (object != null) {
storage_pool storage = (storage_pool) object;
// Get formatted storage type and format using Enum renders
String storageType = storage.getstorage_pool_type() == StorageType.UNKNOWN ? "" :
(new EnumRenderer<StorageType>()).render(storage.getstorage_pool_type());
String storageFormatType = storage.getStoragePoolFormatType() == null ? "" :
(new EnumRenderer<StorageFormatType>()).render(storage.getStoragePoolFormatType());
// Add storage type and format if available
if (storageType.length() > 0) {
formattedString = " (" + storageType;
if (storageFormatType.length() > 0) {
formattedString += ", " + storageFormatType;
}
formattedString += ")";
}
formattedString = storage.getname() + formattedString;
}
return formattedString;
}
});
formatListEditor = new ListModelListBoxEditor<Object>(new EnumRenderer());
hostListEditor = new ListModelListBoxEditor<Object>(new AbstractRenderer<Object>() {
@Override
public String render(Object object) {
return object == null ? "" : ((VDS) object).getvds_name();
}
});
storageTypeListEditor = new ListModelListBoxEditor<Object>(new AbstractRenderer<Object>() {
@Override
public String render(Object object) {
String formattedString = "";
if (object != null) {
EnumRenderer<StorageType> storageEnumRenderer = new EnumRenderer<StorageType>();
EnumRenderer<StorageDomainType> storageDomainEnumRenderer = new EnumRenderer<StorageDomainType>();
String storageDomainType = storageDomainEnumRenderer.render(((IStorageModel) object).getRole());
String storageType = storageEnumRenderer.render(((IStorageModel) object).getType());
formattedString = storageDomainType + " / " + storageType;
}
return formattedString;
}
});
}
void addStyles() {
storageTypeListEditor.setLabelStyleName(style.label());
storageTypeListEditor.addContentWidgetStyleName(style.storageContentWidget());
formatListEditor.setLabelStyleName(style.label());
formatListEditor.addContentWidgetStyleName(style.formatContentWidget());
}
void localize(ApplicationConstants constants) {
nameEditor.setLabel(constants.storagePopupNameLabel());
datacenterListEditor.setLabel(constants.storagePopupDataCenterLabel());
storageTypeListEditor.setLabel(constants.storagePopupStorageTypeLabel());
formatListEditor.setLabel(constants.storagePopupFormatTypeLabel());
hostListEditor.setLabel(constants.storagePopupHostLabel());
}
@Override
public void edit(StorageModel object) {
Driver.driver.edit(object);
final StorageModel storageModel = object;
storageModel.getSelectedItemChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
// Reveal the appropriate storage view according to the selected storage type
revealStorageView(storageModel);
}
});
}
@SuppressWarnings("unchecked")
private void revealStorageView(StorageModel object) {
IStorageModel model = object.getSelectedItem();
if (model.getType() == StorageType.NFS) {
storageView = new NfsStorageView();
} else if (model.getType() == StorageType.LOCALFS) {
storageView = new LocalStorageView();
} else if (model.getType() == StorageType.FCP) {
if (model.getRole() == StorageDomainType.ImportExport) {
storageView = new SanImportStorageView();
} else {
storageView = new FcpStorageView();
}
} else if (model.getType() == StorageType.ISCSI) {
if (model.getRole() == StorageDomainType.ImportExport) {
storageView = new IscsiImportStorageView();
} else {
storageView = new IscsiStorageView();
}
}
// Clear the current storage view
specificStorageTypePanel.clear();
// Add the new storage view and call focus on it if needed
if (storageView != null) {
storageView.edit(model);
specificStorageTypePanel.add(storageView);
if (!nameEditor.isVisible()) {
storageView.focus();
}
}
}
@Override
public StorageModel flush() {
return Driver.driver.flush();
}
@Override
public void focusInput() {
nameEditor.setFocus(true);
}
@Override
public boolean handleEnterKeyDisabled() {
return storageView.isSubViewFocused();
}
interface WidgetStyle extends CssResource {
String formatContentWidget();
String storageContentWidget();
String label();
String storageTypeLabel();
String storageDomainTypeLabel();
}
}