/*
* 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.drools.workbench.screens.guided.dtable.client.widget.table.popovers;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import com.ait.lienzo.client.core.shape.Group;
import com.ait.lienzo.client.core.types.Transform;
import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableModellerView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.popovers.definitions.ColumnDefinitionFactory;
import org.uberfire.client.callbacks.Callback;
import org.uberfire.commons.validation.PortablePreconditions;
import org.uberfire.ext.wires.core.grids.client.model.GridColumn;
import org.uberfire.ext.wires.core.grids.client.widget.grid.GridWidget;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.grids.impl.BaseGridRendererHelper;
import org.uberfire.ext.wires.core.grids.client.widget.layer.GridLayer;
@ApplicationScoped
public class ColumnHeaderPopOverImpl implements ColumnHeaderPopOver {
private PopOverView view;
private ColumnDefinitionFactory columnDefinitionFactory;
@Inject
public ColumnHeaderPopOverImpl( final PopOverView view,
final ColumnDefinitionFactory columnDefinitionFactory ) {
this.view = view;
this.columnDefinitionFactory = columnDefinitionFactory;
}
@Override
public void show( final GuidedDecisionTableModellerView modellerView,
final GuidedDecisionTableView.Presenter dtPresenter,
final int uiColumnIndex ) {
PortablePreconditions.checkNotNull( "modellerView",
modellerView );
PortablePreconditions.checkNotNull( "dtPresenter",
dtPresenter );
showSource( modellerView,
dtPresenter,
uiColumnIndex );
}
private void showSource( final GuidedDecisionTableModellerView modellerView,
final GuidedDecisionTableView.Presenter dtPresenter,
final int uiColumnIndex ) {
final BaseColumn column = dtPresenter.getModel().getExpandedColumns().get( uiColumnIndex );
final int screenX = getScreenX( modellerView,
dtPresenter,
uiColumnIndex );
final int screenY = getScreenY( modellerView,
dtPresenter );
view.show( ( Callback<PopOverView.Content> callback ) ->
columnDefinitionFactory.generateColumnDefinition( dtPresenter,
column,
( String definition ) ->
callback.callback( new PopOverView.Content() {
@Override
public String getContent() {
return definition;
}
@Override
public int getX() {
return screenX;
}
@Override
public int getY() {
return screenY;
}
} )
) );
}
@Override
public void hide() {
view.hide();
}
private int getScreenX( final GuidedDecisionTableModellerView modellerView,
final GuidedDecisionTableView.Presenter dtPresenter,
final int uiColumnIndex ) {
final GridWidget gridWidget = dtPresenter.getView();
final GridColumn<?> uiColumn = gridWidget.getModel().getColumns().get( uiColumnIndex );
final double gx = gridWidget.getX();
final GridLayer layer = modellerView.getGridLayerView();
final int containerX = layer.getDomElementContainer().getAbsoluteLeft();
final double vx = layer.getVisibleBounds().getX();
final Transform t = layer.getViewport().getTransform();
final BaseGridRendererHelper rendererHelper = gridWidget.getRendererHelper();
final BaseGridRendererHelper.RenderingInformation ri = rendererHelper.getRenderingInformation();
final BaseGridRendererHelper.RenderingBlockInformation floatingBlockInformation = ri.getFloatingBlockInformation();
final double offsetX = floatingBlockInformation.getColumns().contains( uiColumn ) ? floatingBlockInformation.getX() : 0;
final int screenX = containerX + (int) ( ( gx - vx + offsetX + rendererHelper.getColumnOffset( uiColumn ) + uiColumn.getWidth() / 2 ) * t.getScaleX() );
return screenX;
}
private int getScreenY( final GuidedDecisionTableModellerView modellerView,
final GuidedDecisionTableView.Presenter dtPresenter ) {
final GridWidget gridWidget = dtPresenter.getView();
final double gy = gridWidget.getY();
final GridLayer layer = modellerView.getGridLayerView();
final int containerY = layer.getDomElementContainer().getAbsoluteTop();
final double vy = layer.getVisibleBounds().getY();
final Transform t = layer.getViewport().getTransform();
final Group header = gridWidget.getHeader();
final double headerHeight = gridWidget.getRenderer().getHeaderHeight();
final double headerRowHeight = gridWidget.getRenderer().getHeaderRowHeight();
final double offsetY = header == null ? 0 : header.getY();
final int screenY = containerY + (int) ( ( gy - vy + offsetY + headerHeight - headerRowHeight / 2 ) * t.getScaleX() );
return screenY;
}
}