Skip to content

Commit 0f08676

Browse files
committed
provide custom Twig file overlay to indicate "extends" and attached controller template types Haehnchen#1485
1 parent 4c83f16 commit 0f08676

File tree

7 files changed

+60
-0
lines changed

7 files changed

+60
-0
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/Symfony2Icons.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class Symfony2Icons {
6161
public static final Icon TWIG_LINE_MARKER = IconLoader.getIcon("/icons/twig_line_marker.png");
6262
public static final Icon TWIG_LINE_OVERWRITE = IconLoader.getIcon("/icons/overwrite.png");
6363

64+
public static final Icon TWIG_CONTROLLER_FILE = IconLoader.getIcon("/icons/twig_controller_file.png");
6465
public static final Icon TWIG_EXTENDS_FILE = IconLoader.getIcon("/icons/twig_extends_file.png");
6566
public static final Icon TWIG_IMPLEMENTS_FILE = IconLoader.getIcon("/icons/twig_implements_file.png");
6667

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package fr.adrienbrault.idea.symfony2plugin.twig.icon;
2+
3+
import com.intellij.ide.IconProvider;
4+
import com.intellij.openapi.project.DumbService;
5+
import com.intellij.openapi.util.Iconable;
6+
import com.intellij.psi.PsiElement;
7+
import com.intellij.psi.util.PsiTreeUtil;
8+
import com.intellij.ui.LayeredIcon;
9+
import com.jetbrains.twig.TwigFile;
10+
import com.jetbrains.twig.elements.TwigExtendsTag;
11+
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
12+
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
13+
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
14+
import icons.TwigIcons;
15+
import org.jetbrains.annotations.NotNull;
16+
17+
import javax.swing.*;
18+
19+
/**
20+
* Based on Twig content add overlay to the default Twig file icon, indicating the possible template type
21+
*
22+
* @author Daniel Espendiller <[email protected]>
23+
*/
24+
public class TwigIconProvider extends IconProvider {
25+
public Icon getIcon(@NotNull PsiElement element, @Iconable.IconFlags int flags) {
26+
if (!(element instanceof TwigFile) || !Symfony2ProjectComponent.isEnabled(element.getProject()) || DumbService.getInstance(element.getProject()).isDumb()) {
27+
return null;
28+
}
29+
30+
// attach controller icon overlay
31+
LayeredIcon icon = null;
32+
if (hasController((TwigFile) element)) {
33+
icon = new LayeredIcon(TwigIcons.TwigFileIcon, Symfony2Icons.TWIG_CONTROLLER_FILE);
34+
icon.setIcon(Symfony2Icons.TWIG_CONTROLLER_FILE, 1, SwingConstants.NORTH_WEST);
35+
}
36+
37+
// file provides extends tag, add another layer on top; but put the layer below the previous layer if provided
38+
TwigExtendsTag childOfType = PsiTreeUtil.findChildOfType(element, TwigExtendsTag.class);
39+
if (childOfType != null) {
40+
if (icon == null) {
41+
// we are alone so just place the icon
42+
icon = new LayeredIcon(TwigIcons.TwigFileIcon, Symfony2Icons.TWIG_EXTENDS_FILE);
43+
icon.setIcon(Symfony2Icons.TWIG_EXTENDS_FILE, 1, SwingConstants.NORTH_WEST);
44+
} else {
45+
// icon should be below first one
46+
icon = new LayeredIcon(icon, Symfony2Icons.TWIG_IMPLEMENTS_FILE);
47+
icon.setIcon(Symfony2Icons.TWIG_EXTENDS_FILE, 1, 0, Symfony2Icons.TWIG_CONTROLLER_FILE.getIconHeight() + 1);
48+
}
49+
}
50+
51+
return icon;
52+
}
53+
54+
private boolean hasController(@NotNull TwigFile twigFile) {
55+
return TwigUtil.findTwigFileController(twigFile).size() > 0
56+
|| TwigUtil.getTwigFileMethodUsageOnIndex(twigFile).size() > 0;
57+
}
58+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@
246246
<codeInsight.parameterNameHints language="yaml" implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.ServiceArgumentParameterHintsProvider"/>
247247

248248
<multiHostInjector implementation="fr.adrienbrault.idea.symfony2plugin.lang.ParameterLanguageInjector"/>
249+
<iconProvider implementation="fr.adrienbrault.idea.symfony2plugin.twig.icon.TwigIconProvider"/>
249250

250251
<localInspection groupPath="Symfony" shortName="PhpRouteMissingInspection" displayName="Route Missing"
251252
groupName="Route"
263 Bytes
Loading
423 Bytes
Loading
2.5 KB
Loading
3.89 KB
Loading

0 commit comments

Comments
 (0)