package org.ovirt.engine.ui.common.widget.dialog;
import org.gwtbootstrap3.client.ui.Anchor;
import org.gwtbootstrap3.client.ui.constants.Styles;
import org.ovirt.engine.ui.common.CommonApplicationConstants;
import org.ovirt.engine.ui.common.gin.AssetProvider;
import org.ovirt.engine.ui.common.widget.tooltip.WidgetTooltip;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiChild;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class SimpleDialogPanel extends AbstractDialogPanel {
// 100 pixels is the height of the header and the footer combined. Excluding the margins
private static final int HEADER_FOOTER_HEIGHT = 100;
private static final CommonApplicationConstants constants = AssetProvider.getConstants();
public interface InfoIconStyle extends CssResource {
String infoIconColor();
}
public interface InfoIconResources extends ClientBundle {
@Source("org/ovirt/engine/ui/common/css/InfoIcon.css")
InfoIconStyle iconStyle();
}
private static final InfoIconResources RESOURCES = GWT.create(InfoIconResources.class);
interface WidgetUiBinder extends UiBinder<Widget, SimpleDialogPanel> {
WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
}
protected interface Style extends CssResource {
String footerButton();
}
@UiField
SimplePanel contentPanel;
@UiField
FlowPanel footerButtonPanel;
@UiField
FlowPanel footerStatusPanel;
@UiField
ScrollPanel contentScrollPanel;
@UiField
Button closeButton;
@UiField
FlowPanel header;
@UiField
Anchor infoAnchor;
@UiField
WidgetTooltip helpIconButtonTooltip;
@UiField
Style style;
private final InfoIconStyle infoIconStyle;
private UICommand helpCommand;
public SimpleDialogPanel() {
infoIconStyle = RESOURCES.iconStyle();
infoIconStyle.ensureInjected();
setWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
infoAnchor.addStyleName(infoIconStyle.infoIconColor());
addAttachHandler(event -> setDraggable(event.isAttached()));
}
private native void setDraggable(boolean dragEnabled) /*-{
var containerElement = this.@org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel::getContainerElement()();
var $popupContent = $wnd.jQuery(containerElement).parent();
if (dragEnabled) {
$popupContent.draggable({ handle: '.modal-header' });
} else {
$popupContent.draggable('destroy');
}
}-*/;
@Override
@UiChild(tagname = "header", limit = 1)
public void setHeader(String headerTitle) {
HTMLPanel headerTitlePanel = new HTMLPanel("H4", headerTitle); //$NON-NLS-1$
headerTitlePanel.addStyleName(Styles.MODAL_TITLE);
headerTitlePanel.getElement().getStyle().setFloat(Float.LEFT);
// Close button and IconType makes 2 widgets
while (header.getWidgetCount() > 2) {
header.remove(header.getWidgetCount() - 1);
}
header.add(headerTitlePanel);
addHelpButtonHandler();
helpIconButtonTooltip.setText(constants.clickForHelp());
}
@Override
@UiChild(tagname = "content", limit = 1)
public void setContent(Widget widget) {
contentPanel.setWidget(widget);
}
@Override
public Widget getContent() {
return contentPanel.getWidget();
}
@Override
@UiChild(tagname = "footerButton")
public void addFooterButton(Widget button) {
button.addStyleName(style.footerButton());
footerButtonPanel.add(button);
}
@Override
public void show() {
super.show();
contentScrollPanel.getElement().getStyle().setHeight(getOffsetHeight() - HEADER_FOOTER_HEIGHT, Unit.PX);
contentPanel.getElement().getStyle().setProperty("minHeight", getOffsetHeight() - HEADER_FOOTER_HEIGHT, Unit.PX); //$NON-NLS-1$
}
public void setNoScroll(boolean value) {
if (value) {
contentScrollPanel.getElement().getStyle().setOverflow(Overflow.VISIBLE);
} else {
contentScrollPanel.getElement().getStyle().setOverflow(Overflow.AUTO);
}
}
@Override
public void addStatusWidget(Widget widget) {
footerStatusPanel.add(widget);
}
@Override
public void removeFooterButtons() {
footerButtonPanel.clear();
}
@Override
public void setFooterPanelVisible(boolean visible) {
footerButtonPanel.setVisible(visible);
}
@Override
public void addContentStyleName(String styleName) {
contentPanel.addStyleName(styleName);
}
@Override
public HasClickHandlers getCloseIconButton() {
return closeButton;
}
@Override
public void setCloseIconButtonVisible(boolean visible) {
closeButton.setVisible(visible);
}
private void addHelpButtonHandler() {
infoAnchor.addClickHandler(event -> helpCommand.execute());
}
@Override
public void setHelpCommand(UICommand command) {
helpCommand = command;
infoAnchor.setVisible(command != null);
}
}