org.geowe.client.local.ui.FeatureGrid.java Source code

Java tutorial

Introduction

Here is the source code for org.geowe.client.local.ui.FeatureGrid.java

Source

/*
 * #%L
 * GeoWE Project
 * %%
 * Copyright (C) 2015 - 2016 GeoWE.org
 * %%
 * This file is part of GeoWE.org.
 * 
 * GeoWE 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.
 * 
 * GeoWE 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 GeoWE.  If not, see <http://www.gnu.org/licenses/>.
 * #L%
 */
package org.geowe.client.local.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.gwtopenmaps.openlayers.client.feature.VectorFeature;

import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.sencha.gxt.core.client.ValueProvider;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.ModelKeyProvider;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
import com.sencha.gxt.widget.core.client.grid.ColumnModel;
import com.sencha.gxt.widget.core.client.grid.Grid;

/**
 * Componente grfico que representa una tabla con todos los datos
 * alfanumricos (atributos) de un conjunto de VectorFeature 
 * 
 * @author Atanasio Muoz
 *
 */
public class FeatureGrid extends Grid<VectorFeature> {
    public static final int DEFAULT_WIDTH = 430;
    public static final int DEFAULT_HEIGHT = 200;

    private boolean enableCellRender;

    public FeatureGrid(int width, int height) {
        super(new ListStore<VectorFeature>(new ModelKeyProvider<VectorFeature>() {
            @Override
            public String getKey(VectorFeature item) {
                return item.getFeatureId();
            }
        }),

                new ColumnModel<VectorFeature>(new ArrayList<ColumnConfig<VectorFeature, ?>>()));

        this.setBorders(true);
        this.setAllowTextSelection(true);
        this.getView().setStripeRows(true);
        this.getView().setColumnLines(true);
        this.setColumnReordering(true);
        this.setLoadMask(true);

        this.setWidth(width);
        this.setHeight(height);

        this.setEnableCellRender(false);
    }

    public FeatureGrid() {
        this(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    public boolean isEnableCellRender() {
        return enableCellRender;
    }

    public void setEnableCellRender(boolean enableCellRender) {
        this.enableCellRender = enableCellRender;
    }

    /**
     * Reconstruye la tabla completa en base a los atributos de las
     * features que se reciben como parmetro.
     * @param features
     */
    public void rebuild(List<VectorFeature> features) {
        update(features);
        this.reconfigure(this.getStore(), createColumnList(features));
    }

    /**
     * Reconstruye la tabla completa en base a los atributos de las
     * features que se reciben como parmetro.
     * @param vectorFeatures
     */
    public void rebuild(VectorFeature[] vectorFeatures) {
        rebuild(Arrays.asList(vectorFeatures));
    }

    /**
     * Actualiza los datos de la tabla con los datos de los atributos
     * de las features que se pasan como parmetro. El esquema de las
     * features debe coincidir con las columnas de la tabla
     * @param features
     */
    public void update(List<VectorFeature> features) {
        this.getStore().clear();
        this.getStore().addAll(features);
    }

    /**
     * Actualiza los datos de la tabla con los datos de los atributos
     * de las features que se pasan como parmetro. El esquema de las
     * features debe coincidir con las columnas de la tabla
     * @param vectorFeatures
     */
    public void update(VectorFeature[] vectorFeatures) {
        update(Arrays.asList(vectorFeatures));
    }

    /**
     * Limpia todos los datos de la tabla manteniendo la definicin
     * de las columnas
     */
    public void clear() {
        this.getStore().clear();
    }

    protected ColumnModel<VectorFeature> createColumnList(List<VectorFeature> features) {
        List<ColumnConfig<VectorFeature, ?>> columns = new ArrayList<ColumnConfig<VectorFeature, ?>>();

        if (features != null && features.size() > 0) {
            VectorFeature feature = features.get(0);

            if (feature.getAttributes() != null) {
                for (String attributeName : feature.getAttributes().getAttributeNames()) {
                    AttributeValueProvider attributeProvider = new AttributeValueProvider(attributeName);

                    ColumnConfig<VectorFeature, String> attributeColumn = new ColumnConfig<VectorFeature, String>(
                            attributeProvider, 100, attributeName);
                    attributeColumn.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
                    if (isEnableCellRender()) {
                        attributeColumn.setCell(new FeatureGridCellRenderer());
                    }

                    columns.add(attributeColumn);
                }
            }
        }

        return new ColumnModel<VectorFeature>(columns);
    }

    private class AttributeValueProvider implements ValueProvider<VectorFeature, String> {

        public String attributeName;

        public AttributeValueProvider(String attributeName) {
            this.attributeName = attributeName;
        }

        @Override
        public String getValue(VectorFeature feature) {
            if (feature.getAttributes().getAttributeAsString(attributeName) == null) {
                return "";
            } else {
                return "" + feature.getAttributes().getAttributeAsString(attributeName);
            }
        }

        @Override
        public void setValue(VectorFeature feature, String value) {
            feature.getAttributes().setAttribute(attributeName, value);
        }

        @Override
        public String getPath() {
            return attributeName;
        }
    }
}