package org.tessell.util;
import static org.tessell.widgets.Widgets.newAnimation;
import org.tessell.gwt.animation.client.AnimationLogic;
import org.tessell.gwt.animation.client.IsAnimation;
import org.tessell.gwt.user.client.ui.HasCss;
import org.tessell.gwt.user.client.ui.IsFocusWidget;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.event.logical.shared.AttachEvent;
import com.google.gwt.event.shared.HandlerRegistration;
public class WidgetUtils {
public static IsAnimation fadeOut(final HasCss css) {
return fadeOut(css, 300);
}
public static IsAnimation fadeOut(final HasCss css, int duration) {
IsAnimation a = newAnimation(new AnimationLogic() {
@Override
public void onUpdate(double progress) {
css.getStyle().setOpacity(1 - progress);
}
@Override
public void onComplete() {
css.getStyle().setDisplay(Display.NONE);
}
});
a.run(duration);
return a;
}
public static IsAnimation fadeIn(final HasCss css) {
return fadeIn(css, 300);
}
public static IsAnimation fadeIn(final HasCss css, int duration) {
IsAnimation a = newAnimation(new AnimationLogic() {
@Override
public void onStart() {
css.getStyle().clearDisplay();
css.getStyle().setOpacity(0.0);
}
@Override
public void onUpdate(double progress) {
css.getStyle().setOpacity(progress);
}
});
a.run(duration);
return a;
}
/** Sets {@code display=none} on each element. */
public static void hide(HasCss... csses) {
for (HasCss css : csses) {
css.getStyle().setDisplay(Display.NONE);
}
}
/** Clears {@code display} on each element. */
public static void show(HasCss... csses) {
for (HasCss css : csses) {
css.getStyle().clearDisplay();
}
}
/** Set {@code visibility=hidden} on each element. */
public static void invisible(HasCss... csses) {
for (HasCss css : csses) {
css.getStyle().setVisibility(Visibility.HIDDEN);
}
}
/** Clears {@code visibility} on each element. */
public static void visible(HasCss... csses) {
for (HasCss css : csses) {
css.getStyle().clearVisibility();
}
}
/** Sets focus on {@code w}, potentially waiting until it's {@link AttachEvent}. */
public static void focus(final IsFocusWidget w) {
if (w.isAttached() || !GWT.isClient()) {
w.setFocus(true);
} else {
final HandlerRegistration[] h = new HandlerRegistration[] { null };
h[0] = w.addAttachHandler(new AttachEvent.Handler() {
public void onAttachOrDetach(AttachEvent event) {
if (event.isAttached()) {
w.setFocus(true);
if (h[0] != null) {
h[0].removeHandler();
}
}
}
});
}
}
}