/* * 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.uibinder.client; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Node; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.UIObject; /** * Static helper methods used by UiBinder. These methods are likely to move, * so please don't use them for non-UiBinder code. */ public class UiBinderUtil { /** * Temporary attachment record that keeps track of where an element was * before attachment. Use the detach method to put things back. * */ public static class TempAttachment { private final Element element; private final Element origParent; private final Element origSibling; private TempAttachment(Element origParent, Element origSibling, Element element) { this.origParent = origParent; this.origSibling = origSibling; this.element = element; } /** * Restore to previous DOM state before attachment. */ public void detach() { // Put the panel's element back where it was. if (origParent != null) { origParent.insertBefore(element, origSibling); } else { orphan(element); } } } private static Element hiddenDiv; /** * Attaches the element to the dom temporarily. Keeps track of where it is * attached so that things can be put back latter. * * @return attachment record which can be used for reverting back to previous * DOM state */ public static TempAttachment attachToDom(Element element) { // TODO(rjrjr) This is copied from HTMLPanel. Reconcile ensureHiddenDiv(); // Hang on to the panel's original parent and sibling elements so that it // can be replaced. Element origParent = element.getParentElement(); Element origSibling = element.getNextSiblingElement(); // Attach the panel's element to the hidden div. hiddenDiv.appendChild(element); return new TempAttachment(origParent, origSibling, element); } public static Element fromHtml(String html) { ensureHiddenDiv(); hiddenDiv.setInnerHTML(html); Element newbie = hiddenDiv.getFirstChildElement(); orphan(newbie); return newbie; } private static void ensureHiddenDiv() { // If the hidden DIV has not been created, create it. if (hiddenDiv == null) { hiddenDiv = Document.get().createDivElement(); UIObject.setVisible(hiddenDiv, false); RootPanel.getBodyElement().appendChild(hiddenDiv); } } private static void orphan(Node node) { node.getParentNode().removeChild(node); } /** * Not to be instantiated. */ private UiBinderUtil() { } }