/* * Copyright 2016 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.kie.workbench.common.screens.datamodeller.client.widgets.editor; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.constants.ButtonSize; import org.gwtbootstrap3.client.ui.constants.ButtonType; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.gwt.ButtonCell; import org.kie.workbench.common.screens.datamodeller.client.resources.i18n.Constants; import org.kie.workbench.common.screens.datamodeller.client.resources.images.ImagesResources; import org.kie.workbench.common.screens.datamodeller.client.util.AnnotationValueHandler; import org.kie.workbench.common.screens.datamodeller.client.widgets.refactoring.ShowUsagesPopup; import org.kie.workbench.common.screens.datamodeller.model.maindomain.MainDomainAnnotations; import org.kie.workbench.common.services.datamodeller.core.ObjectProperty; import org.uberfire.backend.vfs.Path; import org.uberfire.ext.widgets.common.client.common.BusyPopup; import org.uberfire.ext.widgets.common.client.common.popups.YesNoCancelPopup; import org.uberfire.ext.widgets.common.client.tables.SimpleTable; import org.uberfire.mvp.Command; @Dependent public class DataObjectBrowserViewImpl extends Composite implements DataObjectBrowserView { interface DataObjectBrowserViewImplUIBinder extends UiBinder<Widget, DataObjectBrowserViewImpl> { } enum ColumnId { NAME_COLUMN, LABEL_COLUMN, TYPE_COLUMN } private static DataObjectBrowserViewImplUIBinder uiBinder = GWT.create( DataObjectBrowserViewImplUIBinder.class ); private final ButtonCell deleteCell = new ButtonCell( IconType.TRASH, ButtonType.DANGER, ButtonSize.SMALL ); @UiField Button objectButton; @UiField Button newPropertyButton; @UiField( provided = true ) SimpleTable<ObjectProperty> propertiesTable = new BrowserSimpleTable<ObjectProperty>( 1000 ); Map<Column<?,?>, ColumnId> columnIds = new HashMap<Column<?, ?>, ColumnId>( ); ListDataProvider<ObjectProperty> dataProvider; private Presenter presenter; private boolean readonly = true; private int tableHeight = 480; @Inject public DataObjectBrowserViewImpl() { initWidget( uiBinder.createAndBindUi( this ) ); } @PostConstruct protected void init() { newPropertyButton.setIcon( IconType.PLUS ); newPropertyButton.addClickHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { presenter.onNewProperty(); } } ); objectButton.addClickHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { presenter.onSelectCurrentDataObject(); } } ); //Init properties table propertiesTable.setEmptyTableCaption( Constants.INSTANCE.objectBrowser_emptyTable() ); propertiesTable.setColumnPickerButtonVisible( false ); propertiesTable.setToolBarVisible( false ); setTableHeight( tableHeight ); addPropertyNameColumn(); addPropertyLabelColumn(); addPropertyTypeBrowseColumn(); addPropertyTypeColumn(); addRemoveRowColumn(); addSortHandler(); //Init the selection model SingleSelectionModel<ObjectProperty> selectionModel = new SingleSelectionModel<ObjectProperty>(); propertiesTable.setSelectionModel( selectionModel ); selectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() { @Override public void onSelectionChange( SelectionChangeEvent event ) { ObjectProperty selectedProperty = ( ( SingleSelectionModel<ObjectProperty> ) propertiesTable.getSelectionModel() ).getSelectedObject(); presenter.onSelectProperty( selectedProperty ); } } ); setReadonly( true ); } @Override public void init( Presenter presenter ) { this.presenter = presenter; } @Override public void setDataProvider( ListDataProvider<ObjectProperty> dataProvider ) { if ( !dataProvider.getDataDisplays().contains( propertiesTable ) ) { dataProvider.addDataDisplay( propertiesTable ); } this.dataProvider = dataProvider; } public void setObjectSelectorLabel( String label, String title ) { objectButton.setText( label ); objectButton.setTitle( title ); } public void setReadonly( boolean readonly ) { this.readonly = readonly; enableNewPropertyAction( !readonly ); enableDeleteRowAction( !readonly ); } public void enableNewPropertyAction( boolean enable ) { newPropertyButton.setEnabled( enable ); } @Override public void enableDeleteRowAction( boolean enable ) { deleteCell.setEnabled( enable ); } @Override public void redrawRow( int row ) { //ideally we should have a method redrawRow( row ); propertiesTable.redraw(); } @Override public void redrawTable() { propertiesTable.redraw(); } @Override public ObjectProperty getSelectedRow() { return ( ( SingleSelectionModel<ObjectProperty> ) propertiesTable.getSelectionModel() ).getSelectedObject(); } @Override public void setSelectedRow( ObjectProperty objectProperty, boolean select ) { ( ( SingleSelectionModel<ObjectProperty> ) propertiesTable.getSelectionModel() ).setSelected( objectProperty, select ); } @Override public void setTableHeight( int height ) { this.tableHeight = height; propertiesTable.setHeight( tableHeight + "px" ); } @Override public int getTableHeight() { return tableHeight; } private void addPropertyNameColumn() { Column<ObjectProperty, String> column = new Column<ObjectProperty, String>( new TextCell() ) { @Override public String getValue( ObjectProperty objectProperty ) { if ( objectProperty.getName() != null ) { return objectProperty.getName(); } else { return ""; } } }; column.setSortable( true ); propertiesTable.addColumn( column, Constants.INSTANCE.objectBrowser_columnName() ); propertiesTable.setColumnWidth( column, 25, Style.Unit.PCT ); columnIds.put( column, ColumnId.NAME_COLUMN ); } private void addPropertyLabelColumn() { Column<ObjectProperty, String> column = new Column<ObjectProperty, String>( new TextCell() ) { @Override public String getValue( ObjectProperty objectProperty ) { if ( objectProperty.getName() != null ) { return AnnotationValueHandler.getStringValue( objectProperty, MainDomainAnnotations.LABEL_ANNOTATION, MainDomainAnnotations.VALUE_PARAM ); } else { return ""; } } }; column.setSortable( true ); propertiesTable.addColumn( column, Constants.INSTANCE.objectBrowser_columnLabel() ); propertiesTable.setColumnWidth( column, 25, Style.Unit.PCT ); columnIds.put( column, ColumnId.LABEL_COLUMN ); } private void addPropertyTypeBrowseColumn() { ClickableImageResourceCell typeImageCell = new ClickableImageResourceCell( true, 20 ); final Column<ObjectProperty, ImageResource> column = new Column<ObjectProperty, ImageResource>( typeImageCell ) { @Override public ImageResource getValue( final ObjectProperty property ) { if ( presenter != null && presenter.isSelectablePropertyType( property ) ) { return ImagesResources.INSTANCE.BrowseObject(); } else { return null; } } }; column.setFieldUpdater( new FieldUpdater<ObjectProperty, ImageResource>() { public void update( final int index, final ObjectProperty property, final ImageResource value ) { presenter.onSelectPropertyType( property ); } } ); propertiesTable.addColumn( column, " " ); propertiesTable.setColumnWidth( column, 38, Style.Unit.PX ); } private void addPropertyTypeColumn() { Column<ObjectProperty, String> column = new Column<ObjectProperty, String>( new TextCell() ) { @Override public String getValue( ObjectProperty objectProperty ) { if ( objectProperty.getName() != null && presenter != null ) { return presenter.getPropertyTypeDisplayValue( objectProperty ); } else { return ""; } } }; column.setSortable( true ); propertiesTable.addColumn( column, Constants.INSTANCE.objectBrowser_columnType() ); propertiesTable.setColumnWidth( column, 35, Style.Unit.PCT ); columnIds.put( column, ColumnId.TYPE_COLUMN ); } private void addRemoveRowColumn() { Column<ObjectProperty, String> column = new Column<ObjectProperty, String>( new ButtonCell( IconType.TRASH, ButtonType.DANGER, ButtonSize.SMALL ) ) { @Override public String getValue( ObjectProperty objectProperty ) { return Constants.INSTANCE.objectBrowser_action_delete(); } }; column.setFieldUpdater( new FieldUpdater<ObjectProperty, String>() { @Override public void update( int index, ObjectProperty objectProperty, String value ) { if ( !readonly ) { presenter.onDeleteProperty( objectProperty, index ); } } } ); propertiesTable.addColumn( column, "" ); propertiesTable.setColumnWidth( column, calculateButtonSize( Constants.INSTANCE.objectBrowser_action_delete() ), Style.Unit.PX ); } private void addSortHandler() { propertiesTable.addColumnSortHandler( new ColumnSortEvent.Handler() { @Override public void onColumnSort( ColumnSortEvent event ) { Column<?, ?> column = event.getColumn(); ColumnId columnId; if ( ( columnId = columnIds.get( column ) ) != null ) { switch ( columnId ) { case NAME_COLUMN: presenter.onSortByName( event.isSortAscending() ); break; case LABEL_COLUMN: presenter.onSortByLabel( event.isSortAscending() ); break; case TYPE_COLUMN: presenter.onSortByType( event.isSortAscending() ); } } } } ); } @Override public void showBusyIndicator( String message ) { BusyPopup.showMessage( message ); } @Override public void hideBusyIndicator() { BusyPopup.close(); } @Override public void showYesNoCancelPopup( final String title, final String content, final Command yesCommand, final String yesButtonText, final ButtonType yesButtonType, final Command noCommand, final String noButtonText, final ButtonType noButtonType, final Command cancelCommand, final String cancelButtonText, final ButtonType cancelButtonType ) { YesNoCancelPopup yesNoCancelPopup = YesNoCancelPopup.newYesNoCancelPopup( title, content, yesCommand, yesButtonText, yesButtonType, noCommand, noButtonText, noButtonType, cancelCommand, cancelButtonText, cancelButtonType ); yesNoCancelPopup.setClosable( false ); yesNoCancelPopup.show(); } @Override public void showUsagesPopupForDeletion( final String message, final List<Path> usedByFiles, final Command yesCommand, final Command cancelCommand ) { ShowUsagesPopup showUsagesPopup = ShowUsagesPopup.newUsagesPopupForDeletion( message, usedByFiles, yesCommand, cancelCommand ); showUsagesPopup.setClosable( false ); showUsagesPopup.show(); } private int calculateButtonSize( String buttonLabel ) { return 11 * buttonLabel.length() + 12 + 4; } private class BrowserSimpleTable<T> extends SimpleTable<T> { public BrowserSimpleTable( int pageSize ) { super(); dataGrid.setPageSize( pageSize ); } } }