Federico Simoncelli has uploaded a new change for review. Change subject: [wip] frontend: add the import glance image support ......................................................................
[wip] frontend: add the import glance image support Change-Id: I084dadfd208255738140f093ffc8ec136f83d7f6 Signed-off-by: Federico Simoncelli <fsimo...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java 11 files changed, 630 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/83/16083/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java index dedf766..f5527d7 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java @@ -642,6 +642,9 @@ @DefaultStringValue("Scan Alignment") String getDiskAlignment(); + @DefaultStringValue("Data Center") + String dataCenter(); + @DefaultStringValue("Name") String nameDisk(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java new file mode 100644 index 0000000..d2dfe3a --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java @@ -0,0 +1,303 @@ +package org.ovirt.engine.ui.uicommonweb.models.storage; + +import org.ovirt.engine.core.common.action.ImportRepoImageParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum; +import org.ovirt.engine.core.common.businessentities.RepoImage; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.ICommandTarget; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.Event; +import org.ovirt.engine.ui.uicompat.EventArgs; +import org.ovirt.engine.ui.uicompat.EventDefinition; +import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; +import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; +import org.ovirt.engine.ui.uicompat.UIConstants; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public class ImportExportImageModel extends EntityModel implements ICommandTarget { + + protected static EventDefinition selectedItemChangedEventDefinition; + + static { + selectedItemChangedEventDefinition = new EventDefinition("SelectedItemChanged", ListModel.class); //$NON-NLS-1$ + } + + protected static UIConstants constants = ConstantsManager.getInstance().getConstants(); + + protected List<RepoImage> repoImages; + protected StorageDomain sourceStorageDomain; + + private ListModel dataCenter; + private ListModel storageDomain; + private ListModel quota; + + private UICommand okCommand; + private UICommand cancelCommand; + + public List<RepoImage> getRepoImages() { + return repoImages; + } + + public void setRepoImages(List<RepoImage> repoImages) { + if (repoImages == this.repoImages) { + return; + } + this.repoImages = repoImages; + onPropertyChanged(new PropertyChangedEventArgs("RepoImages")); //$NON-NLS-1$ + } + + public ListModel getDataCenter() + { + return dataCenter; + } + + public void setDataCenter(ListModel value) + { + dataCenter = value; + } + + public ListModel getStorageDomain() { + return storageDomain; + } + + public void setStorageDomain(ListModel storageDomain) { + this.storageDomain = storageDomain; + } + + public ListModel getQuota() { + return quota; + } + + public void setQuota(ListModel quota) { + this.quota = quota; + } + + + public UICommand getOkCommand() { + return okCommand; + } + + public void setOkCommand(UICommand okCommand) { + this.okCommand = okCommand; + } + + public UICommand getCancelCommand() { + return cancelCommand; + } + + public void setCancelCommand(UICommand cancelCommand) { + this.cancelCommand = cancelCommand; + } + + public ImportExportImageModel() { + setDataCenter(new ListModel()); + getDataCenter().getSelectedItemChangedEvent().addListener(this); + + setStorageDomain(new ListModel()); + getStorageDomain().getSelectedItemChangedEvent().addListener(this); + + setQuota(new ListModel()); + + setOkCommand(new UICommand("OnExecute", this)); //$NON-NLS-1$ + getOkCommand().setTitle(constants.ok()); + getOkCommand().setIsDefault(true); + getOkCommand().setIsExecutionAllowed(false); + + setCancelCommand(new UICommand("Cancel", this)); //$NON-NLS-1$ + getCancelCommand().setTitle(constants.cancel()); + getCancelCommand().setIsCancel(true); + + getCommands().add(getOkCommand()); + getCommands().add(getCancelCommand()); + } + + public void init(StorageDomain sourceStorageDomain, List<RepoImage> repoImages) { + this.sourceStorageDomain = sourceStorageDomain; + setRepoImages(repoImages); + updateDataCenters(); + } + + protected void updateDataCenters() { + INewAsyncCallback callback = new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + ImportExportImageModel model = (ImportExportImageModel) target; + List<StoragePool> dataCenters = (List<StoragePool>) returnValue; + + // Sorting by name + Collections.sort(dataCenters, new Linq.StoragePoolByNameComparer()); + + model.getDataCenter().setItems(dataCenters); + stopProgress(); + } + }; + + startProgress(null); + AsyncDataProvider.getDataCenterList(new AsyncQuery(this, callback)); + } + + protected void updateControlsAvailability() { + String warningMessage = null; + + if (getStorageDomain().getIsEmpty()) { + getStorageDomain().setIsChangable(false); + getQuota().setItems(null); + getQuota().setIsChangable(false); + getOkCommand().setIsExecutionAllowed(false); + warningMessage = constants.noStorageDomainAvailableMsg(); + } else { + getStorageDomain().setIsChangable(true); + getOkCommand().setIsExecutionAllowed(true); + } + + setMessage(warningMessage); + } + + protected void updateStorageDomains() { + INewAsyncCallback callback = new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + ImportExportImageModel model = (ImportExportImageModel) target; + List<StorageDomain> storageDomains = new ArrayList<StorageDomain>(); + + // Filtering out domains that are not active + for (StorageDomain storageDomainItem : (List<StorageDomain>) returnValue) { + if (Linq.isDataActiveStorageDomain(storageDomainItem)) { + storageDomains.add(storageDomainItem); + } + } + + // Sorting by name + Collections.sort(storageDomains, new Linq.StorageDomainByNameComparer()); + + model.getStorageDomain().setItems(storageDomains); + model.getStorageDomain().setIsEmpty(storageDomains.isEmpty()); + + model.updateControlsAvailability(); + stopProgress(); + } + }; + + startProgress(null); + AsyncDataProvider.getStorageDomainList(new AsyncQuery(this, callback), + ((StoragePool) getDataCenter().getSelectedItem()).getId()); + } + + protected QuotaEnforcementTypeEnum getDataCenterQuotaEnforcementType() { + StoragePool dataCenter = (StoragePool) getDataCenter().getSelectedItem(); + return (dataCenter == null) ? null : dataCenter.getQuotaEnforcementType(); + } + + private void updateQuotas() { + StorageDomain storageDomain = (StorageDomain) getStorageDomain().getSelectedItem(); + + if (getDataCenterQuotaEnforcementType() == QuotaEnforcementTypeEnum.DISABLED || storageDomain == null) { + getQuota().setItems(null); + getQuota().setIsChangable(false); + return; + } + + INewAsyncCallback callback = new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + ImportExportImageModel model = (ImportExportImageModel) target; + model.getQuota().setItems((List<Quota>) ((VdcQueryReturnValue) returnValue).getReturnValue()); + getQuota().setIsChangable(true); + stopProgress(); + } + }; + + startProgress(null); + Frontend.RunQuery(VdcQueryType.GetAllRelevantQuotasForStorage, + new IdQueryParameters(storageDomain.getId()), + new AsyncQuery(this, callback)); + } + + protected void cancel() { + stopProgress(); + ((ListModel) getEntity()).setWindow(null); + } + + @Override + public void executeCommand(UICommand command) + { + super.executeCommand(command); + + startProgress(null); + + ArrayList<VdcActionParametersBase> actionParameters = new ArrayList<VdcActionParametersBase>(); + + for (RepoImage repoImage : repoImages) { + ImportRepoImageParameters importParameters = new ImportRepoImageParameters(); + + // source + importParameters.setSourceRepoImageId(repoImage.getRepoImageId()); + importParameters.setSourceStorageDomainId(sourceStorageDomain.getId()); + + // destination + importParameters.setStoragePoolId(((StoragePool) getDataCenter().getSelectedItem()).getId()); + importParameters.setStorageDomainId(((StorageDomain) getStorageDomain().getSelectedItem()).getId()); + + Quota selectedQuota = (Quota) getQuota().getSelectedItem(); + + if (selectedQuota != null) { + importParameters.setQuotaId(selectedQuota.getId()); + } + + actionParameters.add(importParameters); + } + + Frontend.RunMultipleAction(VdcActionType.ImportRepoImage, actionParameters, + new IFrontendMultipleActionAsyncCallback() { + @Override + public void executed(FrontendMultipleActionAsyncResult result) { + ImportExportImageModel model = (ImportExportImageModel) result.getState(); + model.stopProgress(); + model.cancel(); + } + }, this); + } + + protected void dataCenter_SelectedItemChanged() { + updateStorageDomains(); + } + + protected void storageDomain_SelectedItemChanged() { + updateQuotas(); + } + + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) + { + super.eventRaised(ev, sender, args); + + if (ev.matchesDefinition(selectedItemChangedEventDefinition)) { + if (sender == getDataCenter()) { + dataCenter_SelectedItemChanged(); + } + if (sender == getStorageDomain()) { + storageDomain_SelectedItemChanged(); + } + } + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java index 0a9f43b..50d3de3 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java @@ -7,12 +7,14 @@ import org.ovirt.engine.core.common.businessentities.ImageFileType; import org.ovirt.engine.core.common.businessentities.RepoImage; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.queries.GetImagesListParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; @@ -23,9 +25,22 @@ public StorageIsoListModel() { setTitle(ConstantsManager.getInstance().getConstants().imagesTitle()); - setHashName("images"); // $//$NON-NLS-1$ + setHashName("images"); //$NON-NLS-1$ + + setDownloadImagesCommand(new UICommand("Download", this)); //$NON-NLS-1$ + updateActionAvailability(); setIsTimerDisabled(true); + } + + private UICommand downloadImagesCommand; + + public UICommand getDownloadImagesCommand() { + return downloadImagesCommand; + } + + public void setDownloadImagesCommand(UICommand downloadImagesCommand) { + this.downloadImagesCommand = downloadImagesCommand; } @Override @@ -97,18 +112,18 @@ return; } - ArrayList<RepoImage> repoFileList = (ArrayList<RepoImage>) - returnValue.getReturnValue(); + @SuppressWarnings("unchecked") + ArrayList<RepoImage> repoImageList = (ArrayList<RepoImage>) returnValue.getReturnValue(); - Collections.sort(repoFileList, new Comparator<RepoImage>() { + Collections.sort(repoImageList, new Comparator<RepoImage>() { @Override public int compare(RepoImage a, RepoImage b) { return a.getRepoImageId().compareToIgnoreCase(b.getRepoImageId()); } }); - setItems(repoFileList); - setIsEmpty(repoFileList.isEmpty()); + setItems(repoImageList); + setIsEmpty(repoImageList.isEmpty()); } }; @@ -119,4 +134,52 @@ protected String getListName() { return "StorageIsoListModel"; //$NON-NLS-1$ } + + private void downloadImages() { + @SuppressWarnings("unchecked") + ArrayList<RepoImage> repoImages = (ArrayList<RepoImage>) getSelectedItems(); + + if (repoImages == null || getWindow() != null) { + return; + } + + ImportExportImageModel model = new ImportExportImageModel(); + setWindow(model); + model.setTitle(ConstantsManager.getInstance().getConstants().downloadImagesTitle()); + model.setHashName("download_images"); //$NON-NLS-1$ + model.setEntity(this); + model.init((StorageDomain) getEntity(), repoImages); + } + + public void cancel() { + setWindow(null); + Frontend.Unsubscribe(); + } + + private void updateActionAvailability() { + StorageDomain storageDomain = (StorageDomain) getEntity(); + @SuppressWarnings("unchecked") + ArrayList<RepoImage> selectedImages = + getSelectedItems() != null ? (ArrayList<RepoImage>) getSelectedItems() : new ArrayList<RepoImage>(); + getDownloadImagesCommand().setIsExecutionAllowed(storageDomain != null && + storageDomain.getStorageType() == StorageType.GLANCE && selectedImages.size() > 0); + } + + @Override + protected void selectedItemsChanged() { + super.selectedItemsChanged(); + updateActionAvailability(); + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + + if (command == getDownloadImagesCommand()) { + downloadImages(); + } + else if (command.getName().equals("Cancel")) { //$NON-NLS-1$ + cancel(); + } + } } diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index 625084a..9a15cc4 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -529,6 +529,9 @@ @DefaultStringValue("Move Disk(s)") String moveDisksTitle(); + @DefaultStringValue("Download Image(s)") + String downloadImagesTitle(); + @DefaultStringValue("Snapshots") String snapshotsTitle(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java index c6b6daf..a761b96 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java @@ -2204,6 +2204,9 @@ @DefaultStringValue("Type") String typeIso(); + @DefaultStringValue("Download") + String downloadImage(); + // Storage tree @DefaultStringValue("Name") String nameStorageTree(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java index c81b03b..9ba04cc 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java @@ -65,6 +65,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.DisksAllocationPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindMultiDcPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindSingleDcPopupPresenterWidget; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageDestroyPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageForceCreatePopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StoragePopupPresenterWidget; @@ -257,6 +258,7 @@ import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.DisksAllocationPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindMultiDcPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindSingleDcPopupView; +import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.ImportExportImagePopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StorageDestroyPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StorageForceCreatePopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StoragePopupView; @@ -1032,6 +1034,9 @@ bindPresenterWidget(ChangeQuotaPopupPresenterWidget.class, ChangeQuotaPopupPresenterWidget.ViewDef.class, ChangeQuotaPopupView.class); + bindPresenterWidget(ImportExportImagePopupPresenterWidget.class, + ImportExportImagePopupPresenterWidget.ViewDef.class, + ImportExportImagePopupView.class); // Storage Remove bindPresenterWidget(StorageRemovePopupPresenterWidget.class, diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java index 49b7cac..cfdbaac 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java @@ -38,6 +38,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.event.EventPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindMultiDcPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindSingleDcPopupPresenterWidget; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageDestroyPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageForceCreatePopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StoragePopupPresenterWidget; @@ -184,10 +185,21 @@ @Provides @Singleton - public SearchableDetailModelProvider<RepoImage, StorageListModel, StorageIsoListModel> getStorageIsoListProvider(ClientGinjector ginjector) { + public SearchableDetailModelProvider<RepoImage, StorageListModel, StorageIsoListModel> getStorageIsoListProvider(ClientGinjector ginjector, + final Provider<ImportExportImagePopupPresenterWidget> importExportPopupProvider) { return new SearchableDetailTabModelProvider<RepoImage, StorageListModel, StorageIsoListModel>(ginjector, StorageListModel.class, - StorageIsoListModel.class); + StorageIsoListModel.class) { + @Override + public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(StorageIsoListModel source, + UICommand lastExecutedCommand, Model windowModel) { + if (lastExecutedCommand == getModel().getDownloadImagesCommand()) { + return importExportPopupProvider.get(); + } else { + return super.getModelPopup(source, lastExecutedCommand, windowModel); + } + } + }; } @Provides diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java new file mode 100644 index 0000000..5a3d0bd --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java @@ -0,0 +1,20 @@ +package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage; + +import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget; +import org.ovirt.engine.ui.uicommonweb.models.storage.ImportExportImageModel; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; + +public class ImportExportImagePopupPresenterWidget extends + AbstractModelBoundPopupPresenterWidget<ImportExportImageModel, ImportExportImagePopupPresenterWidget.ViewDef> { + + public interface ViewDef extends AbstractModelBoundPopupPresenterWidget.ViewDef<ImportExportImageModel> { + } + + @Inject + public ImportExportImagePopupPresenterWidget(EventBus eventBus, ViewDef view) { + super(eventBus, view); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java new file mode 100644 index 0000000..4d1827b --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java @@ -0,0 +1,169 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage; + +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.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.inject.Inject; +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.common.businessentities.RepoImage; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.ui.common.idhandler.WithElementId; +import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; +import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; +import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; +import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable.SelectionMode; +import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; +import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer; +import org.ovirt.engine.ui.common.widget.table.column.DiskSizeColumn; +import org.ovirt.engine.ui.common.widget.table.column.EntityModelTextColumn; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.ImportExportImageModel; +import org.ovirt.engine.ui.uicompat.Event; +import org.ovirt.engine.ui.uicompat.EventArgs; +import org.ovirt.engine.ui.uicompat.IEventListener; +import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.ApplicationResources; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget; + +import java.util.ArrayList; + + +public class ImportExportImagePopupView extends AbstractModelBoundPopupView<ImportExportImageModel> implements + ImportExportImagePopupPresenterWidget.ViewDef { + + interface Driver extends SimpleBeanEditorDriver<ImportExportImageModel, ImportExportImagePopupView> { + } + + interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ImportExportImagePopupView> { + ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); + } + + @UiField + FlowPanel messagePanel; + + @UiField(provided = true) + @Path(value = "dataCenter.selectedItem") + @WithElementId + public ListModelListBoxEditor<Object> dataCenterEditor; + + @UiField(provided = true) + @Path(value = "storageDomain.selectedItem") + @WithElementId + public ListModelListBoxEditor<Object> storageDomainEditor; + + @UiField(provided = true) + @Path(value = "quota.selectedItem") + @WithElementId + public ListModelListBoxEditor<Object> quotaEditor; + + @UiField(provided = true) + SimplePanel imageListPanel; + + @Ignore + EntityModelCellTable<ListModel> imageList; + + private final Driver driver = GWT.create(Driver.class); + + @Inject + public ImportExportImagePopupView(EventBus eventBus, ApplicationResources resources, ApplicationConstants constants) { + super(eventBus, resources); + + dataCenterEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { + @Override + public String renderNullSafe(Object object) { + return ((StoragePool) object).getname(); + } + }); + dataCenterEditor.setLabel(constants.dataCenter()); + + storageDomainEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { + @Override + public String renderNullSafe(Object object) { + return ((StorageDomain) object).getStorageName(); + } + }); + storageDomainEditor.setLabel(constants.domainNameStorage()); + + quotaEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { + @Override + public String renderNullSafe(Object object) { + return ((Quota) object).getQuotaName(); + } + }); + quotaEditor.setLabel(constants.quota()); + + imageListPanel = new SimplePanel(); + + imageList = new EntityModelCellTable<ListModel>(SelectionMode.NONE, true); + imageList.addEntityModelColumn(new EntityModelTextColumn<RepoImage>() { + @Override + public String getText(RepoImage repoImage) { + return repoImage.getRepoImageTitle(); + } + }, constants.fileNameIso()); + imageList.addEntityModelColumn(new EntityModelTextColumn<RepoImage>() { + @Override + public String getText(RepoImage repoImage) { + return repoImage.getFileType().toString(); + } + }, constants.typeIso()); + imageList.addEntityModelColumn(new DiskSizeColumn<EntityModel>() { + @Override + protected Long getRawValue(EntityModel object) { + return ((RepoImage) (object.getEntity())).getSize(); + } + }, constants.actualSizeTemplate()); + + imageList.setWidth("100%", true); //$NON-NLS-1$ + imageListPanel.setWidget(imageList); + + initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); + driver.initialize(this); + } + + @Override + public void edit(final ImportExportImageModel model) { + driver.edit(model); + + model.getPropertyChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + if (args instanceof PropertyChangedEventArgs) { + PropertyChangedEventArgs changedArgs = (PropertyChangedEventArgs) args; + if ("RepoImages".equals(changedArgs.PropertyName)) { //$NON-NLS-1$ + if (model.getRepoImages() != null) { + ArrayList<EntityModel> repoImageModels = new ArrayList<EntityModel>(); + for (RepoImage i : model.getRepoImages()) { + repoImageModels.add(new EntityModel(i)); + } + imageList.setRowData(repoImageModels); + } + } + } + } + }); + } + + @Override + public ImportExportImageModel flush() { + return driver.flush(); + } + + @Override + public void setMessage(String message) { + super.setMessage(message); + + messagePanel.setVisible(message != null && !message.isEmpty()); + messagePanel.clear(); + messagePanel.add(new Label(message)); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml new file mode 100644 index 0000000..d946090 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog" + xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" xmlns:w="urn:import:org.ovirt.engine.ui.common.widget.uicommon.storage"> + + <ui:style> + .messagePanel { + color: #CD2127; + text-align: center; + padding: 10px; + } + .imageListPanel { + overflow: auto; + position: absolute; + width: 100%; + } + </ui:style> + + <d:SimpleDialogPanel width="540px" height="400px"> + <d:content> + <g:FlowPanel> + <e:ListModelListBoxEditor ui:field="dataCenterEditor" /> + <e:ListModelListBoxEditor ui:field="storageDomainEditor" /> + <e:ListModelListBoxEditor ui:field="quotaEditor" /> + <g:FlowPanel ui:field="messagePanel" visible="false" addStyleNames="{style.messagePanel}" /> + <g:SimplePanel ui:field="imageListPanel" addStyleNames="{style.imageListPanel}" /> + </g:FlowPanel> + </d:content> + </d:SimpleDialogPanel> + +</ui:UiBinder> \ No newline at end of file diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java index 4e33f5f..8bc9517 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java @@ -5,12 +5,14 @@ import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; import org.ovirt.engine.ui.common.widget.table.column.DiskSizeColumn; import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip; +import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageIsoListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageIsoPresenter; import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView; +import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; import com.google.inject.Inject; @@ -52,6 +54,13 @@ }; getTable().addColumn(sizeColumn, constants.actualSizeTemplate(), "100px"); //$NON-NLS-1$ + getTable().addActionButton(new WebAdminButtonDefinition<RepoImage>(constants.downloadImage()) { + @Override + protected UICommand resolveCommand() { + return getDetailModel().getDownloadImagesCommand(); + } + }); + getTable().showRefreshButton(); } } -- To view, visit http://gerrit.ovirt.org/16083 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I084dadfd208255738140f093ffc8ec136f83d7f6 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches