package com.compomics.util.gui.waiting.waitinghandlers;
import com.compomics.util.waiting.WaitingHandler;
import java.util.Date;
/**
* This class is an implementation of the WaitingHandler interface to be used
* when operating through the Command Line Interface.
*
* @author Harald Barsnes
*/
public class WaitingHandlerCLIImpl implements WaitingHandler {
/**
* Boolean indicating whether the process is finished.
*/
private boolean runFinished = false;
/**
* Boolean indicating whether the process is canceled.
*/
private boolean runCanceled = false;
/**
* Set if the waiting handler is to show the progress for the current
* process or not. Useful when running subprocesses that one wants to be
* able to cancel but do not want to show the progress for.
*/
private boolean displayProgress = true;
/**
* The primary progress counter. -1 if indeterminate.
*/
private int primaryProgressCounter = 0;
/**
* The secondary progress counter. -1 if indeterminate.
*/
private int secondaryProgressCounter = 0;
/**
* The primary max progress counter.
*/
private int primaryMaxProgressCounter = 0;
/**
* The secondary max progress counter.
*/
private int secondaryMaxProgressCounter = 0;
/**
* The report to append.
*/
protected String iReport = "";
/**
* Boolean indicating whether a new line should be printed before writing
* feedback to the user.
*/
private boolean needNewLine = false;
/**
* The line break type.
*/
private String lineBreak = System.getProperty("line.separator");
@Override
public synchronized void setMaxPrimaryProgressCounter(int maxProgressValue) {
if (displayProgress) {
primaryMaxProgressCounter = maxProgressValue;
}
}
@Override
public synchronized void increasePrimaryProgressCounter() {
if (displayProgress) {
primaryProgressCounter++;
}
}
@Override
public synchronized void increasePrimaryProgressCounter(int amount) {
if (displayProgress) {
primaryProgressCounter += amount;
}
}
@Override
public void setPrimaryProgressCounter(int value) {
if (displayProgress) {
primaryProgressCounter = value;
}
}
@Override
public synchronized void setMaxSecondaryProgressCounter(int maxProgressValue) {
if (displayProgress) {
secondaryMaxProgressCounter = maxProgressValue;
}
}
@Override
public synchronized void resetSecondaryProgressCounter() {
if (displayProgress) {
secondaryProgressCounter = 0;
}
}
@Override
public synchronized void increaseSecondaryProgressCounter() {
if (displayProgress) {
if (secondaryMaxProgressCounter != 0) {
int progress1 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
secondaryProgressCounter++;
int progress2 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
printProgress(progress1, progress2);
} else {
secondaryProgressCounter++;
}
}
}
@Override
public synchronized void setSecondaryProgressCounter(int value) {
if (displayProgress) {
if (secondaryMaxProgressCounter != 0) {
int progress1 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
secondaryProgressCounter = value;
int progress2 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
printProgress(progress1, progress2);
} else {
secondaryProgressCounter = value;
}
}
}
@Override
public synchronized void increaseSecondaryProgressCounter(int amount) {
if (displayProgress) {
if (secondaryMaxProgressCounter != 0) {
int progress1 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
secondaryProgressCounter += amount;
int progress2 = (int) 10.0 * secondaryProgressCounter / secondaryMaxProgressCounter;
printProgress(progress1, progress2);
} else {
secondaryProgressCounter += amount;
}
}
}
/**
* Print the progress to the command line
*
* @param progress1 previous progress value
* @param progress2 current progress value
*/
private synchronized void printProgress(int progress1, int progress2) {
if (progress2 > progress1) {
int progress = 10 * progress2;
if (progress1 == 0) {
if (needNewLine) {
System.out.append(lineBreak);
}
System.out.print("10%");
needNewLine = true;
} else if (progress2 > 99) {
System.out.print(" " + progress + "%");
System.out.append(lineBreak);
needNewLine = false;
} else {
System.out.print(" " + progress + "%");
needNewLine = true;
}
}
}
@Override
public synchronized void setSecondaryProgressCounterIndeterminate(boolean indeterminate) {
if (displayProgress) {
secondaryProgressCounter = -1;
}
}
@Override
public void setRunFinished() {
runFinished = true;
}
@Override
public void setRunCanceled() {
runCanceled = true;
}
@Override
public synchronized void appendReport(String report, boolean includeDate, boolean addNewLine) {
if (displayProgress) {
String tempReport = report;
if (includeDate) {
Date date = new Date();
tempReport = date + " " + report;
}
if (addNewLine) {
tempReport = tempReport + lineBreak;
}
iReport = iReport + tempReport;
if (needNewLine) {
System.out.append(lineBreak);
needNewLine = false;
}
System.out.append(tempReport);
}
}
@Override
public synchronized void appendReportNewLineNoDate() {
if (displayProgress) {
if (needNewLine) {
System.out.append(lineBreak);
needNewLine = false;
}
iReport = iReport + lineBreak;
System.out.append(lineBreak);
}
}
@Override
public synchronized void appendReportEndLine() {
if (displayProgress) {
if (needNewLine) {
System.out.append(lineBreak);
needNewLine = false;
}
iReport = iReport + lineBreak;
System.out.append(lineBreak);
}
}
@Override
public boolean isRunCanceled() {
return runCanceled;
}
@Override
public boolean isRunFinished() {
return runFinished;
}
@Override
public void setWaitingText(String text) {
if (displayProgress) {
appendReport(text, true, true);
}
}
@Override
public synchronized void setPrimaryProgressCounterIndeterminate(boolean indeterminate) {
if (displayProgress) {
if (indeterminate) {
primaryProgressCounter = -1;
}
}
}
@Override
public boolean isReport() {
return true;
}
@Override
public void setSecondaryProgressText(String text) {
if (displayProgress) {
appendReport(text, true, true);
}
}
@Override
public synchronized void resetPrimaryProgressCounter() {
if (displayProgress) {
primaryProgressCounter = 0;
}
}
@Override
public synchronized int getPrimaryProgressCounter() {
return primaryProgressCounter;
}
@Override
public synchronized int getMaxPrimaryProgressCounter() {
return primaryMaxProgressCounter;
}
@Override
public synchronized int getSecondaryProgressCounter() {
return secondaryProgressCounter;
}
@Override
public synchronized int getMaxSecondaryProgressCounter() {
return secondaryMaxProgressCounter;
}
@Override
public void setDisplayProgress(boolean displayProgress) {
this.displayProgress = displayProgress;
}
@Override
public boolean getDisplayProgress() {
return displayProgress;
}
}