package ql.gui; import ql.gui.input.Input; import ql.semantics.ValueTable; import ql.semantics.values.Value; import java.util.HashSet; import java.util.Observable; import java.util.Observer; import java.util.Set; /** * Created by Nik on 3-3-15. */ public class Refresher implements Observer { private final Set<Refreshable> items; private final ValueTable valueTable; public Refresher(ValueTable valueTable) { this.valueTable = valueTable; this.items = new HashSet<>(); } public void addItem(Refreshable item) { this.items.add(item); } public void refresh() { for (Refreshable refreshable : this.items) { refreshable.refreshElement(this.valueTable); } } @Override public void update(Observable o, Object arg) { Input input = (Input) o; valueTable.storeValue(input.getId(), (Value) arg); this.evaluateRecursively(this.items); for (Refreshable refreshable : this.items) { refreshable.refreshElement(this.valueTable); } } private void evaluateRecursively(Set<Refreshable> items) { Set<Refreshable> unresolved = this.evaluate(items); if (!(unresolved.equals(items))) { this.evaluateRecursively(unresolved); } } private Set<Refreshable> evaluate(Set<Refreshable> items) { Set<Refreshable> unresolved = new HashSet<>(); for (Refreshable r : items) { Value val = r.evaluate(this.valueTable); if (val.isUndefined()) { unresolved.add(r); } } return unresolved; } }