/* * Copyright 2008 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.user.client.ui.impl; import com.google.gwt.dom.client.Element; /** * Internet Explorer 6 implementation of * {@link com.google.gwt.user.client.ui.impl.PopupImpl}. */ public class PopupImplIE6 extends PopupImpl { @Override public native void onHide(Element popup) /*-{ // It is at least rarely possible to get an onHide() without a matching // onShow(), usually because of timing issues created by animations. So // we're careful not to assume the existence of '__frame' here. var frame = popup.__frame; if (frame) { frame.parentElement.removeChild(frame); frame.__popup = null; popup.__frame = null; popup.onresize = null; popup.onmove = null; } }-*/; @Override public native void onShow(Element popup) /*-{ // TODO: make this more Java and less JSNI? var frame = $doc.createElement('iframe'); // Setting a src prevents mixed-content warnings. // http://weblogs.asp.net/bleroy/archive/2005/08/09/how-to-put-a-div-over-a-select-in-ie.aspx frame.src = "javascript:''"; frame.scrolling = 'no'; frame.frameBorder = 0; popup.__frame = frame; frame.__popup = popup; // Make the frame shadow the popup var style = frame.style; style.position = 'absolute'; // Don't get in the way of transparency effects style.filter = 'alpha(opacity=0)'; // Visibility of frame should match visiblity of popup element. style.visibility = popup.currentStyle.visibility; // Issue 2443: remove styles that affect the size of the iframe style.border = 0; style.padding = 0; style.margin = 0; // takes effect immediately style.left = popup.offsetLeft; style.top = popup.offsetTop; style.width = popup.offsetWidth; style.height = popup.offsetHeight; style.zIndex = popup.currentStyle.zIndex; // updates position and dimensions as popup is moved & resized popup.onmove = function() { frame.style.left = popup.offsetLeft; frame.style.top = popup.offsetTop; }; popup.onresize = function() { frame.style.width = popup.offsetWidth; frame.style.height = popup.offsetHeight; }; style.setExpression('zIndex', 'this.__popup.currentStyle.zIndex'); popup.parentElement.insertBefore(frame, popup); }-*/; @Override public native void setVisible(Element popup, boolean visible) /*-{ if (popup.__frame) { popup.__frame.style.visibility = visible ? 'visible' : 'hidden'; } }-*/; }