/* * Copyright 2015 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.animation; import java.util.Set; import com.ait.lienzo.client.core.animation.AnimationTweener; import com.ait.lienzo.client.core.animation.IAnimation; import com.ait.lienzo.client.core.animation.IAnimationCallback; import com.ait.lienzo.client.core.animation.IAnimationHandle; import com.ait.lienzo.client.core.animation.TimedAnimation; import com.ait.lienzo.client.core.shape.IPrimitive; 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 com.google.gwt.user.client.Command; import org.uberfire.ext.wires.core.grids.client.widget.grid.GridWidget; import org.uberfire.ext.wires.core.grids.client.widget.layer.pinning.GridPinnedModeManager; /** * An animation to reposition the ViewPort so the given GridWidget is centred * horizontally and GridWidget header aligned with the top of the ViewPort. */ public class GridWidgetExitPinnedModeAnimation extends TimedAnimation { public GridWidgetExitPinnedModeAnimation(final GridPinnedModeManager.PinnedContext state, final Set<GridWidget> gridWidgets, final Set<IPrimitive<?>> gridWidgetConnectors, final Command onCompleteCommand) { super(500, new IAnimationCallback() { private final double startScaleX = 1.0; private final double startScaleY = 1.0; private Point2D delta; private Point2D startTranslation; private GridWidget gridWidget; private double endScaleX; private double endScaleY; private AnimationTweener tweener = AnimationTweener.EASE_OUT; @Override public void onStart(final IAnimation animation, final IAnimationHandle handle) { gridWidget = state.getGridWidget(); final Viewport vp = gridWidget.getViewport(); if (vp.getTransform() == null) { vp.setTransform(new Transform()); } endScaleX = state.getScaleX(); endScaleY = state.getScaleY(); startTranslation = getViewportTranslation().mul(-1.0); final Point2D endTranslation = new Point2D(state.getTranslateX(), state.getTranslateY()); delta = new Point2D(endTranslation.getX() - startTranslation.getX(), endTranslation.getY() - startTranslation.getY()); for (GridWidget gw : gridWidgets) { gw.setVisible(true); } for (IPrimitive<?> p : gridWidgetConnectors) { p.setVisible(true); } gridWidget.getLayer().setListening(false); gridWidget.getLayer().batch(); } @Override public void onFrame(final IAnimation animation, final IAnimationHandle handle) { final double pct = assertPct(animation.getPercent()); final Viewport vp = gridWidget.getViewport(); final Transform transform = vp.getTransform(); transform.reset(); final Point2D frameLocation = startTranslation.add(delta.mul(pct)); final double frameScaleX = startScaleX + (endScaleX - startScaleX) * pct; final double frameScaleY = startScaleY + (endScaleY - startScaleY) * pct; transform.translate(frameLocation.getX(), frameLocation.getY()).scale(frameScaleX, frameScaleY); showGridWidgets(pct); showGridWidgetConnectors(pct); gridWidget.getLayer().batch(); } @Override public void onClose(final IAnimation animation, final IAnimationHandle handle) { gridWidget.getLayer().setListening(true); gridWidget.getLayer().batch(); onCompleteCommand.execute(); } private Point2D getViewportTranslation() { final Viewport vp = gridWidget.getViewport(); final Transform transform = vp.getTransform(); final Transform t = transform.copy().getInverse(); final Point2D p = new Point2D(t.getTranslateX(), t.getTranslateY()); return p; } private double assertPct(final double pct) { if (pct < 0) { return 0; } if (pct > 1.0) { return 1.0; } return tweener.apply(pct); } private void showGridWidgets(final double pct) { for (GridWidget gw : gridWidgets) { gw.setAlpha(pct); } } private void showGridWidgetConnectors(final double pct) { for (IPrimitive<?> p : gridWidgetConnectors) { p.setAlpha(pct); } } }); } }