/*
* 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.datasource.management.client.dbexplorer.dbobjects;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.view.client.AsyncDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import org.gwtbootstrap3.client.ui.ListBox;
import org.gwtbootstrap3.client.ui.constants.ButtonSize;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.gwtbootstrap3.client.ui.gwt.ButtonCell;
import org.gwtbootstrap3.client.ui.gwt.FlowPanel;
import org.jboss.errai.common.client.dom.Button;
import org.jboss.errai.common.client.dom.Div;
import org.jboss.errai.common.client.dom.HTMLElement;
import org.jboss.errai.common.client.dom.Label;
import org.jboss.errai.common.client.dom.TextInput;
import org.jboss.errai.ui.client.local.api.IsElement;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.kie.workbench.common.screens.datasource.management.client.resources.i18n.DataSourceManagementConstants;
import org.kie.workbench.common.screens.datasource.management.client.util.UIUtil;
import org.uberfire.commons.data.Pair;
import org.uberfire.ext.widgets.common.client.common.BusyPopup;
import org.uberfire.ext.widgets.common.client.tables.PagedTable;
@Templated
public class DatabaseObjectExplorerViewImpl
implements DatabaseObjectExplorerView, IsElement {
private Presenter presenter;
@Inject
@DataField( "header-panel" )
private Div headerPanel;
@Inject
@DataField( "schema-selector-label" )
private Label schemaSelectorLabel;
@Inject
@DataField( "schema-selector" )
private ListBox schemaSelector;
@Inject
@DataField( "object-type-selector-label" )
private Label objectTypeSelectorLabel;
@Inject
@DataField( "object-type-selector" )
private ListBox objectTypeSelector;
@Inject
@DataField( "name-filter-label" )
private Label nameFilterLabel;
@Inject
@DataField( "name-filter-textbox" )
private TextInput nameFilterTextBox;
@Inject
@DataField( "filter-button" )
private Button filterButton;
@Inject
@DataField( "results-panel" )
private FlowPanel resultsPanel;
private PagedTable< DatabaseObjectRow > dataGrid;
@Inject
private TranslationService translationService;
public DatabaseObjectExplorerViewImpl( ) {
}
@PostConstruct
private void init( ) {
nameFilterTextBox.setAttribute( "placeholder", translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_namePatternHelp ) );
dataGrid = new PagedTable<>( 20, new ProvidesKey< DatabaseObjectRow >( ) {
@Override
public Object getKey( DatabaseObjectRow item ) {
return item.getName( );
}
} );
initializeResultsTable( );
resultsPanel.add( dataGrid );
}
@Override
public void init( Presenter presenter ) {
this.presenter = presenter;
}
@Override
public String getSchema( ) {
return schemaSelector.getSelectedValue( );
}
@Override
public String getObjectType( ) {
return objectTypeSelector.getSelectedValue( );
}
@Override
public String getFilterTerm( ) {
return nameFilterTextBox.getValue();
}
@Override
public void loadSchemaOptions( List< Pair< String, String > > options, String selectedOption ) {
UIUtil.loadOptions( schemaSelector, options, selectedOption );
}
@Override
public void loadDatabaseObjectTypeOptions( List< Pair< String, String > > options ) {
UIUtil.loadOptions( objectTypeSelector, options );
}
@Override
public void setDataProvider( AsyncDataProvider< DatabaseObjectRow > dataProvider ) {
dataGrid.setDataProvider( dataProvider );
}
@Override
public void showHeaderPanel( boolean show ) {
headerPanel.setHidden( !show );
}
@Override
public void showSchemaSelector( boolean show ) {
schemaSelectorLabel.setHidden( !show );
showElement( schemaSelector.getElement( ), show );
}
@Override
public void showObjectTypeFilter( boolean show ) {
objectTypeSelectorLabel.setHidden( !show );
showElement( objectTypeSelector.getElement( ), show );
}
@Override
public void showObjectNameFilter( boolean show ) {
nameFilterLabel.setHidden( !show );
showElement( nameFilterTextBox, show );
}
@Override
public void showFilterButton( boolean show ) {
showElement( filterButton, show );
}
@Override
public void redraw( ) {
dataGrid.redraw( );
}
@Override
public void showBusyIndicator( String message ) {
BusyPopup.showMessage( message );
}
@Override
public void hideBusyIndicator( ) {
BusyPopup.close( );
}
@EventHandler( "filter-button" )
private void onFilterClick( ClickEvent event ) {
presenter.onSearch( );
}
private void initializeResultsTable( ) {
dataGrid.setEmptyTableCaption( translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_dbObjectsListEmpty ) );
dataGrid.setToolBarVisible( false );
addNameColumn( );
addTypeColumn( );
addOpenColumn( );
}
private void addNameColumn( ) {
Column< DatabaseObjectRow, String > column = new Column< DatabaseObjectRow, String >( new TextCell( ) ) {
@Override
public String getValue( DatabaseObjectRow row ) {
return row.getName( );
}
};
dataGrid.addColumn( column, translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_dbObjectNameColumn ) );
dataGrid.setColumnWidth( column, 80, Style.Unit.PCT );
}
private void addTypeColumn( ) {
Column< DatabaseObjectRow, String > column = new Column< DatabaseObjectRow, String >( new TextCell( ) ) {
@Override
public String getValue( DatabaseObjectRow row ) {
return row.getType( );
}
};
dataGrid.addColumn( column, translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_dbObjectTypeColumn ) );
dataGrid.setColumnWidth( column, 10, Style.Unit.PCT );
}
private void addOpenColumn( ) {
Column< DatabaseObjectRow, String > column = new Column< DatabaseObjectRow, String >( new ButtonCell( ButtonType.DEFAULT, ButtonSize.SMALL ) ) {
@Override
public String getValue( DatabaseObjectRow row ) {
return translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_dbObjectOpen );
}
};
column.setFieldUpdater( new FieldUpdater< DatabaseObjectRow, String >( ) {
@Override
public void update( int index,
DatabaseObjectRow row,
String value ) {
onOpen( row );
}
} );
dataGrid.addColumn( column, translationService.getTranslation(
DataSourceManagementConstants.DatabaseObjectExplorerViewImpl_dbObjectActionColumn ) );
dataGrid.setColumnWidth( column, 10, Style.Unit.PCT );
}
private void onOpen( DatabaseObjectRow row ) {
presenter.onOpen( row );
}
private void showElement( com.google.gwt.dom.client.Element element, boolean show ) {
element.getStyle( ).setDisplay( show ? Style.Display.INLINE_BLOCK : Style.Display.NONE );
}
private void showElement( HTMLElement element, boolean show ) {
element.getStyle().setProperty( "display",
show ? Style.Display.INLINE_BLOCK.getCssName() : Style.Display.NONE.getCssName() );
}
}