/* * Copyright 2012 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.workbench.screens.guided.template.client.editor; import java.util.ArrayList; import java.util.List; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.ui.Panel; import org.drools.workbench.models.datamodel.rule.InterpolationVariable; import org.drools.workbench.models.guided.template.shared.TemplateModel; import org.drools.workbench.screens.guided.template.client.editor.events.SetInternalTemplateDataModelEvent; import org.drools.workbench.screens.guided.template.client.editor.events.SetTemplateDataEvent; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.AbstractDecoratedGridHeaderWidget; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.AbstractDecoratedGridSidebarWidget; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.AbstractDecoratedGridWidget; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.AbstractMergableGridWidget; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.CellValue; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.DynamicColumn; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.ResourcesProvider; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.data.DynamicData; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.events.SetModelEvent; /** * A Decorated Grid for Template Data */ public abstract class AbstractDecoratedTemplateDataGridWidget extends AbstractDecoratedGridWidget<TemplateModel, TemplateDataColumn, String> { //Factories to create new data elements protected final TemplateDataCellFactory cellFactory; protected final TemplateDataCellValueFactory cellValueFactory; public AbstractDecoratedTemplateDataGridWidget( ResourcesProvider<TemplateDataColumn> resources, TemplateDataCellFactory cellFactory, TemplateDataCellValueFactory cellValueFactory, EventBus eventBus, Panel mainPanel, Panel bodyPanel, AbstractMergableGridWidget<TemplateModel, TemplateDataColumn> gridWidget, AbstractDecoratedGridHeaderWidget<TemplateModel, TemplateDataColumn> headerWidget, AbstractDecoratedGridSidebarWidget<TemplateModel, TemplateDataColumn> sidebarWidget ) { super( resources, eventBus, mainPanel, bodyPanel, gridWidget, headerWidget, sidebarWidget ); if ( cellFactory == null ) { throw new IllegalArgumentException( "cellFactory cannot be null" ); } if ( cellValueFactory == null ) { throw new IllegalArgumentException( "cellValueFactory cannot be null" ); } this.cellFactory = cellFactory; this.cellValueFactory = cellValueFactory; //Wire-up event handlers eventBus.addHandler( SetTemplateDataEvent.TYPE, this ); } public void onSetModel( SetModelEvent<TemplateModel> event ) { DynamicData data = new DynamicData(); TemplateModel model = event.getModel(); List<DynamicColumn<TemplateDataColumn>> columns = new ArrayList<DynamicColumn<TemplateDataColumn>>(); setupInternalModel( model, columns, data ); //Raise event setting data and columns for UI components SetInternalTemplateDataModelEvent sime = new SetInternalTemplateDataModelEvent( model, data, columns ); eventBus.fireEvent( sime ); } private void setupInternalModel( TemplateModel model, List<DynamicColumn<TemplateDataColumn>> columns, DynamicData data ) { //Get interpolation variables InterpolationVariable[] vars = model.getInterpolationVariablesList(); if ( vars.length == 0 ) { return; } int colIndex = 0; String[][] modelData = model.getTableAsArray(); // Dummy rows because the underlying DecoratedGridWidget expects there // to be enough rows to receive the columns data for ( int iRow = 0; iRow < modelData.length; iRow++ ) { data.addRow(); } //Add corresponding columns to table for ( InterpolationVariable var : vars ) { TemplateDataColumn col = new TemplateDataColumn( var.getVarName(), var.getDataType(), var.getFactType(), var.getFactField() ); DynamicColumn<TemplateDataColumn> column = new DynamicColumn<TemplateDataColumn>( col, cellFactory.getCell( col ), colIndex, eventBus ); columns.add( column ); data.addColumn( colIndex, makeColumnData( modelData, col, colIndex++ ), true ); } } // Make a row of data for insertion into a DecoratedGridWidget private List<CellValue<? extends Comparable<?>>> makeColumnData( String[][] data, TemplateDataColumn column, int colIndex ) { int dataSize = data.length; List<CellValue<? extends Comparable<?>>> columnData = new ArrayList<CellValue<? extends Comparable<?>>>( dataSize ); for ( int iRow = 0; iRow < dataSize; iRow++ ) { String[] row = data[ iRow ]; //Underlying Template model uses empty Strings as null values; which is quite different in the MergedGrid world String initialValue = row[ colIndex ]; if ( initialValue != null && initialValue.equals( "" ) ) { initialValue = null; } CellValue<? extends Comparable<?>> cv = cellValueFactory.convertModelCellValue( column, initialValue ); columnData.add( cv ); } return columnData; } }