/*
* 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.dtable.client.widget.table.model.synchronizers.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.enterprise.context.Dependent;
import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn;
import org.drools.workbench.models.guided.dtable.shared.model.BaseColumnFieldDiff;
import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52;
import org.drools.workbench.models.guided.dtable.shared.model.RowNumberCol52;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.ModelSynchronizer;
import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.Synchronizer;
import org.uberfire.ext.wires.core.grids.client.model.GridData;
import org.uberfire.ext.wires.core.grids.client.model.GridRow;
import org.uberfire.ext.wires.core.grids.client.model.impl.BaseGridRow;
import org.uberfire.ext.wires.core.grids.client.widget.grid.selections.impl.RowSelectionStrategy;
import static org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.RowSynchronizer.*;
@Dependent
public class RowSynchronizer extends BaseSynchronizer<RowMetaData, RowMetaData, RowMetaData> {
public interface RowMetaData extends Synchronizer.MetaData {
int getRowIndex();
}
public static class RowMetaDataImpl implements RowMetaData {
private final int rowIndex;
public RowMetaDataImpl() {
this( -1 );
}
public RowMetaDataImpl( final int rowIndex ) {
this.rowIndex = rowIndex;
}
@Override
public int getRowIndex() {
return rowIndex;
}
}
@Override
public boolean handlesAppend( final MetaData metaData ) {
return metaData instanceof RowMetaData;
}
@Override
public void append( final RowMetaData metaData ) {
if ( !handlesAppend( metaData ) ) {
return;
}
final List<DTCellValue52> modelRow = new ArrayList<DTCellValue52>();
model.getData().add( modelRow );
final GridRow uiModelRow = new BaseGridRow( GuidedDecisionTableView.ROW_HEIGHT );
uiModel.appendRow( uiModelRow );
final int rowIndex = uiModel.getRowCount() - 1;
initialiseRowData( rowIndex );
}
@Override
public boolean handlesInsert( final MetaData metaData ) throws ModelSynchronizer.MoveColumnVetoException {
return metaData instanceof RowMetaData;
}
@Override
public void insert( final RowMetaData metaData ) throws ModelSynchronizer.MoveColumnVetoException {
if ( !handlesAppend( metaData ) ) {
return;
}
final int rowIndex = metaData.getRowIndex();
final List<DTCellValue52> modelRow = new ArrayList<DTCellValue52>();
model.getData().add( rowIndex,
modelRow );
final GridRow uiModelRow = new BaseGridRow( GuidedDecisionTableView.ROW_HEIGHT );
uiModel.insertRow( rowIndex,
uiModelRow );
initialiseRowData( rowIndex );
}
private void initialiseRowData( final int rowIndex ) {
final List<BaseColumn> modelColumns = model.getExpandedColumns();
final List<DTCellValue52> modelRow = model.getData().get( rowIndex );
for ( int columnIndex = 0; columnIndex < modelColumns.size(); columnIndex++ ) {
final BaseColumn modelColumn = modelColumns.get( columnIndex );
final DTCellValue52 modelCell = makeModelCellValue( modelColumn );
modelRow.add( modelCell );
//BaseGridData is sparsely populated; only add values if needed.
if ( modelCell.hasValue() ) {
uiModel.setCellInternal( rowIndex,
columnIndex,
gridWidgetCellFactory.convertCell( modelCell,
modelColumn,
cellUtilities,
columnUtilities ) );
}
uiModel.indexColumn( columnIndex );
//Set-up SelectionManager for Row Number column, to select entire row.
if ( modelColumn instanceof RowNumberCol52 ) {
uiModel.getCell( rowIndex,
columnIndex ).setSelectionManager( RowSelectionStrategy.INSTANCE );
}
}
}
@Override
public boolean handlesUpdate( final MetaData metaData ) {
//We don't support updating a row at present, but we could; e.g. clear all values etc
return false;
}
@Override
public List<BaseColumnFieldDiff> update( final RowMetaData originalMetaData,
final RowMetaData editedMetaData ) {
//We don't support updating a row at present, but we could; e.g. clear all values etc
return Collections.emptyList();
}
@Override
public boolean handlesDelete( final MetaData metaData ) {
return metaData instanceof RowMetaData;
}
@Override
public void delete( final RowMetaData metaData ) {
if ( !handlesDelete( metaData ) ) {
return;
}
final int rowIndex = metaData.getRowIndex();
final GridData.Range rowRange = uiModel.deleteRow( rowIndex );
final int minRowIndex = rowRange.getMinRowIndex();
final int maxRowIndex = rowRange.getMaxRowIndex();
for ( int ri = minRowIndex; ri <= maxRowIndex; ri++ ) {
model.getData().remove( minRowIndex );
}
}
@Override
public boolean handlesMoveColumnsTo( final List<? extends MetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
//Moving Row data is delegated to each respective Column Synchronizer
return false;
}
@Override
public void moveColumnsTo( final List<MoveColumnToMetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
//Moving Row data is delegated to each respective Column Synchronizer
}
@Override
public boolean handlesMoveRowsTo( final List<? extends MetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
for ( MetaData md : metaData ) {
if ( !( md instanceof MoveRowToMetaData ) ) {
return false;
}
}
return true;
}
@Override
public void moveRowsTo( final List<MoveRowToMetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
//Check operation is supported
if ( !handlesMoveRowsTo( metaData ) ) {
return;
}
for ( int idx = 0; idx < metaData.size(); idx++ ) {
final MoveRowToMetaData md = metaData.get( idx );
final int sourceRowIndex = md.getSourceRowIndex();
final int targetRowIndex = md.getTargetRowIndex();
final List<DTCellValue52> row = md.getRow();
if ( targetRowIndex < sourceRowIndex ) {
model.getData().remove( sourceRowIndex );
model.getData().add( targetRowIndex,
row );
} else if ( targetRowIndex > sourceRowIndex ) {
model.getData().remove( sourceRowIndex - idx );
model.getData().add( targetRowIndex - idx,
row );
}
}
}
}