package fi.jasoft.dragdroplayouts.client.ui.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
public class IframeCoverUtility {
private static Map<Element, Element> iframeCoverMap = new HashMap<Element, Element>();
public static final String SHIM_ATTRIBUTE = "shims";
/**
* Adds an iframe cover over an Embedded component
*
* @param iframe
* The iframe element
* @return
* The element which covers the iframe
*/
private static Element addIframeCover(Element iframe) {
if (iframeCoverMap.containsKey(iframe)) {
return iframeCoverMap.get(iframe);
}
// Get dimensions
String iframeWidth = iframe.getAttribute("width");
String iframeHeight = iframe.getAttribute("height");
Style iframeStyle = iframe.getStyle();
if (!iframeWidth.equals("") && !iframeHeight.equals("")) {
iframeStyle.setPosition(Position.ABSOLUTE);
iframeStyle.setTop(0, Unit.PX);
iframeStyle.setLeft(0, Unit.PX);
}
// Create the cover element
Element coverContainer = DOM.createDiv();
DOM.setStyleAttribute(coverContainer, "width", iframeWidth);
DOM.setStyleAttribute(coverContainer, "height", iframeHeight);
coverContainer.setClassName("v-dragdrop-iframe-container");
coverContainer.getStyle().setPosition(Position.RELATIVE);
iframe.getParentElement().appendChild(coverContainer);
// Move iframe to cover container
iframe.getParentElement().replaceChild(coverContainer, iframe);
coverContainer.appendChild(iframe);
// Style the cover
Element cover = DOM.createDiv();
cover.setClassName("v-dragdrop-iframe-cover");
Style coverStyle = cover.getStyle();
coverStyle.setPosition(Position.ABSOLUTE);
coverStyle.setWidth(100, Unit.PCT);
coverStyle.setHeight(100, Unit.PCT);
coverStyle.setTop(0, Unit.PX);
coverStyle.setLeft(0, Unit.PX);
coverContainer.appendChild(cover);
iframeCoverMap.put(iframe, coverContainer);
return coverContainer;
}
/**
* Removes a iframe cover
*
* @param iframe
* The iframe element which has been covered
*/
private static void removeIframeCover(Element iframe) {
Element coverContainer = iframeCoverMap.get(iframe);
if (coverContainer != null) {
Element parent = coverContainer.getParentElement().cast();
parent.replaceChild(iframe, coverContainer);
iframe.getStyle().setPosition(null);
iframeCoverMap.remove(iframe);
}
}
/**
* Adds iframe covers for all child iframe elements
*
* @param rootElement
* The parent element
* @return
* A set of elements with the iframe covers
*/
private static Set<Element> addIframeCovers(Element rootElement) {
Set<Element> coveredIframes = new HashSet<Element>();
NodeList<com.google.gwt.dom.client.Element> iframes = rootElement
.getElementsByTagName("iframe");
for (int i = 0; i < iframes.getLength(); i++) {
Element iframe = (Element) iframes.getItem(i);
addIframeCover(iframe);
coveredIframes.add(iframe);
}
return coveredIframes;
}
/**
* Removes iframe covers from a set of iframes
*
* @param iframes
* The iframes to remove the covers from
*/
private static void removeIframeCovers(Set<Element> iframes) {
if (iframes != null) {
for (Element iframe : iframes) {
removeIframeCover(iframe);
}
}
}
// The covered ifream covers
private Set<Element> coveredIframes = new HashSet<Element>();
/**
* Enable IFrame covers for a element
*
* @param enabled
* Enable/Disable Iframe covers
* @param root
* The root element where to put the IFrame covers
*/
public void setIframeCoversEnabled(boolean enabled, Element root) {
if (enabled) {
coveredIframes = addIframeCovers(root);
} else if (coveredIframes != null) {
removeIframeCovers(coveredIframes);
coveredIframes = null;
}
}
}