package com.intellij.flex.uiDesigner.mxml; import com.google.common.base.CharMatcher; import com.intellij.flex.uiDesigner.InjectionUtil; import com.intellij.lang.javascript.flex.AnnotationBackedDescriptor; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.meta.PsiMetaData; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlTagChild; import com.intellij.psi.xml.XmlText; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.xml.XmlElementDescriptor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; // isCollapseWhiteSpace - only for tag: https://bugs.adobe.com/jira/browse/SDK-3983 class XmlTagValueProvider implements XmlElementValueProvider { private XmlTag tag; public XmlTag getTag() { return tag; } public void setTag(XmlTag tag) { this.tag = tag; } @Override public String getTrimmed() { return tag.getValue().getTrimmedText(); } @Override public CharSequence getSubstituted() { CharSequence v = getDisplay(tag.getValue().getChildren()); if (v == EMPTY) { return EMPTY; } XmlElementDescriptor descriptor = tag.getDescriptor(); // may be ClassBackedElementDescriptor for fx:String: <TextArea><text><fx:String>sfsdsd</fx:String></text></TextArea> if (descriptor instanceof AnnotationBackedDescriptor && ((AnnotationBackedDescriptor)descriptor).isCollapseWhiteSpace()) { return CharMatcher.WHITESPACE.trimAndCollapseFrom(v, ' '); } else { return v; } } @Override public PsiLanguageInjectionHost getInjectedHost() { return MxmlUtil.getInjectedHost(tag); } @Override @Nullable public JSClass getJsClass() { return InjectionUtil.getJsClassFromPackageAndLocalClassNameReferences(tag); } @NotNull @Override public XmlElement getElement() { return tag; } @Override public PsiMetaData getPsiMetaData() { return tag.getDescriptor(); } private static CharSequence getDisplay(XmlTagChild[] children) { if (children.length == 1) { if (children[0] instanceof XmlText) { return ((XmlText)children[0]).getValue(); } else { return EMPTY; } } else { final StringBuilder consolidatedText = StringBuilderSpinAllocator.alloc(); try { for (final XmlTagChild element : children) { consolidatedText.append(element instanceof XmlText ? ((XmlText)element).getValue() : element.getText()); } return consolidatedText.length() == 0 ? EMPTY : consolidatedText; } finally { StringBuilderSpinAllocator.dispose(consolidatedText); } } } }