package org.ovirt.engine.ui.webadmin.widget.editor; import java.util.Collection; import java.util.LinkedList; import java.util.Queue; import com.google.gwt.animation.client.Animation; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class AnimatedVerticalPanel extends VerticalPanel { private static final int ANIM_DELAY = 500; private static final int ADD_DELAY = 100; private final Queue<Widget> pendingWidgtes = new LinkedList<>(); public void addAll(Collection<? extends Widget> list, boolean fadeIn) { for (Widget widget : list) { if (fadeIn) { addPending(widget); } else { add(widget); } } if (fadeIn) { renderPending(); } } public void addFadeIn(Widget w) { final Style widgetStyle = w.getElement().getStyle(); widgetStyle.setOpacity(0); add(w); new Animation() { @Override protected void onUpdate(double progress) { widgetStyle.setOpacity(progress); } }.run(ANIM_DELAY); } public void addPending(Widget w) { pendingWidgtes.add(w); } public void renderPending() { Scheduler.get().scheduleFixedDelay(() -> { if (pendingWidgtes.isEmpty()) { return false; } addFadeIn(pendingWidgtes.remove()); return !pendingWidgtes.isEmpty(); }, ADD_DELAY); } }