package org.sigmah.client.ui.widget.popup; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.sigmah.client.dispatch.monitor.LoadingMask; import org.sigmah.client.event.ClosePopupEvent; import org.sigmah.client.event.handler.ClosePopupHandler; import org.sigmah.client.ui.view.zone.MessageBannerView; import org.sigmah.client.ui.widget.panel.Panels; import org.sigmah.client.util.ClientUtils; import org.sigmah.client.util.MessageType; import com.extjs.gxt.ui.client.event.WindowEvent; import com.extjs.gxt.ui.client.event.WindowListener; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Layout; import com.extjs.gxt.ui.client.widget.Window; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.layout.FlowLayout; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; /** * Default popup view implementation. * * @author Denis Colliot (dcolliot@ideia.fr) * @author Tom Miette (tmiette@ideia.fr) */ public class PopupWidget implements IsPopupWidget, IsWidget { // CSS. private static final String CSS_MAIN_PANEL = "popup-content"; private final Window window; private final ContentPanel contentPanel; private final boolean customLayout; private final SimplePanel messagePanel; private final HTML message; private WindowListener windowListener; private final LoadingMask loadingMask; public PopupWidget(boolean modal) { this(modal, true, null); } public PopupWidget(boolean modal, boolean closable) { this(modal, closable, null); } public PopupWidget(boolean modal, Layout layout) { this(modal, true, layout); } public PopupWidget(boolean modal, boolean closable, Layout layout) { final Layout nullSafeLayout = layout != null ? layout : new FlowLayout(); customLayout = !(nullSafeLayout instanceof FlowLayout); // GXT window. this.window = new Window() { @Override protected void onRender(Element parent, int pos) { super.onRender(parent, pos); getBody().addStyleName(CSS_MAIN_PANEL); } }; window.setAutoHide(!modal); window.setPlain(modal); window.setModal(modal); window.setBlinkModal(false); window.setClosable(closable); window.setLayout(nullSafeLayout); setWidth("400px"); setHeight(null); // Message (dynamically inserted). messagePanel = new SimplePanel(); messagePanel.setStyleName(MessageBannerView.CSS_PANEL); messagePanel.setVisible(false); message = new HTML(); message.addStyleName(MessageBannerView.CSS_MESSAGE); messagePanel.add(message); // Content panel. contentPanel = Panels.content(null, new FlowLayout()); // Loading mask. loadingMask = new LoadingMask(window); } /** * {@inheritDoc} */ @Override public Widget asWidget() { return window; } /** * {@inheritDoc} */ @Override public void center() { show(); window.center(); } /** * {@inheritDoc} */ @Override public void show() { window.show(); } /** * {@inheritDoc} */ @Override public void hide() { window.hide(); } /** * {@inheritDoc} */ @Override public void setStyleName(String styleName) { window.setStyleName(styleName); } /** * {@inheritDoc} */ @Override public void addStyleName(String styleName) { window.addStyleName(styleName); } /** * {@inheritDoc} */ @Override public void removeStyleName(String styleName) { window.removeStyleName(styleName); } /** * {@inheritDoc} */ @Override public void setTitle(String title) { window.setHeadingHtml(title); } /** * {@inheritDoc} */ @Override public void setContent(Widget widget) { if (customLayout) { // TODO Try to fix custom layout display with popup message. window.add(widget); } else { contentPanel.add(widget); window.add(messagePanel); window.add(contentPanel); } } /** * {@inheritDoc} */ @Override public void setWidth(String width) { if (ClientUtils.isNotBlank(width)) { window.setAutoWidth(false); window.setWidth(width); } else { window.setAutoWidth(true); } } /** * {@inheritDoc} */ @Override public void setHeight(String height) { if (ClientUtils.isNotBlank(height)) { window.setAutoHeight(false); window.setHeight(height); } else { window.setAutoHeight(true); } } /** * {@inheritDoc} */ @Override public void setZIndex(int zIndex) { window.setZIndex(zIndex); } /** * {@inheritDoc} */ @Override public void setClosePopupHandler(final ClosePopupHandler handler) { if (windowListener != null) { window.removeWindowListener(windowListener); windowListener = null; } if (handler == null) { return; } windowListener = new WindowListener() { @Override public void windowHide(WindowEvent we) { handler.onClosePopup(new ClosePopupEvent()); } }; window.addWindowListener(windowListener); } /** * {@inheritDoc} */ @Override public void setPageMessageVisible(boolean visible) { messagePanel.setVisible(visible); } /** * {@inheritDoc} */ @Override public void setPageMessage(String html) { setPageMessageVisible(ClientUtils.isNotBlank(html)); message.setHTML(html); } /** * {@inheritDoc} */ @Override public void setPageMessage(String html, MessageType type) { setPageMessage(html); setPageMessageType(type); } /** * {@inheritDoc} */ @Override public void setPageMessageType(MessageType type) { MessageType.applyStyleName(messagePanel, type); MessageType.applyStyleName(window, type); } /** * {@inheritDoc} */ @Override public boolean isLoading() { return loadingMask.isLoading(); } /** * {@inheritDoc} */ @Override public void setLoading(boolean loading) { loadingMask.setLoading(loading); } /** * Add the given button to the window backing this popup. * @param button Button to add to the popup. */ public void addButton(Button button) { window.addButton(button); } }