package org.ovirt.engine.ui.userportal.section.main.view.tab.extended; import java.util.List; import org.gwtbootstrap3.client.ui.constants.IconType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.common.widget.refresh.SimpleRefreshManager; import org.ovirt.engine.ui.common.widget.table.SimpleActionTable; import org.ovirt.engine.ui.common.widget.table.cell.AbstractCell; import org.ovirt.engine.ui.common.widget.table.cell.AbstractIconButtonCell; import org.ovirt.engine.ui.common.widget.table.column.AbstractColumn; import org.ovirt.engine.ui.uicommonweb.ErrorPopupManager; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.models.VmConsoles; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalItemModel; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalListModel; import org.ovirt.engine.ui.userportal.ApplicationConstants; import org.ovirt.engine.ui.userportal.ApplicationResources; import org.ovirt.engine.ui.userportal.ApplicationTemplates; import org.ovirt.engine.ui.userportal.gin.AssetProvider; import org.ovirt.engine.ui.userportal.gin.ClientGinjectorProvider; import org.ovirt.engine.ui.userportal.section.main.presenter.tab.extended.SideTabExtendedVirtualMachinePresenter; import org.ovirt.engine.ui.userportal.section.main.view.AbstractSideTabWithDetailsView; import org.ovirt.engine.ui.userportal.uicommon.model.vm.UserPortalListProvider; import org.ovirt.engine.ui.userportal.widget.action.UserPortalButtonDefinition; import org.ovirt.engine.ui.userportal.widget.basic.MainTabBasicListItemMessagesTranslator; import org.ovirt.engine.ui.userportal.widget.extended.vm.ConsoleButtonCell; import org.ovirt.engine.ui.userportal.widget.extended.vm.ConsoleEditButtonCell; import org.ovirt.engine.ui.userportal.widget.table.UserPortalSimpleActionTable; import org.ovirt.engine.ui.userportal.widget.table.column.AbstractUserportalMaskedDataurlImageColumn; import org.ovirt.engine.ui.userportal.widget.table.column.VmStatusColumn; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.cellview.client.RowStyles; import com.google.inject.Inject; public class SideTabExtendedVirtualMachineView extends AbstractSideTabWithDetailsView<UserPortalItemModel, UserPortalListModel> implements SideTabExtendedVirtualMachinePresenter.ViewDef { interface ViewIdHandler extends ElementIdHandler<SideTabExtendedVirtualMachineView> { ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); } public interface VmTableResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/userportal/css/ExtendedVmListTable.css" }) TableStyle cellTableStyle(); } private static final VmTableResources vmTableResources = GWT.create(VmTableResources.class); private final ErrorPopupManager errorPopupManager; private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationResources resources = AssetProvider.getResources(); private static final ApplicationConstants constants = AssetProvider.getConstants(); @Inject public SideTabExtendedVirtualMachineView(UserPortalListProvider modelProvider, ErrorPopupManager errorPopupManager, MainTabBasicListItemMessagesTranslator translator, ClientStorage clientStorage) { super(modelProvider, clientStorage); this.errorPopupManager = errorPopupManager; resources.sideTabExtendedVmStyle().ensureInjected(); ViewIdHandler.idHandler.generateAndSetIds(this); initTable(); } @Override protected SimpleActionTable<UserPortalItemModel> createActionTable() { return new UserPortalSimpleActionTable<>(modelProvider, getTableResources(), ClientGinjectorProvider.getEventBus(), ClientGinjectorProvider.getClientStorage(), new SimpleRefreshManager(modelProvider, ClientGinjectorProvider.getEventBus(), ClientGinjectorProvider.getClientStorage())); } @Override protected Resources getTableResources() { return vmTableResources; } @Override protected Object getSubTabPanelContentSlot() { return SideTabExtendedVirtualMachinePresenter.TYPE_SetSubTabPanelContent; } @SuppressWarnings({ "rawtypes", "unchecked" }) void initTable() { final String elementIdPrefix = getTable().getContentTableElementId(); ImageResource mask = resources.disabledSmallMask(); AbstractUserportalMaskedDataurlImageColumn maskedVmImageColumn = new AbstractUserportalMaskedDataurlImageColumn(mask) { @Override public Guid getIconId(UserPortalItemModel itemModel) { return itemModel.getSmallIconId(); } }; getTable().addColumn(maskedVmImageColumn, constants.empty(), "77px"); //$NON-NLS-1$ getTable().addColumn(new VmStatusColumn(), constants.empty(), "55px"); //$NON-NLS-1$ AbstractCell<UserPortalItemModel> nameAndDescriptionCell = new AbstractCell<UserPortalItemModel>() { @Override public void render(Context context, UserPortalItemModel item, SafeHtmlBuilder sb, String id) { sb.append(templates.vmNameCellItem( id, item.getName())); String description = item.getDescription(); if (description != null && !description.isEmpty()) { sb.append(templates.vmDescriptionCellItem(description)); } } }; AbstractColumn<UserPortalItemModel, UserPortalItemModel> nameAndDescriptionColumn = new AbstractColumn<UserPortalItemModel, UserPortalItemModel>(nameAndDescriptionCell) { @Override public UserPortalItemModel getValue(UserPortalItemModel item) { return item; } }; getTable().addColumn(nameAndDescriptionColumn, constants.empty(), "400px"); //$NON-NLS-1$ ConsoleButtonCell openConsoleCell = new ConsoleButtonCell( resources.sideTabExtendedVmStyle().enabledConsoleButton(), resources.sideTabExtendedVmStyle().disabledConsoleButton(), model -> { try { if (!model.isPool()) { model.getVmConsoles().connect(); } } catch (VmConsoles.ConsoleConnectException e) { errorPopupManager.show(e.getLocalizedErrorMessage()); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(constants.openConsoleLabel()); } }; openConsoleCell.setElementIdPrefix(elementIdPrefix); openConsoleCell.setColumnId("openConsoleButton"); //$NON-NLS-1$ getTable().addColumn(new AbstractColumn(openConsoleCell) { @Override public Object getValue(Object object) { return object; } }, constants.empty(), "100px"); //$NON-NLS-1$ ConsoleEditButtonCell consoleEditCell = new ConsoleEditButtonCell( resources.sideTabExtendedVmStyle().enabledEditConsoleButton(), resources.sideTabExtendedVmStyle().disabledEditConsoleButton(), model -> getModel().getEditConsoleCommand().execute()) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(constants.editConsoleLabel()); } }; consoleEditCell.setElementIdPrefix(elementIdPrefix); consoleEditCell.setColumnId("editConsoleButton"); //$NON-NLS-1$ getTable().addColumn(new AbstractColumn(consoleEditCell) { @Override public Object getValue(Object object) { return object; } }, constants.empty(), "30px"); //$NON-NLS-1$ // start getTable().addColumn(new AbstractColumn<UserPortalItemModel, UserPortalItemModel>( new AbstractIconButtonCell<UserPortalItemModel>(IconType.PLAY) { @Override protected UICommand resolveCommand(UserPortalItemModel value) { return value.isPool() ? value.getTakeVmCommand() : value.getRunCommand(); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(value.isPool() ? constants.takeVmLabel() : constants.runVmLabel()); } @Override public UserPortalItemModel getValue(UserPortalItemModel object) { return object; } }, constants.empty(), "15px"); //$NON-NLS-1$ // shutdown getTable().addColumn(new AbstractColumn<UserPortalItemModel, UserPortalItemModel>( new AbstractIconButtonCell<UserPortalItemModel>(IconType.STOP) { @Override protected UICommand resolveCommand(UserPortalItemModel value) { return value.isPool() ? value.getReturnVmCommand() : value.getShutdownCommand(); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(value.isPool() ? constants.returnVmLabel() : constants.shutDownVm()); } @Override public UserPortalItemModel getValue(UserPortalItemModel object) { return object; } }, constants.empty(), "15px"); //$NON-NLS-1$ // suspend getTable().addColumn(new AbstractColumn<UserPortalItemModel, UserPortalItemModel>( new AbstractIconButtonCell<UserPortalItemModel>(IconType.PAUSE) { @Override protected UICommand resolveCommand(UserPortalItemModel value) { return value.getPauseCommand(); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(constants.suspendVmLabel()); } @Override public UserPortalItemModel getValue(UserPortalItemModel object) { return object; } }, constants.empty(), "15px"); //$NON-NLS-1$ // poweroff getTable().addColumn(new AbstractColumn<UserPortalItemModel, UserPortalItemModel>( new AbstractIconButtonCell<UserPortalItemModel>(IconType.POWER_OFF) { @Override protected UICommand resolveCommand(UserPortalItemModel value) { return value.getStopCommand(); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(constants.powerOffVm()); } @Override public UserPortalItemModel getValue(UserPortalItemModel object) { return object; } }, constants.empty(), "15px"); //$NON-NLS-1$ // reboot getTable().addColumn(new AbstractColumn<UserPortalItemModel, UserPortalItemModel>( // TODO: switch IconType.REFRESH to "pficon-spinner2" when ovirt-js-dependencies is // updated with the latest version of patternfly new AbstractIconButtonCell<UserPortalItemModel>(IconType.REFRESH) { @Override protected UICommand resolveCommand(UserPortalItemModel value) { return value.getRebootCommand(); } }) { @Override public SafeHtml getTooltip(UserPortalItemModel value) { return SafeHtmlUtils.fromSafeConstant(constants.rebootVm()); } @Override public UserPortalItemModel getValue(UserPortalItemModel object) { return object; } }, constants.empty(), "20px"); //$NON-NLS-1$ getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.newVm()) { @Override protected UICommand resolveCommand() { return getModel().getNewVmCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.editVm()) { @Override protected UICommand resolveCommand() { return getModel().getEditCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.removeVm()) { @Override protected UICommand resolveCommand() { return getModel().getRemoveCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.cloneVm()) { @Override protected UICommand resolveCommand() { return getModel().getCloneVmCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.runOnceVm()) { @Override protected UICommand resolveCommand() { return getModel().getRunOnceCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.changeCdVm()) { @Override protected UICommand resolveCommand() { return getModel().getChangeCdCommand(); } }); getTable().addActionButton(new UserPortalButtonDefinition<UserPortalItemModel>(constants.makeTemplateVm()) { @Override protected UICommand resolveCommand() { return getModel().getNewTemplateCommand(); } }); getTable().setExtraRowStyles(new RowStyles<UserPortalItemModel>() { @Override public String getStyleNames(UserPortalItemModel row, int rowIndex) { if (row == null) { return null; } if (isSelectedRow(row)) { return null; } return row.isVmUp() ? resources.sideTabExtendedVmStyle().vmUpRow() : resources.sideTabExtendedVmStyle().vmDownRow(); } protected boolean isSelectedRow(UserPortalItemModel row) { UserPortalItemModel selectedModel = getModel().getSelectedItem(); if (selectedModel != null) { if (modelProvider.getKey(selectedModel).equals(modelProvider.getKey(row))) { return true; } } List<UserPortalItemModel> selectedModels = getModel().getSelectedItems(); if (selectedModels == null) { return false; } for (UserPortalItemModel model : selectedModels) { if (modelProvider.getKey(model).equals(modelProvider.getKey(row))) { return true; } } return false; } }); } }