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
;
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
);
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
);
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
;