allow custom documents for LanguageTextField

This commit is contained in:
Maxim.Mossienko
2010-07-07 15:33:45 +04:00
parent 75ebe01063
commit 9b246114ca
3 changed files with 29 additions and 18 deletions
@@ -26,7 +26,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.util.Consumer;
import com.intellij.util.LocalTimeCounter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -36,14 +35,15 @@ public class LanguageTextField extends EditorTextField {
private final Project myProject;
public LanguageTextField(Language language, @NotNull Project project, @NotNull String value) {
this(language, project, value, null);
this(language, project, value, new SimpleDocumentCreator());
}
public LanguageTextField(@Nullable Language language,
@NotNull Project project,
@NotNull String value,
@Nullable Consumer<PsiFile> tagger) {
super(createDocument(value, language, project, tagger), project,
@NotNull DocumentCreator documentCreator
) {
super(documentCreator.createDocument(value, language, project), project,
language != null ? language.getAssociatedFileType() : StdFileTypes.PLAIN_TEXT, language == null);
myLanguage = language;
@@ -54,7 +54,22 @@ public class LanguageTextField extends EditorTextField {
ShiftTabAction.attachTo(this);
}
private static Document createDocument(String value, @Nullable Language language, Project project, @Nullable Consumer<PsiFile> tagger) {
public interface DocumentCreator {
Document createDocument(String value, @Nullable Language language, Project project);
}
public static class SimpleDocumentCreator implements DocumentCreator {
@Override
public Document createDocument(String value, @Nullable Language language, Project project) {
return LanguageTextField.createDocument(value, language, project, this);
}
public void customizePsiFile(PsiFile file) {
}
}
private static Document createDocument(String value, @Nullable Language language, Project project,
@NotNull SimpleDocumentCreator documentCreator) {
if (language != null) {
final PsiFileFactory factory = PsiFileFactory.getInstance(project);
final FileType fileType = language.getAssociatedFileType();
@@ -62,9 +77,7 @@ public class LanguageTextField extends EditorTextField {
final long stamp = LocalTimeCounter.currentTime();
final PsiFile psiFile = factory.createFileFromText("Dummy." + fileType.getDefaultExtension(), fileType, value, stamp, true, false);
if (tagger != null) {
tagger.consume(psiFile);
}
documentCreator.customizePsiFile(psiFile);
final Document document = PsiDocumentManager.getInstance(project).getDocument(psiFile);
assert document != null;
return document;
@@ -18,10 +18,9 @@ package org.intellij.plugins.intelliLang.inject.config.ui;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.ui.EditorTextField;
import com.intellij.util.Consumer;
import com.intellij.ui.LanguageTextField;
import org.intellij.lang.regexp.RegExpLanguage;
import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
import com.intellij.ui.LanguageTextField;
import javax.swing.*;
@@ -52,8 +51,8 @@ public class AdvancedPanel extends AbstractInjectionPanel<BaseInjection> {
}
private void createUIComponents() {
myValuePattern = new LanguageTextField(RegExpLanguage.INSTANCE, myProject, myOrigInjection.getValuePattern(), new Consumer<PsiFile>() {
public void consume(PsiFile psiFile) {
myValuePattern = new LanguageTextField(RegExpLanguage.INSTANCE, myProject, myOrigInjection.getValuePattern(), new LanguageTextField.SimpleDocumentCreator() {
public void customizePsiFile(PsiFile psiFile) {
psiFile.putCopyableUserData(ValueRegExpAnnotator.KEY, Boolean.TRUE);
}
});
@@ -18,12 +18,11 @@ package org.intellij.plugins.intelliLang.inject.config.ui;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.ui.EditorTextField;
import com.intellij.util.Consumer;
import com.intellij.ui.LanguageTextField;
import org.intellij.lang.regexp.RegExpLanguage;
import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
import org.intellij.plugins.intelliLang.inject.config.AbstractTagInjection;
import org.intellij.plugins.intelliLang.inject.config.XPathSupportProxy;
import com.intellij.ui.LanguageTextField;
import javax.swing.*;
@@ -58,8 +57,8 @@ public class AdvancedXmlPanel extends AbstractInjectionPanel<AbstractTagInjectio
}
private void createUIComponents() {
myValuePattern = new LanguageTextField(RegExpLanguage.INSTANCE, myProject, myOrigInjection.getValuePattern(), new Consumer<PsiFile>() {
public void consume(PsiFile psiFile) {
myValuePattern = new LanguageTextField(RegExpLanguage.INSTANCE, myProject, myOrigInjection.getValuePattern(), new LanguageTextField.SimpleDocumentCreator() {
public void customizePsiFile(PsiFile psiFile) {
psiFile.putCopyableUserData(ValueRegExpAnnotator.KEY, Boolean.TRUE);
}
});
@@ -67,8 +66,8 @@ public class AdvancedXmlPanel extends AbstractInjectionPanel<AbstractTagInjectio
// don't even bother to look up the language when xpath-evaluation isn't possible
final XPathSupportProxy proxy = XPathSupportProxy.getInstance();
myXPathCondition = new LanguageTextField(proxy != null ? InjectedLanguage.findLanguageById("XPath") : null, myProject,
myOrigInjection.getXPathCondition(), new Consumer<PsiFile>() {
public void consume(PsiFile psiFile) {
myOrigInjection.getXPathCondition(), new LanguageTextField.SimpleDocumentCreator() {
public void customizePsiFile(PsiFile psiFile) {
// important to get proper validation & completion for Jaxen's built-in and PSI functions
// like lower-case(), file-type(), file-ext(), file-name(), etc.
if (proxy != null) {