/*******************************************************************************
 * Copyright 2014, 2017 gwt-ol3
 *
 * 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 com.github.tdesjardins.ol3.demo.client.example;

import com.github.tdesjardins.ol3.demo.client.constants.DemoConstants;
import com.github.tdesjardins.ol3.demo.client.utils.DemoUtils;
import com.google.gwt.user.client.Window;

import ol.Collection;
import ol.Coordinate;
import ol.Feature;
import ol.FeatureOptions;
import ol.Map;
import ol.MapOptions;
import ol.OLFactory;
import ol.View;
import ol.control.MousePosition;
import ol.control.MousePositionOptions;
import ol.event.EventListener;
import ol.events.condition.Condition;
import ol.geom.Polygon;
import ol.interaction.Select;
import ol.interaction.SelectOptions;
import ol.layer.Base;
import ol.layer.LayerOptions;
import ol.layer.Tile;
import ol.layer.VectorLayerOptions;
import ol.proj.Projection;
import ol.proj.ProjectionOptions;
import ol.source.Osm;
import ol.source.Vector;
import ol.source.VectorOptions;
import ol.source.XyzOptions;

/**
 * Example for feature selection.
 *
 * @author Tino Desjardins
 */
public class SelectFeaturesExample implements Example {

    /* (non-Javadoc)
     * @see de.desjardins.ol3.demo.client.example.Example#show() */
    @Override
    public void show(String exampleId) {

    	Coordinate centerCoordinate = OLFactory.createCoordinate(13.37, 52.52);
        Coordinate transformedMidPoint = Projection.transform(centerCoordinate, DemoConstants.EPSG_4326, DemoConstants.EPSG_3857);

        // create a polygon
        Polygon polygon = DemoUtils.createTestPolygon();

        // create a feature
        FeatureOptions featureOptions = OLFactory.createOptions();
        // TODO Setter for ID seems to doesn't have an effect in feature options.
        // featureOptions.setId("g1");
        featureOptions.setGeometry(polygon);

        Feature feature = new Feature(featureOptions);
        feature.setId("g1");
        feature.set("name", "triangle");

        // create another feature via cloning
        Feature feature2 = feature.clone();
        feature2.setId("g2");
        feature2.getGeometry().rotate(180, transformedMidPoint);

        Collection<Feature> lstFeatures = new Collection<Feature>();
        lstFeatures.push(feature);
        lstFeatures.push(feature2);

        VectorOptions vectorSourceOptions = OLFactory.createOptions();
        vectorSourceOptions.setFeatures(lstFeatures);
        Vector vectorSource = new Vector(vectorSourceOptions);

        VectorLayerOptions vectorLayerOptions = OLFactory.createOptions();
        vectorLayerOptions.setSource(vectorSource);
        ol.layer.Vector vectorLayer = new ol.layer.Vector(vectorLayerOptions);

        // create an OSM-layer
        XyzOptions osmSourceOptions = OLFactory.createOptions();
        Osm osmSource = new Osm(osmSourceOptions);
        LayerOptions osmLayerOptions = OLFactory.createOptions();
        osmLayerOptions.setSource(osmSource);
        Tile osmLayer = new Tile(osmLayerOptions);

        // create a view
        View view = new View();

        view.setCenter(transformedMidPoint);
        view.setZoom(14);

        // create the map
        MapOptions mapOptions = OLFactory.createOptions();
        mapOptions.setTarget(exampleId);
        mapOptions.setView(view);
        Collection<Base> lstLayer = new Collection<Base>();
        lstLayer.push(osmLayer);
        lstLayer.push(vectorLayer);
        mapOptions.setLayers(lstLayer);
        Map map = new Map(mapOptions);

        // add some controls
        map.addControl(OLFactory.createScaleLine());

        MousePositionOptions mousePositionOptions = OLFactory.createOptions();
        ProjectionOptions projectionOptions = OLFactory.createOptions();
        projectionOptions.setCode(DemoConstants.EPSG_4326);
        mousePositionOptions.setProjection(OLFactory.createProjection(projectionOptions));

        MousePosition mousePosition = new MousePosition(mousePositionOptions);
        mousePosition.setCoordinateFormat(Coordinate.createStringXY(5));
        map.addControl(mousePosition);

        SelectOptions selectOptions = new SelectOptions();
        selectOptions.setCondition(Condition.getClick());
        
        // create a select interaction
        final Select selectFeature = new Select(selectOptions);
        map.addInteraction(selectFeature);

        EventListener<Select.Event> selectListener = new EventListener<Select.Event>() {

            @Override
            public void onEvent(Select.Event event) {

            	Collection<Feature> selectedFeatures = selectFeature.getFeatures();

            	if (selectedFeatures.getLength() > 0) {
            		Feature feature = selectedFeatures.item(0);
            		String output = "You selected feature with id '" + feature.getId() + "'"
            				+ " and name '" + feature.get("name") + "'"
            				+ " and geometry name '" + feature.getGeometryName() + "'"
            				+ ".";
            		Window.alert(output);
            	}

            }

        };

        selectFeature.on("select", selectListener);

    }

}

@@ -1218,32 +1218,61 @@
 ositionOptions;%0A
+import ol.control.ScaleLine;%0A
 import ol.event.
@@ -1973,17 +1973,20 @@
  %7B%0A%0A    
-%09
+    
 Coordina
@@ -2007,32 +2007,20 @@
 inate = 
-OLFactory.create
+new 
 Coordina
@@ -4228,32 +4228,20 @@
 Control(
-OLFactory.create
+new 
 ScaleLin
@@ -4502,32 +4502,20 @@
 jection(
-OLFactory.create
+new 
 Projecti
@@ -4848,24 +4848,16 @@
 ick());%0A
-        
 %0A       
@@ -5175,17 +5175,20 @@
         
-%09
+    
 Collecti
@@ -5260,17 +5260,20 @@
         
-%09
+    
 if (sele
@@ -5316,18 +5316,24 @@
         
+    
-%09%09
+    
 Feature 
@@ -5380,18 +5380,24 @@
         
+       
-%09%09
+ 
 String o
@@ -5465,36 +5465,48 @@
 %22'%22%0A            
-%09%09%09%09
+                
 + %22 and name '%22 
@@ -5545,20 +5545,32 @@
         
+   
-%09%09%09%09
+             
 + %22 and 
@@ -5636,12 +5636,24 @@
     
-%09%09%09%09
+                
 + %22.
@@ -5671,10 +5671,16 @@
     
-%09%09
+        
 Wind
@@ -5713,9 +5713,12 @@
     
-%09
+    
 %7D%0A%0A 

Refactor SelectFeaturesExample