Skip to content

Commit 018c5dc

Browse files
authored
Merge pull request #80 from cedricziel/icon-index
Use index to store and query icon information
2 parents 0e1e940 + b106325 commit 018c5dc

File tree

14 files changed

+342
-318
lines changed

14 files changed

+342
-318
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,4 @@ fabric.properties
7070
/build_test
7171
/plugins/typo3-plugin
7272
/.cache
73-
/.gradle
73+
/.gradle
Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.cedricziel.idea.typo3;
22

33
import com.cedricziel.idea.typo3.container.IconProvider;
4-
import com.intellij.openapi.application.ApplicationManager;
54
import com.intellij.openapi.components.ProjectComponent;
65
import com.intellij.openapi.diagnostic.Logger;
7-
import com.intellij.openapi.project.DumbService;
86
import com.intellij.openapi.project.Project;
97
import org.jetbrains.annotations.NotNull;
108

@@ -18,6 +16,10 @@ public TYPO3CMSProjectComponent(Project project) {
1816
this.project = project;
1917
}
2018

19+
public static Logger getLogger() {
20+
return LOG;
21+
}
22+
2123
@Override
2224
public void initComponent() {
2325
}
@@ -34,26 +36,10 @@ public String getComponentName() {
3436

3537
@Override
3638
public void projectOpened() {
37-
Project ref = this.project;
38-
39-
ApplicationManager.getApplication().executeOnPooledThread(() -> ApplicationManager.getApplication().runReadAction(() -> {
40-
while (DumbService.isDumb(ref)) {
41-
try {
42-
Thread.sleep(1);
43-
} catch (InterruptedException e) {
44-
e.printStackTrace();
45-
}
46-
}
47-
IconProvider.getInstance(ref);
48-
}));
49-
}
39+
}
5040

5141
@Override
5242
public void projectClosed() {
5343
IconProvider.destroyInstance(project);
5444
}
55-
56-
public static Logger getLogger() {
57-
return LOG;
58-
}
5945
}

src/main/java/com/cedricziel/idea/typo3/annotation/IconAnnotator.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.cedricziel.idea.typo3.annotation;
22

3-
import com.cedricziel.idea.typo3.container.IconProvider;
3+
import com.cedricziel.idea.typo3.index.IconIndex;
44
import com.cedricziel.idea.typo3.psi.PhpElementsUtil;
5-
import com.intellij.lang.annotation.Annotation;
65
import com.intellij.lang.annotation.AnnotationHolder;
76
import com.intellij.lang.annotation.Annotator;
8-
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
9-
import com.intellij.openapi.util.TextRange;
107
import com.intellij.psi.PsiElement;
118
import com.intellij.psi.util.PsiTreeUtil;
129
import com.jetbrains.php.lang.psi.elements.MethodReference;
@@ -35,18 +32,14 @@ public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder a
3532
}
3633

3734
private void annotateIconUsage(PsiElement psiElement, AnnotationHolder annotationHolder, String value) {
38-
IconProvider iconProvider = IconProvider.getInstance(psiElement.getProject());
39-
annotateIcon(psiElement, annotationHolder, value, iconProvider);
35+
annotateIcon(psiElement, annotationHolder, value);
4036
}
4137

42-
private void annotateIcon(PsiElement psiElement, AnnotationHolder annotationHolder, String value, IconProvider iconProvider) {
43-
if (iconProvider.has(psiElement.getProject(), value)) {
44-
TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset());
45-
Annotation annotation = annotationHolder.createInfoAnnotation(range, null);
46-
annotation.setTextAttributes(DefaultLanguageHighlighterColors.LINE_COMMENT);
38+
private void annotateIcon(PsiElement psiElement, AnnotationHolder annotationHolder, String value) {
39+
if (IconIndex.getAllAvailableIcons(psiElement.getProject()).contains(value)) {
40+
annotationHolder.createInfoAnnotation(psiElement, null);
4741
} else {
48-
TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset());
49-
annotationHolder.createWarningAnnotation(range, "Unresolved icon - this may also occur if the icon is defined in your extension, but not in the global icon registry.");
42+
annotationHolder.createWarningAnnotation(psiElement, "Unresolved icon - this may also occur if the icon is defined in your extension, but not in the global icon registry.");
5043
}
5144
}
5245
}
Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package com.cedricziel.idea.typo3.codeInsight;
22

33
import com.cedricziel.idea.typo3.TYPO3CMSIcons;
4-
import com.cedricziel.idea.typo3.container.IconProvider;
4+
import com.cedricziel.idea.typo3.index.IconIndex;
55
import com.cedricziel.idea.typo3.psi.PhpElementsUtil;
6-
import com.cedricziel.idea.typo3.util.IconUtil;
76
import com.intellij.codeInsight.completion.*;
87
import com.intellij.codeInsight.lookup.LookupElementBuilder;
98
import com.intellij.patterns.PlatformPatterns;
@@ -14,9 +13,6 @@
1413
import com.jetbrains.php.lang.psi.elements.ParameterList;
1514
import org.jetbrains.annotations.NotNull;
1615

