3.1 KiB
title |
---|
File View Providers |
A file view provider (see the FileViewProvider
class) was introduced in IntelliJ IDEA 6.0. Its main purpose is to manage access to multiple PSI trees within a single file.
For example, a JSPX page has a separate PSI tree for the Java code in it (PsiJavaFile
), a separate tree for the XML code (XmlFile
), and a separate tree for JSP as a whole JspFile
).
Each of the PSI trees covers the entire contents of the file, and contains special "outer language elements" in the places where contents in a different language can be found.
A FileViewProvider
instance corresponds to a single VirtualFile
, a single Document
, and can be used to retrieve multiple PsiFile
instances.
How do I get an FVP?
- From a VirtualFile:
PsiManager.getInstance(project).findViewProvider()
- From a PSI file:
psiFile.getViewProvider()
What can I do with an FVP?
- To get the set of all languages for which PSI trees exist in a file:
fileViewProvider.getLanguages()
- To get the PSI tree for a particular language:
fileViewProvider.getPsi(language)
, where thelanguage
parameter can take values of theLanguage
type defined in StdLanguages class. For example, to get the PSI tree for XML, usefileViewProvider.getPsi(StdLanguages.XML)
. - To find an element of a particular language at the specified offset in the file:
fileViewProvider.findElementAt(offset, language)
How do I extend the FileViewProvider?
To create a file type that has multiple interspersing trees for different languages, your plugin must contain an extension to the fileType.fileViewProviderFactory
extension point available in the IntelliJ Platform core.
This extension point is declared using the FileTypeExtensionPoint
bean class.
To access this extension point, create a Java class that implements the FileViewProviderFactory
interface, and in this class, override the createFileViewProvider
method.
To declare the extension to the fileType.fileViewProviderFactory
extension point, add the following syntax to the <extensions>
section of the plugin.xml
file:
<extensions>
<fileType.fileViewProviderFactory filetype="%file_type%" implementationClass="%class_name%" />
</extensions>
Where %file_type%
refers to the type of the file being created (for example, "JFS"), and the %class_name%
refers to the name of your Java class that implements the FileViewProviderFactory
interface.