Added GUI

This commit is contained in:
Robert Vokac 2024-01-14 14:27:59 +00:00
parent 61e323e401
commit e419612fed
No known key found for this signature in database
GPG Key ID: 693D30BEE3329055
2 changed files with 248 additions and 192 deletions

View File

@ -1,13 +1,6 @@
package rvc.timecalc;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import javax.swing.JOptionPane;
/**
* @author Robert
@ -15,196 +8,37 @@ import java.util.Set;
*/
public class Main {
public static final String WALL = "||";
private static final String NEW_LINE = "\n";
public static void main(String[] args) {
while(true) {run(args);
if(args.length != 0) {
break;
}
System.out.println(("Do you want to continue (y/n)?"));
Scanner scanner = new Scanner(System.in);
if(!scanner.nextLine().equals("y")) {
System.out.println("Exiting \"Time Calc\".");
break;
}
}
}
public static void run(String[] args) {
System.out.println("*** Time Calc ***");
System.out.println("-----------------\n");
int EXPECTED_ARG_COUNT = 2;
if (args.length == 0) {
Scanner scanner = new Scanner(System.in);
args = new String[2];
System.out.print("Arguments: ");
String returned = scanner.nextLine();
args[0] = returned.split(" ")[0];
if (returned.contains(" ")) {
args[1] = returned.split(" ")[1];
} else {
args[1] = "0:00";
}
}
if(args.length == 1) {
args = new String[]{args[0], "0:00"};
}
if (args.length < EXPECTED_ARG_COUNT) {
throw new RuntimeException(
"Expected arg count is " + EXPECTED_ARG_COUNT
+ ", but count of found args is: " + args.length);
}
String startTime = args[0];
String overtimeUsed = args[1];
int startHour = Integer.valueOf(startTime.split(":")[0]);
int startMinute = Integer.valueOf(startTime.split(":")[1]);
// System.out.println("startHour=" + startHour);
// System.out.println("startMinute=" + startMinute);
int overtimeUsedHour = Integer.valueOf(overtimeUsed.split(":")[0]);
int overtimeUsedMinute = Integer.valueOf(overtimeUsed.split(":")[1]);
// System.out.println("overtimeUsedHour=" + overtimeUsedHour);
// System.out.println("overtimeUsedMinute=" + overtimeUsedMinute);
int workingHoursLength = 8;
int endHour = startHour + workingHoursLength - overtimeUsedHour;
int endMinute = startMinute + 30 - overtimeUsedMinute;
while (endMinute >= 60) {
endMinute = endMinute - 60;
endHour = endHour + 1;
}
int totalMinutes = (endHour * 60 + endMinute) - (startHour * 60 + startMinute);
// System.out.println("totalMinutes=" + totalMinutes);
// System.out.println("endHour=" + endHour);
// System.out.println("endMinute=" + endMinute);
System.out.println();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
Set<String> alreadyShownTimes = new HashSet<>();
NumberFormat formatter = new DecimalFormat("#0.00");
while (true) {
LocalDateTime now = LocalDateTime.now();
String nowString = dtf.format(now);
if (alreadyShownTimes.contains(nowString)) {
//nothing to do
continue;
} else {
alreadyShownTimes.add(nowString);
}
int hourNow = Integer.parseInt(nowString.split(":")[0]);
int minuteNow = Integer.parseInt(nowString.split(":")[1]);
// System.out.println("hourNow=" + hourNow);
// System.out.println("minuteNow=" + minuteNow);
int hourRemains = endHour - hourNow;
int minuteRemains = endMinute - minuteNow;
if (minuteRemains < 0) {
minuteRemains = minuteRemains + 60;
hourRemains = hourRemains - 1;
}
int hourDone = workingHoursLength - overtimeUsedHour - hourRemains;
int minutesDone = 30 - overtimeUsedMinute - minuteRemains;
int totalMinutesDone = hourDone * 60 + minutesDone;
double done = ((double)totalMinutesDone)/((double)totalMinutes);
// System.out.println("hourDone=" + hourDone);
// System.out.println("minutesDone=" + minutesDone);
// System.out.println("totalMinutesDone=" + totalMinutesDone);
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);
} else {
System.out.print(msg);
}
if(hourRemains <= 0 && minuteRemains <= 0) {
System.out.println("Congratulation :-) It is the time to go home.\n\n");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
break;
}
while(true) {
String startTime = (String) JOptionPane.showInputDialog(
null,
"Start Time:",
"Start Time",
JOptionPane.PLAIN_MESSAGE,
null,
null,
""
);
String overTime = (String) JOptionPane.showInputDialog(
null,
"Overtime:",
"Overtime",
JOptionPane.PLAIN_MESSAGE,
null,
null,
"0:00"
);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
TimeCalc timeCalc =
new TimeCalc(startTime, overTime);
} catch(Exception e) {
JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(), e.getMessage(), JOptionPane.ERROR_MESSAGE);
}
}
}
private static void printPercentToAscii(double percent,
String msg) {
NumberFormat formatter = new DecimalFormat("#00.00");
String s = formatter.format(percent * 100);
s = s.replace(",","");
int percentInt = (int)(percent * 100);
// System.out.println("percentInt=" + percentInt);
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};
// System.out.println(i1 +" " + i2 + " " + i3 + " " + i4);
int index = 0;
for(int i:array) {
if(i < 0) {
i = 0;
}
System.out.print(index == 2 ? (msg + createSpaces(9 + (percentInt<10 ? 1: 0) + (percentInt==100 ? -1: 0))) : createSpaces(58));
for(int j = 1; j <= i; j++) {
System.out.print("#");
}
for(int j = 10; j > i; j--) {
System.out.print(".");
}
System.out.println();
index++;
}
System.out.println(createSpaces(58) + "||======||");
int spacesTotal = 52;
int spacesDone = (int) (percent * 52);
int spacesTodo = spacesTotal - spacesDone;
System.out.println(
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 +
"===================================================================="
);
System.out.println("\n\n");
}
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();
}
private static final String createOneZeroes(int count) {
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= count; i++) {
double random = Math.random();
sb.append(random > 0.66 ? "1" : (random > 0.33 ? "0" : "1"));
}
return sb.toString();
}
}

View File

@ -0,0 +1,222 @@
package rvc.timecalc;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
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<>();
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
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);
// }
if(hourRemains <= 0 && minuteRemains <= 0) {
sb.append("\nCongratulation :-) It is the time to go home.");
//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();
}
private static void printPercentToAscii(double percent,
String msg, StringBuilder sb) {
NumberFormat formatter = new DecimalFormat("#00.00");
String s = formatter.format(percent * 100);
s = s.replace(",","");
int percentInt = (int)(percent * 100);
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;
}
sb.append(index == 2 ? (msg + createSpaces(9 + (percentInt<10 ? 1: 0) + (percentInt==100 ? -1: 0))) : createSpaces(58));
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);
int spacesTodo = spacesTotal - spacesDone;
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();
}
}