ummisco.gama.ui.viewers.gis.geotools.control.MaplayerTableViewer.java Source code

Java tutorial

Introduction

Here is the source code for ummisco.gama.ui.viewers.gis.geotools.control.MaplayerTableViewer.java

Source

/*********************************************************************************************
 *
 * 'MaplayerTableViewer.java, in plugin ummisco.gama.ui.viewers, is part of the source code of the
 * GAMA modeling and simulation platform.
 * (c) 2007-2016 UMI 209 UMMISCO IRD/UPMC & Partners
 *
 * Visit https://github.com/gama-platform/gama for license information and developers contact.
 * 
 *
 **********************************************************************************************/

package ummisco.gama.ui.viewers.gis.geotools.control;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.geotools.data.FeatureSource;
import org.geotools.map.Layer;
import org.geotools.map.MapLayer;
import org.geotools.map.StyleLayer;
import org.geotools.styling.Style;

import ummisco.gama.ui.resources.GamaIcons;
import ummisco.gama.ui.resources.IGamaIcons;
import ummisco.gama.ui.viewers.gis.geotools.SwtMapPane;
import ummisco.gama.ui.viewers.gis.geotools.styling.SimpleStyleConfigurator;
import ummisco.gama.ui.viewers.gis.geotools.utils.Utils;

/**
 * A {@link TableViewer table viewer} for {@link Layer map layers}.
 *
 * @author Andrea Antonello (www.hydrologis.com)
 *
 *
 *
 * @source $URL$
 */
public class MaplayerTableViewer extends TableViewer implements ISelectionChangedListener {
    private final List<Layer> layersList = new ArrayList<Layer>();
    private Layer selectedMapLayer;

    private final String[] titles = { "Layer name", "Visible", "Style" };
    private SwtMapPane pane;

    /**
     * Constructor.
     * 
     * <p>
     * <b>Note</b> that after the object is built and before actually using it,
     * the {@link SwtMapPane map pane} has to be set through the
     * {@link #setPane(SwtMapPane)} method.
     * </p>
     * 
     * @param parent
     *            the parent {@link Composite}.
     * @param style
     *            the style for the {@link Composite}.
     */
    public MaplayerTableViewer(final Composite parent, final int style) {
        super(parent, style);

        this.setContentProvider(new ArrayContentProvider());
        this.addSelectionChangedListener(this);

        createColumns(parent, this);
        final Table table = this.getTable();
        table.setHeaderVisible(true);
        // table.setLinesVisible(true);

        this.setInput(layersList);
    }

    /**
     * Setter for the {@link SwtMapPane map pane}.
     * 
     * @param pane
     *            the map pane to use.
     */
    public void setPane(final SwtMapPane pane) {
        this.pane = pane;
    }

    /**
     * Getter for the loaded {@link MapLayer}s list.
     * 
     * @return the list of map layers.
     */
    public List<Layer> getLayersList() {
        return layersList;
    }

    /**
     * Getter for the selected {@link Layer}.
     * 
     * @return the selected layer or <code>null</code>.
     */
    public Layer getSelectedMapLayer() {
        return selectedMapLayer;
    }

    private void createColumns(final Composite parent, final TableViewer viewer) {

        final int[] bounds = { 120, 50, 50 };

        TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(final Object element) {
                if (element instanceof Layer) {
                    final Layer p = (Layer) element;
                    if (Utils.isGridLayer(p)) {
                        return GamaIcons.create(IGamaIcons.GRID).image();
                    }
                    return GamaIcons.create(IGamaIcons.FEATURE).image();
                }
                return null;
            }

            @Override
            public String getText(final Object element) {
                if (element instanceof Layer) {
                    final Layer p = (Layer) element;
                    String title = p.getTitle();
                    if (title == null || title.length() == 0) {
                        @SuppressWarnings("rawtypes")
                        final FeatureSource featureSource = p.getFeatureSource();
                        if (featureSource != null) {
                            title = featureSource.getName().getLocalPart().toString();
                        }
                    }
                    return title;
                }
                return null;
            }
        });

        col = createTableViewerColumn(titles[1], bounds[1], 1);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(final Object element) {
                if (element instanceof Layer) {
                    final Layer p = (Layer) element;
                    if (p.isVisible()) {
                        return GamaIcons.create(IGamaIcons.CHECKED).image();
                    }
                    return GamaIcons.create(IGamaIcons.UNCHECKED).image();
                }
                return null;
            }

            @Override
            public String getText(final Object element) {
                return null;
            }
        });

        col = createTableViewerColumn(titles[2], bounds[2], 2);
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(final Object element) {
                return GamaIcons.create(IGamaIcons.STYLE).image();
            }

            @Override
            public String getText(final Object element) {
                return null;
            }
        });

    }

    private TableViewerColumn createTableViewerColumn(final String title, final int bound, final int colNumber) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(this, SWT.NONE);
        final TableColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setWidth(bound);
        column.setResizable(true);
        column.setMoveable(true);
        return viewerColumn;
    }

    @Override
    public void selectionChanged(final SelectionChangedEvent arg0) {
        if (arg0 == null) {
            selectedMapLayer = null;
            return;
        }
        final IStructuredSelection selection = (IStructuredSelection) arg0.getSelection();
        final Object firstElement = selection.getFirstElement();
        if (firstElement instanceof Layer) {
            selectedMapLayer = (Layer) firstElement;
        }
    }

    @Override
    protected void triggerEditorActivationEvent(final ColumnViewerEditorActivationEvent event) {
        super.triggerEditorActivationEvent(event);
        final ViewerCell source = (ViewerCell) event.getSource();
        final int columnIndex = source.getColumnIndex();
        if (columnIndex == 1) {
            final Layer element = (Layer) source.getElement();
            element.setVisible(!element.isVisible());
            refresh();
            pane.redraw();
        } else if (columnIndex == 2) {
            final Layer element = (Layer) source.getElement();
            try {
                doSetStyle(element);
            } catch (final IOException e) {
                e.printStackTrace();
            }
            pane.redraw();
        }
    }

    /**
     * Show a style dialog to create a new Style for the layer
     *
     * @param layer
     *            the layer to be styled
     * @throws IOException
     */
    private void doSetStyle(final Layer layer) throws IOException {
        if (layer instanceof StyleLayer) {
            final StyleLayer styleLayer = (StyleLayer) layer;
            final Style style = SimpleStyleConfigurator.showDialog(this.getTable().getShell(), layer);
            if (style != null) {
                styleLayer.setStyle(style);
            }
        }
    }

    /**
     * Adds a {@link Layer} to the viewer and updates.
     * 
     * @param layer
     *            the layer to add.
     */
    public void addLayer(final Layer layer) {
        layersList.add(0, layer);
        refresh();
    }

    /**
     * Removes a {@link Layer} from the viewer and updates.
     * 
     * @param layer
     *            the layer to remove.
     */
    public void removeLayer(final Layer layer) {
        layersList.remove(layer);
        refresh();
    }

    /**
     * Clears all the layers from the viewer.
     */
    public void clear() {
        layersList.clear();
        refresh();
    }

}