// Copyright 2012 Google Inc. All Rights Reserved. // // 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 org.eclipse.che.ide.ui; import elemental.dom.Element; import org.eclipse.che.ide.runtime.Assert; import org.eclipse.che.ide.ui.menu.AutoHideComponent; import org.eclipse.che.ide.ui.menu.AutoHideView; import org.eclipse.che.ide.ui.menu.PositionController; import org.eclipse.che.ide.util.dom.Elements; import com.google.gwt.dom.client.Node; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; /** Represents a floating popup, that can be attached to any element. */ public class Popup extends AutoHideComponent<Popup.View, AutoHideComponent.AutoHideModel> implements IsWidget { public interface Css extends CssResource { String root(); String contentHolder(); } public interface Resources extends ClientBundle { @Source({"org/eclipse/che/ide/ui/constants.css", "Popup.css", "org/eclipse/che/ide/api/ui/style.css"}) Css popupCss(); } /** The View for the Popup component. */ public static class View extends AutoHideView<Void> { private final Css css; private final Element contentHolder; View(Resources resources) { this.css = resources.popupCss(); contentHolder = Elements.createDivElement(css.contentHolder()); Element rootElement = Elements.createDivElement(css.root()); rootElement.appendChild(contentHolder); setElement(rootElement); } void setContentElement(Element contentElement) { contentHolder.setInnerHTML(""); if (contentElement != null) { contentHolder.appendChild(contentElement); } } } public static Popup create(Resources resources) { View view = new View(resources); return new Popup(view); } private PositionController positionController; private HTML widget; private Popup(View view) { super(view, new AutoHideModel()); } @Override public void show() { Assert.isNotNull(positionController, "You cannot show this popup without using a position controller"); positionController.updateElementPosition(); cancelPendingHide(); super.show(); } /** Shows the popup anchored to a given element. */ public void show(PositionController.Positioner positioner) { positionController = new PositionController(positioner, getView().getElement()); show(); } /** * Sets the popup's content element. * * @param contentElement * the DOM element to show in the popup, or {@code null} * to clean up the popup's DOM */ public void setContentElement(Element contentElement) { getView().setContentElement(contentElement); } public void destroy() { forceHide(); setContentElement(null); positionController = null; } /** {@inheritDoc} */ @Override public Widget asWidget() { if (widget == null) { widget = new HTML(); widget.getElement().appendChild((Node)getView().getElement()); } return widget; } }