package com.nvlad.yii2support.views.completion; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.codeInsight.template.Template; import com.intellij.codeInsight.template.TemplateManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.nvlad.yii2support.views.ViewsUtil; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; /** * Created by NVlad on 28.12.2016. */ class ViewLookupElement extends LookupElement { final private PsiFile myFile; final private String myName; final private String myTail; ViewLookupElement(PsiFile psiFile) { myFile = psiFile; VirtualFile file = psiFile.getVirtualFile(); if (file.getNameWithoutExtension().contains(".")) { myName = file.getName(); myTail = null; } else { myName = file.getNameWithoutExtension(); myTail = "." + file.getExtension(); } } @NotNull @Override public String getLookupString() { return myName; } @Override public void renderElement(LookupElementPresentation presentation) { presentation.setIcon(myFile.getIcon(0)); presentation.setItemText(myName); presentation.setItemTextBold(true); if (myTail != null) { presentation.setTailText(myTail, true); } presentation.setTypeText("View"); presentation.setTypeGrayed(true); } @Override public void handleInsert(InsertionContext context) { PsiElement element = context.getFile().getViewProvider().findElementAt(context.getSelectionEndOffset()); element = PsiTreeUtil.getParentOfType(element, StringLiteralExpression.class); if (element == null) { return; } String value = ((StringLiteralExpression) element).getContents(); if (value.contains("/")) { value = value.substring(value.lastIndexOf('/') + 1); } if (!myName.equals(value)) { String filename = myFile.getName(); if (!filename.equals(value)) { return; } } MethodReference reference = PsiTreeUtil.getParentOfType(element, MethodReference.class); if (reference != null) { reference.putUserData(ViewsUtil.RENDER_VIEW, ((StringLiteralExpression) element).getContents()); reference.putUserData(ViewsUtil.RENDER_VIEW_FILE, myFile); } ArrayList<String> params = ViewsUtil.getViewVariables(myFile); if (params.size() > 0) { ParameterList parameterList = (ParameterList) element.getParent(); if (parameterList.getParameters().length == 1) { Project project = context.getProject(); Template template = TemplateManager.getInstance(project).createTemplate("", ""); template.addTextSegment(", ["); boolean addComma = false; for (String param : params) { String variableName = "$" + param.toUpperCase() + "$"; if (addComma) { template.addTextSegment(", "); } template.addTextSegment("'" + param + "' => "); template.addVariable(variableName, "", "\"$" + param + "\"", true); template.addVariableSegment(variableName); addComma = true; } template.addTextSegment("]"); int offset = parameterList.getParameters()[0].getTextRange().getEndOffset(); context.getEditor().getCaretModel().moveToOffset(offset); TemplateManager.getInstance(project).startTemplate(context.getEditor(), template); } } } }