5253523f3bb8b9af5913964a4c3d0d3d85a07fba
[idea/javafx-plugin.git] / src / org / jetbrains / javafx / lang / psi / impl / JavaFxClassDefinitionImpl.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package org.jetbrains.javafx.lang.psi.impl;
17
18 import com.intellij.lang.ASTNode;
19 import com.intellij.openapi.util.io.FileUtil;
20 import com.intellij.psi.PsiElement;
21 import com.intellij.psi.PsiFile;
22 import com.intellij.psi.PsiReference;
23 import com.intellij.psi.ResolveState;
24 import com.intellij.psi.scope.PsiScopeProcessor;
25 import com.intellij.util.Icons;
26 import com.intellij.util.IncorrectOperationException;
27 import org.jetbrains.annotations.NonNls;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30 import org.jetbrains.javafx.lang.parser.JavaFxElementTypes;
31 import org.jetbrains.javafx.lang.psi.*;
32 import org.jetbrains.javafx.lang.psi.impl.resolve.JavaFxResolveUtil;
33 import org.jetbrains.javafx.lang.psi.stubs.JavaFxClassStub;
34
35 import javax.swing.*;
36
37 /**
38  * Created by IntelliJ IDEA.
39  * Author: Alexey.Ivanov
40  * Date:   12.05.2010
41  * Time:   16:21:57
42  */
43 public class JavaFxClassDefinitionImpl extends JavaFxPresentableElementImpl<JavaFxClassStub> implements JavaFxClassDefinition {
44   public JavaFxClassDefinitionImpl(@NotNull ASTNode node) {
45     super(node);
46   }
47
48   public JavaFxClassDefinitionImpl(@NotNull JavaFxClassStub stub) {
49     super(stub, JavaFxElementTypes.CLASS_DEFINITION);
50   }
51
52   @Override
53   public String getName() {
54     final JavaFxClassStub classStub = getStub();
55     if (classStub != null) {
56       return classStub.getName();
57     }
58     return super.getName();
59   }
60
61   @Nullable
62   public JavaFxQualifiedName getQualifiedName() {
63     final JavaFxClassStub stub = getStub();
64     if (stub != null) {
65       return stub.getQualifiedName();
66     }
67     else {
68       return JavaFxPsiUtil.getQName(this);
69     }
70   }
71
72   @Override
73   public JavaFxElement[] getMembers() {
74     return getStubOrPsiChildren(JavaFxElementTypes.CLASS_MEMBERS, JavaFxElement.EMPTY_ARRAY);
75   }
76
77   @Override
78   public JavaFxReferenceElement[] getSuperClassElements() {
79     final JavaFxReferenceList referenceList = childToPsi(JavaFxElementTypes.REFERENCE_LIST);
80     assert referenceList != null;
81     return referenceList.getReferenceElements();
82   }
83
84   @Override
85   protected void acceptJavaFxVisitor(@NotNull JavaFxElementVisitor visitor) {
86     visitor.visitClassDefinition(this);
87   }
88
89   @Override
90   public Icon getIcon(int flags) {
91     return Icons.CLASS_ICON;
92   }
93
94 // TODO: !!!
95
96   public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
97     throw new IncorrectOperationException();
98   }
99
100   @Override
101   public boolean processDeclarations(@NotNull final PsiScopeProcessor processor,
102                                      @NotNull final ResolveState state,
103                                      final PsiElement lastParent,
104                                      @NotNull final PsiElement place) {
105     if (!JavaFxResolveUtil.processElements(getMembers(), lastParent, processor, state)) {
106       return false;
107     }
108     final PsiFile containingFile = getContainingFile();
109     if (containingFile instanceof JavaFxFile) {
110       final String name = containingFile.getName();
111       if (FileUtil.getNameWithoutExtension(name).equals(getName())) {
112         if (!JavaFxResolveUtil.processElements(((JavaFxFile)containingFile).getDefinitions(), this, processor, state)) {
113           return false;
114         }
115       }
116     }
117     final JavaFxReferenceElement[] superClassElements = getSuperClassElements();
118     for (JavaFxReferenceElement referenceElement : superClassElements) {
119       final PsiReference reference = referenceElement.getReference();
120       if (reference != null) {
121         final PsiElement resolveResult = reference.resolve();
122         if (resolveResult != null) {
123           if (!resolveResult.processDeclarations(processor, state, lastParent, place)) {
124             return false;
125           }
126         }
127       }
128     }
129     return processor.execute(this, state);
130   }
131 }