spring structure view
[fedora-idea.git] / xml / impl / src / com / intellij / lang / xml / XMLLanguage.java
blob061e7183638dea2d4fcd1eed729ebabaf69745e1
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;
42 /**
43 * Created by IntelliJ IDEA.
44 * User: max
45 * Date: Jan 24, 2005
46 * Time: 10:59:22 AM
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) {
61 super(name, mime);
62 myFormattingModelBuilder = new FormattingModelBuilder() {
63 @NotNull
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),
69 documentModel);
74 @NotNull
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();
87 @NotNull
88 public FindUsagesProvider getFindUsagesProvider() {
89 if (myXmlFindUsagesProvider == null) myXmlFindUsagesProvider = new XmlFindUsagesProvider();
90 return myXmlFindUsagesProvider;
93 @NotNull
94 public SurroundDescriptor[] getSurroundDescriptors() {
95 return new SurroundDescriptor[]{new XmlSurroundDescriptor()};
98 public Commenter getCommenter() {
99 return new XmlCommenter();
102 @NotNull
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;
118 @Nullable
119 public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) {
120 if (psiFile instanceof XmlFile) {
121 StructureViewBuilder builder = getStructureViewBuilderForExtensions(psiFile);
122 if (builder != null) {
123 return builder;
126 for (XmlStructureViewBuilderProvider xmlStructureViewBuilderProvider : getStructureViewBuilderProviders()) {
127 final StructureViewBuilder structureViewBuilder = xmlStructureViewBuilderProvider.createStructureViewBuilder((XmlFile)psiFile);
128 if (structureViewBuilder != null) {
129 return structureViewBuilder;
133 return new TreeBasedStructureViewBuilder() {
134 @NotNull
135 public StructureViewModel createStructureViewModel() {
136 return new XmlStructureViewTreeModel((XmlFile)psiFile);
140 else {
141 return null;
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) {
153 return builder;
156 return null;
159 @Nullable
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();