/*
* GeoSolutions - MapstoreMobile - GeoSpatial Framework on Android based devices
* Copyright (C) 2013 GeoSolutions (www.geo-solutions.it)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package it.geosolutions.android.map.overlay.managers;
import java.util.ArrayList;
import it.geosolutions.android.map.MapsActivity;
import it.geosolutions.android.map.R;
import it.geosolutions.android.map.listeners.OverlayChangeListener;
import it.geosolutions.android.map.mapstore.model.MapStoreConfiguration;
import it.geosolutions.android.map.mapstore.utils.MapStoreUtils;
import it.geosolutions.android.map.model.Layer;
import it.geosolutions.android.map.overlay.MarkerOverlay;
import it.geosolutions.android.map.overlay.SpatialiteOverlay;
import it.geosolutions.android.map.overlay.WMSOverlay;
import it.geosolutions.android.map.overlay.items.DescribedMarker;
import it.geosolutions.android.map.overlay.switcher.OverlaySwitcherFragment;
import it.geosolutions.android.map.utils.MarkerUtils;
import it.geosolutions.android.map.view.AdvancedMapView;
import it.geosolutions.android.map.wms.WMSLayer;
import org.mapsforge.android.maps.overlay.MyLocationOverlay;
import org.mapsforge.android.maps.overlay.Overlay;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
/**
* Manages overlays of the AdvancedMapView
* @author Lorenzo Natali (lorenzo.natali@geo-solutions.it)
*
*/
public class SimpleOverlayManager implements OverlayManager {
/** MARKERS_ENABLED_FLAG */
private static final String MARKERS_ENABLED_FLAG = "markers";
/** DATA_ENABLED_FLAG */
private static final String DATA_ENABLED_FLAG = "data";
/** MAPSTORE_ENABLED_FLAG */
private static final String MAPSTORE_ENABLED_FLAG = "mapstore";
public static final String MAPSTORE_CONFIG = "MAPSTORE_CONFIG";
//------------------------------------------------------
//PUBLIC VARIABLES
//------------------------------------------------------
public MarkerOverlay markerOverlay;
public SpatialiteOverlay spatialiteOverlay;
public boolean markerActivated;
public boolean spatialActivated;
public boolean mapstoreActivated;
public WMSOverlay wmsOverlay;
private MapStoreConfiguration mapStoreConfig;
private AdvancedMapView mapView;
/**
* returns the <MapStoreConfiguration> for the WMSLayer
* @return
*/
public MapStoreConfiguration getMapStoreConfig() {
return mapStoreConfig;
}
/**
* set the
* @param mapStoreConfig for the WMSLayer
*/
public void setMapStoreConfig(MapStoreConfiguration mapStoreConfig) {
this.mapStoreConfig = mapStoreConfig;
overlayChangeListener.onOverlayVisibilityChange(R.id.mapstore, mapstoreActivated);
}
/**
* the <OverlayChangeListener> that notifies the changes in the overlay
* visibility and events of add of a <MapStoreConfiguration>
*/
public OverlayChangeListener overlayChangeListener =new OverlayChangeListener(){
public void onOverlayVisibilityChange(int id, boolean visibility) {}
};
/**
* get the current <OverlayChangeListener>
* @return
*/
public OverlayChangeListener getOverlayChangeListener() {
return overlayChangeListener;
}
/**
* set the <OverlayChangeListener> object to monitor the overlay changes
* @param overlayChangeListener
*/
public void setOverlayChangeListener(OverlayChangeListener overlayChangeListener) {
this.overlayChangeListener = overlayChangeListener;
}
/**
* Create the <OverlayManager>
* it automatically binds to the mapView and initialize overlays
* @param mapView
*/
public SimpleOverlayManager(AdvancedMapView mapView) {
this.mapView =mapView;
//add spatialite overlay
mapView.setOverlayManger(this);
this.spatialiteOverlay = new SpatialiteOverlay();
spatialiteOverlay.setProjection(mapView.getProjection());
wmsOverlay = new WMSOverlay();
wmsOverlay.setProjection(mapView.getProjection());
setMarkerOverlay(new MarkerOverlay());
}
/**
* Add/Remove the Overlay from the mapView if the
*
* @param itemId
* id of the menu item
* @param enabled
* true to set the layer visible, false to make it not visible
*/
public void toggleOverlayVisibility(int itemId, boolean enable) {
boolean present = false;
Overlay overlay = null;
Log.v("LAYERS", mapView.getOverlays().size() + " overays found");
for (Overlay o : mapView.getOverlays()) {
if (o.equals(spatialiteOverlay) && itemId == R.id.data) {
present = true;
Log.v("LAYERS", "data layer is visible");
overlay = o;
break;
}
if (o.equals(wmsOverlay) && itemId == R.id.mapstore) {
present = true;
Log.v("LAYERS", "marker layer is visible");
overlay = o;
break;
}
if (o.equals(markerOverlay) && itemId == R.id.markers) {
present = true;
Log.v("LAYERS", "marker layer is visible");
overlay = o;
break;
}
}
if (present && !enable) {
mapView.getOverlays().remove(overlay);
mapView.redraw();
overlayChangeListener.onOverlayVisibilityChange(itemId, enable);
Log.v("LAYERS", "removing layer");
} else if (!present && enable) {
if (itemId == R.id.data) {
//data layer is always at level 0
mapView.getOverlays().add(0, spatialiteOverlay);
Log.v("LAYERS", "add data layer");
}else if(itemId == R.id.mapstore){
if(mapView.getOverlays().size()>0){
mapView.getOverlays().add(1,wmsOverlay );
}else{
mapView.getOverlays().add(0, wmsOverlay);
}
} else if (itemId == R.id.markers) {
//marker overlay goes always over the data and marker overlay
int index = (mapView.getOverlays().contains(spatialiteOverlay) ? 1 :0 ) +
(mapView.getOverlays().add(markerOverlay) ? 1 : 0 );
mapView.getOverlays().add(index, markerOverlay);
Log.v("LAYERS", "add marker layer");
}
overlayChangeListener.onOverlayVisibilityChange(itemId, enable);
mapView.getOverlayController().redrawOverlays();
}
}
/**
* sets the data overlay visible
*/
public void setDataVisible() {
spatialActivated = true;
mapView.getOverlays().add(spatialiteOverlay);
overlayChangeListener.onOverlayVisibilityChange(R.id.data, true);
}
/**
* get the markerOverlay
* @return the <MarkerOverlay>
*/
public MarkerOverlay getMarkerOverlay() {
return markerOverlay;
}
public SpatialiteOverlay getDataOverlay() {
return spatialiteOverlay;
}
public void setMarkerOverlay(MarkerOverlay markerOverlay) {
this.markerOverlay= markerOverlay;
}
public void setMarkerVisible() {
markerActivated =true;
overlayChangeListener.onOverlayVisibilityChange(R.id.markers, true);
mapView.getOverlays().add(markerOverlay);
}
public void addLocationOverlay(MyLocationOverlay overlay) {
mapView.getOverlays().add(mapView.getOverlays().size(), overlay);
}
public void removeOverlay(Overlay overlay) {
mapView.getOverlays().remove(overlay);
}
public void addWMSLayers(ArrayList<Layer> arrayList){
if(wmsOverlay == null){
wmsOverlay=new WMSOverlay();
}
wmsOverlay.setLayers((ArrayList<WMSLayer>)(ArrayList) arrayList);
toggleOverlayVisibility(R.id.mapstore, true);
Log.v("WMS","TOTAL LAYERS:" + wmsOverlay.getLayers().size());
}
public WMSOverlay getWMSOverlay() {
// TODO Auto-generated method stub
return wmsOverlay;
}
/**
* load a MapStore configuration into the WMSOverlay
* @param the <MapStoreConfiguration> object to load
*/
public void loadMapStoreConfig(MapStoreConfiguration result){
if(result == null) return ;
addWMSLayers(MapStoreUtils.buildWMSLayers(result));
setMapStoreConfig(result);
}
/**
* save the current status of the layers in the provided bundle
* @param savedInstanceState
*/
public void saveInstanceState(Bundle savedInstanceState) {
ArrayList<DescribedMarker> markers = getMarkerOverlay().getMarkers();
savedInstanceState.putParcelableArrayList(MapsActivity.PARAMETERS.MARKERS,MarkerUtils.getMarkersDTO(markers));
savedInstanceState.putBoolean(MARKERS_ENABLED_FLAG, mapView.getOverlays().contains(getMarkerOverlay()));//TODO change for visibility!!!
savedInstanceState.putBoolean(DATA_ENABLED_FLAG, mapView.getOverlays().contains(getDataOverlay()));
savedInstanceState.putBoolean(MAPSTORE_ENABLED_FLAG, mapView.getOverlays().contains(getWMSOverlay()));
savedInstanceState.putSerializable(MAPSTORE_CONFIG, getMapStoreConfig());
}
/**
* restore the state of the overlays from a bundle
* @param savedInstanceState
*/
public void restoreInstanceState(Bundle savedInstanceState) {
if(savedInstanceState.getBoolean(MARKERS_ENABLED_FLAG,true)){
setMarkerVisible();
if(savedInstanceState.getBoolean(DATA_ENABLED_FLAG,true)){
setDataVisible();
}
}
loadMapStoreConfig((MapStoreConfiguration) savedInstanceState.getSerializable(MAPSTORE_CONFIG));
toggleOverlayVisibility(R.id.mapstore,savedInstanceState.getBoolean(MAPSTORE_ENABLED_FLAG,false) );
}
public void defaultInit() {
setMarkerVisible();
setDataVisible();
}
/* (non-Javadoc)
* @see it.geosolutions.android.map.overlay.managers.OverlayManager#forceRedraw()
*/
@Override
public void forceRedraw() {
mapView.getOverlayController().redrawOverlays();
}
}