Search in sources :

Example 1 with XmlElementValueProvider

use of com.intellij.flex.uiDesigner.mxml.XmlElementValueProvider in project intellij-plugins by JetBrains.

the class IncrementalDocumentSynchronizer method incrementalSync.

private boolean incrementalSync(final DocumentInfo info) {
    final XmlElementValueProvider valueProvider = findSupportedTarget();
    if (valueProvider == null) {
        return false;
    }
    XmlTag tag = (XmlTag) valueProvider.getElement().getParent();
    if (!(tag.getDescriptor() instanceof ClassBackedElementDescriptor)) {
        return false;
    }
    int componentId = info.rangeMarkerIndexOf(tag);
    if (componentId == -1) {
        return false;
    }
    final AnnotationBackedDescriptor descriptor = (AnnotationBackedDescriptor) valueProvider.getPsiMetaData();
    assert descriptor != null;
    final String typeName = descriptor.getTypeName();
    final String type = descriptor.getType();
    if (type == null) {
        return !typeName.equals(FlexAnnotationNames.EFFECT);
    } else if (type.equals(JSCommonTypeNames.FUNCTION_CLASS_NAME) || typeName.equals(FlexAnnotationNames.EVENT)) {
        return true;
    }
    final StringRegistry.StringWriter stringWriter = new StringRegistry.StringWriter();
    //noinspection IOResourceOpenedButNotSafelyClosed
    final PrimitiveAmfOutputStream dataOut = new PrimitiveAmfOutputStream(new ByteArrayOutputStreamEx(16));
    PrimitiveWriter writer = new PrimitiveWriter(dataOut, stringWriter);
    boolean needRollbackStringWriter = true;
    try {
        if (descriptor.isAllowsPercentage()) {
            String value = valueProvider.getTrimmed();
            final boolean hasPercent;
            if (value.isEmpty() || ((hasPercent = value.endsWith("%")) && value.length() == 1)) {
                return true;
            }
            final String name;
            if (hasPercent) {
                name = descriptor.getPercentProxy();
                value = value.substring(0, value.length() - 1);
            } else {
                name = descriptor.getName();
            }
            stringWriter.write(name, dataOut);
            dataOut.writeAmfDouble(value);
        } else {
            stringWriter.write(descriptor.getName(), dataOut);
            if (!writer.writeIfApplicable(valueProvider, dataOut, descriptor)) {
                needRollbackStringWriter = false;
                stringWriter.rollback();
                return false;
            }
        }
        needRollbackStringWriter = false;
    } catch (InvalidPropertyException ignored) {
        return true;
    } catch (NumberFormatException ignored) {
        return true;
    } finally {
        if (needRollbackStringWriter) {
            stringWriter.rollback();
        }
    }
    Client.getInstance().updatePropertyOrStyle(info.getId(), componentId, stream -> {
        stringWriter.writeTo(stream);
        stream.write(descriptor.isStyle());
        dataOut.writeTo(stream);
    }).doWhenDone(() -> DesignerApplicationManager.createDocumentRenderedNotificationDoneHandler(true).consume(info));
    return true;
}
Also used : VirtualFileWindow(com.intellij.injected.editor.VirtualFileWindow) JavaScriptSupportLoader(com.intellij.lang.javascript.JavaScriptSupportLoader) XmlFile(com.intellij.psi.xml.XmlFile) FlexPredefinedTagNames(com.intellij.javascript.flex.FlexPredefinedTagNames) VirtualFile(com.intellij.openapi.vfs.VirtualFile) Document(com.intellij.openapi.editor.Document) PrimitiveAmfOutputStream(com.intellij.flex.uiDesigner.io.PrimitiveAmfOutputStream) AnnotationBackedDescriptor(com.intellij.lang.javascript.flex.AnnotationBackedDescriptor) MxmlUtil(com.intellij.flex.uiDesigner.mxml.MxmlUtil) FlexAnnotationNames(com.intellij.javascript.flex.FlexAnnotationNames) ClassBackedElementDescriptor(com.intellij.javascript.flex.mxml.schema.ClassBackedElementDescriptor) InjectedLanguageUtil(com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil) StylesheetFile(com.intellij.psi.css.StylesheetFile) XmlTag(com.intellij.psi.xml.XmlTag) ByteArrayOutputStreamEx(com.intellij.flex.uiDesigner.io.ByteArrayOutputStreamEx) XmlElementValueProvider(com.intellij.flex.uiDesigner.mxml.XmlElementValueProvider) XmlAttribute(com.intellij.psi.xml.XmlAttribute) DocumentInfo(com.intellij.flex.uiDesigner.DocumentFactoryManager.DocumentInfo) FileDocumentManager(com.intellij.openapi.fileEditor.FileDocumentManager) FlexReferenceContributor(com.intellij.javascript.flex.FlexReferenceContributor) XmlElementDescriptor(com.intellij.xml.XmlElementDescriptor) PrimitiveWriter(com.intellij.flex.uiDesigner.mxml.PrimitiveWriter) Nullable(org.jetbrains.annotations.Nullable) Update(com.intellij.util.ui.update.Update) JSCommonTypeNames(com.intellij.lang.javascript.psi.JSCommonTypeNames) XmlAttributeDescriptor(com.intellij.xml.XmlAttributeDescriptor) StringRegistry(com.intellij.flex.uiDesigner.io.StringRegistry) com.intellij.psi(com.intellij.psi) XmlAttributeValueProvider(com.intellij.flex.uiDesigner.mxml.XmlAttributeValueProvider) ClassBackedElementDescriptor(com.intellij.javascript.flex.mxml.schema.ClassBackedElementDescriptor) PrimitiveAmfOutputStream(com.intellij.flex.uiDesigner.io.PrimitiveAmfOutputStream) XmlElementValueProvider(com.intellij.flex.uiDesigner.mxml.XmlElementValueProvider) ByteArrayOutputStreamEx(com.intellij.flex.uiDesigner.io.ByteArrayOutputStreamEx) AnnotationBackedDescriptor(com.intellij.lang.javascript.flex.AnnotationBackedDescriptor) StringRegistry(com.intellij.flex.uiDesigner.io.StringRegistry) PrimitiveWriter(com.intellij.flex.uiDesigner.mxml.PrimitiveWriter) XmlTag(com.intellij.psi.xml.XmlTag)

