📄 scalesliderphaselistener.java
字号:
package com.esri.solutions.jitk.web.event;
import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.WebMap;
import com.esri.adf.web.data.geometry.GeometryUtil;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.adf.web.faces.component.MapControl;
import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXResponseRenderer;
import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXUtil;
import java.util.Map;
import java.util.Vector;
import org.apache.log4j.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import org.w3c.dom.Document;
public class ScaleSliderPhaseListener implements PhaseListener {
private static final long serialVersionUID = 200868259665049368L;
private static Logger _logger = Logger.getLogger(ScaleSliderPhaseListener.class.getName());
//Parameter names expected in request
static final String MAP_ZOOM = "mapZoom";
static final String FORM_ID = "formId";
static final String MAP_ID = "mapId";
static final String FACTOR = "factor";
/**
* This PhaseListener must be executed in the JSF's Restore View phase
*/
public PhaseId getPhaseId() {
return PhaseId.APPLY_REQUEST_VALUES;
}
public void beforePhase(PhaseEvent phaseEvent) {
}
/**
* Process functionality based on request parameters
*/
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
@SuppressWarnings("unchecked")
Map paramMap = externalContext.getRequestParameterMap();
//Verify if request is to be processed by this PhaseListener
if (!MAP_ZOOM.equals((String) paramMap.get(MAP_ZOOM))) {
return;
}
IScaleSliderConfig ssb = (IScaleSliderConfig) facesContext.getApplication().createValueBinding("#{scaleSliderBB}").getValue(facesContext);
double minScale_ = Math.round(ssb.getMinScale());
try {
//Get Form from view
UIComponent form = facesContext.getViewRoot().findComponent((String) paramMap.get(FORM_ID));
//Get MapControl
MapControl mapControl = (MapControl) form.findComponent((String) paramMap.get(MAP_ID));
WebMap webMap = mapControl.getWebMap();
WebContext webContext = webMap.getWebContext();
//Set event source as map, since operation is to be performed on the map
Vector<String> eventSources = new Vector<String>();
eventSources.add(mapControl.getId());
AJAXResponseRenderer ajaxRenderer = new AJAXResponseRenderer(facesContext, eventSources, form);
//Get, expand and set map's extent
WebExtent webExtent = webMap.getCurrentExtent();
WebExtent fullExtent = webMap.getFullExtent();
double currentMapScale = webMap.getMapScale();
double mapScale = Double.parseDouble((String) paramMap.get(FACTOR));
double scaleFactor = mapScale / currentMapScale;
com.esri.solutions.jitk.web.data.geometry.WebExtent newExtent =
new com.esri.solutions.jitk.web.data.geometry.WebExtent(webExtent);
newExtent.expand(scaleFactor);
//Do not scale the map to an extent that is not supported by the horizon of the
//coordinate system, i.e. full extent
if (GeometryUtil.inside(newExtent, fullExtent)) {
_logger.debug("Next extent " + newExtent + " within full extent " + fullExtent+ ", scaling");
webExtent.expand(scaleFactor);
} else {
_logger.debug("Next extent " + newExtent + " NOT within full extent " + fullExtent+ ", NOT scaling");
//double mapScale_ =
WebExtent extent_ = getMaxAllowedScale(minScale_, mapScale , currentMapScale, newExtent, fullExtent);
webMap.setCurrentExtent(extent_); //webMap.setMapScale(mapScale_);
}
webContext.refresh();
Document doc = ajaxRenderer.renderResponse(facesContext);
//initialize response
AJAXUtil.writeResponse(facesContext, doc);
} catch (Exception e) {
_logger.error("Unable to render xml", e);
} finally {
//notify Faces Lifecycle
facesContext.responseComplete();
}
}
protected WebExtent getMaxAllowedScale(double minScale, double newMapScale, double currentScale, com.esri.solutions.jitk.web.data.geometry.WebExtent currentExtent, WebExtent fullExtent) {
double newScale = currentScale;
double scaleFactor=1.0;
com.esri.solutions.jitk.web.data.geometry.WebExtent newExtent=currentExtent;
try {
while(newMapScale > currentScale) {
// decrement current scale by a factor (minscale == 15000)
newScale = newMapScale - minScale;
// calculate scale factor
scaleFactor = (newScale/newMapScale);
// calculate new web extent
newExtent = new com.esri.solutions.jitk.web.data.geometry.WebExtent(currentExtent);
newExtent.expand(scaleFactor);
if (GeometryUtil.inside(newExtent, fullExtent)) {
return newExtent; //return newScale;
}
newMapScale = newScale;
currentExtent =new com.esri.solutions.jitk.web.data.geometry.WebExtent(newExtent);
}
} catch(Exception ex) {
_logger.debug(ex.getMessage());
}
return newExtent;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -