p:gmap in composite component, OverlaySelectEvent is NULL

UI Components for JSF
Post Reply
johnhollon
Posts: 1
Joined: 04 Apr 2012, 10:31

04 Apr 2012, 10:51

Environment:

1, glassfish 3.1
2, primefaces 3.0.1

Requirement:

1, Develop a composite component named "corpInfoMap", which shows the locations of corporations in google map as "markers". when user click a marker, display the corporation's infomation in mapInfoWindow.
2, Develop an other composite component named "corpInfoMapDialog", which is a p:dialog contains the "corpInfoMap".

Problem:

The Map works excellent, both in page or in dialog. but when user click the marker in map:
The "OverlaySelectEvent"(event) which is passed into the listener method is NULL. So "event.getgetOverlay()" throws NullPonterException.

Code:

1 corpInfoMap.xhtml

Code: Select all

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:cc="http://java.sun.com/jsf/composite" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core"
>
<cc:interface displayName="corp info map">
    <cc:attribute name="mapModel" required="true" displayName="corp info map Model,type : com.ui.fwjg.viewModel.CorporationMapModel" />
    <cc:attribute name="selectedListener" required="true" method-signature="void method(org.primefaces.event.map.OverlaySelectEvent)" displayName="selected mothod" />
</cc:interface>
<cc:implementation>
    <f:view contentType="text/html">
    <p:gmap zoom="#{cc.attrs.mapModel.zoom}" 
            type="HYBRID" 
            center="#{cc.attrs.mapModel.centerWd},#{cc.attrs.mapModel.centerJd}" 
            style="width:#{cc.attrs.mapModel.width}px;height:#{cc.attrs.mapModel.height}px;"
            model="#{cc.attrs.mapModel.model}"
            >
        <p:ajax event="overlaySelect" listener="#{cc.attrs.selectedListener}"></p:ajax>
         <p:gmapInfoWindow rendered="#{cc.attrs.mapModel.selectedMarker != null}" maxWidth="#{cc.attrs.mapModel.width / 2}">
            <p:outputPanel style="text-align:center;display:block;margin:auto:" rendered="#{cc.attrs.mapModel.selectedMarker != null}">
                <h:panelGroup style="width:100%;font-size:1.5em;line-height:2em;font-weight:bold;text-align:center;">
                    #{cc.attrs.mapModel.selectedMarker.data.dwmc}
                </h:panelGroup>
                <h:panelGroup layout="block" styleClass="com-ui-clearboth"></h:panelGroup>
                <h:graphicImage rendered="#{not empty cc.attrs.mapModel.selectedMarker.data.dwsltFile}" 
                                style="max-width:#{cc.attrs.mapModel.width / 2};display:block;margin:20px auto;" 
                                url="/file.ui?f=#{cc.attrs.mapModel.selectedMarker.data.dwsltFile}"></h:graphicImage> 
                <h:outputText value="#{mapBean.marker.title}" />
                <h:panelGroup layout="block" styleClass="com-ui-clearboth"></h:panelGroup>
                <h:outputText rendered="#{not empty cc.attrs.mapModel.selectedMarker.dwjj}" 
                                value="<p style="font-size:1em;line-height:1.5em;text-indent:2em;">"
                                escape="false"></h:outputText>
                    <h:outputText rendered="#{not empty cc.attrs.mapModel.selectedMarker.dwjj}" value="#{cc.attrs.mapModel.selectedMarker.dwjj}">
                    </h:outputText>
                <h:outputText rendered="#{not empty cc.attrs.mapModel.selectedMarker.dwjj}" value="</p>" escape="false"></h:outputText>
            </p:outputPanel> 
        </p:gmapInfoWindow>  
    </p:gmap>
    </f:view>
</cc:implementation>
2 corpInfoMapDialog.xhtml

