Search code examples
pde

Eclipse PDE: Get full path of an external file open in Workbench


I am writing an Eclipse Plugin which requires me to get full path of any kind of file open in the Workspace.

I am able to get full path of any file which is part of any Eclipse project. Code to get open/active editor file from workspace.

public static String getActiveFilename(IWorkbenchWindow window) {
        IWorkbenchPage activePage = window.getActivePage();
        IEditorInput input = activePage.getActiveEditor().getEditorInput();
        String name = activePage.getActiveEditor().getEditorInput().getName();
        PluginUtils.log(activePage.getActiveEditor().getClass() +" Editor.");
        IPath path = input instanceof FileEditorInput ? ((FileEditorInput) input).getPath() : null;
        if (path != null) {
            return path.toPortableString();
        }
        return name;
    }

However, if any file is drag-dropped in Workspace or opened using File -> Open File. For instance, I opened a file from /Users/mac/log.txt from File -> Open File. My plugin is not able to find location of this file.


Solution

  • After couple of days search, I found the answer by looking at the source code of Eclipse IDE.

    In IDE.class, Eclipse tries to find a suitable editor input depending on the workspace file or an external file. Eclipse handles files in workspace using FileEditorInput and external files using FileStoreEditorInput. Code snippet below:

    /**
         * Create the Editor Input appropriate for the given <code>IFileStore</code>.
         * The result is a normal file editor input if the file exists in the
         * workspace and, if not, we create a wrapper capable of managing an
         * 'external' file using its <code>IFileStore</code>.
         *
         * @param fileStore
         *            The file store to provide the editor input for
         * @return The editor input associated with the given file store
         * @since 3.3
         */
        private static IEditorInput getEditorInput(IFileStore fileStore) {
            IFile workspaceFile = getWorkspaceFile(fileStore);
            if (workspaceFile != null)
                return new FileEditorInput(workspaceFile);
            return new FileStoreEditorInput(fileStore);
        }
    

    I have modified the code posted in the question to handle both files in Workspace and external file.

    public static String getActiveEditorFilepath(IWorkbenchWindow window) {
            IWorkbenchPage activePage = window.getActivePage();
            IEditorInput input = activePage.getActiveEditor().getEditorInput();
    
    
            String name = activePage.getActiveEditor().getEditorInput().getName();
            //Path of files in the workspace.
            IPath path = input instanceof FileEditorInput ? ((FileEditorInput) input).getPath() : null;
            if (path != null) {
                return path.toPortableString();
            }
    
            //Path of the externally opened files in Editor context.
            try {
                URI urlPath = input instanceof FileStoreEditorInput ? ((FileStoreEditorInput) input).getURI() : null;
                if (urlPath != null) {
                    return new File(urlPath.toURL().getPath()).getAbsolutePath();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
    
            //Fallback option to get at least name
            return name;
        }