1 package com
.intellij
.lang
.xml
;
3 import com
.intellij
.formatting
.FormattingModel
;
4 import com
.intellij
.formatting
.FormattingModelBuilder
;
5 import com
.intellij
.ide
.highlighter
.XmlFileHighlighter
;
6 import com
.intellij
.ide
.structureView
.StructureViewBuilder
;
7 import com
.intellij
.ide
.structureView
.StructureViewModel
;
8 import com
.intellij
.ide
.structureView
.TreeBasedStructureViewBuilder
;
9 import com
.intellij
.ide
.structureView
.impl
.xml
.XmlStructureViewBuilderProvider
;
10 import com
.intellij
.ide
.structureView
.impl
.xml
.XmlStructureViewTreeModel
;
11 import com
.intellij
.lang
.*;
12 import com
.intellij
.lang
.annotation
.ExternalAnnotator
;
13 import com
.intellij
.lang
.documentation
.DocumentationProvider
;
14 import com
.intellij
.lang
.findUsages
.FindUsagesProvider
;
15 import com
.intellij
.lang
.folding
.FoldingBuilder
;
16 import com
.intellij
.lang
.surroundWith
.SurroundDescriptor
;
17 import com
.intellij
.openapi
.extensions
.Extensions
;
18 import com
.intellij
.openapi
.fileTypes
.SyntaxHighlighter
;
19 import com
.intellij
.openapi
.project
.Project
;
20 import com
.intellij
.openapi
.vfs
.VirtualFile
;
21 import com
.intellij
.psi
.*;
22 import com
.intellij
.psi
.codeStyle
.CodeStyleSettings
;
23 import com
.intellij
.psi
.formatter
.FormattingDocumentModelImpl
;
24 import com
.intellij
.psi
.formatter
.PsiBasedFormattingModel
;
25 import com
.intellij
.psi
.formatter
.xml
.XmlBlock
;
26 import com
.intellij
.psi
.formatter
.xml
.XmlPolicy
;
27 import com
.intellij
.psi
.impl
.source
.SourceTreeToPsiMap
;
28 import com
.intellij
.psi
.impl
.source
.tree
.TreeElement
;
29 import com
.intellij
.psi
.impl
.source
.tree
.TreeUtil
;
30 import com
.intellij
.psi
.impl
.source
.xml
.XmlPsiPolicy
;
31 import com
.intellij
.psi
.impl
.source
.xml
.behavior
.CDATAOnAnyEncodedPolicy
;
32 import com
.intellij
.psi
.impl
.source
.xml
.behavior
.EncodeEachSymbolPolicy
;
33 import com
.intellij
.psi
.tree
.TokenSet
;
34 import com
.intellij
.psi
.xml
.XmlElementType
;
35 import com
.intellij
.psi
.xml
.XmlFile
;
36 import com
.intellij
.psi
.xml
.XmlTokenType
;
37 import com
.intellij
.xml
.util
.documentation
.XmlDocumentationProvider
;
38 import org
.jetbrains
.annotations
.NonNls
;
39 import org
.jetbrains
.annotations
.NotNull
;
40 import org
.jetbrains
.annotations
.Nullable
;
43 * Created by IntelliJ IDEA.
47 * To change this template use File | Settings | File Templates.
49 public class XMLLanguage
extends CompositeLanguage
{
50 private FoldingBuilder myFoldingBuilder
;
51 protected static final CDATAOnAnyEncodedPolicy CDATA_ON_ANY_ENCODED_POLICY
= new CDATAOnAnyEncodedPolicy();
52 protected static final EncodeEachSymbolPolicy ENCODE_EACH_SYMBOL_POLICY
= new EncodeEachSymbolPolicy();
53 private final FormattingModelBuilder myFormattingModelBuilder
;
54 private XmlFindUsagesProvider myXmlFindUsagesProvider
;
56 public XMLLanguage() {
57 this("XML", "text/xml");
60 protected XMLLanguage(@NonNls String name
, @NonNls String
... mime
) {
62 myFormattingModelBuilder
= new FormattingModelBuilder() {
64 public FormattingModel
createModel(final PsiElement element
, final CodeStyleSettings settings
) {
65 final ASTNode root
= TreeUtil
.getFileElement((TreeElement
)SourceTreeToPsiMap
.psiElementToTree(element
));
66 final FormattingDocumentModelImpl documentModel
= FormattingDocumentModelImpl
.createOn(element
.getContainingFile());
67 return new PsiBasedFormattingModel(element
.getContainingFile(),
68 new XmlBlock(root
, null, null, new XmlPolicy(settings
, documentModel
), null, null),
75 public SyntaxHighlighter
getSyntaxHighlighter(Project project
, final VirtualFile virtualFile
) {
76 return new XmlFileHighlighter();
79 public XmlPsiPolicy
getPsiPolicy() {
80 return CDATA_ON_ANY_ENCODED_POLICY
;
83 public ParserDefinition
getParserDefinition() {
84 return new XMLParserDefinition();
88 public FindUsagesProvider
getFindUsagesProvider() {
89 if (myXmlFindUsagesProvider
== null) myXmlFindUsagesProvider
= new XmlFindUsagesProvider();
90 return myXmlFindUsagesProvider
;
94 public SurroundDescriptor
[] getSurroundDescriptors() {
95 return new SurroundDescriptor
[]{new XmlSurroundDescriptor()};
98 public Commenter
getCommenter() {
99 return new XmlCommenter();
103 public TokenSet
getReadableTextContainerElements() {
104 return TokenSet
.orSet(super.getReadableTextContainerElements(), TokenSet
.create(XmlElementType
.XML_CDATA
,
105 XmlTokenType
.XML_ATTRIBUTE_VALUE_TOKEN
,
106 XmlTokenType
.XML_DATA_CHARACTERS
));
109 public FoldingBuilder
getFoldingBuilder() {
110 if (myFoldingBuilder
== null) myFoldingBuilder
= new XmlFoldingBuilder();
111 return myFoldingBuilder
;
114 public FormattingModelBuilder
getFormattingModelBuilder() {
115 return myFormattingModelBuilder
;
119 public StructureViewBuilder
getStructureViewBuilder(final PsiFile psiFile
) {
120 if (psiFile
instanceof XmlFile
) {
121 StructureViewBuilder builder
= getStructureViewBuilderForExtensions(psiFile
);
122 if (builder
!= null) {
126 for (XmlStructureViewBuilderProvider xmlStructureViewBuilderProvider
: getStructureViewBuilderProviders()) {
127 final StructureViewBuilder structureViewBuilder
= xmlStructureViewBuilderProvider
.createStructureViewBuilder((XmlFile
)psiFile
);
128 if (structureViewBuilder
!= null) {
129 return structureViewBuilder
;
133 return new TreeBasedStructureViewBuilder() {
135 public StructureViewModel
createStructureViewModel() {
136 return new XmlStructureViewTreeModel((XmlFile
)psiFile
);
145 private static XmlStructureViewBuilderProvider
[] getStructureViewBuilderProviders() {
146 return (XmlStructureViewBuilderProvider
[])Extensions
.getExtensions(XmlStructureViewBuilderProvider
.EXTENSION_POINT_NAME
);
149 private StructureViewBuilder
getStructureViewBuilderForExtensions(final PsiFile psiFile
) {
150 for (Language language
: getLanguageExtensionsForFile(psiFile
)) {
151 final StructureViewBuilder builder
= language
.getStructureViewBuilder(psiFile
);
152 if (builder
!= null) {
160 public ExternalAnnotator
getExternalAnnotator() {
161 return new XMLExternalAnnotator();
164 public FileViewProvider
createViewProvider(final VirtualFile file
, final PsiManager manager
, final boolean physical
) {
165 if (SingleRootFileViewProvider
.isTooLarge(file
)) {
166 return new SingleRootFileViewProvider(manager
, file
, physical
);
169 return new XmlFileViewProvider(manager
, file
, physical
, this);
172 protected DocumentationProvider
createDocumentationProvider() {
173 return new XmlDocumentationProvider();