net.refractions.udig.tool.select.internal.AOILayerPage.java Source code

Java tutorial

Introduction

Here is the source code for net.refractions.udig.tool.select.internal.AOILayerPage.java

Source

/* uDig - User Friendly Desktop Internet GIS client
 * http://udig.refractions.net
 * (C) 2011, Refractions Research Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License.
 *
 * This library 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
 * Lesser General Public License for more details.
 */

package net.refractions.udig.tool.select.internal;

import java.util.List;

import net.refractions.udig.aoi.AOIListener;
import net.refractions.udig.aoi.AOIProxy;
import net.refractions.udig.aoi.IAOIService;
import net.refractions.udig.aoi.IAOIStrategy;
import net.refractions.udig.project.ILayer;
import net.refractions.udig.ui.PlatformGIS;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.Page;

/**
 * A page to add to the AOI View (Area of Interest) used for additional configuration of the AOI.
 * <p>
 * Has a combo to select a AOILayer from and displays the current AOI/s selected. 
 * 
 * @author paul.pfeiffer
 * @version 1.3.0
 */
public class AOILayerPage extends Page {

    private Composite page;
    private AOIProxy strategy;
    private ComboViewer comboViewer;
    //    private ListViewer listViewer;

    private static String AOI_LAYER_ID = "net.refractions.udig.tool.select.internal.aoiLayer";

    private ISelectionChangedListener comboListener = new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection selectedLayer = (IStructuredSelection) event.getSelection();
            ILayer selected = (ILayer) selectedLayer.getFirstElement();
            getAOILayerStrategy().setActiveLayer(selected);
        }
    };

    /*
     * Listens to the AOILayerStrategy and updates our view if anything changes!
     */
    private AOIListener layerWatcher = new AOIListener() {

        public void handleEvent(AOIListener.Event event) {
            // must be run in the UI thread to be able to call setSelected
            PlatformGIS.asyncInDisplayThread(new Runnable() {

                @Override
                public void run() {
                    ILayer activeLayer = getAOILayerStrategy().getActiveLayer();
                    List<ILayer> layers = getAOILayerStrategy().getAOILayers();
                    if (comboViewer == null || comboViewer.getControl() == null
                            || comboViewer.getControl().isDisposed()) {
                        return; // we are shut down or hidden
                    }
                    comboViewer.setInput(layers);
                    // check if the current layer still exists
                    if (layers.contains(activeLayer)) {
                        setSelected(activeLayer);
                    } else {
                        setSelected(null);
                    }
                    //                    listViewer.setInput(getAOILayerStrategy().getFeatures());
                }
            }, true);
        }

    };

    public AOILayerPage() {
        // careful don't do any work here
    }

    // We would overrride init if we needed to (remmeber to call super)
    @Override
    public void init(IPageSite pageSite) {
        super.init(pageSite); // provides access to stuff
    }

    /*
     * returns a AOILayerStrategy object for quick access
     */
    private AOILayerStrategy getAOILayerStrategy() {
        IAOIService aOIService = PlatformGIS.getAOIService();
        IAOIStrategy aOIStrategy = aOIService.findProxy(AOI_LAYER_ID).getStrategy();

        if (aOIStrategy instanceof AOILayerStrategy) {
            return (AOILayerStrategy) aOIStrategy;
        }
        return null;
    }

    @Override
    public void createControl(Composite parent) {
        page = new Composite(parent, SWT.NONE);

        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        page.setLayout(layout);

        Label comboLabel = new Label(page, SWT.LEFT);
        comboLabel.setText("Layer:");
        comboLabel.pack();

        listenStrategy(true);

        comboViewer = new ComboViewer(page, SWT.READ_ONLY);
        comboViewer.setContentProvider(new ArrayContentProvider());
        comboViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof ILayer) {
                    ILayer layer = (ILayer) element;
                    return layer.getName();
                }
                return super.getText(element);
            }
        });
        List<ILayer> layers = getAOILayerStrategy().getAOILayers();
        comboViewer.setInput(layers);

        ILayer activeLayer = getAOILayerStrategy().getActiveLayer();
        setSelected(activeLayer);

        comboViewer.addSelectionChangedListener(comboListener);

        //        // list of current AOI features
        //        Label listLabel = new Label(page, SWT.LEFT);
        //        listLabel.setText("Current Features:");
        //        listLabel.pack();
        //        
        //        listViewer = new ListViewer(page, SWT.READ_ONLY);
        //        listViewer.setContentProvider(new ArrayContentProvider());
        //        listViewer.setLabelProvider(new LabelProvider(){
        //            @Override
        //            public String getText( Object element ) {
        //                if (element instanceof SimpleFeature) {
        //                    SimpleFeature feature = (SimpleFeature) element;
        //                    Collection<Property> properties = feature.getProperties();
        //                    String name = new String();
        //                    for (Property property : properties) {
        //                        String propertyName = property.getName().getLocalPart();
        //                        if(propertyName.toLowerCase().contains("name")) {
        //                            name = property.getValue().toString();
        //                            System.out.println(name);
        //                            continue;
        //                        }
        //                            
        //                    }
        //                    return name;
        //                }
        //                return super.getText(element);
        //            }
        //        });
        //        List<SimpleFeature> features = getAOILayerStrategy().getFeatures(); 
        //        listViewer.setInput(features);
    }

    /*
     * This will update the combo viewer (carefully unhooking events while the viewer is updated).
     * 
     * @param selected
     */
    private void setSelected(ILayer selected) {

        boolean disposed = comboViewer.getControl().isDisposed();
        if (comboViewer == null || disposed) {
            listenStrategy(false);
            return; // the view has shutdown!
        }

        ILayer current = getSelected();
        // check combo
        if (current != selected) {
            try {
                listenCombo(false);
                comboViewer.setSelection(new StructuredSelection(selected), true);
            } finally {
                listenCombo(true);
            }
        }

    }

    /*
     * Get the AOI Layer selected by the user
     * 
     * @return ILayer selected by the user
     */
    private ILayer getSelected() {
        if (comboViewer.getSelection() instanceof IStructuredSelection) {
            IStructuredSelection selection = (IStructuredSelection) comboViewer.getSelection();
            return (ILayer) selection.getFirstElement();
        }
        return null;
    }

    protected void listenCombo(boolean listen) {
        if (listen) {
            comboViewer.addSelectionChangedListener(comboListener);
        } else {
            comboViewer.removeSelectionChangedListener(comboListener);
        }
    }

    protected void listenStrategy(boolean listen) {
        AOILayerStrategy aOILayerStrategy = getAOILayerStrategy();
        if (listen) {
            aOILayerStrategy.addListener(layerWatcher);
        } else {
            aOILayerStrategy.removeListener(layerWatcher);
        }
    }

    @Override
    public Composite getControl() {
        return page;
    }

    @Override
    public void setFocus() {
        if (page != null && !page.isDisposed()) {
            page.setFocus();
        }
    }

    @Override
    public void dispose() {
        if (page != null) {
            // remove any listeners            
        }
        if (strategy != null) {
            // remove any listeners
            strategy = null;
        }
        super.dispose();
    }

}