From 32bd40c7eeee379d7180ad49a1085bec27c3acda Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 13 Feb 2013 16:50:19 +0100 Subject: [PATCH] javafx: refs to stylesheets (IDEA-99984) --- .../fxml/refs/FxmlReferencesContributor.java | 2 + .../refs/JavaFxLocationReferenceProvider.java | 41 ++++++++++++++++--- .../javaFX/testData/completion/mystyle.css | 0 .../testData/completion/stylesheets.fxml | 4 ++ .../completion/stylesheets_after.fxml | 4 ++ .../testData/highlighting/readOnly.fxml | 2 +- .../javaFX/fxml/JavaFxCompletionTest.java | 16 +++++++- 7 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 plugins/javaFX/testData/completion/mystyle.css create mode 100644 plugins/javaFX/testData/completion/stylesheets.fxml create mode 100644 plugins/javaFX/testData/completion/stylesheets_after.fxml diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java index 525d1f79229b..b6141f780749 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java @@ -85,6 +85,8 @@ public class FxmlReferencesContributor extends PsiReferenceContributor { registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withParent(XmlPatterns.xmlAttribute().withName("url")).and(attributeValueInFxml), new JavaFxLocationReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withParent(XmlPatterns.xmlAttribute().withName("stylesheets")).and(attributeValueInFxml), + new JavaFxLocationReferenceProvider(true)); registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlTokenType.XML_TAG_CHARACTERS).inFile(inFxmlElementPattern()), new ImportReferenceProvider()); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java index c901ad7c9697..37654301ee08 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java @@ -23,25 +23,56 @@ import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * User: anna */ class JavaFxLocationReferenceProvider extends PsiReferenceProvider { + private boolean mySupportCommaInValue = false; + + JavaFxLocationReferenceProvider() { + } + + JavaFxLocationReferenceProvider(boolean supportCommaInValue) { + mySupportCommaInValue = supportCommaInValue; + } + @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, @NotNull ProcessingContext context) { final String value = ((XmlAttributeValue)element).getValue(); - final FileReferenceSet set; if (value.startsWith("@")) { - set = new FileReferenceSet(value.substring(1), element, 2, null, true); + return new FileReferenceSet(value.substring(1), element, 2, null, true).getAllReferences(); } else { - set = new FileReferenceSet(value, element, 1, null, true); - if (value.startsWith("/")) { - set.addCustomization(FileReferenceSet.DEFAULT_PATH_EVALUATOR_OPTION, FileReferenceSet.ABSOLUTE_TOP_LEVEL); + if (mySupportCommaInValue && value.contains(",")) { + int startIdx = 0; + int endIdx = 0; + List refs = new ArrayList(); + while (true) { + endIdx = value.indexOf(",", startIdx); + Collections.addAll(refs, collectRefs(element, endIdx >= 0 ? value.substring(startIdx, endIdx) : value.substring(startIdx), startIdx + 1)); + startIdx = endIdx + 1; + if (endIdx < 0) { + break; + } + } + return refs.toArray(new PsiReference[refs.size()]); + } else { + return collectRefs(element, value, 1); } } + } + + private static PsiReference[] collectRefs(PsiElement element, String value, final int startInElement) { + final FileReferenceSet set = new FileReferenceSet(value, element, startInElement, null, true); + if (value.startsWith("/")) { + set.addCustomization(FileReferenceSet.DEFAULT_PATH_EVALUATOR_OPTION, FileReferenceSet.ABSOLUTE_TOP_LEVEL); + } return set.getAllReferences(); } } diff --git a/plugins/javaFX/testData/completion/mystyle.css b/plugins/javaFX/testData/completion/mystyle.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/javaFX/testData/completion/stylesheets.fxml b/plugins/javaFX/testData/completion/stylesheets.fxml new file mode 100644 index 000000000000..41c90611747c --- /dev/null +++ b/plugins/javaFX/testData/completion/stylesheets.fxml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/completion/stylesheets_after.fxml b/plugins/javaFX/testData/completion/stylesheets_after.fxml new file mode 100644 index 000000000000..bf5c96f74043 --- /dev/null +++ b/plugins/javaFX/testData/completion/stylesheets_after.fxml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/highlighting/readOnly.fxml b/plugins/javaFX/testData/highlighting/readOnly.fxml index cb3413474368..f049c06bf023 100644 --- a/plugins/javaFX/testData/highlighting/readOnly.fxml +++ b/plugins/javaFX/testData/highlighting/readOnly.fxml @@ -1,6 +1,6 @@ -backgroundFills=""> +mystyle.css" backgroundFills=""> diff --git a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java index ce18d272cd7a..08de34dbe9c5 100644 --- a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java +++ b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java @@ -97,6 +97,10 @@ public class JavaFxCompletionTest extends CompletionTestCase { doTest("text"); } + public void testStylesheets() throws Exception { + doTest("mystyle.css", "mystyle.css"); + } + public void testReadOnly() throws Exception { configureByFile(getTestName(true) + ".fxml"); assertTrue(myItems.length > 0); @@ -117,7 +121,17 @@ public class JavaFxCompletionTest extends CompletionTestCase { } private void doTest(final String selection) throws Exception { - configureByFile(getTestName(true) + ".fxml"); + doTest(selection, null); + } + + private void doTest(final String selection, String additionalPath) throws Exception { + final String mainFxml = getTestName(true) + ".fxml"; + if (additionalPath != null) { + configureByFiles(null, mainFxml, additionalPath); + complete(); + } else { + configureByFile(mainFxml); + } assertTrue(myItems.length > 0); LookupElement selectionElement = null; for (LookupElement item : myItems) {