package jetbrains.mps.internal.make.runtime.backports;
/*Generated by MPS */
import jetbrains.mps.internal.make.runtime.script.AbstractProgressStrategy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import java.util.Deque;
import jetbrains.mps.baseLanguage.tuples.runtime.Tuples;
import jetbrains.mps.internal.collections.runtime.DequeSequence;
import java.util.LinkedList;
import jetbrains.mps.progress.EmptyProgressMonitor;
import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple;
public class ProgressMonitorProgressStrategy extends AbstractProgressStrategy {
private static final String TOTAL = "__TOTAL__";
private static final int MAXWORK = 10000;
@NotNull
private ProgressMonitor monitor;
private Deque<Tuples._2<ProgressMonitor, AbstractProgressStrategy.Work>> monitorWorkStack = DequeSequence.fromDequeNew(new LinkedList<Tuples._2<ProgressMonitor, AbstractProgressStrategy.Work>>());
private boolean isInitialized;
private int done;
public ProgressMonitorProgressStrategy() {
super(TOTAL);
reset(new EmptyProgressMonitor());
}
public void reset(ProgressMonitor monitor) {
this.monitor = (monitor != null ? monitor : new EmptyProgressMonitor());
DequeSequence.fromDequeNew(monitorWorkStack).clear();
this.done = 0;
this.isInitialized = false;
}
public void initializeIfNeeded() {
if (!(isInitialized)) {
monitor.start("", MAXWORK);
isInitialized = true;
}
}
public boolean isCanceled() {
return monitor.isCanceled();
}
public ProgressMonitor getProgressMonitor() {
initializeIfNeeded();
return (DequeSequence.fromDequeNew(monitorWorkStack).isEmpty() ? monitor : DequeSequence.fromDequeNew(monitorWorkStack).peekElement()._0());
}
@Override
protected void begunWork(AbstractProgressStrategy.Work wrk) {
initializeIfNeeded();
ProgressMonitor submon;
if (DequeSequence.fromDequeNew(monitorWorkStack).isEmpty()) {
submon = monitor.subTask((int) Math.floor(wrk.prevWorkRatio() * MAXWORK));
} else {
submon = DequeSequence.fromDequeNew(monitorWorkStack).peekElement()._0().subTask(wrk.prevWork());
}
submon.start(wrk.name(), wrk.workLeft());
DequeSequence.fromDequeNew(monitorWorkStack).pushElement(MultiTuple.<ProgressMonitor,AbstractProgressStrategy.Work>from(submon, wrk));
}
@Override
protected void advancedWork(AbstractProgressStrategy.Work wrk) {
initializeIfNeeded();
if (wrk == DequeSequence.fromDequeNew(monitorWorkStack).peekElement()._1()) {
ProgressMonitor mon = DequeSequence.fromDequeNew(monitorWorkStack).peekElement()._0();
mon.advance(wrk.workDone());
mon.step(wrk.comment());
}
}
@Override
protected void finishedWork(AbstractProgressStrategy.Work wrk) {
initializeIfNeeded();
popMatchingMonitor(wrk).done();
}
private ProgressMonitor popMatchingMonitor(AbstractProgressStrategy.Work work) {
while (DequeSequence.fromDequeNew(monitorWorkStack).isNotEmpty()) {
if (DequeSequence.fromDequeNew(monitorWorkStack).peekElement()._1() == work) {
return DequeSequence.fromDequeNew(monitorWorkStack).popElement()._0();
}
DequeSequence.fromDequeNew(monitorWorkStack).popElement()._0().done();
}
return monitor;
}
}