package kornell.gui.client.uidget; import java.util.logging.Logger; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.place.shared.PlaceChangeEvent; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; import kornell.api.client.KornellSession; import kornell.core.lom.ExternalPage; import kornell.core.util.StringUtils; import kornell.gui.client.GenericClientFactoryImpl; import kornell.gui.client.event.ShowChatDockEvent; import kornell.gui.client.event.ShowChatDockEventHandler; import kornell.gui.client.util.view.Positioning; public class ExternalPageView extends Uidget implements ShowChatDockEventHandler{ private static final Logger logger = Logger.getLogger(ExternalPageView.class.getName()); private IFrameElement iframe; FlowPanel panel = new FlowPanel(); private KornellSession session; public ExternalPageView(ExternalPage page) { GenericClientFactoryImpl.EVENT_BUS.addHandler(ShowChatDockEvent.TYPE,this); session = GenericClientFactoryImpl.KORNELL_SESSION; createIFrame(); panel.setStyleName("contentWrapper"); panel.getElement().appendChild(iframe); String url = page.getURL(); String key = page.getKey(); setSrc(url,key); initWidget(panel); GenericClientFactoryImpl.EVENT_BUS.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { placeIframe(); } }); } private void createIFrame() { if (iframe == null) { iframe = Document.get().createIFrameElement(); iframe.addClassName("externalContent"); iframe.setAttribute("allowtransparency", "true"); iframe.setAttribute("style", "background-color: transparent;"); //allowing html5 video player to work on fullscreen inside the iframe iframe.setAttribute("allowFullScreen", "true"); iframe.setAttribute("webkitallowfullscreen", "true"); iframe.setAttribute("mozallowfullscreen", "true"); Event.sinkEvents(iframe, Event.ONLOAD); Event.setEventListener(iframe, new EventListener() { @Override public void onBrowserEvent(Event event) { fireViewReady(); } }); } placeIframe(); // Weird yet simple way of solving FF's weird behavior Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { Scheduler.get().scheduleDeferred(new Command() { @Override public void execute() { placeIframe(); } }); } }); } private void placeIframe() { iframe.setPropertyString("width", "100%"); int h = (Window.getClientHeight() - Positioning.NORTH_BAR); if(session.getCurrentCourseClass() != null && !session.getCurrentCourseClass().isEnrolledOnCourseVersion()){ h -= Positioning.SOUTH_BAR; } String height = h + "px"; iframe.setPropertyString("height", height); } public void setSrc(final String src, final String actomKey) { // TODO: Check if src exists String mkurl = StringUtils.mkurl("/", src); logger.info("Iframe source set to ["+mkurl+"]"); iframe.setSrc(mkurl); } @Override public void onShowChatDock(ShowChatDockEvent event) { if(event.isShowChatDock()){ panel.addStyleName("chatDocked"); } else { panel.removeStyleName("chatDocked"); } } }