Code: Select all

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:cc="http://java.sun.com/jsf/composite" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:comuicommon="http://java.sun.com/jsf/composite/components/ui/common">
<!-- INTERFACE -->
<cc:interface displayName="dialog of corp info map">
    <cc:attribute name="mapModel" required="true" displayName="corp info map Model,type: com.ui.fwjg.viewModel.CorporationMapModel" />
    <cc:attribute name="selectedListener" required="true" method-signature="void method(javax.faces.component.behavior.AjaxBehavior)" displayName="selected mothod" />
    <cc:attribute name="dialogId" default="corpInfoMapDialog" displayName="dialog ID" />
</cc:interface>
<cc:implementation>
    <p:dialog header="DanWeiDiLiXinXi" widgetVar="#{cc.attrs.dialogId}" id="#{cc.attrs.dialogId}" width="#{cc.attrs.mapModel.width}">
        <h:panelGroup rendered="#{cc.attrs.mapModel != null and cc.attrs.mapModel.model != null and (not empty cc.attrs.mapModel.model.markers)}" layout="block">
            <comuicommon:corpInfoMap mapModel="#{cc.attrs.mapModel}" selectedListener="#{cc.attrs.selectedListener}"/>
        </h:panelGroup>
        <h:panelGroup rendered="#{not (cc.attrs.mapModel != null and cc.attrs.mapModel.model != null and (not empty cc.attrs.mapModel.model.markers))}" 
                    layout="block" style="font-size:2em;text-align:center;">
            Gai Danwei wu dili Xinxi
        </h:panelGroup>
    </p:dialog>
</cc:implementation>
</html>
3 The Backing Beans(One of them)

Code: Select all

@ManagedBean
@ViewScoped
public class JlltWssbDjjsbEditPage  implements Serializable{

    ... // a lot of lines
    private CorporationMapModel corporationMapModel;

    @PostConstruct
    public void init() {
        corporationMapModel = new CorporationMapModel();
        ... // other codes, have no business with corporationMapModel.
    }

    // the OverlaySelectEvent listener method
    // when user click the marker in map, this method is invoked, but the parameter "evnet" is null.
    public void setSelectedMarker(OverlaySelectEvent event){
        corporationMapModel.onMarkerSelect(event);
    }

    public CorporationMapModel getCorporationMapModel() {
        return corporationMapModel;
    }

    public void setCorporationMapModel(CorporationMapModel corporationMapModel) {
        this.corporationMapModel = corporationMapModel;
    }

    // reset the jsb, reset the corporationMapModel's properties(only it's properties, neither it nor the mapModel in it.)
    public void setJsb(JlltWssbDjjsb jsb) {
        this.jsb = jsb;
        Corporation corporation = jsb == null ? null : (jsb.getWineInfo() == null ? null : jsb.getWineInfo().getCorporation());
        corporationMapModel.resetModel(corporation);
        setShowHistory(jsb != null);
        initWineInfo();
    }

    ... // a lot of lines, have no business with corporationMapModel
}
4 CorporationMapModel.java

Code: Select all

public class CorporationMapModel implements Serializable{
    private List<Corporation> corporations; // corporation list
    private MapModel model; // Model primefaces map model
    private String centerJd; //  map center lng
    private String centerWd; //  map center lat
    private String zoom; //  gmap zoom
    private Marker selectedMarker; // selected Marker selected marker(overlay)
    private int width = 600; // the width(px) of the map
    private int height = 480; // the height(px) of the map 

    public void resetModel(Corporation corporation) {
        List<Corporation> corporations = new ArrayList<Corporation>();
        if(corporation != null){
            corporations.add(corporation);
        }
        setCorporations(corporations);
    }
    public void resetModel(List<Corporation> corporations) {
        corporations = corporations == null ? new ArrayList<Corporation>() : corporations;
        setCorporations(corporations);
    }

