All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wicketstuff.openlayers.api.control.AbstractControl Maven / Gradle / Ivy

There is a newer version: 1.5-RC5.1
Show newest version
/*
 * 
 * ==============================================================================
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.wicketstuff.openlayers.api.control;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.wicketstuff.openlayers.IOpenLayersMap;
import org.wicketstuff.openlayers.api.IJavascriptComponent;
import org.wicketstuff.openlayers.api.layer.Layer;

/**
 * @author Michael O'Cleirigh
 * 
 *         Provides a base class for the IJavascriptControl interface that
 *         provides a default implementation for the javascript initialization
 *         and removal methods.
 * 
 */
public class AbstractControl implements IJavascriptComponent {

	
	private static final long serialVersionUID = -9139375207645853318L;

	private final boolean externalizable;

	private final String name;
	
	private List layerList = null;
	
	private LinkedList> eventJavascript = new LinkedList>();
	

	protected AbstractControl(String name, boolean externalizable) {
		this.name = name;
		this.externalizable = externalizable;

	}

	/**
	 * A convenience wrapper to {@link #getJSadd(IOpenLayersMap, String)}
	 * 
	 * that builds the parameter string from the parameter map and then invokes the method. 
	 * 
	 * @param map
	 * @param parameters
	 * @return the initialization javascript that adds this control to the map using the parameters if given.
	 */
	protected String getJSadd(IOpenLayersMap map, Map parameters) {
	
		return this.getJSadd(map, "OpenLayers.Control." + this.name, parameters);
	}
	
	protected String getJSadd(IOpenLayersMap map, String javascriptClassName, Map parameters) {
	

		if (map.isExternalControls() && externalizable) {

			parameters
					.put("div", "OpenLayers.Util.getElement('wicketOpenlayer"
							+ this.name + "')");
		}

		StringBuffer buf = new StringBuffer();

		ListkeyList = new LinkedList();
		
		keyList.addAll(parameters.keySet());
		
		if (keyList.size() > 0) {
			int last = keyList.size() - 1;

			for (int i = 0; i < last; i++) {

				String key = keyList.get(i);
				
				String value = parameters.get(key);

				buf.append(key);
				buf.append(": ");
				buf.append(value);
				
				buf.append(", ");
			}

			String key = keyList.get(last);
			String value = parameters.get(key);
			
			buf.append(key);
			buf.append(": ");
			buf.append(value);
		}

		return getJSadd(map, javascriptClassName, buf.toString());

	}

	/**
	 * Calls map.addControl() for the generated initialization javascript using the parameterString if present.
	 * 
	 * @param map 
	 * @param parameterString contains comma separated list of parameters
	 * @return
	 */
	protected String getJSadd(IOpenLayersMap map, String parameterString) {

		return this.getJSadd(map, "OpenLayers.Control." + this.name, parameterString);
	}

	/**
	 * 
	 * @param map the openlayers map java binding.
	 * @param javascriptClassName the name of the javascript class being invoked.
	 * @param parameterString the constructor parameters if any.
	 * @return the javascript to invoke the map.addControl() method containing the initialized constructor for the control type.
	 * 
	 */
	protected String getJSadd(IOpenLayersMap map, String javascriptClassName, String parameterString) {
		
		String invocation = null;
		
		String id = getId();
		
		StringBuffer layers = new StringBuffer();
		if (layerList != null && !layerList.isEmpty()) {
			layers.append("[");
			for (Layer item: layerList) {
				if (layers.length() > 1) layers.append(", ");
				layers.append("layer" + item.getId());
			}
			layers.append("]");
		}
		
		if (parameterString.length() == 0) {
			invocation =  map.getJSinvoke("addControl('" + id
					+ "', new " + javascriptClassName + "(" + layers.toString() +"))");
		} else {
			invocation =  map.getJSinvoke("addControl('" + id
					+ "', new " + javascriptClassName + "(" + (layers.length() > 0 ? layers.toString() + ", " : "") + "{"
					+ parameterString + "}))");
		}
		
		if (eventJavascript.size() > 0) {
			// prepend the creational logic to the event registration javascript.
			
			StringBuffer renderedJavascript = new StringBuffer(invocation);
			
			for (IModel model : eventJavascript) {
			
				renderedJavascript.append(model.getObject());
				
			}
			return renderedJavascript.toString();
		}
		else
			return invocation;
	}

	public String getJSadd(IOpenLayersMap map) {

		return getJSadd(map, "");
	}

	public String getJSremove(IOpenLayersMap map) {
		return map.getJSinvoke("removeControl('" + this.name + "')");
	}

	/* (non-Javadoc)
	 * @see org.wicketstuff.openlayers.api.IJavascriptComponent#getId()
	 */
	public String getId() {
		return this.name + String.valueOf(System.identityHashCode(this));
	}
	
	/**
	 * 
	 * Allows javascript to be wired into events on this control.
	 * 
	 * The name of the event object in scope for the model value is 'evt'. 
	 * 

*

* control.events.register("featureselected", this, function(evt) { * modelValue <-- this is the content from the model. * }); *
*

* * Note: This is not the method to use if you want to use ajax and have wicket to the event processing. * @param map the map object that the control is bound to (will be bound to). * @param event the name of the OpenLayersEvent * @param model an IModel that provides the javascript text to be registered on the event. * */ public void registerJavascriptEvent(final IOpenLayersMap map, final String event, final IModel eventHandlingJavascriptModel) { // added through a model so that we can wait until the render phase before calculating the callback urls if the event handling javascript contains // wicket behaviours. eventJavascript.add(new AbstractReadOnlyModel() { /* (non-Javadoc) * @see org.apache.wicket.model.AbstractReadOnlyModel#getObject() */ @Override public String getObject() { StringBuffer buf = new StringBuffer(); buf.append(map.getJSinvokeNoLineEnd("controls['"+getId()+"'].events.register(\"")); buf.append(event); buf.append("\", this, function (evt) {"); buf.append(eventHandlingJavascriptModel.getObject()); buf.append("});\n"); return buf.toString(); } }); } /* (non-Javadoc) * @see org.wicketstuff.openlayers.api.IJavascriptComponent#getJSResourceReference() */ public JavaScriptResourceReference[] getJSResourceReferences() { // default is to not have any custom javascript for the control. return null; } /** * A helper similiar to OpenLayersMap.getJSInvoke except instead of just getting the map context we get this control context from the root. * * @param map * @param invocation * @return */ protected String getJSinvoke(IOpenLayersMap map, String invocation) { return map.getJSinvoke("controls['" + this.getId() + "']." + invocation); } public void setLayerList(List layerList) { this.layerList = layerList; } public List getLayerList() { return layerList; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy