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