package com.intellij.lang.javascript.flex;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegateAdapter;
import com.intellij.injected.editor.EditorWindow;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlComment;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
public class MxmlEnterHandler extends EnterHandlerDelegateAdapter {
public Result preprocessEnter(@NotNull PsiFile file,
@NotNull Editor editor,
@NotNull Ref<Integer> caretOffset,
@NotNull Ref<Integer> caretAdvance,
@NotNull DataContext dataContext,
EditorActionHandler originalHandler) {
int offset = caretOffset.get().intValue();
if (file instanceof JSFile) {
PsiElement context = InjectedLanguageManager.getInstance(file.getProject()).getInjectionHost(file);
if (context instanceof XmlComment) {
file = context.getContainingFile();
editor = ((EditorWindow)editor).getDelegate();
offset = editor.getCaretModel().getOffset();
}
}
if (!JavaScriptSupportLoader.isFlexMxmFile(file)) return Result.Continue;
if (CodeInsightSettings.getInstance().INSERT_BRACE_ON_ENTER && isAfterUnmatchedMxmlComment(editor, file, offset)) {
String indent = "";
CharSequence buffer = editor.getDocument().getCharsSequence();
int lineStart = CharArrayUtil.shiftBackwardUntil(buffer, offset - 1, "\n") + 1;
int current = lineStart;
while(current < offset && Character.isWhitespace(buffer.charAt(current))) ++ current;
if (current > lineStart) {
indent = buffer.subSequence(lineStart, current).toString();
}
editor.getDocument().insertString(offset, "\n" + indent + "-->");
originalHandler.execute(editor, dataContext);
return Result.Stop;
}
return Result.Continue;
}
private static boolean isAfterUnmatchedMxmlComment(Editor editor, PsiFile file, int offset) {
CharSequence chars = editor.getDocument().getCharsSequence();
if (!(offset >= 5 && chars.charAt(offset - 1) == '-' &&
chars.charAt(offset - 2) == '-' &&
chars.charAt(offset - 3) == '-' &&
chars.charAt(offset - 4) == '!' &&
chars.charAt(offset - 5) == '<')) {
return false;
}
PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument());
final PsiElement at = file.findElementAt(offset);
String parentText;
String marker = "<!---";
if (at != null && (parentText = at.getParent().getText()).endsWith("-->")) {
return parentText.indexOf(marker, marker.length()) != -1;
}
return true;
}
}