package org.vaadin.smartgwt.server.extra; import java.util.List; import java.util.Map; import org.vaadin.smartgwt.server.layout.NonUIComponent; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.web.bindery.event.shared.HandlerRegistration; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.ui.AbstractComponent; /** * A non-visual component that notifies registered listeners at a specific interval.<p> * * While listeners are registered, it is possible to make asynchronous UI changes without the user triggering a server call. */ @com.vaadin.ui.ClientWidget(org.vaadin.smartgwt.client.extra.VRefresher.class) public class Refresher extends AbstractComponent implements NonUIComponent { private List<RefreshListener> listeners = Lists.newArrayList(); private int interval; /** * Refresher with a 1 second interval by default. */ public Refresher() { interval = 1000; } /** * Refresh interval in milliseconds. * * @return interval in milliseconds. */ public int getInterval() { return interval; } /** * Refresh interval in milliseconds. * * @param interval { _ > 0 } in milliseconds. */ public void setInterval(int interval) { assert interval > 0 : "interval must be a positive number"; this.interval = interval; } /** * Adds a listener that will be notified after each interval. * * @param listener { _ != null } to be notified. * @return the registration handler to remove the listener. */ public HandlerRegistration addListener(final RefreshListener listener) { assert listener != null : "listener must not be null"; listeners.add(listener); requestRepaint(); return new HandlerRegistration() { @Override public void removeHandler() { listeners.remove(listener); requestRepaint(); } }; } @Override public void paintContent(PaintTarget target) throws PaintException { if (!listeners.isEmpty()) { target.addAttribute("interval", interval); } } @Override public void changeVariables(Object source, Map<String, Object> variables) { for (RefreshListener listener : ImmutableList.copyOf(listeners)) { listener.refresh(this); } } }