/*
* Copyright 2017 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.wizard.table.pages;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants;
import org.drools.workbench.screens.guided.dtable.client.widget.Validator;
import org.drools.workbench.screens.guided.dtable.client.wizard.table.pages.cells.ConditionCell;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.CheckBox;
import org.gwtbootstrap3.client.ui.Label;
import org.uberfire.ext.widgets.core.client.resources.WizardCellListResources;
/**
* An implementation of the Column Expansion page
*/
@Dependent
public class ColumnExpansionPageViewImpl extends Composite
implements
ColumnExpansionPageView {
private Presenter presenter;
private List<ConditionCol52> availableColumns;
private Set<ConditionCol52> availableColumnsSelections;
private MinimumWidthCellList<ConditionCol52> availableColumnsWidget;
private List<ConditionCol52> chosenColumns = new ArrayList<ConditionCol52>();
private Set<ConditionCol52> chosenColumnsSelections;
private MinimumWidthCellList<ConditionCol52> chosenColumnsWidget;
private MultiSelectionModel<ConditionCol52> availableSelectionModel = new MultiSelectionModel<ConditionCol52>();
private MultiSelectionModel<ConditionCol52> chosenSelectionModel = new MultiSelectionModel<ConditionCol52>();
private boolean isFullyExpanded = true;
@UiField
CheckBox chkExpandInFull;
@UiField
HorizontalPanel columnSelectorContainer;
@UiField
ScrollPanel availableColumnsContainer;
@UiField
ScrollPanel chosenColumnsContainer;
@UiField
Button btnAdd;
@UiField
Button btnRemove;
@Inject
private ConditionCell availableConditionsCell;
@Inject
private ConditionCell chosenConditionsCell;
interface ColumnExpansionPageWidgetBinder
extends
UiBinder<Widget, ColumnExpansionPageViewImpl> {
}
private static ColumnExpansionPageWidgetBinder uiBinder = GWT.create( ColumnExpansionPageWidgetBinder.class );
public ColumnExpansionPageViewImpl() {
initWidget( uiBinder.createAndBindUi( this ) );
}
@PostConstruct
public void setup() {
this.availableColumnsWidget = new MinimumWidthCellList<ConditionCol52>( availableConditionsCell,
WizardCellListResources.INSTANCE );
this.chosenColumnsWidget = new MinimumWidthCellList<ConditionCol52>( chosenConditionsCell,
WizardCellListResources.INSTANCE );
initialiseAvailableColumns();
initialiseChosenColumns();
initialiseExpandInFull();
}
@Override
public void setValidator( final Validator validator ) {
this.availableConditionsCell.setValidator( validator );
this.chosenConditionsCell.setValidator( validator );
}
private void initialiseAvailableColumns() {
availableColumnsContainer.add( availableColumnsWidget );
availableColumnsWidget.setKeyboardSelectionPolicy( KeyboardSelectionPolicy.ENABLED );
availableColumnsWidget.setMinimumWidth( 270 );
final Label lstEmpty = new Label( GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardNoAvailableColumns() );
lstEmpty.setStyleName( WizardCellListResources.INSTANCE.cellListStyle().cellListEmptyItem() );
availableColumnsWidget.setEmptyListWidget( lstEmpty );
availableColumnsWidget.setSelectionModel( availableSelectionModel );
availableSelectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange( final SelectionChangeEvent event ) {
availableColumnsSelections = availableSelectionModel.getSelectedSet();
btnAdd.setEnabled( availableColumnsSelections.size() > 0 );
}
} );
}
private void initialiseChosenColumns() {
chosenColumnsContainer.add( chosenColumnsWidget );
chosenColumnsWidget.setKeyboardSelectionPolicy( KeyboardSelectionPolicy.ENABLED );
chosenColumnsWidget.setMinimumWidth( 270 );
final Label lstEmpty = new Label( GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardNoChosenColumns() );
lstEmpty.setStyleName( WizardCellListResources.INSTANCE.cellListStyle().cellListEmptyItem() );
chosenColumnsWidget.setEmptyListWidget( lstEmpty );
chosenColumnsWidget.setSelectionModel( chosenSelectionModel );
chosenSelectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange( final SelectionChangeEvent event ) {
chosenColumnsSelections = chosenSelectionModel.getSelectedSet();
btnRemove.setEnabled( chosenColumnsSelections.size() > 0 );
}
} );
}
private void initialiseExpandInFull() {
chkExpandInFull.addClickHandler( new ClickHandler() {
@Override
public void onClick( final ClickEvent event ) {
isFullyExpanded = chkExpandInFull.getValue();
columnSelectorContainer.setVisible( !isFullyExpanded );
presenter.setColumnsToExpand( getColumnsToExpand() );
}
} );
}
@Override
public void setChosenColumns( final List<ConditionCol52> columns ) {
chosenColumnsWidget.setRowCount( columns.size(),
true );
chosenColumnsWidget.setRowData( columns );
}
@Override
public void setAvailableColumns( final List<ConditionCol52> columns ) {
availableColumns = columns;
availableColumns.removeAll( chosenColumns );
availableColumnsWidget.setRowCount( columns.size(),
true );
availableColumnsWidget.setRowData( columns );
}
@Override
public void init( final ColumnExpansionPageView.Presenter presenter ) {
this.presenter = presenter;
}
@Override
public void setAreConditionsDefined( final boolean areConditionsDefined ) {
availableColumnsWidget.redraw();
chosenColumnsWidget.redraw();
}
private List<ConditionCol52> getColumnsToExpand() {
final List<ConditionCol52> columns = new ArrayList<ConditionCol52>();
if ( isFullyExpanded ) {
columns.addAll( availableColumns );
}
columns.addAll( chosenColumns );
return columns;
}
@UiHandler(value = "btnAdd")
public void btnAddClick( final ClickEvent event ) {
for ( ConditionCol52 column : availableColumnsSelections ) {
chosenColumns.add( column );
availableColumns.remove( column );
}
availableSelectionModel.clear();
availableColumnsSelections.clear();
setChosenColumns( chosenColumns );
setAvailableColumns( availableColumns );
presenter.setColumnsToExpand( getColumnsToExpand() );
btnAdd.setEnabled( false );
}
@UiHandler(value = "btnRemove")
public void btnRemoveClick( final ClickEvent event ) {
for ( ConditionCol52 column : chosenColumnsSelections ) {
chosenColumns.remove( column );
availableColumns.add( column );
}
chosenSelectionModel.clear();
chosenColumnsSelections.clear();
setChosenColumns( chosenColumns );
setAvailableColumns( availableColumns );
presenter.setColumnsToExpand( getColumnsToExpand() );
btnRemove.setEnabled( false );
}
}