package se.unlogic.standardutils.operation;
import java.util.ArrayList;
import java.util.Timer;
public class ProgressMeter {
private int start;
private int finish;
private int currentPosition;
private long startTime;
private long endTime;
private Timer timer;
private ArrayList<ProgressMonitor> progressMonitors;
public ProgressMeter(){};
public ProgressMeter(int start, int finish){
this.start = start;
this.finish = finish;
}
public ProgressMeter(boolean setStartTime){
if(setStartTime){
this.setStartTime();
}
}
public ProgressMeter(int start, int finish, int currentPosition){
this.start = start;
this.finish = finish;
this.currentPosition = currentPosition;
}
public int getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(int currentPosition) {
this.currentPosition = currentPosition;
}
public void incrementCurrentPosition(){
this.currentPosition++;
}
public void decrementCurrentPosition(){
this.currentPosition--;
}
public int getFinish() {
return finish;
}
public void setFinish(int finish) {
this.finish = finish;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getPercentComplete(){
if(this.finish > this.start){
return (int)(((float)(this.currentPosition - this.start)/(float)(this.finish - this.start))*100f);
}else if(this.finish < this.start){
return (int)(((float)(this.start - this.currentPosition)/(float)(this.start - this.finish))*100f);
}else{
return -1;
}
}
public int getPercentRemaining(){
if(this.finish > this.start){
if(this.finish - this.currentPosition != 0){
return (int)(((float)(this.finish - this.currentPosition)/(float)(this.finish - this.start))*100f);
}else{
return 0;
}
}else if(this.finish < this.start){
if(this.currentPosition - this.finish != 0){
return (int)(((float)(this.currentPosition - this.finish)/(float)(this.start - this.finish))*100f);
}else{
return 0;
}
}else{
return -1;
}
}
public int getIntervalSize(){
if(this.finish > this.start){
return this.finish - this.start;
}else if(this.finish < this.start){
return this.start - this.finish;
}else{
return 0;
}
}
public long getStartTime() {
return startTime;
}
public void setStartTime() {
this.startTime = System.currentTimeMillis();
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime() {
this.endTime = System.currentTimeMillis();
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public long getTimeSpent(){
if(this.startTime != 0){
if(this.endTime == 0){
return System.currentTimeMillis() - this.startTime;
}else{
return this.endTime - this.startTime;
}
}else{
return 0;
}
}
public void addProgressMonitor(ProgressMonitor pm, long period){
if(this.timer == null){
this.timer = new Timer();
}
if(this.progressMonitors == null){
this.progressMonitors = new ArrayList<ProgressMonitor>();
}
pm.setProgressMeter(this);
this.timer.schedule(pm, 0, period);
this.progressMonitors.add(pm);
}
public ArrayList<ProgressMonitor> getProgressMonitors() {
return progressMonitors;
}
public void cancelProgressMonitors(){
if(this.progressMonitors != null){
for(ProgressMonitor pm: this.progressMonitors){
pm.cancel();
}
}
}
public void finalize(){
if(this.timer != null){
timer.cancel();
}
}
}