org.eclipse.ui.part.FileEditorInput.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.part.FileEditorInput.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Andrey Loskutov <loskutov@gmx.de> - generified interface, bug 461762
 *******************************************************************************/
package org.eclipse.ui.part;

import java.net.URI;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.model.IWorkbenchAdapter;

/**
 * Adapter for making a file resource a suitable input for an editor.
 * <p>
 * This class may be instantiated; it is not intended to be subclassed.
 * </p>
 * @noextend This class is not intended to be subclassed by clients.
 */
public class FileEditorInput extends PlatformObject
        implements IFileEditorInput, IPathEditorInput, IURIEditorInput, IPersistableElement {
    private IFile file;

    /**
     * Return whether or not file is local. Only {@link IFile}s with a local
     * value should call {@link IPathEditorInput#getPath()}
     * @param file
     * @return boolean <code>true</code> if the file has a local implementation.
     * @since 3.4
     */
    public static boolean isLocalFile(IFile file) {

        IPath location = file.getLocation();
        if (location != null)
            return true;
        //this is not a local file, so try to obtain a local file
        try {
            final URI locationURI = file.getLocationURI();
            if (locationURI == null)
                return false;
            IFileStore store = EFS.getStore(locationURI);
            //first try to obtain a local file directly fo1r this store
            java.io.File localFile = store.toLocalFile(EFS.NONE, null);
            //if no local file is available, obtain a cached file
            if (localFile == null)
                localFile = store.toLocalFile(EFS.CACHE, null);
            if (localFile == null)
                return false;
            return true;
        } catch (CoreException e) {
            //this can only happen if the file system is not available for this scheme
            IDEWorkbenchPlugin.log("Failed to obtain file store for resource", e); //$NON-NLS-1$
            return false;
        }

    }

    /**
     * Creates an editor input based of the given file resource.
     *
     * @param file the file resource
     */
    public FileEditorInput(IFile file) {
        if (file == null)
            throw new IllegalArgumentException();
        this.file = file;

    }

    @Override
    public int hashCode() {
        return file.hashCode();
    }

    /*
     * The <code>FileEditorInput</code> implementation of this
     * <code>Object</code> method bases the equality of two
     * <code>FileEditorInput</code> objects on the equality of their underlying
     * <code>IFile</code> resources.
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof IFileEditorInput)) {
            return false;
        }
        IFileEditorInput other = (IFileEditorInput) obj;
        return file.equals(other.getFile());
    }

    @Override
    public boolean exists() {
        return file.exists();
    }

    @Override
    public String getFactoryId() {
        return FileEditorInputFactory.getFactoryId();
    }

    @Override
    public IFile getFile() {
        return file;
    }

    @Override
    public ImageDescriptor getImageDescriptor() {
        IContentType contentType = IDE.getContentType(file);
        return PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(file.getName(), contentType);
    }

    @Override
    public String getName() {
        return file.getName();
    }

    @Override
    public IPersistableElement getPersistable() {
        return this;
    }

    @Override
    public IStorage getStorage() {
        return file;
    }

    @Override
    public String getToolTipText() {
        return file.getFullPath().makeRelative().toString();
    }

    @Override
    public void saveState(IMemento memento) {
        FileEditorInputFactory.saveState(memento, this);
    }

    @Override
    public URI getURI() {
        return file.getLocationURI();
    }

    @Override
    public IPath getPath() {
        IPath location = file.getLocation();
        if (location != null)
            return location;
        //this is not a local file, so try to obtain a local file
        try {
            final URI locationURI = file.getLocationURI();
            if (locationURI == null)
                throw new IllegalArgumentException();
            IFileStore store = EFS.getStore(locationURI);
            //first try to obtain a local file directly fo1r this store
            java.io.File localFile = store.toLocalFile(EFS.NONE, null);
            //if no local file is available, obtain a cached file
            if (localFile == null)
                localFile = store.toLocalFile(EFS.CACHE, null);
            if (localFile == null)
                throw new IllegalArgumentException();
            return Path.fromOSString(localFile.getAbsolutePath());
        } catch (CoreException e) {
            //this can only happen if the file system is not available for this scheme
            IDEWorkbenchPlugin.log("Failed to obtain file store for resource", e); //$NON-NLS-1$
            throw new RuntimeException(e);
        }
    }

    @Override
    public String toString() {
        return getClass().getName() + "(" + getFile().getFullPath() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
    }

    /*
     * Allows for the return of an {@link IWorkbenchAdapter} adapter.
     *
     * @since 3.5
     *
     * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
     */
    @Override
    public <T> T getAdapter(Class<T> adapterType) {
        if (IWorkbenchAdapter.class.equals(adapterType)) {
            return adapterType.cast(new IWorkbenchAdapter() {

                @Override
                public Object[] getChildren(Object o) {
                    return new Object[0];
                }

                @Override
                public ImageDescriptor getImageDescriptor(Object object) {
                    return FileEditorInput.this.getImageDescriptor();
                }

                @Override
                public String getLabel(Object o) {
                    return FileEditorInput.this.getName();
                }

                @Override
                public Object getParent(Object o) {
                    return FileEditorInput.this.getFile().getParent();
                }
            });
        }

        return super.getAdapter(adapterType);
    }
}