/*
* Copyright 2012 Axel Winkler, Daniel Dunér
*
* This file is part of Daxplore Presenter.
*
* Daxplore Presenter is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* Daxplore Presenter 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Daxplore Presenter. If not, see <http://www.gnu.org/licenses/>.
*/
package org.daxplore.presenter.client.ui;
import java.util.LinkedList;
import java.util.List;
import org.daxplore.presenter.client.event.EmbedSizeEvent;
import org.daxplore.presenter.client.event.EmbedSizeHandler;
import org.daxplore.presenter.client.event.ImageButtonEvent;
import org.daxplore.presenter.client.event.ImageButtonHandler;
import org.daxplore.presenter.client.event.QueryUpdateEvent;
import org.daxplore.presenter.client.event.QueryUpdateHandler;
import org.daxplore.presenter.client.json.Prefix;
import org.daxplore.presenter.client.json.UITexts;
import org.daxplore.presenter.client.resources.DaxploreConfig;
import org.daxplore.presenter.shared.EmbedDefinition;
import org.daxplore.presenter.shared.EmbedDefinition.EmbedFlag;
import org.daxplore.presenter.shared.QueryDefinition;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Frame;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
/**
* A {@link PopupPanel} that is displayed when the user clicks the embed button
* in the {@link ImageButtonPanel}.
*
* <p>
* Popups are displayed on top of the rest of the page.
* </p>
*
* <p>
* This popup is used as a component of {@link ButtonWithPopup}.
* </p>
*/
public class EmbedPopup extends PopupPanel implements EmbedSizeHandler, QueryUpdateHandler, ImageButtonHandler,
MouseUpHandler, ChangeHandler, ValueChangeHandler<Boolean> {
private DaxploreConfig config;
private final String prefix;
private VerticalPanel mainPanel;
private Frame iframeSpot = new Frame();
private final TextArea linkTextArea;
private String currentEmbedText = "";
private CheckBox transparencyCheckbox, legendCheckbox;
private EmbedSize currentEmbedSize = EmbedSize.MEDIUM;
private boolean needCodeUpdate = false;
private QueryDefinition queryDefinition;
/**
* Instantiates a new embed popup panel.
*
* @param eventBus
* the system's bus
* @param uiTexts
* the resource that supplies localized text to the UI
* @param config
* supplies configuration parameters to the client
*/
@Inject
public EmbedPopup(final EventBus eventBus, UITexts uiTexts, DaxploreConfig config, Prefix prefix) {
super(true);
this.prefix = prefix.getPrefix();
mainPanel = new VerticalPanel();
mainPanel.setSpacing(5);
Label popupHeader = new Label(uiTexts.embedPopupTitle());
mainPanel.add(popupHeader);
Label popupDescription = new Label(uiTexts.embedPopupDescription());
mainPanel.add(popupDescription);
linkTextArea = new TextArea();
linkTextArea.setText("");
linkTextArea.addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
linkTextArea.setFocus(true);
linkTextArea.selectAll();
}
});
linkTextArea.getElement().setAttribute("spellCheck", "false");
linkTextArea.addMouseUpHandler(this);
linkTextArea.addChangeHandler(this);
setStyleName("daxplore-EmbedPopup");
popupHeader.addStyleName("daxplore-EmbedPopup-header");
linkTextArea.addStyleName("daxplore-EmbedPopup-textarea");
mainPanel.add(linkTextArea);
DisclosurePanel settingsPanel = new DisclosurePanel(uiTexts.embedSettingsHeader());
FlowPanel settingsContentPanel = new FlowPanel();
settingsPanel.add(settingsContentPanel);
settingsPanel.setWidth("100%");
mainPanel.add(settingsPanel);
HorizontalPanel sizeButtonPanel = new HorizontalPanel();
sizeButtonPanel.setSpacing(10);
for (final EmbedSize embedSize : EmbedSize.values()) {
Button button = new Button(embedSize.getButtonText(config, uiTexts));
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new EmbedSizeEvent(embedSize));
}
});
sizeButtonPanel.add(button);
}
currentEmbedSize = EmbedSize.MEDIUM;
settingsContentPanel.add(sizeButtonPanel);
transparencyCheckbox = new CheckBox(uiTexts.embedTransparentBackground());
transparencyCheckbox.setValue(true, false);
transparencyCheckbox.addValueChangeHandler(this);
settingsContentPanel.add(transparencyCheckbox);
legendCheckbox = new CheckBox(uiTexts.embedShowLegend());
legendCheckbox.setValue(true, false);
legendCheckbox.addValueChangeHandler(this);
settingsContentPanel.add(legendCheckbox);
iframeSpot.setStyleName("daxplore-EmbedPopup-iframeSpot");
mainPanel.add(iframeSpot);
setWidget(mainPanel);
EmbedSizeEvent.register(eventBus, this);
QueryUpdateEvent.register(eventBus, this);
}
/**
* {@inheritDoc}
*/
@Override
public void onEmbedSize(EmbedSizeEvent event) {
currentEmbedSize = event.getEmbedSize();
updateEmbedCode();
}
private void updateEmbedCode() {
if (queryDefinition != null) {
int width = currentEmbedSize.getWidth(config);
int height = currentEmbedSize.getHeight(config);
// get base address, e.g. http://127.0.0.1/p/myprefix
String address = GWT.getHostPageBaseURL() + prefix;
address += "?f=embed&q=" + queryDefinition.getAsString();
address += "&l=" + LocaleInfo.getCurrentLocale().getLocaleName();
if(!GWT.isScript() && Window.Location.getParameter("gwt.codesvr") != null) {
address += "&gwt.codesvr=" + Window.Location.getParameter("gwt.codesvr");
}
List<EmbedFlag> flags = new LinkedList<>();
String transparency = "";
if (transparencyCheckbox.getValue()) {
flags.add(EmbedFlag.TRANSPARENT);
transparency = " allowtransparency=\"true\"";
}
if (legendCheckbox.getValue()) {
flags.add(EmbedFlag.LEGEND);
}
EmbedDefinition embedDefinition = new EmbedDefinition(flags);
address += "#" + embedDefinition.getAsString();
currentEmbedText = "<iframe src=\"" + address + "\" width=\"" + width + "\" height=\"" + height
+ "\" frameborder=\"0\"" + transparency + "></iframe>";
linkTextArea.setText(currentEmbedText);
// temporary test code:
mainPanel.remove(iframeSpot);
iframeSpot = new Frame();
iframeSpot.setStyleName("daxplore-EmbedPopup-iframeSpot");
iframeSpot.setUrl("about:blank");
iframeSpot.setUrl(address);
iframeSpot.getElement().setAttribute("frameborder", "0");
iframeSpot.getElement().setAttribute("style", "width:" + width + "px;" + "height:" + height + "px;");
if (transparencyCheckbox.getValue()) {
iframeSpot.getElement().setAttribute("allowtransparency", "true");
iframeSpot.getElement().setAttribute("style", "width:" + width + "px;" + "height:" + height + "px");
} else {
iframeSpot.getElement().setAttribute("style", "width:" + width + "px;" + "height:" + height + "px");
}
mainPanel.add(iframeSpot);
}
}
/**
* {@inheritDoc}
*/
@Override
public void onQueryUpdate(QueryUpdateEvent event) {
queryDefinition = event.getQueryDefinition();
if (isVisible()) {
updateEmbedCode();
} else {
needCodeUpdate = true;
}
}
/**
* {@inheritDoc}
*/
@Override
public void onImageButtonClick(ImageButtonEvent event) {
if (needCodeUpdate) {
updateEmbedCode();
needCodeUpdate = false;
}
}
/**
* {@inheritDoc}
*/
@Override
public void onMouseUp(MouseUpEvent event) {
if (event.getSource() == linkTextArea) {
event.preventDefault();
linkTextArea.setFocus(true);
linkTextArea.selectAll();
}
}
/**
* {@inheritDoc}
*/
@Override
public void onChange(ChangeEvent event) {
if (event.getSource() == linkTextArea) {
linkTextArea.setText(currentEmbedText);
}
}
/**
* {@inheritDoc}
*/
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
updateEmbedCode();
}
}