    private void calInfosByCorporations() {
        if(model == null)
            model = new DefaultMapModel();
        model.getMarkers().clear();
        if (corporations != null && corporations.size() > 0) {
            for (Corporation corporation : corporations) {
                CorporationMapInfo mapInfo = CorporationMapInfo.generateNewCorporationMapInfo(corporation);
                if (mapInfo != null) {
                    model.addOverlay(mapInfo);
                }
            }
            List<Marker> markers = model.getMarkers();
            if (markers != null && markers.size() > 0) {
                double maxWd = 0D;
                double minWd = 0D;
                double maxJd = 0D;
                double minJd = 0D;
                for (int i = 0; i < markers.size(); i++) {
                    Marker marker = markers.get(i);
                    if (i == 0) {
                        maxWd = marker.getLatlng().getLat();
                        minWd = marker.getLatlng().getLat();
                        maxJd = marker.getLatlng().getLng();
                        minJd = marker.getLatlng().getLng();
                    } else {
                        double wd = marker.getLatlng().getLat();
                        double jd = marker.getLatlng().getLng();
                        maxWd = maxWd < wd ? wd : maxWd;
                        maxJd = maxJd < jd ? jd : maxJd;
                        minWd = minWd > wd ? wd : minWd;
                        minJd = minJd > jd ? jd : minJd;
                    }
                }
                BigDecimal centerWd = new BigDecimal((maxWd + minWd) / 2D);
                BigDecimal centerJd = new BigDecimal((maxJd + minJd) / 2D);
                centerWd = centerWd.setScale(6, BigDecimal.ROUND_HALF_UP);
                centerJd = centerJd.setScale(6, BigDecimal.ROUND_HALF_UP);
                setCenterWd(centerWd.toPlainString());
                setCenterJd(centerJd.toPlainString());
                zoom = GoogleMapZoom.getZoom(maxWd, minWd, maxJd, minJd, width, height);
            }
        }
    }

    public void onMarkerSelect(OverlaySelectEvent event) {
        selectedMarker = (Marker) event.getOverlay();
    }

    public List<Corporation> getCorporations() {
        return corporations;
    }

    public void setCorporations(List<Corporation> corporations) {
        corporations = corporations == null ? new ArrayList<Corporation>() : corporations;
        this.corporations = corporations;
        calInfosByCorporations();
    }

    public MapModel getModel() {
        return model;
    }

    public String getCenterJd() {
        return centerJd;
    }

    public void setCenterJd(String centerJd) {
        this.centerJd = centerJd;
    }

    public String getCenterWd() {
        return centerWd;
    }

    public void setCenterWd(String centerWd) {
        this.centerWd = centerWd;
    }

    public String getZoom() {
        return zoom;
    }

    public void setZoom(String zoom) {
        this.zoom = zoom;
    }

    public Marker getSelectedMarker() {
        return selectedMarker;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public void setModel(MapModel model) {
        this.model = model;
    }
    public void setSelectedMarker(Marker selectedMarker) {
        this.selectedMarker = selectedMarker;
    }
}
5 js.xhtml("js" means "reduce", not "javascript"), the important part in this xhtml file.

Code: Select all

<h:form id="dwMapForm">
            <comuicommon:corpInfoMapDialog
                mapModel="#{jlltWssbDjjsbEditPage.corporationMapModel}"
                selectedListener="#{jlltWssbDjjsbEditPage.setSelectedMarker(org.primefaces.event.map.OverlaySelectEvent)}"
                dialogId="dwMapDialog"
            />
</h:form>
what I've done:

1, I've googled a lot, but there are no answers.
2, I've debuged, I found that the event object has been generated by primefaces (at least, in the method of AjaxBehaviorRenderer.decode(FacesContext context, UIComponent component, ClientBehavior behavior), the event object is exists, not null.)
3, and in the method of JlltWssbDjjsbEditPage.setSelectedMarker(OverlaySelectEvent event), the event is null.

Thank you every one!

I hope I've make it clear.

Best regards!

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 15 guests