package com.yoursway.progress.core.internal; import com.yoursway.pingback.core.Pingback; import com.yoursway.progress.core.ItemizedProgress; import com.yoursway.progress.core.Naming; import com.yoursway.progress.core.Progress; public class ChildItemizedProgressTracker implements ItemizedProgress, Tracker { private final Tracker parent; private final int itemCount; private final double totalWeight; private int itemsDone = 0; private Progress itemProgress = null; private double currentItemWeight; private final Naming naming; public ChildItemizedProgressTracker(Tracker parent, int itemCount, double totalWeight, Naming naming) { this.parent = parent; this.itemCount = itemCount; this.totalWeight = totalWeight; this.naming = naming; } public void item() { item(1); } public void item(double weight) { endItem(); checkCancellation(); itemProgress = new ChildProgressTracker(this, weight, naming); this.currentItemWeight = weight; } public void item(String itemName) { item(itemName, 1); } public void item(String itemName, double weight) { item(weight); itemProgress.setTaskName(itemName); } public void skip() { skip(1); } public void skip(double weight) { endItem(); parent.skipWorkBecauseOfChild(weight); itemsDone++; } private void endItem() { if (isItemStarted()) { itemsDone++; itemProgress.done(); itemProgress = null; } } public Progress subtask(double weight, Naming naming) { return itemProgress.subtask(weight, naming); } public Progress subtask() { return itemProgress.subtask(currentItemWeight, Naming.AS_SIBLINGS); } public void willNotRun() { if (itemsDone > 0 || isItemStarted()) throw new IllegalStateException("willNotRun only makes sense when no items have been started"); parent.skipWorkBecauseOfChild(totalWeight); } private boolean isItemStarted() { return itemProgress != null; } public void done() { endItem(); if (itemsDone != itemCount) Pingback.ignorableErrorCondition("Allocated item count is not equal to the used item count."); } public void checkCancellation() { parent.checkCancellation(); } public void childStarting(int index) { } public void incrementWorkBecauseOfChild(double delta) { parent.incrementWorkBecauseOfChild(delta); } public void skipWorkBecauseOfChild(double delta) { parent.skipWorkBecauseOfChild(delta); } public void setTaskNameFromChild(String name, Naming naming) { parent.setTaskNameFromChild(name, naming); } public void setTaskNameFromChild(String name, int level) { parent.setTaskNameFromChild(name, level); } }