/*
* 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.uberfire.ext.wires.core.grids.client.widget.grid.impl;
import java.util.List;
import com.ait.lienzo.client.core.shape.Viewport;
import com.ait.lienzo.client.core.types.Point2D;
import com.ait.lienzo.client.core.types.Transform;
import org.uberfire.commons.validation.PortablePreconditions;
import org.uberfire.ext.wires.core.grids.client.model.Bounds;
import org.uberfire.ext.wires.core.grids.client.model.GridColumn;
import org.uberfire.ext.wires.core.grids.client.model.GridData;
import org.uberfire.ext.wires.core.grids.client.util.ColumnIndexUtilities;
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;
public abstract class BaseKeyboardOperation implements KeyboardOperation {
protected GridLayer gridLayer;
public BaseKeyboardOperation(final GridLayer gridLayer) {
this.gridLayer = PortablePreconditions.checkNotNull("gridLayer",
gridLayer);
}
@Override
public TriStateBoolean isShiftKeyDown() {
return TriStateBoolean.DONT_CARE;
}
@Override
public TriStateBoolean isControlKeyDown() {
return TriStateBoolean.DONT_CARE;
}
protected boolean scrollSelectedCellIntoView(final GridWidget gridWidget) {
if (!isSelectionOriginSet(gridWidget)) {
return false;
}
if (!(isGridWidgetRendered(gridWidget) || isGridColumnCandidateForScroll(gridWidget))) {
return false;
}
final double dx = getCellScrollDeltaX(gridWidget);
final double dy = getCellScrollDeltaY(gridWidget);
if (dx != 0 || dy != 0) {
adjustViewportTransform(gridLayer.getViewport(),
new Point2D(dx,
dy));
}
return true;
}
private boolean isSelectionOriginSet(final GridWidget selectedGridWidget) {
final GridData gridModel = selectedGridWidget.getModel();
final GridData.SelectedCell origin = gridModel.getSelectedCellsOrigin();
return origin != null;
}
private boolean isGridWidgetRendered(final GridWidget gridWidget) {
final BaseGridRendererHelper rendererHelper = gridWidget.getRendererHelper();
final BaseGridRendererHelper.RenderingInformation renderingInformation = rendererHelper.getRenderingInformation();
return renderingInformation != null;
}
private boolean isGridColumnCandidateForScroll(final GridWidget gridWidget) {
final GridData gridModel = gridWidget.getModel();
final BaseGridRendererHelper rendererHelper = gridWidget.getRendererHelper();
final BaseGridRendererHelper.RenderingInformation renderingInformation = rendererHelper.getRenderingInformation();
if (renderingInformation == null) {
return false;
}
final List<GridColumn<?>> columns = gridModel.getColumns();
final GridData.SelectedCell origin = gridModel.getSelectedCellsOrigin();
final int uiColumnIndex = ColumnIndexUtilities.findUiColumnIndex(columns,
origin.getColumnIndex());
final BaseGridRendererHelper.RenderingBlockInformation floatingBlockInformation = renderingInformation.getFloatingBlockInformation();
final List<GridColumn<?>> floatingColumns = floatingBlockInformation.getColumns();
final GridColumn<?> column = columns.get(uiColumnIndex);
return !floatingColumns.contains(column);
}
private double getCellScrollDeltaX(final GridWidget gridWidget) {
final GridData gridModel = gridWidget.getModel();
final List<GridColumn<?>> columns = gridModel.getColumns();
final GridData.SelectedCell origin = gridModel.getSelectedCellsOrigin();
final int uiColumnIndex = ColumnIndexUtilities.findUiColumnIndex(columns,
origin.getColumnIndex());
double dx = 0;
final Bounds bounds = gridLayer.getVisibleBounds();
final double columnWidth = columns.get(uiColumnIndex).getWidth();
final double gridCellX = gridWidget.getX() + gridWidget.getRendererHelper().getColumnOffset(uiColumnIndex);
if (gridCellX + columnWidth >= bounds.getX() + bounds.getWidth()) {
dx = bounds.getX() + bounds.getWidth() - gridCellX - columnWidth;
} else if (gridCellX <= bounds.getX()) {
dx = bounds.getX() - gridCellX;
}
return dx;
}
private double getCellScrollDeltaY(final GridWidget gridWidget) {
final GridData gridModel = gridWidget.getModel();
final GridData.SelectedCell origin = gridModel.getSelectedCellsOrigin();
final int uiRowIndex = origin.getRowIndex();
double dy = 0;
final Bounds bounds = gridLayer.getVisibleBounds();
final double rowHeight = gridModel.getRow(uiRowIndex).getHeight();
final double headerHeight = gridWidget.getRenderer().getHeaderHeight();
final double gridCellY = gridWidget.getY() + headerHeight + gridWidget.getRendererHelper().getRowOffset(uiRowIndex);
if (gridCellY + rowHeight >= bounds.getY() + bounds.getHeight()) {
dy = bounds.getY() + bounds.getHeight() - gridCellY - rowHeight;
} else if (gridCellY <= bounds.getY() + headerHeight) {
dy = bounds.getY() + headerHeight - gridCellY;
}
return dy;
}
private void adjustViewportTransform(final Viewport vp,
final Point2D delta) {
final Transform transform = vp.getTransform();
final Transform t = transform.copy().getInverse();
final Point2D translation = new Point2D(t.getTranslateX(),
t.getTranslateY()).mul(-1.0);
final double scaleX = transform.getScaleX();
final double scaleY = transform.getScaleY();
transform.reset();
final Point2D frameLocation = translation.add(delta);
transform.scale(scaleX,
scaleY).translate(frameLocation.getX(),
frameLocation.getY());
}
}