/* * Copyright 2011 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.ui.client; import com.google.gwt.event.logical.shared.AttachEvent; import com.google.gwt.event.logical.shared.HasAttachHandlers; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.web.bindery.event.shared.HandlerRegistration; import java.util.HashSet; /** * OrientationHelper implementation that works by by monitoring window size * changes, and so works on both mobile devices and desktop browsers. * <p> * Expected to be used as an app-wide singleton. */ public class WindowBasedOrientationHelper implements OrientationHelper { private class CommandSet implements AttachEvent.Handler, HandlerRegistration { final Command portraitCommand; final Command landscapeCommand; final HandlerRegistration attachEventReg; boolean active; CommandSet(HasAttachHandlers widget, Command portrait, Command landscape) { this.portraitCommand = portrait; this.landscapeCommand = landscape; attachEventReg = widget.addAttachHandler(this); active = widget.isAttached(); } @Override public void onAttachOrDetach(AttachEvent event) { active = event.isAttached(); fire(); } @Override public void removeHandler() { commandSets.remove(this); attachEventReg.removeHandler(); } void fire() { if (active) { if (isPortrait) { portraitCommand.execute(); } else { landscapeCommand.execute(); } } } } private static boolean calculateIsPortrait() { return Window.getClientHeight() > Window.getClientWidth(); } private boolean isPortrait; private HandlerRegistration windowResizeReg; private HashSet<CommandSet> commandSets = new HashSet<CommandSet>(); public WindowBasedOrientationHelper() { isPortrait = calculateIsPortrait(); windowResizeReg = Window.addResizeHandler(new ResizeHandler() { public void onResize(ResizeEvent event) { update(); } }); } @Override public boolean isPortrait() { assertLive(); return isPortrait; } @Override public HandlerRegistration setCommands(HasAttachHandlers widget, Command forPortrait, Command forLandscape) { assertLive(); CommandSet commandSet = new CommandSet(widget, forPortrait, forLandscape); commandSets.add(commandSet); commandSet.fire(); return commandSet; } public void stop() { assertLive(); windowResizeReg.removeHandler(); windowResizeReg = null; for (CommandSet commandSet : commandSets) { commandSet.attachEventReg.removeHandler(); } commandSets = null; } private void assertLive() { assert windowResizeReg != null : "Cannot do this after stop() is called"; } private void update() { boolean was = isPortrait; isPortrait = calculateIsPortrait(); if (was != isPortrait) { for (CommandSet helper : commandSets) { helper.fire(); } } } }