从Eclipse中的externaly创建的文件中获取IStorage

时间:2016-12-12 14:51:10

标签: java eclipse eclipse-plugin eclipse-rcp

我目前正在Eclipse Neon中开发一个编辑器插件。除了使用编辑器打开文件之外,一切都很完美,这些文件不是在当前Eclipse项目中创建的,而是手动在工作区外的文件夹中创建的(例如Documents)。

在我的实现中,我需要我要打开的每个文件的IStorage。我目前的代码如下:

public static IStorage getStorage(IEditorInput editorInput) {
    if (editorInput instanceof IStorageEditorInput) {
      try {
        return ((IStorageEditorInput) editorInput).getStorage();
      }
      catch (CoreException e) {
        throw new RuntimeException(e);
      }
    }
    else if (editorInput instanceof FileStoreEditorInput) {
      try {
        IURIEditorInput uriInput = (IURIEditorInput)editorInput;
        URI uri = uriInput.getURI();
        File file = new File(uri);
        return ((IStorageEditorInput) editorInput).getStorage(); // How to get the IStorage
      }
      catch (CoreException e) {
        throw new RuntimeException(e);
      }
    }
    else {
      throw new IllegalArgumentException("Unknown IEditorInput implementation");
    }
  }

重要的情况是editorInputFileStoreEditorInput的实例,在第二个if中处理。目前,我从中获取了一个文件,但我不知道如何从文件或IStorage本身获取FileStoreEditorInput

1 个答案:

答案 0 :(得分:2)

我不知道有办法为IStorage获得FileStoreEditorInput。除了您可以尝试查看editorInput.getAdapter( IStorage.class )是否返回有用的内容。

但是,您可以自己实现IStorage界面。例如:

class FileStorage implements IStorage {
  private final FileStoreEditorInput editorInput;

  FileStorage( FileStoreEditorInput editorInput ) {
    this.editorInput = editorInput;
  }

  @Override
  public <T> T getAdapter( Class<T> adapter ) {
    return Platform.getAdapterManager().getAdapter( this, adapter );
  }

  @Override
  public boolean isReadOnly() {
    return false;
  }

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

  @Override
  public IPath getFullPath() {
    return new Path( URIUtil.toFile( editorInput.getURI() ).getAbsolutePath() );
  }

  @Override
  public InputStream getContents() {
    try {
      return editorInput.getURI().toURL().openStream();
    } catch( IOException e ) {
      throw new UncheckedIOException( e );
    }
  }
}