package es.icarto.gvsig.navtableforms.utils;
import java.util.ArrayList;
import java.util.List;
import com.iver.andami.PluginServices;
import com.iver.andami.ui.mdiManager.IWindow;
import com.iver.cit.gvsig.fmap.MapControl;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.fmap.layers.FLayers;
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
import com.iver.cit.gvsig.project.documents.view.gui.View;
public class TOCLayerManager {
private BaseView view = null;
private FLayers layersInTOC = null;
private MapControl mapControl = null;
public TOCLayerManager() {
IWindow[] windows = PluginServices.getMDIManager().getOrderedWindows();
for (IWindow w : windows) {
if (w instanceof BaseView) {
view = (BaseView) w;
break;
}
}
if (view != null) {
mapControl = view.getMapControl();
layersInTOC = mapControl.getMapContext().getLayers();
}
}
public TOCLayerManager(MapControl mapControl) {
this.mapControl = mapControl;
this.layersInTOC = mapControl.getMapContext().getLayers();
}
public void setVisibleAllLayers() {
if (layersInTOC != null) {
layersInTOC.setAllVisibles(true);
}
}
public void setActiveAndVisibleLayer(String layerName) {
if (layersInTOC != null) {
layersInTOC.setAllVisibles(false);
layersInTOC.setAllActives(false);
for (int i = 0; i < layersInTOC.getLayersCount(); i++) {
FLayer layer = layersInTOC.getLayer(i);
String name = layer.getName();
if (name.equalsIgnoreCase(layerName)) {
layer.setVisible(true);
layer.setActive(true);
}
}
}
}
public FLyrVect getLayerByName(String layerName) {
if (layersInTOC != null) {
List<FLyrVect> innerLayers = getInnerLayers(layersInTOC);
for (FLyrVect l : innerLayers) {
if (hasName(l, layerName)) {
return l;
}
}
}
return null;
}
public FLyrVect getActiveLayer() {
if (mapControl != null) {
FLayer[] activeLayers = mapControl.getMapContext().getLayers()
.getActives();
for (FLayer layer : activeLayers) {
if (isFLyrVect(layer)) {
return (FLyrVect) layer;
}
}
}
return null;
}
public FLyrVect[] getActiveLayers() {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
if (mapControl != null) {
FLayer[] activeLayers = mapControl.getMapContext().getLayers()
.getActives();
for (FLayer layer : activeLayers) {
if (isFLyrVect(layer)) {
layers.add((FLyrVect) layer);
}
}
}
return layers.toArray(new FLyrVect[0]);
}
public FLyrVect[] getVisibleLayers() {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
if (mapControl != null) {
FLayer[] activeLayers = mapControl.getMapContext().getLayers()
.getVisibles();
for (FLayer layer : activeLayers) {
if (isFLyrVect(layer)) {
layers.add((FLyrVect) layer);
}
}
}
return layers.toArray(new FLyrVect[0]);
}
public String getNameOfActiveLayer() {
FLyrVect layer = getActiveLayer();
if (layer != null) {
return layer.getName();
}
return null;
}
public FLyrVect[] getAllLayers() {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
if (mapControl != null) {
layers.addAll(getInnerLayers(mapControl.getMapContext().getLayers()));
}
return layers.toArray(new FLyrVect[0]);
}
public List<FLyrVect> getJoinedLayers() {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
for (FLyrVect l : getAllLayers()) {
if (l.isJoined()) {
layers.add(l);
}
}
return layers;
}
public List<FLyrVect> getEditingLayers() {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
for (FLyrVect l : getAllLayers()) {
if (l.isEditing()) {
layers.add(l);
}
}
return layers;
}
public View getView() {
if (view instanceof View) {
return (View) view;
}
return null;
}
protected List<FLyrVect> getInnerLayers(FLayers layerGroup) {
List<FLyrVect> layers = new ArrayList<FLyrVect>();
for (int i = 0, len = layerGroup.getLayersCount(); i < len; i++) {
FLayer layer = layerGroup.getLayer(i);
if (isFLayers(layer)) {
layers.addAll(getInnerLayers((FLayers) layer));
continue;
}
if (isFLyrVect(layer)) {
layers.add((FLyrVect) layer);
continue;
}
}
return layers;
}
public void removeAllLayers() {
layersInTOC.setAllVisibles(false);
removeAllLayers(layersInTOC);
}
private void removeAllLayers(FLayers layers) {
while (layers.getLayersCount() > 0) {
FLayer layer = layers.getLayer(0);
if (isFLayers(layer)) {
removeAllLayers((FLayers) layer);
}
layers.removeLayer(0);
}
}
public void removeAllOverviewLayer() {
FLayers layers = view.getMapOverview().getMapContext().getLayers();
removeAllLayers(layers);
}
public boolean hasName(FLayer layer, String layerName) {
return layer.getName().equalsIgnoreCase(layerName);
}
public boolean isFLyrVect(FLayer layer) {
return layer instanceof FLyrVect;
}
public boolean isFLayers(final FLayer layer) {
return layer instanceof FLayers;
}
}