package co.forsaken.projectindigo.util.concurrent;
import java.util.Observable;
import java.util.Observer;
import lombok.Getter;
public class WorkUnit extends Observable implements ProgressObservable, Observer {
@Getter private double offset;
@Getter private final double percentage;
@Getter private final double interval;
@Getter private double total;
private double progress = -1;
private String localizedStatus;
private String localizedTitle;
private boolean shouldConfirmInterrupt = false;
public WorkUnit() {
this.offset = 0;
this.percentage = 0;
this.interval = 0;
}
private WorkUnit(double offset, double percentage, double interval) {
this.offset = offset;
this.percentage = percentage;
this.interval = interval;
}
public synchronized WorkUnit split(double percentage) {
WorkUnit workUnit = new WorkUnit(total, percentage, 0);
total += percentage;
workUnit.addObserver(this);
return workUnit;
}
public synchronized WorkUnit split(double totalPercentage, double count) {
WorkUnit workUnit = new WorkUnit(total, totalPercentage / count, totalPercentage / count);
total += totalPercentage;
workUnit.addObserver(this);
return workUnit;
}
public void advance() {
offset += interval;
}
public double getProgress() {
return progress;
}
public void setProgress(double progress) {
this.progress = progress;
setChanged();
notifyObservers();
}
public String getLocalizedStatus() {
return localizedStatus;
}
public void setLocalizedStatus(String localizedStatus) {
this.localizedStatus = localizedStatus;
setChanged();
notifyObservers();
}
public void push(double progress, String localizedStatus) {
this.progress = progress;
this.localizedStatus = localizedStatus;
setChanged();
notifyObservers();
}
public String getLocalizedTitle() {
return localizedTitle;
}
public void setLocalizedTitle(String localizedTitle) {
this.localizedTitle = localizedTitle;
setChanged();
notifyObservers();
}
public boolean shouldConfirmInterrupt() {
return shouldConfirmInterrupt;
}
public void setShouldConfirmInterrupt(boolean shouldConfirmInterrupt) {
this.shouldConfirmInterrupt = shouldConfirmInterrupt;
setChanged();
notifyObservers();
}
public void update(Observable o, Object arg) {
if (o instanceof ProgressObservable) {
ProgressObservable worker = (ProgressObservable) o;
WorkUnit workUnit;
double progress = worker.getProgress();
if (progress >= 0) {
if (worker instanceof WorkUnit && (workUnit = (WorkUnit) worker).getPercentage() > 0) {
progress = (worker.getProgress() * workUnit.getPercentage() + workUnit.getOffset()) / getTotal();
}
this.progress = progress;
}
this.localizedStatus = worker.getLocalizedStatus();
this.localizedTitle = worker.getLocalizedTitle();
this.shouldConfirmInterrupt = worker.shouldConfirmInterrupt();
setChanged();
notifyObservers();
}
}
}