blob: 0fcb0dfa184b5387eb4fd718b23106600b633b33 [file] [log] [blame]
/*
* 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;
}
}