/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2011 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.gwt.client.map.store;

import org.geomajas.gwt.client.map.cache.tile.TileFunction;
import org.geomajas.gwt.client.map.cache.tile.VectorTile;
import org.geomajas.gwt.client.map.feature.Feature;
import org.geomajas.gwt.client.map.feature.LazyLoadCallback;
import org.geomajas.gwt.client.spatial.Bbox;

/**
 * <p>
 * General interface of a store containing features for a {@link org.geomajas.gwt.client.map.layer.VectorLayer}.
 * A {@link org.geomajas.gwt.client.map.store.VectorLayerStore} is meant
 * to store the necessary features for a specific layer, and even synchronize with the server if needed. All caches will
 * make use of spatial tiles, by whom to divide the space and more efficiently retrieve the necessary information.
 * </p>
 *
 * @author Pieter De Graef
 */
public interface VectorLayerStore extends LayerStore<VectorTile> {

	/**
	 * Does this store currently contain the feature with given identifier?
	 *
	 * @param id
	 *            A feature's identifier.
	 * @return Return true or false.
	 */
	boolean contains(String id);

	/**
	 * Get a feature by it's identifier.
	 *
	 * @param id
	 *            The feature's identifier.
	 * @param featureIncludes what data should be available in the features
	 * @param callback callback which gets the features
	 */
	void getFeature(String id, int featureIncludes, LazyLoadCallback callback);

	/**
	 * Get a feature by it's identifier. If it can't be found, null is returned. The feature may require additional
	 * lazy loading.
	 *
	 * @param id
	 *            The feature's identifier.
	 * @return feature which may require additional lazy loading
	 */
	Feature getPartialFeature(String id);

	/**
	 * Return a set of all features currently in the store.
	 *
	 * @param featureIncludes what data should be available in the features
	 * @param callback callback which gets the features
	 */
	void getFeatures(int featureIncludes, LazyLoadCallback callback);

	/**
	 * Add a new feature to the underlying data structure.
	 *
	 * @param feature
	 *            Feature object.
	 * @return Was the method successful in adding the feature or not?
	 */
	boolean addFeature(Feature feature);

	/**
	 * Remove a feature from the underlying data structure. (if it's in there)
	 *
	 * @param id
	 *            The feature's identifier.
	 * @return Returns the feature if it was found. Null otherwise.
	 */
	Feature removeFeature(String id);

	/**
	 * Return the current size of the store. How many features are stored here?
	 *
	 * @return number of features in the store
	 */
	int size();

	/**
	 * Make a certain query on the store. The cache will go over all tiles intersecting the given bounding box. If some
	 * of these tiles are not yet present in the cache, they will be fetched from the server with the given filter.
	 *
	 * @param bbox
	 *            The bounding box wherein we are to search for tiles.
	 * @param filter
	 *            Additional filter which can be applied in the query. This is usually null, but could for example be
	 *            used when a node is missing.
	 * @param onDelete
	 *            The function to be applied on the tiles deleted by this sync. This function should take a node as
	 *            parameter.
	 * @param onUpdate
	 *            The function to be applied on the tiles intersecting the given bounding box. This function should take
	 *            a node as parameter.
	 */
	void queryAndSync(Bbox bbox, String filter, TileFunction<VectorTile> onDelete,
			TileFunction<VectorTile> onUpdate);

	/**
	 * Make a certain query on the cache. The cache will go over all tiles intersecting the given bounding box. No
	 * synchronization with the server is performed.
	 *
	 * @param bbox
	 *            The bounding box wherein we are to search for tiles, and apply the function.
	 * @param callback
	 *            The function to be applied on the tiles intersecting the given bounding box. This function should take
	 *            a node as parameter.
	 */
	void query(Bbox bbox, TileFunction<VectorTile> callback);

	/**
	 * Creates a new feature instance. This does not add the feature to the store yet !
	 * @return the new feature
	 */
	Feature newFeature();
}

@@ -1695,32 +1695,87 @@
 n the features%0D%0A
+%09 * See %7B@link org.geomajas.global.GeomajasConstant%7D.%0D%0A
 %09 * @param callb
@@ -2347,24 +2347,81 @@
 the features
+. %0D%0A%09 * See %7B@link org.geomajas.global.GeomajasConstant%7D.
 %0D%0A%09 * @param

Add link to geomajasconstant in the javadoc