package org.vaadin.alump.gofullscreen; import java.util.LinkedList; import java.util.List; import com.vaadin.ui.Component; import org.vaadin.alump.gofullscreen.gwt.client.shared.FSButtonServerRpc; import org.vaadin.alump.gofullscreen.gwt.client.shared.FSButtonState; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Button; /** * Button that can be used to toggle client side fullscreen mode on browser * supporting requestFullScreen calls. Full screen state change requests has to * be done from user actions. For this reason there is no API for server side to * ask client side to move to full screen mode. */ @SuppressWarnings("serial") public class FullScreenButton extends Button { private boolean targetIsFullscreen = false; private final List<FullScreenListener> fsListeners = new LinkedList<FullScreenListener>(); /** * Create new full screen button. */ public FullScreenButton() { registerRpc(serverRpc); } /** * Create full screen button with a caption. * * @param caption Caption of button. */ public FullScreenButton(String caption) { super(caption); registerRpc(serverRpc); } /** * Create full screen button with caption and clicklistener. * * @param caption Caption of button. * @param listener Click listener. */ public FullScreenButton(String caption, ClickListener listener) { super(caption, listener); registerRpc(serverRpc); } private final FSButtonServerRpc serverRpc = new FSButtonServerRpc() { @Override public void enteredFullscreen() { setFullScreenState(true); } @Override public void leftFullscreen() { setFullScreenState(false); } }; protected void setFullScreenState(boolean fullscreen) { if (targetIsFullscreen != fullscreen) { targetIsFullscreen = fullscreen; final FullScreenEvent event = new FullScreenEvent(this, getFullScreenTarget(), targetIsFullscreen); for (FullScreenListener listener : fsListeners) { listener.onFullScreenEvent(event); } } } @Override protected FSButtonState getState() { return (FSButtonState) super.getState(); } /** * Define component shown in fullscreen. Use null if you want full client * side view to be fullscreened. * * @param target Component shown in fullscreen or null (full client side view). */ public void setFullScreenTarget(Component target) { getState().fullscreenTarget = target; } /** * Get current full screen target component. * * @return Component shown in fullscreen or null (full client side view) */ public AbstractComponent getFullScreenTarget() { if (getState().fullscreenTarget != null) { return (AbstractComponent) getState().fullscreenTarget; } else { return null; } } /** * Is target component currently full screen. */ public boolean isFullScreen() { return targetIsFullscreen; } /** * Use addFullScreenListener */ public void addFullScreenListener(FullScreenListener listener) { fsListeners.add(listener); } /** * Remove fullscreen change listener. * * @param listener */ public void removeFullScreenChangeListener(FullScreenListener listener) { fsListeners.remove(listener); } /** * Hide button automatically on browsers that do not support FullScreen API * * @param hidden true to auto hide */ public void setHiddenWhenNotSupported(boolean hidden) { getState().hideIfNotSupported = hidden; } /** * Check if button is automatically hidden on browsers not supporting FullScreen API * * @return true if auto hidden */ public boolean isHiddenWhenNotSupported() { return getState().hideIfNotSupported; } }