eu.esdihumboldt.hale.ui.io.util.SaveFileFieldEditor.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.io.util.SaveFileFieldEditor.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.util;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;

/**
 * File field editor that opens a save instead of an open dialog
 * 
 * @since 2.2
 */
public class SaveFileFieldEditor extends ExtendedFileFieldEditor {

    private static final int SAVE_STYLE = SWT.SAVE | SWT.SHEET;

    /**
     * Indicates whether specifying an URI is allowed
     */
    private boolean allowUri = false;

    /**
     * Indicates whether the path must be absolute; <code>false</code> by
     * default.
     */
    private boolean enforceAbsolute = false;

    /**
     * Default constructor
     */
    protected SaveFileFieldEditor() {
        super(SAVE_STYLE);

        init();
    }

    private void init() {
        // change the editor error message
        setErrorMessage("Value must be a valid file name to save to");
    }

    /**
     * @see FileFieldEditor#FileFieldEditor(String, String, boolean, Composite)
     */
    public SaveFileFieldEditor(String name, String labelText, boolean enforceAbsolute, Composite parent) {
        super(name, labelText, enforceAbsolute, parent, SAVE_STYLE);

        this.enforceAbsolute = enforceAbsolute;

        init();
    }

    /**
     * @see FileFieldEditor#FileFieldEditor(String, String, boolean, int,
     *      Composite)
     */
    public SaveFileFieldEditor(String name, String labelText, boolean enforceAbsolute, int validationStrategy,
            Composite parent) {
        super(name, labelText, enforceAbsolute, validationStrategy, parent, SAVE_STYLE);

        this.enforceAbsolute = enforceAbsolute;

        init();
    }

    /**
     * @see FileFieldEditor#FileFieldEditor(String, String, Composite)
     */
    public SaveFileFieldEditor(String name, String labelText, Composite parent) {
        super(name, labelText, parent, SAVE_STYLE);

        init();
    }

    /**
     * @see FileFieldEditor#checkState()
     */
    @Override
    protected boolean checkState() {
        String msg = null;

        String path = getTextControl().getText();
        if (path != null) {
            path = path.trim();
        } else {
            path = "";//$NON-NLS-1$
        }
        if (path.length() == 0) {
            if (!isEmptyStringAllowed()) {
                msg = getErrorMessage();
            }
        } else {
            File file = null;
            if (allowUri) {
                // check if string is an uri
                try {
                    URI uri = new URI(path);

                    // check if the URI references a file
                    try {
                        file = new File(uri);
                        // is a file, just continue with normal validity check
                    } catch (IllegalArgumentException e) {
                        // no file
                        return isValid(uri);
                    }
                } catch (URISyntaxException e) {
                    // ignore - no URI, try file
                }
            }

            if (file == null) {
                file = new File(path);
            }

            if (isValid(file)) {
                if (enforceAbsolute && !file.isAbsolute()) {
                    msg = JFaceResources.getString("FileFieldEditor.errorMessage2");//$NON-NLS-1$
                }
            } else {
                msg = getErrorMessage();
            }
        }

        if (msg != null) { // error
            showErrorMessage(msg);
            return false;
        }

        // OK!
        clearErrorMessage();
        return true;
    }

    /**
     * Checks if the given file is valid, may be overridden
     * 
     * @param file the file
     * @return if the file is valid
     */
    protected boolean isValid(File file) {
        if (file.isAbsolute()) {
            if (file.isDirectory()) {
                // file is a directory
                return false;
            }

            // some parent must be a directory
            File parent = file.getParentFile();
            while (parent != null) {
                if (parent.isDirectory()) {
                    return true;
                }

                parent = parent.getParentFile();
            }

            return false;
        } else {
            // no validation for files that are not absolute
            return true;
        }
    }

    /**
     * Checks if the given URI is valid, may be overridden
     * 
     * @param uri the URI
     * @return if the URI is valid
     */
    protected boolean isValid(URI uri) {
        // accept all well-formed URIs
        return true;
    }

    /**
     * @return the allowUri
     */
    public boolean isAllowUri() {
        return allowUri;
    }

    /**
     * @param allowUri the allowUri to set
     */
    public void setAllowUri(boolean allowUri) {
        this.allowUri = allowUri;
    }

}