Search in sources :

Example 1 with StateReference

use of com.intellij.javascript.flex.FlexReferenceContributor.StateReference in project intellij-plugins by JetBrains.

the class StateWriter method checkStateSpecificPropertyValue.

public boolean checkStateSpecificPropertyValue(MxmlWriter mxmlWriter, PropertyProcessor propertyProcessor, XmlElementValueProvider valueProvider, AnnotationBackedDescriptor descriptor, @NotNull Context context) {
    PsiReference[] references = valueProvider.getElement().getReferences();
    if (references.length < 2) {
        return false;
    }
    List<State> states = null;
    for (int i = references.length - 1; i > -1; i--) {
        PsiReference psiReference = references[i];
        if (psiReference instanceof StateReference) {
            // resolve is expensive for StateReference, so, we use string key (states name) instead of object key (states tag)
            states = nameToState.get(psiReference.getCanonicalText());
            break;
        }
    }
    if (states == null) {
        return false;
    }
    final List<State> filteredStates;
    if (context instanceof DynamicObjectContext) {
        final ArrayList<State> includeInStates = ((DynamicObjectContext) context).includeInStates;
        filteredStates = new ArrayList<>(states.size());
        for (State state : states) {
            if (includeInStates.contains(state)) {
                filteredStates.add(state);
            } else {
                MxmlWriter.LOG.warn("Skip " + valueProvider.getElement().getText() + " from " + state.name + " " + "due to element parent object included only in " + includeInStates);
            }
        }
        if (filteredStates.isEmpty()) {
            return true;
        }
    } else {
        filteredStates = states;
    }
    ValueWriter valueWriter = null;
    try {
        valueWriter = propertyProcessor.process(valueProvider.getElement(), valueProvider, descriptor, context);
    } catch (InvalidPropertyException ignored) {
    }
    if (valueWriter == null) {
        // binding is not yet supported for state specific
        return true;
    }
    final PrimitiveAmfOutputStream out = writer.getOut();
    SetPropertyOrStyle override = new SetPropertyOrStyle(writer.getBlockOut().startRange());
    writer.classOrPropertyName(propertyProcessor.isStyle() ? "com.intellij.flex.uiDesigner.flex.states.SetStyle" : "com.intellij.flex.uiDesigner.flex.states.SetProperty");
    writer.property(NAME).stringReference(propertyProcessor.getName());
    writer.property(VALUE);
    PropertyKind propertyKind;
    try {
        propertyKind = valueWriter.write(descriptor, valueProvider, out, writer, false, context);
    } catch (InvalidPropertyException ignored) {
        // todo handle invalidProperty for state
        throw new UnsupportedOperationException("");
    }
    if (propertyKind.isComplex()) {
        mxmlWriter.processPropertyTagValue(descriptor, (XmlTag) valueProvider.getElement(), context, propertyKind);
    }
    override.targetId = context.getOrAllocateId();
    if (pendingFirstSetProperty == null && context instanceof NullContext) {
        pendingFirstSetProperty = override;
    }
    writer.getBlockOut().endRange(override.dataRange);
    for (State state : filteredStates) {
        state.overrides.add(override);
    }
    return true;
}
Also used : StateReference(com.intellij.javascript.flex.FlexReferenceContributor.StateReference) PrimitiveAmfOutputStream(com.intellij.flex.uiDesigner.io.PrimitiveAmfOutputStream) PsiReference(com.intellij.psi.PsiReference) PropertyKind(com.intellij.flex.uiDesigner.mxml.PropertyProcessor.PropertyKind) InvalidPropertyException(com.intellij.flex.uiDesigner.InvalidPropertyException)

Aggregations

InvalidPropertyException (com.intellij.flex.uiDesigner.InvalidPropertyException)1 PrimitiveAmfOutputStream (com.intellij.flex.uiDesigner.io.PrimitiveAmfOutputStream)1 PropertyKind (com.intellij.flex.uiDesigner.mxml.PropertyProcessor.PropertyKind)1 StateReference (com.intellij.javascript.flex.FlexReferenceContributor.StateReference)1 PsiReference (com.intellij.psi.PsiReference)1