package com.yiistorm.completition.lookups;
import com.intellij.codeInsight.completion.InsertHandler;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.codeStyle.ProjectCodeStyleSettingsManager;
import com.intellij.util.PlatformIcons;
import com.jetbrains.php.lang.parser.PhpElementTypes;
import com.jetbrains.php.lang.psi.PhpPsiElementFactory;
import com.jetbrains.php.lang.psi.elements.ArrayHashElement;
import com.jetbrains.php.lang.psi.elements.impl.ArrayCreationExpressionImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
public class NewArrayValueLookupElement extends LookupElement {
private String insertString, filePath, fileName;
private PsiElement psiElement = null;
private Project project = null;
public String createTitle = "create array value";
@Nullable
private InsertHandler<LookupElement> insertHandler = null;
public NewArrayValueLookupElement(String insertString, String filePath, String fileName, Project project) {
this.insertString = insertString;
this.filePath = filePath;
this.fileName = fileName;
this.project = project;
}
@NotNull
@Override
public String getLookupString() {
return insertString;
}
@NotNull
public Object getObject() {
return this.psiElement != null ? this.psiElement : super.getObject();
}
public void insertIntoArrayConfig(String string, String openFilePath) {
String relpath = openFilePath.replace(project.getBasePath(), "").substring(1).replace("\\", "/");
VirtualFile vf = project.getBaseDir().findFileByRelativePath(relpath);
if (vf == null) {
return;
}
PsiFile pf = PsiManager.getInstance(project).findFile(vf);
String lineSeparator = " " + ProjectCodeStyleSettingsManager.getSettings(project).getLineSeparator();
if (vf != null) {
PsiElement groupStatement = pf.getFirstChild();
if (groupStatement != null) {
PsiDocumentManager.getInstance(project).commitDocument(pf.getViewProvider().getDocument());
pf.getManager().reloadFromDisk(pf);
for (PsiElement pl : groupStatement.getChildren()) {
if (pl.toString().equals("Return")) {
PsiElement[] pl2 = pl.getChildren();
if (pl2.length > 0 && pl2[0].toString().equals("Array creation expression")) {
ArrayCreationExpressionImpl ar = (ArrayCreationExpressionImpl) pl2[0];
ArrayHashElement p = (ArrayHashElement) PhpPsiElementFactory.createFromText(project,
PhpElementTypes.HASH_ARRAY_ELEMENT,
"array('" + string + "'=>'')");
PsiElement closingBrace = ar.getLastChild();
String preLast = closingBrace.getPrevSibling().toString();
if (!preLast.equals("Comma")) {
pf.getViewProvider().getDocument().insertString(
closingBrace.getTextOffset(), "," + lineSeparator + p.getText());
}
}
break;
}
}
}
}
}
public void handleInsert(InsertionContext context) {
File f = new File(filePath + fileName + ".php");
VirtualFile base = this.project.getBaseDir();
if (base != null) {
final String relativePath = filePath.replace(base.getPath(), "");
final Project project = this.project;
final VirtualFile viewsPath = base.findFileByRelativePath(relativePath);
if (viewsPath != null) {
//context.getEditor().getDocument().insertString(1000,"test");
insertIntoArrayConfig("test", f.getPath());
if (this.insertHandler != null) {
this.insertHandler.handleInsert(context, this);
}
}
}
}
public void renderElement(LookupElementPresentation presentation) {
presentation.setItemText(insertString);
presentation.setIcon(PlatformIcons.ADD_ICON);
presentation.setTypeText(createTitle);
presentation.setTailText(".php");
presentation.setTypeGrayed(false);
}
}