package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.RadioButtonPanel;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogButton;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmDiskPopupWidget;
import org.ovirt.engine.ui.common.widget.uicommon.storage.ImageInfoForm;
import org.ovirt.engine.ui.uicommonweb.models.storage.UploadImageModel;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.UploadImagePopupPresenterWidget;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.InputElement;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.inject.Inject;
public class UploadImagePopupView extends AbstractModelBoundPopupView<UploadImageModel> implements UploadImagePopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<UploadImageModel, UploadImagePopupView> {
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, UploadImagePopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface WidgetStyle extends CssResource {
String imageUriEditor();
String imageUriEditorContent();
}
@UiField
WidgetStyle style;
@UiField
@Ignore
Label imageSourceLabel;
@UiField
RadioButtonPanel imageSourcePanel;
@UiField
@Ignore
HorizontalPanel imageFileUploadPanel;
@UiField
FlowPanel uploadMessagePanel;
@UiField
FileUpload imageFileUpload;
@UiField
SimpleDialogButton imageFileUploadButton;
@UiField
@Ignore
Label imageFileUploadLabel;
@UiField
@Ignore
FlowPanel imageFileDownloadPanel;
@UiField
FlowPanel downloadMessagePanel;
@UiField
@Editor.Path(value = "imageUri.entity")
StringEntityModelTextBoxEditor imageUriEditor;
@UiField
@Ignore
Label diskOptionsLabel;
@UiField(provided = true)
@Ignore
@WithElementId("vmdisk")
VmDiskPopupWidget vmDiskPopupWidget;
@UiField
@Ignore
ImageInfoForm imageInfoForm;
private final Driver driver = GWT.create(Driver.class);
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public UploadImagePopupView(EventBus eventBus) {
super(eventBus);
vmDiskPopupWidget = new VmDiskPopupWidget(false);
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
localize();
addStyles();
driver.initialize(this);
}
void localize() {
imageSourceLabel.setText(constants.uploadImageSourceLabel());
imageUriEditor.setLabel(constants.uploadImageUriLabel());
diskOptionsLabel.setText(constants.uploadImageDiskOptionsLabel());
}
void addStyles() {
imageUriEditor.addContentWidgetContainerStyleName(style.imageUriEditorContent());
imageUriEditor.addStyleName(style.imageUriEditor());
}
@Override
public void edit(final UploadImageModel model) {
driver.edit(model);
model.setImageFileUploadElement(imageFileUpload.getElement());
imageFileUpload.addChangeHandler(changeEvent -> model.getImagePath().setEntity(imageFileUpload.getFilename()));
model.getPropertyChangedEvent().addListener((ev, sender, args) -> {
if ("Message".equals(args.propertyName)) { //$NON-NLS-1$
setPanelMessage(uploadMessagePanel, model.getMessage());
}
else if ("IsValid".equals(args.propertyName)) { //$NON-NLS-1$
uploadMessagePanel.clear();
if (!model.getIsValid() && !model.getInvalidityReasons().isEmpty()) {
setPanelMessage(uploadMessagePanel, model.getInvalidityReasons().get(0));
}
}
});
// This is called before adding the radio buttons because it updates the selected option
handleImageUploadBrowserSupport(model);
imageSourcePanel.addRadioButton(
constants.uploadImageSourceLocal(),
model.getImageSourceLocalEnabled().getEntity(),
true,
event -> {
model.getImageSourceLocalEnabled().setEntity(true);
setSourceVisibility(model);
});
imageSourcePanel.addRadioButton(
constants.uploadImageSourceRemote(),
!model.getImageSourceLocalEnabled().getEntity(),
true,
event -> {
model.getImageSourceLocalEnabled().setEntity(false);
setSourceVisibility(model);
});
setSourceVisibility(model);
vmDiskPopupWidget.edit(model.getDiskModel());
if (model.getIsResumeUpload()) {
diskOptionsLabel.setText(constants.uploadImageDiskOptionsInfoOnlyLabel());
}
imageInfoForm.initialize(model.getImageInfoModel());
model.getImageInfoModel().getEntityChangedEvent().addListener((ev, sender, args) -> model.setIsValid(model.getImageInfoModel().getIsValid()));
model.getImageInfoModel().initialize(model.getImageFileUploadElement());
// Add image upload click handler and label updater
imageFileUploadButton.addClickHandler(event -> imageFileUpload.getElement().<InputElement>cast().click());
imageFileUpload.addChangeHandler(event -> imageFileUploadLabel.setText(imageFileUpload.getFilename()));
}
private void handleImageUploadBrowserSupport(final UploadImageModel model) {
model.setBrowserSupportsUpload(model.browserSupportsUploadAPIs());
if (!model.getBrowserSupportsUpload()) {
model.getOkCommand().setIsExecutionAllowed(false);
imageFileUpload.setEnabled(false);
setPanelMessage(uploadMessagePanel, constants.uploadImageUploadNotSupportedMessage());
model.getImageSourceLocalEnabled().setEntity(false);
}
}
private void setSourceVisibility(final UploadImageModel model) {
imageFileUploadPanel.setVisible(model.getImageSourceLocalEnabled().getEntity());
imageFileDownloadPanel.setVisible(!model.getImageSourceLocalEnabled().getEntity());
}
private void setPanelMessage(FlowPanel panel, String message) {
panel.clear();
panel.add(new Label(message));
panel.setVisible(message != null && !message.isEmpty());
}
private void setDownloadMessage(String message) {
downloadMessagePanel.clear();
downloadMessagePanel.add(new Label(message));
downloadMessagePanel.setVisible(message != null && !message.isEmpty());
}
@Override
public UploadImageModel flush() {
vmDiskPopupWidget.flush();
return driver.flush();
}
@Override
public void cleanup() {
// Related Model is still alive for uploading the file.
// TODO(vs) fix the associated models so that we can call `driver.cleanup()`
}
@Override
public int setTabIndexes(int nextTabIndex) {
nextTabIndex = vmDiskPopupWidget.setTabIndexes(nextTabIndex);
return nextTabIndex;
}
}