package org.ovirt.engine.ui.webadmin.section.main.view.popup; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import org.gwtbootstrap3.client.ui.constants.IconType; import org.ovirt.engine.core.common.businessentities.Erratum; import org.ovirt.engine.core.common.businessentities.Erratum.ErrataSeverity; import org.ovirt.engine.core.common.businessentities.Erratum.ErrataType; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.table.HasColumns; import org.ovirt.engine.ui.common.widget.table.column.AbstractFullDateTimeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractIconTypeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; import org.ovirt.engine.ui.uicommonweb.models.AbstractErrataListModel; import org.ovirt.engine.ui.uicommonweb.models.ErrataFilterValue; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.widget.errata.ErrataFilterPanel; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState; import com.google.gwt.user.client.ui.LayoutPanel; import com.google.gwt.user.client.ui.ResizeComposite; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionModel; import com.google.gwt.view.client.SingleSelectionModel; /** * Renders a grid of errata (singular: Erratum) and a panel of check boxes * (ErrataFilterPanel) which allow the user to filter the grid (client-side). */ public class ErrataTableView extends ResizeComposite { interface ViewUiBinder extends UiBinder<LayoutPanel, ErrataTableView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } public interface Style extends CssResource { String errataSummaryLabel(); } private static final ApplicationConstants constants = AssetProvider.getConstants(); @UiField(provided=true) EntityModelCellTable<AbstractErrataListModel> errataTable; @UiField ScrollPanel scrollPanel; @UiField ErrataFilterPanel errataFilterPanel; private List<HandlerRegistration> selectionHandlers = new ArrayList<>(); protected AbstractErrataListModel errataListModel; public ErrataTableView() { createErrataTable(); initErrataGrid(errataTable); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); initFilterPanel(); } private void createErrataTable() { errataTable = new EntityModelCellTable<AbstractErrataListModel>(false, true) { //Override the addSelectionChangeHandler method to prevent a class cast exception. The EntityModelCellTable //expect to be handed a list of EntityModels, but the ErrataListModel is returning a list of Erratums. If //I rework the list model to return EntityModel<Erratum> I get another class cast exception on something //that expects it to return a straight Erratum. public void addSelectionChangeHandler() { // Handle selection getSelectionModel().addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { if (errataListModel == null || errataListModel.getItems() == null) { return; } SelectionModel<?> selectionModel = errataTable.getSelectionModel(); Erratum selectedObject = (Erratum) ((SingleSelectionModel<?>) selectionModel).getSelectedObject(); clearCurrentSelectedItems(); if (selectedObject != null) { errataListModel.setSelectedItem(selectedObject); } } private void clearCurrentSelectedItems() { errataListModel.setSelectedItems(null); errataListModel.setSelectedItem(null); } }); } }; } public void init(AbstractErrataListModel errataListModel) { this.errataListModel = errataListModel; errataTable.setLoadingState(LoadingState.LOADING); updateFilterPanel(); } private void initFilterPanel() { // Handle the filter panel's checkboxes values changing -> simple view update (re-run client-side filter) // ValueChangeHandler<ErrataFilterValue> handler = event -> { errataListModel.setItemsFilter(event.getValue()); errataListModel.reFilter(); }; errataFilterPanel.addValueChangeHandler(handler); } public void addSelectionChangeHandler(SelectionChangeEvent.Handler selectionHandler) { selectionHandlers.add(errataTable.getSelectionModel().addSelectionChangeHandler(selectionHandler)); } public Erratum getSelectedErratum() { @SuppressWarnings({ "unchecked", "rawtypes" }) SingleSelectionModel<Erratum> selectionModel = (SingleSelectionModel) errataTable.getSelectionModel(); return selectionModel.getSelectedObject(); } /** * Setup the columns in the errata grid. This configuration is also used in MainTabEngineErrataView. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void initErrataGrid(HasColumns grid) { grid.enableColumnResizing(); AbstractIconTypeColumn<Erratum> errataTypeColumn = new AbstractIconTypeColumn<Erratum>() { @Override public IconType getValue(Erratum erratum) { if (erratum.getType() == ErrataType.BUGFIX) { getCell().setColor(SafeHtmlUtils.fromTrustedString(ErrataType.BUGFIX.getColor())); return IconType.BUG; } else if (erratum.getType() == ErrataType.ENHANCEMENT) { getCell().setColor(SafeHtmlUtils.fromTrustedString(ErrataType.ENHANCEMENT.getColor())); return IconType.PLUS_SQUARE; } else if (erratum.getType() == ErrataType.SECURITY) { getCell().setColor(SafeHtmlUtils.fromTrustedString(ErrataType.SECURITY.getColor())); return IconType.WARNING; } return null; } }; errataTypeColumn.makeSortable(new ErrataTypeComparator()); grid.addColumn(errataTypeColumn, "", "30px"); //$NON-NLS-1$ //$NON-NLS-2$ AbstractTextColumn errataTypeTextColumn = new AbstractTextColumn<Erratum>() { @Override public String getValue(Erratum erratum) { if (erratum.getType() == ErrataType.BUGFIX) { return constants.bug(); } else if (erratum.getType() == ErrataType.ENHANCEMENT) { return constants.enhancement(); } else if (erratum.getType() == ErrataType.SECURITY) { return constants.security(); } return constants.unknown(); } }; errataTypeTextColumn.makeSortable(); grid.addColumn(errataTypeTextColumn, constants.errataType(), "150px"); //$NON-NLS-1$ AbstractTextColumn<Erratum> errataSeverityColumn = new AbstractTextColumn<Erratum>() { @Override public String getValue(Erratum erratum) { if (erratum.getSeverity() == ErrataSeverity.CRITICAL) { return constants.critical(); } else if (erratum.getSeverity() == ErrataSeverity.IMPORTANT) { return constants.important(); } else if (erratum.getSeverity() == ErrataSeverity.MODERATE) { return constants.moderate(); } return constants.unknown(); } }; errataSeverityColumn.makeSortable(); grid.addColumn(errataSeverityColumn, constants.errataSeverity(), "150px"); //$NON-NLS-1$ AbstractFullDateTimeColumn<Erratum> dateIssuedColumn = new AbstractFullDateTimeColumn<Erratum>(false) { @Override protected Date getRawValue(Erratum erratum) { return erratum.getIssued(); } }; dateIssuedColumn.makeSortable(); grid.addColumn(dateIssuedColumn, constants.errataDateIssued(), "100px"); //$NON-NLS-1$ AbstractTextColumn<Erratum> errataIdColumn = new AbstractTextColumn<Erratum>() { @Override public String getValue(Erratum erratum) { return erratum.getId(); } }; errataIdColumn.makeSortable(); grid.addColumn(errataIdColumn, constants.errataId(), "115px"); //$NON-NLS-1$ AbstractTextColumn<Erratum> titleColumn = new AbstractTextColumn<Erratum>() { @Override public String getValue(Erratum erratum) { return erratum.getTitle(); } }; titleColumn.makeSortable(); grid.addColumn(titleColumn, constants.errataTitle(), "290px"); //$NON-NLS-1$ } @Override public void onResize() { super.onResize(); updateScrollPanelHeight(); } public void clearHandlers() { //Clean up the handlers. for (HandlerRegistration handler: this.selectionHandlers) { handler.removeHandler(); } } private void updateScrollPanelHeight() { //Set the scroll Double newHeight = (double) (getOffsetHeight() - errataFilterPanel.getOffsetHeight()); if (newHeight.intValue() > 0) { scrollPanel.getElement().getStyle().setHeight(newHeight, Unit.PX); } } public void edit() { errataTable.asEditor().edit(errataListModel); updateFilterPanel(); errataTable.setLoadingState(LoadingState.LOADED); } private void updateFilterPanel() { ErrataFilterValue filterValue = errataListModel.getItemsFilter(); if (filterValue != null) { this.errataFilterPanel.init(filterValue.isSecurity(), filterValue.isBugs(), filterValue.isEnhancements()); } } public EntityModelCellTable<AbstractErrataListModel> getErrataTable() { return errataTable; } private static class ErrataTypeComparator implements Comparator<Erratum>, Serializable { @Override public int compare(Erratum erratum0, Erratum erratum1) { return erratum0.getType().compareTo(erratum1.getType()); } } }