+ private void compsChanged(Consumer<? super ModelComponent> compAdded, Consumer<? super ModelComponent> compRemoved, ModelComponent c,
+ List<LogicModel> models, List<ModelComponent> componentsByItemIndex, Combo componentSelector, LogicModel model,
+ AtomicBoolean recalculateQueued, boolean add)
+ {
+ iterateSubmodelTree(compAdded, compRemoved, c, models, add);
+ queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model);
+ }
+
+ private void iterateSubmodelTree(Consumer<? super ModelComponent> compAdded, Consumer<? super ModelComponent> compRemoved,
+ ModelComponent c, List<LogicModel> models, boolean add)
+ {
+ if (c instanceof SubmodelComponent)
+ iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add);
+ }
+
+ private void iterateModelTree(Consumer<? super ModelComponent> compAdded, Consumer<? super ModelComponent> compRemoved,
+ LogicModel model, List<LogicModel> models, boolean add)
+ {
+ if (add ^ models.contains(model))
+ {
+ if (add)
+ {
+ models.add(model);
+ model.addComponentAddedListener(compAdded);
+ model.addComponentRemovedListener(compRemoved);
+ } else
+ {
+ models.remove(model);
+ model.removeComponentAddedListener(compAdded);
+ model.removeComponentRemovedListener(compRemoved);
+ }
+ for (ModelComponent c : model.getComponentsByName().values())
+ iterateSubmodelTree(compAdded, compRemoved, c, models, add);
+ }
+ }
+
+ private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List<ModelComponent> componentsByItemIndex,
+ Combo componentSelector, LogicModel model)
+ {
+ if (recalculateQueued.compareAndSet(false, true))
+ getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model));
+ }
+
+ private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List<ModelComponent> componentsByItemIndex,
+ Combo componentSelector, LogicModel model)