es.axios.udig.spatialoperations.internal.ui.dialogs.CreateNewLayerDialog.java Source code

Java tutorial

Introduction

Here is the source code for es.axios.udig.spatialoperations.internal.ui.dialogs.CreateNewLayerDialog.java

Source

/* uDig-Spatial Operations plugins
 * http://b5m.gipuzkoa.net
 * (C) 2006, Diputacin Foral de Gipuzkoa, Ordenacin Territorial.
 *
 * 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 es.axios.udig.spatialoperations.internal.ui.dialogs;

import net.refractions.udig.ui.FeatureTypeEditor;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.GeometryDescriptor;

import es.axios.udig.spatialoperations.internal.i18n.Messages;
import es.axios.udig.ui.commons.util.GeoToolsUtils;

/**
 * This dialog is used to create new layers.
 * <p>
 *
 * </p>
 * @author Mauricio Pazos (www.axios.es)
 * @author Gabriel Roldan (www.axios.es)
 * @since 1.1.0
 */
public class CreateNewLayerDialog extends TitleAreaDialog {

    private SimpleFeatureTypeBuilder defaultBuilder = null;
    private Button okButton = null;
    private Button cancelButton = null;
    private FeatureTypeBuilderValidator validateFeatureType = null;
    private SimpleFeatureType newFeatureType = null;

    public CreateNewLayerDialog(Shell parentShell) {
        super(parentShell);
    }

    @Override
    protected Control createContents(Composite parent) {
        Control ctrl = super.createContents(parent);

        setTitle(Messages.CreateNewLayerDialog_title);

        setMessage(Messages.CreateNewLayerDialog_specific_attributes, IMessageProvider.INFORMATION);

        return ctrl;
    }

    @Override
    protected Control createDialogArea(Composite parent) {

        final Composite compositeDialog = (Composite) super.createDialogArea(parent);

        FeatureTypeEditor editor = new FeatureTypeEditor();
        this.defaultBuilder = GeoToolsUtils.createDefaultFeatureType();

        FeatureTypeBuilderValidator validator = new FeatureTypeBuilderValidator() {
            public boolean validate(SimpleFeatureTypeBuilder builder) {

                final String name = builder.getName();
                if (name == null || "".equals(name)) { //$NON-NLS-1$
                    setMessage(Messages.CreateNewLayerDialog_must_set_the_feature_name);
                    return false;
                }
                SimpleFeatureType type = null;
                try {
                    type = builder.buildFeatureType();
                } catch (IllegalArgumentException e) {
                    final String msg = Messages.CreateNewLayerDialog_failed_creatin_the_feature_type;
                    setMessage(msg);
                    throw (RuntimeException) new RuntimeException(msg).initCause(e);
                }
                assert type != null;

                GeometryDescriptor geoAttr = type.getDefaultGeometry(); // builder.getDefaultGeometry();
                if (geoAttr == null || "".equals(geoAttr.getName())) { //$NON-NLS-1$

                    setMessage(Messages.CreateNewLayerDialog_must_set_the_geometry);
                    return false;
                }

                //TODO validar consistencia enter sources layer y el nuevo (podrian filtrarse para que solo pueda seleccionar un tipo de geometria vlida con LayerFilter )
                return true;
            }
        };
        this.validateFeatureType = validator;

        new CreateLayerComposite(compositeDialog, SWT.NONE, editor, this.defaultBuilder);

        return compositeDialog;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        this.okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        this.cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

    }

    @Override
    protected void buttonPressed(int buttonId) {

        assert this.defaultBuilder != null;

        this.newFeatureType = null;

        if (IDialogConstants.OK_ID == buttonId) {

            //validates input
            if (!this.validateFeatureType.validate(this.defaultBuilder)) {
                return;
            }
            // the feature type is ok then sets this value in dialog state
            try {
                this.newFeatureType = this.defaultBuilder.buildFeatureType();

            } catch (IllegalArgumentException e) {
                final String msg = Messages.CreateNewLayerDialog_failed_getting_new_feature_type;
                throw (RuntimeException) new RuntimeException(msg).initCause(e);
            }
        }

        setReturnCode(buttonId);
        close();
    }

    @Override
    public int open() {

        int code = super.open();

        //        this.okButton.setEnabled(false);
        //        this.cancelButton.setEnabled(true);

        return code;
    }

    /**
     * @return a new SimpleFeature Type
     */
    public SimpleFeatureType getNewLayer() {

        assert this.getReturnCode() == IDialogConstants.OK_ID;
        assert this.newFeatureType != null;

        return this.newFeatureType;
    }

}