/* * Copyright 2008 Google Inc. * * 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 com.google.gwt.sample.showcase.client.content.other; import com.google.gwt.animation.client.Animation; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.i18n.client.Constants; import com.google.gwt.sample.showcase.client.ContentWidget; import com.google.gwt.sample.showcase.client.Showcase; import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseData; import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseSource; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DecoratorPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * Example file. */ public class CwAnimation extends ContentWidget { /** * A custom animation that moves a small image around a circle in an * {@link AbsolutePanel}. */ @ShowcaseSource public class CustomAnimation extends Animation { /** * The x-coordinate of the center of the circle. */ private int centerX = 120; /** * The y-coordinate of the center of the circle. */ private int centerY = 120; /** * The radius of the circle. */ private int radius = 100; @Override protected void onComplete() { super.onComplete(); startButton.setEnabled(true); cancelButton.setEnabled(false); } @Override protected void onStart() { super.onStart(); startButton.setEnabled(false); cancelButton.setEnabled(true); } @Override protected void onUpdate(double progress) { double radian = 2 * Math.PI * progress; updatePosition(animateeLeft, radian, 0); updatePosition(animateeBottom, radian, 0.5 * Math.PI); updatePosition(animateeRight, radian, Math.PI); updatePosition(animateeTop, radian, 1.5 * Math.PI); } /** * Update the position of the widget, adding a rotational offset. * * @param w the widget to move * @param radian the progress in radian * @param offset the offset in radian */ private void updatePosition(Widget w, double radian, double offset) { radian += offset; double x = radius * Math.cos(radian) + centerX; double y = radius * Math.sin(radian) + centerY; absolutePanel.setWidgetPosition(w, (int) x, (int) y); } } /** * The constants used in this Content Widget. */ @ShowcaseSource public static interface CwConstants extends Constants { @DefaultStringValue("Cancel") String cwAnimationCancel(); String cwAnimationDescription(); String cwAnimationName(); @DefaultStringValue("Animation Options") String cwAnimationOptions(); @DefaultStringValue("Start") String cwAnimationStart(); } /** * The absolute panel used in the example. */ @ShowcaseData private AbsolutePanel absolutePanel = null; /** * The widget that is being animated. */ @ShowcaseData private Widget animateeBottom = null; /** * The widget that is being animated. */ @ShowcaseData private Widget animateeLeft = null; /** * The widget that is being animated. */ @ShowcaseData private Widget animateeRight = null; /** * The widget that is being animated. */ @ShowcaseData private Widget animateeTop = null; /** * The instance of an animation. */ @ShowcaseData private CustomAnimation animation = null; /** * The {@link Button} used to cancel the {@link Animation}. */ @ShowcaseData private Button cancelButton = null; /** * An instance of the constants. */ @ShowcaseData private final CwConstants constants; /** * The {@link Button} used to start the {@link Animation}. */ @ShowcaseData private Button startButton = null; /** * Constructor. * * @param constants the constants */ public CwAnimation(CwConstants constants) { super( constants.cwAnimationName(), constants.cwAnimationDescription(), false); this.constants = constants; } /** * Initialize this example. */ @ShowcaseSource @Override public Widget onInitialize() { // Create a new panel absolutePanel = new AbsolutePanel(); absolutePanel.setSize("250px", "250px"); absolutePanel.ensureDebugId("cwAbsolutePanel"); // Add a widget that we will animate animateeTop = new Image(Showcase.images.gwtLogoThumb()); animateeBottom = new Image(Showcase.images.gwtLogoThumb()); animateeLeft = new Image(Showcase.images.gwtLogoThumb()); animateeRight = new Image(Showcase.images.gwtLogoThumb()); absolutePanel.add(animateeTop); absolutePanel.add(animateeBottom); absolutePanel.add(animateeLeft); absolutePanel.add(animateeRight); // Wrap the absolute panel in a DecoratorPanel DecoratorPanel absolutePanelWrapper = new DecoratorPanel(); absolutePanelWrapper.setWidget(absolutePanel); // Create the options bar DecoratorPanel optionsWrapper = new DecoratorPanel(); optionsWrapper.setWidget(createOptionsBar()); // Add the components to a panel and return it HorizontalPanel mainLayout = new HorizontalPanel(); mainLayout.setSpacing(10); mainLayout.add(optionsWrapper); mainLayout.add(absolutePanelWrapper); // Create the custom animation animation = new CustomAnimation(); // Set the start position of the widgets animation.onComplete(); // Return the layout return mainLayout; } @Override protected void asyncOnInitialize(final AsyncCallback<Widget> callback) { GWT.runAsync(CwAnimation.class, new RunAsyncCallback() { public void onFailure(Throwable caught) { callback.onFailure(caught); } public void onSuccess() { callback.onSuccess(onInitialize()); } }); } /** * Create an options panel that allows users to select a widget and reposition * it. * * @return the new options panel */ @ShowcaseSource private Widget createOptionsBar() { // Create a panel to move components around VerticalPanel optionsBar = new VerticalPanel(); optionsBar.setSpacing(5); optionsBar.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); // Add a title optionsBar.add(new HTML("<b>" + constants.cwAnimationOptions() + "</b>")); // Add start button startButton = new Button(constants.cwAnimationStart()); startButton.addStyleName("sc-FixedWidthButton"); startButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { animation.run(2000); } }); optionsBar.add(startButton); // Add cancel button cancelButton = new Button(constants.cwAnimationCancel()); cancelButton.addStyleName("sc-FixedWidthButton"); cancelButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { animation.cancel(); } }); optionsBar.add(cancelButton); // Return the options bar return optionsBar; } }