update copyright
[fedora-idea.git] / java / idea-ui / src / com / intellij / facet / impl / autodetecting / FacetDetectorRegistryEx.java
blob6c1e017f2d9338da837328cf4e1b933cac933175
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.intellij.facet.impl.autodetecting;
19 import com.intellij.facet.FacetConfiguration;
20 import com.intellij.facet.FacetType;
21 import com.intellij.facet.Facet;
22 import com.intellij.facet.FacetModel;
23 import com.intellij.facet.autodetecting.FacetDetector;
24 import com.intellij.facet.autodetecting.FacetDetectorRegistry;
25 import com.intellij.facet.autodetecting.DetectedFacetPresentation;
26 import com.intellij.facet.autodetecting.UnderlyingFacetSelector;
27 import com.intellij.openapi.fileTypes.FileType;
28 import com.intellij.openapi.fileTypes.StdFileTypes;
29 import com.intellij.openapi.util.Condition;
30 import com.intellij.openapi.vfs.VirtualFile;
31 import com.intellij.openapi.vfs.VirtualFileFilter;
32 import com.intellij.openapi.roots.ModifiableRootModel;
33 import com.intellij.patterns.VirtualFilePattern;
34 import com.intellij.patterns.PlatformPatterns;
35 import com.intellij.patterns.*;
36 import com.intellij.psi.PsiFile;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
39 import org.jetbrains.annotations.NonNls;
41 import java.util.Collection;
43 /**
44 * @author nik
46 public class FacetDetectorRegistryEx<C extends FacetConfiguration> implements FacetDetectorRegistry<C> {
47 private final @Nullable FacetDetectorForWizardRegistry<C> myForWizardDelegate;
48 private final @Nullable FacetOnTheFlyDetectorRegistry<C> myOnTheFlyDelegate;
49 private DetectedFacetPresentation myPresentation;
51 public FacetDetectorRegistryEx(final @Nullable FacetDetectorForWizardRegistry<C> forWizardDelegate, final @Nullable FacetOnTheFlyDetectorRegistry<C> onTheFlyDelegate) {
52 myForWizardDelegate = forWizardDelegate;
53 myOnTheFlyDelegate = onTheFlyDelegate;
56 public void customizeDetectedFacetPresentation(@NotNull final DetectedFacetPresentation presentation) {
57 myPresentation = presentation;
60 public <U extends FacetConfiguration> void registerUniversalDetectorByFileNameAndRootTag(@NotNull @NonNls String fileName,
61 @NotNull @NonNls String rootTag,
62 @NotNull final FacetDetector<VirtualFile, C> detector,
63 @Nullable UnderlyingFacetSelector<VirtualFile, U> underlyingFacetSelector) {
64 VirtualFilePattern fileNamePattern = PlatformPatterns.virtualFile().withName(StandardPatterns.string().equalTo(fileName));
65 VirtualFilePattern wizardPattern = fileNamePattern.xmlWithRootTag(StandardPatterns.string().equalTo(rootTag));
67 if (underlyingFacetSelector != null) {
68 registerSubFacetDetectorForWizard(StdFileTypes.XML, wizardPattern, detector, underlyingFacetSelector);
70 else {
71 registerDetectorForWizard(StdFileTypes.XML, wizardPattern, detector);
74 registerOnTheFlySubFacetDetector(StdFileTypes.XML, fileNamePattern, XmlPatterns.xmlFile().withRootTag(XmlPatterns.xmlTag().withName(rootTag)),
75 convertDetector(detector), underlyingFacetSelector);
78 public void registerDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, @NotNull final FacetDetector<VirtualFile, C> facetDetector) {
79 if (myForWizardDelegate != null) {
80 myForWizardDelegate.register(fileType, virtualFileFilter, facetDetector);
84 public void registerDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern,
85 @NotNull final FacetDetector<VirtualFile, C> facetDetector) {
86 registerDetectorForWizard(fileType, new MyPatternFilter(virtualFilePattern), facetDetector);
89 public <U extends FacetConfiguration> void registerSubFacetDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern,
90 @NotNull final FacetDetector<VirtualFile, C> facetDetector,
91 @NotNull final UnderlyingFacetSelector<VirtualFile, U> underlyingFacetSelector) {
92 if (myForWizardDelegate != null) {
93 myForWizardDelegate.register(fileType, new MyPatternFilter(virtualFilePattern), facetDetector, underlyingFacetSelector);
98 private <U extends FacetConfiguration> void registerOnTheFlyDetector(@NotNull final FileType fileType,
99 @NotNull final VirtualFileFilter virtualFileFilter,
100 @NotNull final Condition<PsiFile> psiFileFilter,
101 @NotNull final FacetDetector<PsiFile, C> facetDetector,
102 @Nullable UnderlyingFacetSelector<VirtualFile, U> selector) {
103 if (myOnTheFlyDelegate != null) {
104 myOnTheFlyDelegate.register(fileType, virtualFileFilter, psiFileFilter, facetDetector, selector);
108 public <U extends FacetConfiguration> void registerOnTheFlySubFacetDetector(@NotNull final FileType fileType,
109 @NotNull final VirtualFilePattern virtualFilePattern,
110 @NotNull final ElementPattern<? extends PsiFile> psiFilePattern,
111 @NotNull final FacetDetector<PsiFile, C> facetDetector,
112 final UnderlyingFacetSelector<VirtualFile, U> selector) {
113 registerOnTheFlyDetector(fileType, new MyPatternFilter(virtualFilePattern), new Condition<PsiFile>() {
114 public boolean value(final PsiFile psiFile) {
115 return psiFilePattern.accepts(psiFile);
117 }, facetDetector, selector);
120 public void registerOnTheFlyDetector(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern,
121 @NotNull final ElementPattern<? extends PsiFile> psiFilePattern,
122 @NotNull final FacetDetector<PsiFile, C> facetDetector) {
123 registerOnTheFlySubFacetDetector(fileType, virtualFilePattern, psiFilePattern, facetDetector, null);
126 public void registerOnTheFlyDetector(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, @NotNull final Condition<PsiFile> psiFileFilter,
127 @NotNull final FacetDetector<PsiFile, C> facetDetector) {
128 registerOnTheFlyDetector(fileType, virtualFileFilter, psiFileFilter, facetDetector, null);
133 public void registerUniversalDetector(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern,
134 @NotNull final FacetDetector<VirtualFile, C> facetDetector) {
135 registerUniversalDetector(fileType, new MyPatternFilter(virtualFilePattern), facetDetector);
138 public void registerUniversalDetector(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, @NotNull final FacetDetector<VirtualFile, C> facetDetector) {
139 if (myForWizardDelegate != null) {
140 myForWizardDelegate.register(fileType, virtualFileFilter, facetDetector);
142 if (myOnTheFlyDelegate != null) {
143 myOnTheFlyDelegate.register(fileType, virtualFileFilter, facetDetector, null);
147 public <U extends FacetConfiguration> void registerUniversalSubFacetDetector(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern,
148 @NotNull final FacetDetector<VirtualFile, C> facetDetector,
149 final UnderlyingFacetSelector<VirtualFile, U> underlyingFacetSelector) {
150 registerSubFacetDetectorForWizard(fileType, virtualFilePattern, facetDetector, underlyingFacetSelector);
151 if (myOnTheFlyDelegate != null) {
152 myOnTheFlyDelegate.register(fileType, new MyPatternFilter(virtualFilePattern), facetDetector, underlyingFacetSelector);
156 private static class MyPatternFilter implements VirtualFileFilter {
157 private final VirtualFilePattern myVirtualFilePattern;
159 public MyPatternFilter(final VirtualFilePattern virtualFilePattern) {
160 myVirtualFilePattern = virtualFilePattern;
163 public boolean accept(final VirtualFile file) {
164 return myVirtualFilePattern.accepts(file);
168 public static <C extends FacetConfiguration> FacetDetector<PsiFile, C> convertDetector(final FacetDetector<VirtualFile, C> detector) {
169 return new FacetDetector<PsiFile, C>(detector.getId() + "-psi") {
170 public C detectFacet(final PsiFile source, final Collection<C> existentFacetConfigurations) {
171 VirtualFile virtualFile = source.getVirtualFile();
172 return virtualFile != null ? detector.detectFacet(virtualFile, existentFacetConfigurations) : null;
175 public void beforeFacetAdded(@NotNull final Facet facet, final FacetModel facetModel, @NotNull final ModifiableRootModel modifiableRootModel) {
176 detector.beforeFacetAdded(facet, facetModel, modifiableRootModel);
179 public void afterFacetAdded(@NotNull final Facet facet) {
180 detector.afterFacetAdded(facet);
185 @NotNull
186 public static <C extends FacetConfiguration> DetectedFacetPresentation getDetectedFacetPresentation(@NotNull FacetType<?,C> facetType) {
187 FacetDetectorRegistryEx<C> registry = new FacetDetectorRegistryEx<C>(null, null);
188 facetType.registerDetectors(registry);
189 DetectedFacetPresentation presentation = registry.myPresentation;
190 return presentation != null ? presentation : DefaultDetectedFacetPresentation.INSTANCE;