17-
import javax.swing.*;
18-
import java.io.IOException;
19-
2016
public class IconCompletionContributor extends CompletionContributor {
2117
public IconCompletionContributor() {
2218
extend(CompletionType.BASIC,
@@ -33,42 +29,16 @@ public void addCompletions(@NotNull CompletionParameters parameters,
3329

3430
PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class);
3531
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getIcon")) {
36-
completeAvailableIcons(element, resultSet);
32+
completeIconsFromIndex(element, resultSet);
3733
}
3834
}
3935
}
4036
);
4137
}
4238

43-
private void completeAvailableIcons(PsiElement element, CompletionResultSet resultSet) {
44-
IconProvider iconProvider = IconProvider.getInstance(element.getProject());
45-
iconProvider.all(element.getProject()).forEach(iconDefinition -> {
46-
LookupElementBuilder lookupElement;
47-
try {
48-
if (iconDefinition.getVirtualFile() == null) {
49-
throw new IOException("Could not find icon source");
50-
}
51-
Icon iconFromFile = IconUtil.createIconFromFile(iconDefinition.getVirtualFile());
52-
if (iconFromFile == null) {
53-
throw new IOException("Unable to create image from icon source");
54-
}
55-
lookupElement = LookupElementBuilder
56-
.create(iconDefinition.getIdentifier())
57-
.withIcon(iconFromFile);
58-
} catch (IOException e) {
59-
// Silent error
60-
lookupElement = LookupElementBuilder
61-
.create(iconDefinition.getIdentifier())
62-
.withIcon(TYPO3CMSIcons.ICON_NOT_RESOLVED);
63-
}
64-
65-
if (iconDefinition.getFilename() != null) {
66-
lookupElement = lookupElement.appendTailText(iconDefinition.getFilename(), true);
67-
} else if (iconDefinition.getProvider() != null) {
68-
lookupElement = lookupElement.appendTailText(iconDefinition.getProvider().getText(), true);
69-
}
70-
71-
resultSet.addElement(lookupElement);
72-
});
39+
private void completeIconsFromIndex(PsiElement element, CompletionResultSet resultSet) {
40+
IconIndex
41+
.getAllAvailableIcons(element.getProject())
42+
.forEach(iconIdentifier -> resultSet.addElement(LookupElementBuilder.create(iconIdentifier).withIcon(TYPO3CMSIcons.ICON_NOT_RESOLVED)));
7343
}
7444
}

src/main/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProvider.java

Lines changed: 0 additions & 113 deletions
This file was deleted.

src/main/java/com/cedricziel/idea/typo3/codeInsight/extbase/EntityLineMarkerProvider.java

Lines changed: 0 additions & 70 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.cedricziel.idea.typo3.codeInsight.navigation;
2+
3+
import com.cedricziel.idea.typo3.index.IconIndex;
4+
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
5+
import com.intellij.openapi.actionSystem.DataContext;
6+
import com.intellij.openapi.editor.Editor;
7+
import com.intellij.patterns.PlatformPatterns;
8+
import com.intellij.psi.PsiElement;
9+
import com.jetbrains.php.lang.parser.PhpElementTypes;
10+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
public class IconGotoDeclarationHandler implements GotoDeclarationHandler {
14+
/**
15+
* Provides an array of target declarations for given {@code sourceElement}.
16+
*
17+
* @param sourceElement input PSI element
18+
* @param offset offset in the file
19+
* @param editor
20+
* @return all target declarations as an array of {@code PsiElement} or null if none were found
21+
*/
22+
@Nullable
23+
@Override
24+
public PsiElement[] getGotoDeclarationTargets(@Nullable PsiElement sourceElement, int offset, Editor editor) {
25+
if (sourceElement != null && PlatformPatterns.psiElement().withParent(StringLiteralExpression.class).accepts(sourceElement)) {
26+
String iconIdentifier = ((StringLiteralExpression) sourceElement.getParent()).getContents();
27+
if (IconIndex.getAllAvailableIcons(sourceElement.getProject()).contains(iconIdentifier)) {
28+
return IconIndex.getIconDefinitionElements(sourceElement.getProject(), iconIdentifier);
29+
}
30+
}
31+
32+
return new PsiElement[0];
33+
}
34+
35+
/**
36+
* Provides the custom action text.
37+
*
38+
* @param context the action data context
39+
* @return the custom text or null to use the default text
40+
*/
41+
@Nullable
42+
@Override
43+
public String getActionText(DataContext context) {
44+
return null;
45+
}
46+
}

0 commit comments

Comments
 (0)