diff --git a/plugins/javaFX/src/META-INF/plugin.xml b/plugins/javaFX/src/META-INF/plugin.xml index 23b98bfa3d76..f3506c41f7c1 100644 --- a/plugins/javaFX/src/META-INF/plugin.xml +++ b/plugins/javaFX/src/META-INF/plugin.xml @@ -16,5 +16,6 @@ + diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java index 52c511285079..4b4cd2076202 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java @@ -44,29 +44,6 @@ public class JavaFXNSDescriptor implements XmlNSDescriptor, Validator parseImports(XmlFile file) { - List definedImports = new ArrayList(); - XmlDocument document = file.getDocument(); - if (document != null) { - XmlProlog prolog = document.getProlog(); - - final Collection - instructions = new ArrayList(PsiTreeUtil.findChildrenOfType(prolog, XmlProcessingInstruction.class)); - for (Iterator iterator = instructions.iterator(); iterator.hasNext(); ) { - final XmlProcessingInstruction instruction = iterator.next(); - final ASTNode node = instruction.getNode(); - ASTNode xmlNameNode = node.findChildByType(XmlTokenType.XML_NAME); - ASTNode importNode = node.findChildByType(XmlTokenType.XML_TAG_CHARACTERS); - if (xmlNameNode == null || !"import".equals(xmlNameNode.getText()) || importNode == null) { - iterator.remove(); - } else { - definedImports.add(importNode.getText()); - } - } - } - return definedImports; - } - @NotNull @Override public XmlElementDescriptor[] getRootElementsDescriptors(@Nullable XmlDocument document) { diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java index 99f9c9b50ca0..c5f3589ea862 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java @@ -15,12 +15,18 @@ */ package org.jetbrains.plugins.javaFX.fxml; +import com.intellij.lang.ASTNode; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.xml.XmlProcessingInstruction; +import com.intellij.psi.xml.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; /** * User: anna @@ -32,4 +38,35 @@ public class JavaFxPsiUtil { PsiFileFactory.getInstance(project).createFileFromText("a.fxml", XMLLanguage.INSTANCE, importText).getFirstChild(); return PsiTreeUtil.findChildOfType(child, XmlProcessingInstruction.class); } + + public static List parseImports(XmlFile file) { + return parseInstructions(file, "import"); + } + + public static List parseInjectedLanguages(XmlFile file) { + return parseInstructions(file, "language"); + } + + private static List parseInstructions(XmlFile file, String instructionName) { + List definedImports = new ArrayList(); + XmlDocument document = file.getDocument(); + if (document != null) { + XmlProlog prolog = document.getProlog(); + + final Collection + instructions = new ArrayList(PsiTreeUtil.findChildrenOfType(prolog, XmlProcessingInstruction.class)); + for (Iterator iterator = instructions.iterator(); iterator.hasNext(); ) { + final XmlProcessingInstruction instruction = iterator.next(); + final ASTNode node = instruction.getNode(); + ASTNode xmlNameNode = node.findChildByType(XmlTokenType.XML_NAME); + ASTNode importNode = node.findChildByType(XmlTokenType.XML_TAG_CHARACTERS); + if (xmlNameNode == null || !instructionName.equals(xmlNameNode.getText()) || importNode == null) { + iterator.remove(); + } else { + definedImports.add(importNode.getText()); + } + } + } + return definedImports; + } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/ScriptLanguageInjector.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/ScriptLanguageInjector.java new file mode 100644 index 000000000000..e97c5ea64b11 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/ScriptLanguageInjector.java @@ -0,0 +1,41 @@ + +package org.jetbrains.plugins.javaFX.fxml; + +import com.intellij.lang.Language; +import com.intellij.lang.injection.MultiHostInjector; +import com.intellij.lang.injection.MultiHostRegistrar; +import com.intellij.openapi.util.TextRange; +import com.intellij.patterns.XmlElementPattern; +import com.intellij.patterns.XmlPatterns; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLanguageInjectionHost; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlText; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class ScriptLanguageInjector implements MultiHostInjector { + + private static final XmlElementPattern.XmlTextPattern SCRIPT_PATTERN = XmlPatterns.xmlText().withParent( + XmlPatterns.xmlTag().withName(FxmlConstants.FX_SCRIPT)); + + public void getLanguagesToInject(@NotNull final MultiHostRegistrar registrar, @NotNull final PsiElement host) { + if (SCRIPT_PATTERN.accepts(host)) { + final Language language = Language.findLanguageByID("JavaScript"); + if (language != null && JavaFxPsiUtil.parseInjectedLanguages((XmlFile)host.getContainingFile()).contains("javascript")) { + registrar.startInjecting(language) + .addPlace(null, null, (PsiLanguageInjectionHost) host, + TextRange.from(0, host.getTextLength() - 1)) + .doneInjecting(); + } + } + } + + @NotNull + public List> elementsToInjectIn() { + return Collections.singletonList(XmlText.class); + } + +} \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java index fa1907ff29f3..ac38ae8bf0fb 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java @@ -25,8 +25,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; -import org.jetbrains.plugins.javaFX.fxml.JavaFXNSDescriptor; import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; +import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; import java.util.ArrayList; import java.util.Collections; @@ -45,7 +45,7 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, } public static PsiClass findPsiClass(String name, XmlTag tag) { - return findPsiClass(name, JavaFXNSDescriptor.parseImports((XmlFile)tag.getContainingFile()), tag, tag.getProject()); + return findPsiClass(name, JavaFxPsiUtil.parseImports((XmlFile)tag.getContainingFile()), tag, tag.getProject()); } public JavaFxClassBackedElementDescriptor(String name, PsiClass aClass) { @@ -161,6 +161,9 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, } return null; } + if (FxmlConstants.FX_DEFAULT_PROPERTIES.contains(name)) { + //return new ; + } return myPsiClass != null ? new JavaFxPropertyElementDescriptor(myPsiClass, name, false) : null; } }