/*
* 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.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.BaseColumnFieldDiffImpl;
import org.drools.workbench.models.guided.dtable.shared.model.CompositeColumn;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryBRLConditionColumn;
import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.ModelSynchronizer;
import static org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.BaseColumnSynchronizer.*;
@Dependent
public class LimitedEntryBRLConditionColumnSynchronizer extends BaseColumnSynchronizer<ColumnMetaData, ColumnMetaData, ColumnMetaData> {
@Override
public int priority() {
return 4;
}
@Override
public boolean handlesAppend( final MetaData metaData ) {
return handlesUpdate( metaData );
}
@Override
public void append( final ColumnMetaData metaData ) {
//Check operation is supported
if ( !handlesAppend( metaData ) ) {
return;
}
final LimitedEntryBRLConditionColumn column = (LimitedEntryBRLConditionColumn) metaData.getColumn();
model.getConditions().add( column );
synchroniseAppendColumn( column );
}
@Override
public boolean handlesUpdate( final MetaData metaData ) {
if ( !( metaData instanceof ColumnMetaData ) ) {
return false;
}
return ( (ColumnMetaData) metaData ).getColumn() instanceof LimitedEntryBRLConditionColumn;
}
@Override
public List<BaseColumnFieldDiff> update( final ColumnMetaData originalMetaData,
final ColumnMetaData editedMetaData ) {
//Check operation is supported
if ( !( handlesUpdate( originalMetaData ) && handlesUpdate( editedMetaData ) ) ) {
return Collections.emptyList();
}
//Get differences between original and edited column
final LimitedEntryBRLConditionColumn originalColumn = (LimitedEntryBRLConditionColumn) originalMetaData.getColumn();
final LimitedEntryBRLConditionColumn editedColumn = (LimitedEntryBRLConditionColumn) editedMetaData.getColumn();
final List<BaseColumnFieldDiff> diffs = originalColumn.diff( editedColumn );
update( originalColumn,
editedColumn );
//LimitedEntry columns are always represented with a BooleanUiColumn
final boolean isHideUpdated = BaseColumnFieldDiffImpl.hasChanged( ConditionCol52.FIELD_HIDE_COLUMN,
diffs );
final boolean isHeaderUpdated = BaseColumnFieldDiffImpl.hasChanged( ConditionCol52.FIELD_HIDE_COLUMN,
diffs );
if ( isHideUpdated ) {
setColumnVisibility( originalColumn,
originalColumn.isHideColumn() );
}
if ( isHeaderUpdated ) {
setColumnHeader( originalColumn,
originalColumn.getHeader() );
}
return diffs;
}
@Override
public boolean handlesDelete( final MetaData metaData ) {
if ( !( metaData instanceof ColumnMetaData ) ) {
return false;
}
return ( (ColumnMetaData) metaData ).getColumn() instanceof LimitedEntryBRLConditionColumn;
}
@Override
public void delete( final ColumnMetaData metaData ) {
//Check operation is supported
if ( !handlesDelete( metaData ) ) {
return;
}
final LimitedEntryBRLConditionColumn column = (LimitedEntryBRLConditionColumn) metaData.getColumn();
final int columnIndex = model.getExpandedColumns().indexOf( column );
model.getConditions().remove( column );
synchroniseDeleteColumn( columnIndex );
}
@Override
public boolean handlesMoveColumnsTo( final List<? extends MetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
for ( MetaData md : metaData ) {
if ( !( md instanceof MoveColumnToMetaData ) ) {
return false;
}
final BaseColumn column = ( (MoveColumnToMetaData) md ).getColumn();
if ( !( column instanceof LimitedEntryBRLConditionColumn ) ) {
return false;
}
}
if ( metaData.size() > 1 ) {
throw new ModelSynchronizer.MoveColumnVetoException();
}
return true;
}
@Override
public void moveColumnsTo( final List<MoveColumnToMetaData> metaData ) throws ModelSynchronizer.MoveColumnVetoException {
//Check operation is supported
if ( !handlesMoveColumnsTo( metaData ) ) {
return;
}
final MoveColumnToMetaData md = metaData.get( 0 );
final LimitedEntryBRLConditionColumn modelColumn = (LimitedEntryBRLConditionColumn) md.getColumn();
final List<CompositeColumn<? extends BaseColumn>> modelConditionColumns = model.getConditions();
final int modelConditionColumnCount = modelConditionColumns.size();
if ( modelConditionColumnCount == 0 ) {
throw new ModelSynchronizer.MoveColumnVetoException();
}
final List<BaseColumn> allModelColumns = model.getExpandedColumns();
final int minColumnIndex = allModelColumns.indexOf( modelConditionColumns.get( 0 ) );
final int maxColumnIndex = allModelColumns.indexOf( modelConditionColumns.get( modelConditionColumnCount - 1 ) );
final int targetColumnIndex = md.getTargetColumnIndex();
final int sourceColumnIndex = md.getSourceColumnIndex();
if ( targetColumnIndex < minColumnIndex || targetColumnIndex > maxColumnIndex ) {
throw new ModelSynchronizer.MoveColumnVetoException();
}
moveModelData( targetColumnIndex,
sourceColumnIndex,
sourceColumnIndex );
modelConditionColumns.remove( modelColumn );
modelConditionColumns.add( targetColumnIndex - minColumnIndex,
modelColumn );
}
private void update( final LimitedEntryBRLConditionColumn originalColumn,
final LimitedEntryBRLConditionColumn editedColumn ) {
originalColumn.setHeader( editedColumn.getHeader() );
originalColumn.setDefaultValue( editedColumn.getDefaultValue() );
originalColumn.setHideColumn( editedColumn.isHideColumn() );
originalColumn.setDefinition( editedColumn.getDefinition() );
}
}