Skip to content

Commit 789a1a6

Browse files
committed
use custom insert handler inside bundle resources file completion for #185
1 parent 79ce1ff commit 789a1a6

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

src/fr/adrienbrault/idea/symfony2plugin/util/SymfonyBundleFileCompletionProvider.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.jetbrains.php.PhpIndex;
1313
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
1414
import fr.adrienbrault.idea.symfony2plugin.util.dict.BundleFile;
15+
import fr.adrienbrault.idea.symfony2plugin.util.dict.ResourceFileInsertHandler;
1516
import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyBundle;
1617
import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyBundleFileLookupElement;
1718
import org.jetbrains.annotations.NotNull;
@@ -50,7 +51,7 @@ protected void addCompletions(@NotNull CompletionParameters completionParameters
5051
}
5152

5253
for(BundleFile bundleFile : bundleFiles) {
53-
completionResultSet.addElement(new SymfonyBundleFileLookupElement(bundleFile));
54+
completionResultSet.addElement(new SymfonyBundleFileLookupElement(bundleFile, ResourceFileInsertHandler.getInstance()));
5455
}
5556

5657
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package fr.adrienbrault.idea.symfony2plugin.util.dict;
2+
3+
import com.intellij.codeInsight.completion.InsertHandler;
4+
import com.intellij.codeInsight.completion.InsertionContext;
5+
import com.intellij.codeInsight.lookup.LookupElement;
6+
import com.intellij.openapi.editor.Editor;
7+
import com.intellij.psi.PsiElement;
8+
import com.jetbrains.php.completion.insert.PhpInsertHandlerUtil;
9+
import com.jetbrains.php.lang.psi.elements.PhpClass;
10+
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
14+
public class ResourceFileInsertHandler implements InsertHandler<LookupElement> {
15+
16+
private static final ResourceFileInsertHandler instance = new ResourceFileInsertHandler();
17+
18+
public void handleInsert(@NotNull InsertionContext context, @NotNull LookupElement lookupElement) {
19+
20+
// resource: "@AsseticBundle/Resources/config/filters/cssimport.xml"
21+
// if no @ is before cursor add one
22+
if(!isStringBeforeCaret(context.getEditor(), context, "@")) {
23+
context.getDocument().insertString(context.getStartOffset(), "@");
24+
}
25+
26+
}
27+
28+
public static boolean isStringBeforeCaret(@NotNull Editor editor, InsertionContext context, @NotNull String string) {
29+
30+
String fileText = editor.getDocument().getText();
31+
if (fileText.length() < string.length()) {
32+
return false;
33+
}
34+
35+
return fileText.substring(context.getStartOffset() - string.length(), context.getStartOffset()).equals(string);
36+
}
37+
38+
39+
public static ResourceFileInsertHandler getInstance(){
40+
return instance;
41+
}
42+
43+
}

src/fr/adrienbrault/idea/symfony2plugin/util/dict/SymfonyBundleFileLookupElement.java

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.adrienbrault.idea.symfony2plugin.util.dict;
22

3+
import com.intellij.codeInsight.completion.InsertHandler;
4+
import com.intellij.codeInsight.completion.InsertionContext;
35
import com.intellij.codeInsight.lookup.LookupElement;
46
import com.intellij.codeInsight.lookup.LookupElementPresentation;
57
import com.intellij.util.IconUtil;
@@ -11,16 +13,42 @@
1113
public class SymfonyBundleFileLookupElement extends LookupElement {
1214

1315
private BundleFile bundleFile;
16+
private InsertHandler<LookupElement> insertHandler = null;
1417

1518
public SymfonyBundleFileLookupElement(BundleFile bundleFile) {
1619
this.bundleFile = bundleFile;
1720
}
1821

22+
public SymfonyBundleFileLookupElement(BundleFile bundleFile, InsertHandler<LookupElement> insertHandler) {
23+
this(bundleFile);
24+
this.insertHandler = insertHandler;
25+
}
26+
1927
@NotNull
2028
@Override
2129
public String getLookupString() {
2230
String shortcutName = this.bundleFile.getShortcutPath();
23-
return shortcutName != null ? shortcutName : "";
31+
if(shortcutName == null) {
32+
return "";
33+
}
34+
35+
// we strip any control char, so only use the pathname
36+
if(shortcutName.startsWith("@")) {
37+
shortcutName = shortcutName.substring(1);
38+
}
39+
40+
return shortcutName;
41+
}
42+
43+
@Override
44+
public void handleInsert(InsertionContext context) {
45+
46+
if(this.insertHandler != null) {
47+
this.insertHandler.handleInsert(context, this);
48+
return;
49+
}
50+
51+
super.handleInsert(context);
2452
}
2553

2654
public void renderElement(LookupElementPresentation presentation) {

0 commit comments

Comments
 (0)