/* * Copyright 2013 JBoss 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 org.overlord.dtgov.ui.client.local.widgets.common; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.Templated; import org.overlord.dtgov.ui.client.local.util.IMouseInOutWidget; import org.overlord.dtgov.ui.client.local.util.WidgetUtil; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window.ScrollEvent; import com.google.gwt.user.client.Window.ScrollHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.RootPanel; /** * An overlay/popover shown to the user when they mouse-over an editable * field in the Artifact Details page. * * @author eric.wittmann@redhat.com */ @Templated("/org/overlord/dtgov/ui/client/local/site/dialogs/propval-editor-popover.html#propval-editor-popover") @Dependent public class EditableInlineLabelPopover extends Composite implements IMouseInOutWidget { @Inject private RootPanel rootPanel; private HandlerRegistration registration = null; @Inject @DataField private Anchor edit; @Inject @DataField private Anchor remove; /** * Constructor. */ public EditableInlineLabelPopover() { } /** * Whether the "remove" button should be shown. * @param flag */ public void setSupportsRemove(boolean flag) { if (flag) { remove.getElement().removeClassName("hide"); //$NON-NLS-1$ } else { remove.getElement().addClassName("hide"); //$NON-NLS-1$ } } /** * Whether the "edit" button should be shown. * @param flag */ public void setSupportsEdit(boolean flag) { if (flag) { edit.getElement().removeClassName("hide"); //$NON-NLS-1$ } else { edit.getElement().addClassName("hide"); //$NON-NLS-1$ } } @PostConstruct protected void onPostConstruct() { WidgetUtil.initMouseInOutWidget(this); } /** * Add to the root panel and then position appropriately. */ public void showOver(Element element) { rootPanel.add(this); getElement().removeClassName("hide"); //$NON-NLS-1$ positionOver(getElement(), element); registration = Window.addWindowScrollHandler(new ScrollHandler() { @Override public void onWindowScroll(ScrollEvent event) { close(); } }); } /** * Positions the given popoverElement on top of the given widget element. * @param popoverElement * @param element */ protected native final void positionOver(Element popoverElement, Element widgetElement) /*-{ var offset = $wnd.jQuery(widgetElement).offset(); var height = $wnd.jQuery(widgetElement).height() + 8; var width = $wnd.jQuery(widgetElement).width() + 8; $wnd.jQuery(popoverElement).find('.overlay').width(width); $wnd.jQuery(popoverElement).find('.overlay').height(height); $wnd.jQuery(popoverElement).offset({ top: offset.top - 4, left: offset.left - 4 }); }-*/; /** * @see org.overlord.sramp.ui.client.local.util.IMouseInOutWidget#onMouseIn() */ @Override public void onMouseIn() { } /** * @see org.overlord.sramp.ui.client.local.util.IMouseInOutWidget#onMouseOut() */ @Override public void onMouseOut() { close(); } /** * Closes the popover. */ public void close() { if (this.registration != null) { this.registration.removeHandler(); this.registration = null; } rootPanel.remove(this); } /** * @return the edit */ public Anchor getEditButton() { return edit; } /** * @return the remove */ public Anchor getRemoveButton() { return remove; } }