eu.esdihumboldt.hale.ui.io.source.FileSource.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.io.source.FileSource.java

Source

/*
 * Copyright (c) 2012 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     HUMBOLDT EU Integrated Project #030962
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.ui.io.source;

import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;

import eu.esdihumboldt.hale.common.core.io.HaleIO;
import eu.esdihumboldt.hale.common.core.io.IOProvider;
import eu.esdihumboldt.hale.common.core.io.ImportProvider;
import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor;
import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier;
import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier;
import eu.esdihumboldt.hale.ui.io.ImportSource;
import eu.esdihumboldt.hale.ui.service.project.ProjectService;
import eu.esdihumboldt.util.io.IOUtils;

/**
 * File import source
 * 
 * @param <P> the supported {@link IOProvider} type
 * 
 * @author Simon Templer
 * @since 2.5
 */
public class FileSource<P extends ImportProvider> extends AbstractProviderSource<P> {

    /**
     * The file field editor for the source file
     */
    private FileSourceFileFieldEditor sourceFile;

    /**
     * The set of supported content types
     */
    private Set<IContentType> supportedTypes;

    private URI projectLocation;

    /**
     * @see ImportSource#createControls(Composite)
     */
    @Override
    public void createControls(Composite parent) {
        parent.setLayout(new GridLayout(4, false));

        ProjectService ps = (ProjectService) PlatformUI.getWorkbench().getService(ProjectService.class);
        projectLocation = ps.getLoadLocation() == null ? null : ps.getLoadLocation();
        boolean projectLocAvailable = projectLocation != null && "file".equals(projectLocation.getScheme());

        // source file
        sourceFile = new FileSourceFileFieldEditor("sourceFile", "Source file:",
                FileFieldEditor.VALIDATE_ON_KEY_STROKE, parent, projectLocation);
        sourceFile.setEmptyStringAllowed(false);
        sourceFile.setPage(getPage());

        // set content types for file field
        Collection<IOProviderDescriptor> factories = getConfiguration().getFactories();
        supportedTypes = new HashSet<IContentType>();
        for (IOProviderDescriptor factory : factories) {
            supportedTypes.addAll(factory.getSupportedTypes());
        }

        sourceFile.setContentTypes(supportedTypes);
        sourceFile.setPropertyChangeListener(new IPropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent event) {
                if (event.getProperty().equals(FieldEditor.IS_VALID)) {
                    updateState(true);
                } else if (event.getProperty().equals(FieldEditor.VALUE)) {
                    updateState(true);
                }
            }
        });

        // provider selection

        // label
        Label providerLabel = new Label(parent, SWT.NONE);
        providerLabel.setText("Import as");

        // create provider combo
        ComboViewer providers = createProviders(parent);
        providers.getControl().setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 3, 1));

        final Button relativeCheck = new Button(parent, SWT.CHECK);
        String text = "Use relative paths if possible.";
        relativeCheck.setText("Use relative paths if possible.");
        relativeCheck.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                sourceFile.setUseRelativeIfPossible(relativeCheck.getSelection());
            }
        });
        if (!projectLocAvailable) {
            relativeCheck.setEnabled(false);
            text += " Only available once the project is saved to a file.";
        }
        relativeCheck.setText(text);
        relativeCheck.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 4, 1));

        // initial state update
        updateState(true);
    }

    /**
     * @see AbstractProviderSource#updateContentType()
     */
    @Override
    protected void updateContentType() {
        IContentType contentType = null;

        if (sourceFile.isValid()) {
            // determine content type
            Collection<IContentType> filteredTypes = HaleIO.findContentTypesFor(supportedTypes, getSource(),
                    sourceFile.getStringValue());
            if (!filteredTypes.isEmpty()) {
                contentType = filteredTypes.iterator().next();
            }
        }

        getConfiguration().setContentType(contentType);
        if (contentType != null) {
            getPage().setMessage(contentType.getName(), DialogPage.INFORMATION);
        } else {
            getPage().setMessage(null);
        }

        super.updateContentType();
    }

    /**
     * @see AbstractProviderSource#isValidSource()
     */
    @Override
    protected boolean isValidSource() {
        return sourceFile.isValid();
    }

    /**
     * @see AbstractProviderSource#getSource()
     */
    @Override
    protected LocatableInputSupplier<? extends InputStream> getSource() {
        File file = new File(sourceFile.getStringValue());
        if (file.isAbsolute())
            return new FileIOSupplier(file);
        else {
            URI relativeURI = IOUtils.relativeFileToURI(file);
            File absoluteFile = new File(projectLocation.resolve(relativeURI));
            return new FileIOSupplier(absoluteFile, relativeURI);
        }
    }

    /**
     * @see AbstractSource#onActivate()
     */
    @Override
    public void onActivate() {
        sourceFile.setFocus();
    }

}