time-calc/src/main/java/rvc/timecalc/TimeCalc.java

264 lines
54 KiB
Java
Raw Normal View History

2024-01-14 14:27:59 +00:00
package rvc.timecalc;
2024-01-14 16:01:43 +00:00
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
2024-01-14 14:27:59 +00:00
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import java.awt.Color;
import java.awt.Font;
2024-01-14 16:01:43 +00:00
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
2024-01-14 14:27:59 +00:00
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
2024-01-14 16:01:43 +00:00
import java.util.Base64;
2024-01-14 14:27:59 +00:00
import java.util.HashSet;
import java.util.Set;
/**
* @author Robert
* @since 08.02.2024
*/
public class TimeCalc {
private static final String DEFAULT_OVERTIME = "0:00";
private static final int WORKING_HOURS_LENGTH = 8;
private static final int WORKING_MINUTES_LENGTH = 30;
public static final String WALL = "||";
private static final String NEW_LINE = "\n";
private final static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
private final String startTime;
private final String overTime;
private final int startHour;
private final int startMinute;
private final int overtimeHour;
private final int overtimeMinute;
private final int totalMinutes;
private int endHour;
private int endMinute;
private final Set<String> alreadyShownTimes = new HashSet<>();
2024-01-14 16:01:43 +00:00
private final Set<Integer> alreadyShownPercents = new HashSet<>();
2024-01-14 14:27:59 +00:00
private boolean stopBeforeEnd = false;
public TimeCalc(String startTimeIn, String overTimeIn) {
this.startTime = startTimeIn;
this.overTime = (overTimeIn == null || overTimeIn.isEmpty()) ? DEFAULT_OVERTIME : overTimeIn;
this.startHour = Integer.valueOf(startTime.split(":")[0]);
this.startMinute = Integer.valueOf(startTime.split(":")[1]);
this.overtimeHour = Integer.valueOf(overTime.split(":")[0]);
this.overtimeMinute = Integer.valueOf(overTime.split(":")[1]);
this.endHour = startHour + WORKING_HOURS_LENGTH - overtimeHour;
this.endMinute = startMinute + WORKING_MINUTES_LENGTH - overtimeMinute;
while (endMinute >= 60) {
endMinute = endMinute - 60;
endHour = endHour + 1;
}
this.totalMinutes = (endHour * 60 + endMinute) - (startHour * 60 + startMinute);
NumberFormat formatter = new DecimalFormat("#0.00");
JFrame window=new JFrame();
JButton restartButton=new JButton("Restart");
JButton exitButton=new JButton("Exit");
restartButton.setBounds(280,260,100, 30);
exitButton.setBounds(390,260,100, 30);
window.add(restartButton);
window.add(exitButton);
JTextPane text = new JTextPane ();
text.setBounds(10,10,540, 250);
text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
text.setForeground(Color.GRAY);
text.setBackground(new Color(238,238,238));
window.add(text);
window.setSize(550,350);
window.setLayout(null);
window.setVisible(true);
window.setTitle("Time Calc");
window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
window.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
exitButton.addActionListener(e -> System.exit(0));
restartButton.addActionListener(e -> {window.setVisible(false); stopBeforeEnd = true;});
StringBuilder sb = null;
while (true) {
if(stopBeforeEnd) {
window.setVisible(false);
window.dispose();
break;
}
sb = new StringBuilder();
LocalDateTime now = LocalDateTime.now();
String nowString = DATE_TIME_FORMATTER.format(now);
if (alreadyShownTimes.contains(nowString)) {
//nothing to do
2024-01-14 15:14:18 +00:00
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
2024-01-14 14:27:59 +00:00
continue;
} else {
alreadyShownTimes.add(nowString);
}
int hourNow = Integer.parseInt(nowString.split(":")[0]);
int minuteNow = Integer.parseInt(nowString.split(":")[1]);
int hourRemains = endHour - hourNow;
int minuteRemains = endMinute - minuteNow;
if (minuteRemains < 0) {
minuteRemains = minuteRemains + 60;
hourRemains = hourRemains - 1;
}
int hourDone = WORKING_HOURS_LENGTH - overtimeHour - hourRemains;
int minutesDone = 30 - overtimeMinute - minuteRemains;
int totalMinutesDone = hourDone * 60 + minutesDone;
double done = ((double)totalMinutesDone)/((double)totalMinutes);
String msg = "Done=" + formatter.format(done * 100) + "% Remains=" + String.format("%02d", hourRemains) + ":" + String
.format("%02d", minuteRemains) + " (" + String.format("%03d", (hourRemains * 60 + minuteRemains)) + " minute" + ((hourRemains * 60 + minuteRemains) > 1 ? "s" : " ") + ")" + " End=" + String
.format("%02d", endHour) + ":" + String
.format("%02d", endMinute);
//if(System.getProperty("progress")!=null) {
printPercentToAscii(done, msg, sb);
// } else {
// sb.append(msg);
// }
2024-01-20 13:13:59 +00:00
if(hourRemains == 0 && minuteRemains ==1) {
Vtipy.showRandom();
}
2024-01-14 14:27:59 +00:00
if(hourRemains <= 0 && minuteRemains <= 0) {
sb.append("\nCongratulation :-) It is the time to go home.");
2024-01-14 16:01:43 +00:00
Toaster toasterManager = new Toaster();
2024-01-14 18:06:23 +00:00
toasterManager.setDisplayTime(30000);
2024-01-14 16:01:43 +00:00
toasterManager.showToaster("Congratulation :-) It is the time to go home.");
2024-01-14 14:27:59 +00:00
//System.out.println(sb.toString());
text.setText(sb.toString());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
while(!stopBeforeEnd) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
} else {
//System.out.println(sb.toString());
text.setText(sb.toString());
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
window.setVisible(false);
window.dispose();
}
2024-01-14 16:01:43 +00:00
private void printPercentToAscii(double percent,
2024-01-14 14:27:59 +00:00
String msg, StringBuilder sb) {
NumberFormat formatter = new DecimalFormat("#00.00");
2024-01-14 16:01:43 +00:00
NumberFormat formatter2 = new DecimalFormat("##.##");
2024-01-14 14:27:59 +00:00
String s = formatter.format(percent * 100);
s = s.replace(",","");
int percentInt = (int)(percent * 100);
2024-01-14 16:55:39 +00:00
if(!alreadyShownPercents.contains((int)(percent*100))) {
2024-01-14 16:43:50 +00:00
alreadyShownPercents.add((int)(percent*100));
2024-01-14 16:01:43 +00:00
Toaster toasterManager = new Toaster();
2024-01-14 18:06:23 +00:00
Font font = new Font("sans", Font.BOLD, 32);
2024-01-14 16:25:05 +00:00
toasterManager.setToasterMessageFont(font);
2024-01-14 16:02:37 +00:00
toasterManager.setDisplayTime(10000);
2024-01-14 18:06:23 +00:00
toasterManager.setToasterWidth(600);
toasterManager.setToasterHeight(400);
toasterManager.setToasterColor(Color.YELLOW);
2024-01-14 16:01:43 +00:00
Base64.Decoder base64Decoder = Base64.getDecoder();
byte[] btDataFile = base64Decoder.decode("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
BufferedImage image = null;
try {
image = percentInt == 100 ? ImageIO.read(new ByteArrayInputStream(btDataFile)): null;
} catch (Exception e) {
System.out.println(e);
}
if(image != null) {
2024-01-14 18:06:23 +00:00
// toasterManager.setToasterWidth(600);
// toasterManager.setToasterHeight(400);
2024-01-14 16:01:43 +00:00
toasterManager.showToaster( new ImageIcon(image), "Progress: " + (formatter2.format(percent*100)) + "%" );
} else {
toasterManager.showToaster( "Progress: " + (formatter2.format(percent*100)) + "%" );
}
}
2024-01-14 14:27:59 +00:00
int i1 = percentInt > 20 ? 10 : (int) (percentInt / 2);
int i2 = percentInt > 40 ? 10 : (int) ((percentInt - 20) / 2);
int i3 = percentInt > 60 ? 10 : (int) ((percentInt - 40) / 2);
int i4 = percentInt > 80 ? 10 : (int) ((percentInt - 60) / 2);
int i5 = (int) ((percentInt - 80) / 2);
int[] array = new int[]{i1,i2,i3,i4,i5};
int index = 0;
for(int i:array) {
if(i < 0) {
i = 0;
}
2024-01-14 14:42:52 +00:00
sb.append(index == 2 ? (msg + createSpaces((percentInt < 0 ? -1 : 0) + 9 + (percentInt<10 ? 1: 0) + (percentInt==100 ? -1: 0))) : createSpaces(58));
2024-01-14 14:27:59 +00:00
for(int j = 1; j <= i; j++) {
sb.append("#");
}
for(int j = 10; j > i; j--) {
sb.append(".");
}
sb.append("\n");
index++;
}
sb.append(createSpaces(58) + "||======||\n");
int spacesTotal = 52;
int spacesDone = (int) (percent * 52);
2024-01-14 14:42:52 +00:00
int spacesTodo = spacesTotal - (spacesDone < 0 ? 0 : spacesDone);
2024-01-14 14:27:59 +00:00
sb.append(
WALL + createSpaces(spacesDone) + " () " + createSpaces(spacesTodo) + WALL + (spacesTodo == 0 ? " GO " :"XXXXXX") + WALL + NEW_LINE +
WALL + createSpaces(spacesDone) + "/||\\" + createSpaces(spacesTodo) + WALL + (spacesTodo == 0 ? " HOME " :"XXXXXX") + WALL + NEW_LINE +
WALL + createSpaces(spacesDone) + " /\\ " + createSpaces(spacesTodo) + WALL + (spacesTodo == 0 ? " !! " :"XXXXXX") + WALL + NEW_LINE +
"====================================================================" + NEW_LINE
);
}
private static final String createSpaces(int spaceCount) {
return create(spaceCount, ' ');
}
private static final String create(int count, char ch) {
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= count; i++) {
sb.append(ch);
}
return sb.toString();
}
}