/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.quickstart.gwt2.client.widget.info;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import org.geomajas.gwt2.client.map.attribute.Attribute;
import org.geomajas.gwt2.client.map.feature.Feature;
import org.geomajas.layer.feature.attribute.ImageUrlAttribute;
import org.geomajas.quickstart.gwt2.client.ApplicationService;
import org.geomajas.quickstart.gwt2.client.controller.feature.controller.FeatureClickedEvent;
import org.geomajas.quickstart.gwt2.client.controller.feature.controller.FeatureClickedHandler;
import org.geomajas.quickstart.gwt2.client.i18n.ApplicationMessages;
import org.geomajas.quickstart.gwt2.client.resource.ApplicationResource;
import java.util.List;
import java.util.Map;
/**
* The info panel widget.
*
* @author David Debuck
*
*/
public class InfoPanel implements IsWidget {
@UiField
protected PopupPanel infoPopupPanel;
PopupPanel temp = new PopupPanel();
private int left;
private int top;
private HTMLPanel infoPopupPanelContent = new HTMLPanel("");
private final Button closeInfoPopupPanelButton = new Button("");
private ApplicationMessages msg = GWT.create(ApplicationMessages.class);
private static final InfoPanelUiBinder UIBINDER = GWT.create(InfoPanelUiBinder.class);
/**
* UI binder interface.
*
* @author David Debuck
*
*/
interface InfoPanelUiBinder extends UiBinder<Widget, InfoPanel> {
}
/**
* Default constructor.
*/
public InfoPanel() {
UIBINDER.createAndBindUi(this);
ApplicationResource.INSTANCE.css().ensureInjected();
ApplicationService.getInstance().getMapPresenter().getEventBus().addHandler(FeatureClickedHandler.TYPE, new MyFeatureClickedHandler());
initInfoPanel();
infoPopupPanel.addDomHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
ApplicationService.getInstance().setTooltipShowingAllowed(false);
}
}, MouseOverEvent.getType());
infoPopupPanel.addDomHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
ApplicationService.getInstance().setTooltipShowingAllowed(true);
}
}, MouseOutEvent.getType());
}
/**
* Add the content tp the popup panel.
* @param wrapper HTMLPanel
*/
public void add(HTMLPanel wrapper) {
infoPopupPanel.add(wrapper);
}
/**
* Set the popup position.
*
* @param left int
* @param top int
*/
public void setPopupPosition(int left, int top) {
infoPopupPanel.setPopupPosition(left, top);
}
/**
* Hide the infoPopupPanel.
*/
public void hide() {
infoPopupPanel.hide();
}
/**
* Hide the infoPopupPanel.
*/
public void show() {
infoPopupPanel.setModal(false);
infoPopupPanel.show();
}
/**
*
* @param left int
*/
public void setLeft(int left) {
this.left = left;
}
/**
*
* @param top int
*/
public void setTop(int top) {
this.top = top;
}
@Override
public Widget asWidget() {
return infoPopupPanel;
}
/**
* Handler that handles FeatureClickedEvent.
*
* @author David Debuck
*/
private class MyFeatureClickedHandler implements FeatureClickedHandler {
@Override
public void onFeatureClicked(FeatureClickedEvent event) {
List<Feature> features = event.getFeatures();
infoPopupPanelContent.clear();
if (!features.isEmpty()) {
infoPopupPanel.setPopupPosition(left, top);
String previousLayerId = "";
for (final Feature feature : features) {
if (!feature.getLayer().getId().equalsIgnoreCase(previousLayerId)) {
Label subTitle = new Label(msg.infoPanelSubTitle() + " " + feature.getLayer().getTitle());
subTitle.addStyleName(ApplicationResource.INSTANCE.css().infoPopupPanelSubTitle());
infoPopupPanelContent.add(subTitle);
}
final Label featureLabel = new Label("- " + feature.getLabel());
featureLabel.addStyleName(ApplicationResource.INSTANCE.css().featureItem());
featureLabel.addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
temp.clear();
temp.addStyleName(ApplicationResource.INSTANCE.css().detailPopupPanel());
HTMLPanel content = new HTMLPanel("");
temp.add(content);
for (Object o : feature.getAttributes().entrySet()) {
Map.Entry pairs = (Map.Entry) o;
Attribute at = (Attribute) pairs.getValue();
if (at.getValue() instanceof ImageUrlAttribute) {
Image image = new Image("images/" + at.getValue().toString());
image.setStyleName(ApplicationResource.INSTANCE.css().countryImage());
content.add(image);
} else {
content.add(new Label(pairs.getKey() + ": " + at.getValue()));
}
}
temp.setPopupPosition(
infoPopupPanel.getAbsoluteLeft() + 205,
featureLabel.getAbsoluteTop()
);
temp.setAutoHideEnabled(true);
temp.setModal(false);
temp.show();
}
});
featureLabel.addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
temp.hide();
}
});
infoPopupPanelContent.add(featureLabel);
previousLayerId = feature.getLayer().getId();
}
infoPopupPanel.setModal(false);
if (ApplicationService.getInstance().toggleFeatureClickedListener(true)) {
infoPopupPanel.hide();
} else {
infoPopupPanel.show();
}
} else {
infoPopupPanel.hide();
}
}
}
/**
* Init the info panel.
*/
private void initInfoPanel() {
infoPopupPanel.addStyleName(ApplicationResource.INSTANCE.css().infoPopupPanel());
HTMLPanel infoPopupPanelWrapper = new HTMLPanel("");
closeInfoPopupPanelButton.addStyleName(ApplicationResource.INSTANCE.css().closePopupPanelButton());
closeInfoPopupPanelButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
infoPopupPanel.hide();
ApplicationService.getInstance().setTooltipShowingAllowed(true);
}
});
HTMLPanel closeInfoButtonContainer = new HTMLPanel("");
closeInfoButtonContainer.addStyleName(ApplicationResource.INSTANCE.css().popupPanelHeader());
Label infoTitle = new Label(msg.infoPanelTitle());
closeInfoButtonContainer.add(infoTitle);
closeInfoButtonContainer.add(closeInfoPopupPanelButton);
infoPopupPanelWrapper.add(closeInfoButtonContainer);
infoPopupPanelContent = new HTMLPanel("");
infoPopupPanelContent.addStyleName(ApplicationResource.INSTANCE.css().infoPopupPanelContent());
ScrollPanel infoPopupPanelScroll = new ScrollPanel();
infoPopupPanelScroll.addStyleName(ApplicationResource.INSTANCE.css().infoPopupPanelScroll());
infoPopupPanelScroll.add(infoPopupPanelContent);
infoPopupPanelWrapper.add(infoPopupPanelScroll);
infoPopupPanel.add(infoPopupPanelWrapper);
infoPopupPanel.hide();
}
}