Aggregations

DocumentInfo (com.intellij.flex.uiDesigner.DocumentFactoryManager.DocumentInfo)1 ByteArrayOutputStreamEx (com.intellij.flex.uiDesigner.io.ByteArrayOutputStreamEx)1 PrimitiveAmfOutputStream (com.intellij.flex.uiDesigner.io.PrimitiveAmfOutputStream)1 StringRegistry (com.intellij.flex.uiDesigner.io.StringRegistry)1 MxmlUtil (com.intellij.flex.uiDesigner.mxml.MxmlUtil)1 PrimitiveWriter (com.intellij.flex.uiDesigner.mxml.PrimitiveWriter)1 XmlAttributeValueProvider (com.intellij.flex.uiDesigner.mxml.XmlAttributeValueProvider)1 XmlElementValueProvider (com.intellij.flex.uiDesigner.mxml.XmlElementValueProvider)1 VirtualFileWindow (com.intellij.injected.editor.VirtualFileWindow)1 FlexAnnotationNames (com.intellij.javascript.flex.FlexAnnotationNames)1 FlexPredefinedTagNames (com.intellij.javascript.flex.FlexPredefinedTagNames)1 FlexReferenceContributor (com.intellij.javascript.flex.FlexReferenceContributor)1 ClassBackedElementDescriptor (com.intellij.javascript.flex.mxml.schema.ClassBackedElementDescriptor)1 JavaScriptSupportLoader (com.intellij.lang.javascript.JavaScriptSupportLoader)1 AnnotationBackedDescriptor (com.intellij.lang.javascript.flex.AnnotationBackedDescriptor)1 JSCommonTypeNames (com.intellij.lang.javascript.psi.JSCommonTypeNames)1 Document (com.intellij.openapi.editor.Document)1 FileDocumentManager (com.intellij.openapi.fileEditor.FileDocumentManager)1 VirtualFile (com.intellij.openapi.vfs.VirtualFile)1 com.intellij.psi (com.intellij.psi)1