package com.intellij.flex.uiDesigner.mxml; import org.jetbrains.annotations.Nullable; class State { private final int index; String name; final LinkedList<OverrideBase> overrides = new LinkedList<>(); private final StateWriter stateWriter; State(StateWriter stateWriter, int index) { this.stateWriter = stateWriter; this.index = index; } @Nullable AddItems getValidActiveAddItems(Context parentContext, boolean autoItemDestruction) { AddItems item = getActiveAddItems(parentContext); return (item != null && item.isAutoDestruction() == autoItemDestruction) ? item : null; } private AddItems getActiveAddItems(Context parentContext) { return parentContext.activeAddItems != null ? parentContext.activeAddItems[index] : null; } private void setActiveAddItems(AddItems override, Context parentContext) { if (parentContext.activeAddItems == null) { parentContext.activeAddItems = new AddItems[stateWriter.statesSize()]; } parentContext.activeAddItems[index] = override; } public void addAddItems(AddItems override, Context parentContext, @Nullable SetPropertyOrStyle pendingFirstSetProperty) { // if all children included in some state, then position is first, and in overrides are exists in reverse order, // - we sort for correct layering AddItems activeAddItems = getActiveAddItems(parentContext); if (activeAddItems != null) { assert overrides.size() > 0; overrides.addBefore(activeAddItems, override); } else if (pendingFirstSetProperty != null && overrides.contains(pendingFirstSetProperty) /* todo refactor, depends on - support setProperty in several states - text.groupName="A" where groupName is A and B states */) { overrides.addBefore(pendingFirstSetProperty, override); } else { overrides.add(override); } setActiveAddItems(override, parentContext); } public void applyItemAutoDestruction(Context context, Context parentContext, BaseWriter writer) { AddItems override = getActiveAddItems(parentContext); if (override == null) { return; } int size = override.getItemDeferredInstances().size(); int lastIndex = size - 1; if (!override.isAutoDestruction() && override.getItemDeferredInstances().get(lastIndex) == context) { if (size == 1) { // test case: ItemDestructionPolicyMergeItems2, override == text="3", override.next == text="2" AddItems next = (AddItems)overrides.getNext(override); if (next != null && next.isAutoDestruction()) { next.addItemDeferredInstance(override.getItemDeferredInstances().get(0)); writer.getBlockOut().removeLastMarkerAndAssert(override.dataRange); overrides.remove(override); setActiveAddItems(next, parentContext); } else { override.setAutoDestruction(true); } } else { override.getItemDeferredInstances().remove(lastIndex); AddItems separatedAddItems = stateWriter.createAddItems((DynamicObjectContext)context, parentContext, true); // about why add before active override see State.addAddItems overrides.addBefore(override, separatedAddItems); setActiveAddItems(separatedAddItems, parentContext); } } } }