blob: d38838475d05fc9a6feb5ad6d4505ea16761dd52 [file] [log] [blame]
/*
* 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();
}
}
}
}