Added several improvements

This commit is contained in:
Robert Vokac 2024-03-09 22:36:59 +00:00
parent 41cfc06b24
commit cfc945d182
No known key found for this signature in database
GPG Key ID: 693D30BEE3329055
11 changed files with 303 additions and 154 deletions

View File

@ -179,6 +179,7 @@ Smileys can be colored or white-black (can be set in configuration)
* CTRL + P - Decrease pause
* SHIFT + C - Increase or decrease of time is change by 1 hour
* CTRL + C - Increase or decrease of time is change by 1 minute
* CTRL + E - Save arrival, overtime, working time, pause time and note
## Command button

View File

@ -5,6 +5,7 @@ import org.nanoboot.utils.timecalc.swing.common.MainWindow;
import org.nanoboot.utils.timecalc.swing.progress.Time;
import org.nanoboot.utils.timecalc.utils.common.FileConstants;
import org.nanoboot.utils.timecalc.utils.common.Jokes;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
@ -14,7 +15,6 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Properties;
import org.nanoboot.utils.timecalc.utils.common.TTime;
/**
* @author Robert Vokac
@ -27,19 +27,19 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
private final TimeCalcConfiguration timeCalcConfiguration;
private final TimeCalcApp timeCalcApp;
private final MainWindow window;
private final MainWindow mainWindow;
private final Time time;
private boolean changeByOneHour = false;
public TimeCalcKeyAdapter(
TimeCalcConfiguration timeCalcConfiguration,
TimeCalcApp timeCalcApp,
MainWindow window,
MainWindow mainWindow,
Time time
) {
this.timeCalcConfiguration = timeCalcConfiguration;
this.timeCalcApp = timeCalcApp;
this.window = window;
this.mainWindow = mainWindow;
this.time = time;
}
@ -48,16 +48,22 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
boolean shiftDown = e.isShiftDown();
boolean ctrlDown = e.isControlDown();
boolean altDown = e.isAltDown();
boolean metaDown = e.isMetaDown();
if (!shiftDown && !ctrlDown && !altDown) {
//boolean metaDown = e.isMetaDown();
if (!shiftDown && !ctrlDown && !altDown /*&& !metaDown*/) {
processKeyCode(keyCode);
} else {
processTestModeKeyCode(keyCode, shiftDown, ctrlDown, altDown);
} else
//if (!metaDown)
{
processShifCtrlAltModeKeyCodes(keyCode, shiftDown, ctrlDown,
altDown);
}
// else {
// processMetaKeyCodes(keyCode);
// }
//meta key ???
}
private void processTestModeKeyCode(int keyCode, boolean shiftDown,
private void processShifCtrlAltModeKeyCodes(int keyCode, boolean shiftDown,
boolean ctrlDown, boolean altDown) {
if (shiftDown && ctrlDown) {
Utils.showNotification("Following key shortcut is not supported: SHIFT + CTRL");
@ -119,40 +125,40 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
break;
}
case KeyEvent.VK_A: {
//Utils.showNotification((increase ? "Increasing" : (decrease ? "Decreasing" : "Reseting")) + " millisecond.");
if (increase) {
window.increaseArrival(changeTTime);
mainWindow.increaseArrival(changeTTime);
}
if (decrease) {
window.decreaseArrival(changeTTime);
mainWindow.decreaseArrival(changeTTime);
}
break;
}
case KeyEvent.VK_O: {
//Utils.showNotification((increase ? "Increasing" : (decrease ? "Decreasing" : "Reseting")) + " millisecond.");
if (increase) {
window.increaseOvertime(changeTTime);
mainWindow.increaseOvertime(changeTTime);
}
if (decrease) {
window.decreaseOvertime(changeTTime);
mainWindow.decreaseOvertime(changeTTime);
}
break;
}
case KeyEvent.VK_W: {
if (increase) {
window.increaseWork(changeTTime);
mainWindow.increaseWork(changeTTime);
}
if (decrease) {
window.decreaseWork(changeTTime);
mainWindow.decreaseWork(changeTTime);
}
break;
}
case KeyEvent.VK_P: {
if (increase) {
window.increasePause(changeTTime);
mainWindow.increasePause(changeTTime);
}
if (decrease) {
window.decreasePause(changeTTime);
mainWindow.decreasePause(changeTTime);
}
break;
}
@ -161,6 +167,12 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
Utils.showNotification("Time will be changed by 1 " + (increase ? "hour" : "minute") + ".");
break;
}
case KeyEvent.VK_E: {
if(ctrlDown) {
mainWindow.doSaveButtonClick();
}
break;
}
default:
// Utils.showNotification(
// "Unsupported key was pressed. There is no key shortcut for this key: "
@ -168,6 +180,16 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
}
}
// private void processMetaKeyCodes(int keyCode) {
//
// switch (keyCode) {
// case KeyEvent.VK_S: {
//
// break;
// }
// default:
// }
// }
private void updateProperty(IntegerProperty integerProperty,
boolean increase, boolean decrease, boolean reset, int timeUnit) {
int currentValue = integerProperty.getValue();
@ -402,11 +424,11 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
break;
}
case KeyEvent.VK_F2: {
window.doCommand();
mainWindow.doCommand();
break;
}
case KeyEvent.VK_R: {
window.doRestart();
mainWindow.doRestart();
break;
}
case KeyEvent.VK_N: {
@ -414,20 +436,20 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
break;
}
case KeyEvent.VK_W: {
window.openWorkDaysWindow();
mainWindow.openWorkDaysWindow();
break;
}
case KeyEvent.VK_A: {
window.openActivitiesWindow();
mainWindow.openActivitiesWindow();
break;
}
case KeyEvent.VK_X: {
window.doExit();
mainWindow.doExit();
break;
}
case KeyEvent.VK_S: {
window.openConfigWindow();
mainWindow.openConfigWindow();
break;
}
@ -441,16 +463,16 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
case KeyEvent.VK_P:
case KeyEvent.VK_F1: {
window.openHelpWindow();
mainWindow.openHelpWindow();
break;
}
case KeyEvent.VK_U: {
window.doEnableEverything();
mainWindow.doEnableEverything();
break;
}
case KeyEvent.VK_I: {
window.doDisableAlmostEverything();
mainWindow.doDisableAlmostEverything();
break;
}
case KeyEvent.VK_E: {
@ -623,7 +645,7 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
}
}
window.repaint();
mainWindow.repaint();
}
private void switchProfile(boolean previous, boolean next) {

View File

@ -17,7 +17,7 @@ import lombok.ToString;
@NoArgsConstructor
public class WorkingDay {
public static final String NODATA = "nodata";
private static final String NODATA = "nodata";
public static String createId(int year, int month, int day) {
return (year + "-" + (month < 10 ? "0" : "") + month + "-" + (day < 10 ? "0" : "") + day);
@ -35,6 +35,10 @@ public class WorkingDay {
private int workingTimeInMinutes;
private int pauseTimeInMinutes;
private String note;
private boolean timeOff;
public boolean isThisDayTimeOff() {
return timeOff || this.note.equals(NODATA);
}
}

View File

@ -28,6 +28,18 @@ public class WorkingDayForStats extends WorkingDay {
private final TTime pause;
private final TTime departure;
public static void fillStatisticsColumns(List<WorkingDayForStats> list) {
//todo
}
public static List<WorkingDayForStats> createList(List<WorkingDay> list) {
List<WorkingDayForStats> result = new ArrayList<>();
for (WorkingDay wd : list) {
WorkingDayForStats wdfs = new WorkingDayForStats(wd);
result.add(wdfs);
}
return result;
}
public WorkingDayForStats(WorkingDay workingDay) {
this(workingDay.getId(),
workingDay.getYear(),
@ -39,18 +51,19 @@ public class WorkingDayForStats extends WorkingDay {
workingDay.getOvertimeMinute(),
workingDay.getWorkingTimeInMinutes(),
workingDay.getPauseTimeInMinutes(),
workingDay.getNote());
workingDay.getNote(),
workingDay.isTimeOff());
}
public WorkingDayForStats(String id, int year, int month, int day, int arrivalHour, int arrivalMinute, int overtimeHour, int overtimeMinute, int workingTimeInMinutes, int pauseTimeInMinutes, String note) {
super(id, year, month, day, arrivalHour, arrivalMinute, overtimeHour, overtimeMinute, workingTimeInMinutes, pauseTimeInMinutes, note);
this.arrival = this.getNote().equals(WorkingDay.NODATA) ? null : new TTime(arrivalHour, arrivalMinute);
this.overtime = this.getNote().equals(WorkingDay.NODATA) ? null : new TTime(overtimeHour, overtimeMinute);
this.work = this.getNote().equals(WorkingDay.NODATA) ? null : TTime.ofMinutes(workingTimeInMinutes);
this.pause = this.getNote().equals(WorkingDay.NODATA) ? null : TTime.ofMinutes(pauseTimeInMinutes);
this.departure = this.getNote().equals(WorkingDay.NODATA) ? null : this.arrival.add(work).add(pause).add(overtime);
this.departureHour = this.getNote().equals(WorkingDay.NODATA) ? -1 : departure.getHour();
this.departureMinute = this.getNote().equals(WorkingDay.NODATA) ? -1 : departure.getMinute();
public WorkingDayForStats(String id, int year, int month, int day, int arrivalHour, int arrivalMinute, int overtimeHour, int overtimeMinute, int workingTimeInMinutes, int pauseTimeInMinutes, String note, boolean timeOff) {
super(id, year, month, day, arrivalHour, arrivalMinute, overtimeHour, overtimeMinute, workingTimeInMinutes, pauseTimeInMinutes, note, timeOff);
this.arrival = this.isThisDayTimeOff() ? null : new TTime(arrivalHour, arrivalMinute);
this.overtime = this.isThisDayTimeOff() ? null : new TTime(overtimeHour, overtimeMinute);
this.work = this.isThisDayTimeOff() ? null : TTime.ofMinutes(workingTimeInMinutes);
this.pause = this.isThisDayTimeOff() ? null : TTime.ofMinutes(pauseTimeInMinutes);
this.departure = this.isThisDayTimeOff() ? null : this.arrival.add(work).add(pause).add(overtime);
this.departureHour = this.isThisDayTimeOff() ? -1 : departure.getHour();
this.departureMinute = this.isThisDayTimeOff() ? -1 : departure.getMinute();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);
@ -59,13 +72,6 @@ public class WorkingDayForStats extends WorkingDay {
this.dayOfWeek = dayOfWeek == 1 ? 7 : dayOfWeek - 1;
}
public List<WorkingDayForStats> createList(List<WorkingDay> list) {
List<WorkingDayForStats> result = new ArrayList<>();
for (WorkingDay wd : list) {
WorkingDayForStats wdfs = new WorkingDayForStats(wd);
}
return result;
}
public String getDayOfWeekAsString() {
return LocalDate.of(getYear(), getMonth() ,getDay()).getDayOfWeek().toString();
}

View File

@ -1,7 +1,10 @@
package org.nanoboot.utils.timecalc.persistence.api;
import java.util.Calendar;
import org.nanoboot.utils.timecalc.app.TimeCalcException;
import org.nanoboot.utils.timecalc.entity.WorkingDay;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import java.util.List;
@ -29,5 +32,18 @@ public interface WorkingDayRepositoryApi {
cal.get(Calendar.DAY_OF_MONTH)
);
}
public List<String> getYears();
List<String> getYears();
void delete(int year, int month, int day);
default void delete(WorkingDay wd) {
delete(wd.getId());
}
default void delete(String id) {
String[] array = id.split("-");
if(array.length != 3) {
TimeCalcException e = new TimeCalcException("Invalid date: " + id);
Utils.showNotification(new TimeCalcException("Invalid date: " + id));
throw e;
}
delete(Integer.parseInt(array[0]),Integer.parseInt(array[1]),Integer.parseInt(array[2]));
}
}

View File

@ -22,7 +22,7 @@ package org.nanoboot.utils.timecalc.persistence.impl.sqlite;
*
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
*/
class VersionTable {
public class VersionTable {
public static final String TABLE_NAME = "VERSION";

View File

@ -1,16 +1,16 @@
package org.nanoboot.utils.timecalc.persistence.impl.sqlite;
import org.nanoboot.utils.timecalc.app.TimeCalcException;
import org.nanoboot.utils.timecalc.entity.WorkingDay;
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.nanoboot.utils.timecalc.entity.WorkingDay;
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
import java.util.List;
import org.nanoboot.utils.timecalc.app.TimeCalcException;
import org.nanoboot.utils.timecalc.utils.common.Utils;
/**
* @author Robert Vokac
@ -35,7 +35,7 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
sb
.append("INSERT INTO ")
.append(WorkingDayTable.TABLE_NAME)
.append(" VALUES (?,?,?,?, ?,?,?,?, ?,?,?)");
.append(" VALUES (?,?,?,?, ?,?,?,?, ?,?,?,?)");
String sql = sb.toString();
@ -56,6 +56,7 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
stmt.setInt(++i, workingDay.getWorkingTimeInMinutes());
stmt.setInt(++i, workingDay.getPauseTimeInMinutes());
stmt.setString(++i, workingDay.getNote());
stmt.setInt(++i, workingDay.isTimeOff() ? 1 : 0);
//
stmt.execute();
@ -124,13 +125,20 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
@Override
public void update(WorkingDay workingDay) {
if(list(workingDay.getYear(), workingDay.getMonth(),workingDay.getDay()).isEmpty()) {
List<WorkingDay> list =
list(workingDay.getYear(), workingDay.getMonth(),
workingDay.getDay());
if(list.isEmpty()) {
create(workingDay);
return;
}
System.out.println("Going to update: " + workingDay.toString());
if(list.get(0).toString().equals(workingDay.toString())) {
System.out.println("Nothing to update.");
return;
}
if(!Utils.askYesNo(null, "Do you want to update this Working Day? " + workingDay, "Update of Working Day")) {
return;
}
@ -145,7 +153,8 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
.append(WorkingDayTable.OVERTIME_MINUTE).append("=?, ")
.append(WorkingDayTable.WORKING_TIME_IN_MINUTES).append("=?, ")
.append(WorkingDayTable.PAUSE_TIME_IN_MINUTES).append("=?, ")
.append(WorkingDayTable.NOTE).append("=? ")
.append(WorkingDayTable.NOTE).append("=?, ")
.append(WorkingDayTable.TIME_OFF).append("=? ")
.append(" WHERE ").append(
WorkingDayTable.ID).append("=?");
@ -161,6 +170,7 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
stmt.setInt(++i, workingDay.getWorkingTimeInMinutes());
stmt.setInt(++i, workingDay.getPauseTimeInMinutes());
stmt.setString(++i, workingDay.getNote());
stmt.setInt(++i, workingDay.isTimeOff() ? 1 : 0);
stmt.setString(++i, workingDay.getId());
@ -193,7 +203,8 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
rs.getInt(WorkingDayTable.OVERTIME_MINUTE),
rs.getInt(WorkingDayTable.WORKING_TIME_IN_MINUTES),
rs.getInt(WorkingDayTable.PAUSE_TIME_IN_MINUTES),
rs.getString(WorkingDayTable.NOTE)
rs.getString(WorkingDayTable.NOTE),
rs.getInt(WorkingDayTable.TIME_OFF) != 0
);
}
@ -236,4 +247,37 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi {
return result;
}
@Override
public void delete(int year, int month, int day) {
StringBuilder sb = new StringBuilder();
sb
.append("DELETE ").append(" FROM ")
.append(WorkingDayTable.TABLE_NAME);
sb.append(" WHERE ");
sb.append(WorkingDayTable.YEAR).append("=? AND ");
sb.append(WorkingDayTable.MONTH).append("=? AND ");
;
sb.append(WorkingDayTable.DAY).append("=? ");
;
String sql = sb.toString();
int i = 0;
try (
Connection connection = sqliteConnectionFactory
.createConnection();
PreparedStatement stmt = connection.prepareStatement(sql);) {
stmt.setInt(++i, year);
stmt.setInt(++i, month);
stmt.setInt(++i, day);
stmt.execute();
} catch (SQLException e) {
System.out.println(e.getMessage());
throw new RuntimeException(e);
} catch (ClassNotFoundException ex) {
System.out.println(ex.getMessage());
throw new RuntimeException(ex);
}
}
}

View File

@ -22,7 +22,7 @@ package org.nanoboot.utils.timecalc.persistence.impl.sqlite;
*
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
*/
class WorkingDayTable {
public class WorkingDayTable {
public static final String TABLE_NAME = "WORKING_DAY";
@ -38,6 +38,7 @@ class WorkingDayTable {
public static final String WORKING_TIME_IN_MINUTES = "WORKING_TIME_IN_MINUTES";
public static final String PAUSE_TIME_IN_MINUTES = "PAUSE_TIME_IN_MINUTES";
public static final String NOTE = "NOTE";
public static final String TIME_OFF = "TIME_OFF";
private WorkingDayTable() {
//Not meant to be instantiated.

View File

@ -64,9 +64,11 @@ public class MainWindow extends TWindow {
private final TTextField workingTimeTextField;
private final TTextField pauseTimeTextField;
private final TTextField noteTextField;
private final TCheckBox timeOffCheckBox = new TCheckBox("Time off");
private final TTextField departureTextField;
private final TTextField elapsedTextField;
private final TTextField remainingTextField;
private final TButton saveButton;
private HelpWindow helpWindow = null;
private ConfigWindow configWindow = null;
private ActivitiesWindow activitiesWindow = null;
@ -79,7 +81,7 @@ public class MainWindow extends TWindow {
this.overtimeTextField = new TTextField();
this.workingTimeTextField = new TTextField("8:00");
this.pauseTimeTextField = new TTextField("0:30");
this.noteTextField = new TTextField("", 160);
this.noteTextField = new TTextField("", 120);
this.departureTextField = new TTextField();
this.elapsedTextField = new TTextField("", 100);
this.remainingTextField = new TTextField("", 100);
@ -272,11 +274,12 @@ public class MainWindow extends TWindow {
pauseTimeTextField.setBoundsFromLeft(pauseTimeInMinutesFieldLabel);
//
TLabel noteTextFieldLabel = new TLabel("Note:");
TLabel noteTextFieldLabel = new TLabel("Note:", 40);
noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField);
noteTextField.setBoundsFromLeft(noteTextFieldLabel);
//half day, pause time in minutes, note
timeOffCheckBox.setBoundsFromLeft(noteTextField);
//
arrivalTextField.setEditable(false);
overtimeTextField.setEditable(false);
workingTimeTextField.setEditable(false);
@ -293,6 +296,7 @@ public class MainWindow extends TWindow {
add(pauseTimeTextField);
add(noteTextFieldLabel);
add(noteTextField);
add(timeOffCheckBox);
//
TLabel departureTextFieldLabel = new TLabel("Departure:", 70);
departureTextFieldLabel.setBoundsFromTop(arrivalTextFieldLabel);
@ -312,7 +316,7 @@ public class MainWindow extends TWindow {
remainingTextField.setBoundsFromLeft(remainingTextFieldLabel);
remainingTextField.setEditable(false);
TButton saveButton = new TButton("Save", 180);
this.saveButton = new TButton("Save", 180);
saveButton.setBoundsFromLeft(remainingTextField);
//
@ -601,29 +605,35 @@ public class MainWindow extends TWindow {
workingDay.setWorkingTimeInMinutes(work_.toTotalMilliseconds() / 1000 / 60);
workingDay.setPauseTimeInMinutes(pause_.toTotalMilliseconds() / 1000 / 60);
workingDay.setNote(noteTextField.getText());
workingDay.setTimeOff(timeOffCheckBox.isSelected());
workingDayRepository.update(workingDay);
if(workingDaysWindow != null) {
workingDaysWindow.doReloadButtonClick();
}
});
WorkingDay workingDay = workingDayRepository.read(time.asCalendar());
WorkingDay wd = workingDayRepository.read(time.asCalendar());
if (workingDay != null) {
workingTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(workingDay.getWorkingTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
pauseTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(workingDay.getPauseTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
noteTextField.valueProperty.setValue(workingDay.getNote());
if (wd != null) {
workingTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getWorkingTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
pauseTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getPauseTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
noteTextField.valueProperty.setValue(wd.getNote());
timeOffCheckBox.setSelected(wd.isTimeOff());
} else {
Calendar cal = time.asCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
workingDay = new WorkingDay();
workingDay.setId(WorkingDay.createId(year, month, day));
workingDay.setYear(year);
workingDay.setMonth(month);
workingDay.setDay(day);
workingDay.setWorkingTimeInMinutes(480);
workingDay.setPauseTimeInMinutes(30);
workingDay.setNote("");
wd = new WorkingDay();
wd.setId(WorkingDay.createId(year, month, day));
wd.setYear(year);
wd.setMonth(month);
wd.setDay(day);
wd.setWorkingTimeInMinutes(480);
wd.setPauseTimeInMinutes(30);
wd.setNote("");
wd.setTimeOff(false);
}
TTime arrival_ = new TTime(arrivalTextField.getText());
TTime overtime_ = new TTime(overtimeTextField.getText());
@ -635,17 +645,15 @@ public class MainWindow extends TWindow {
// System.out.println("work_=" + work_);
// System.out.println("pause_=" + pause_);
workingDay.setArrivalHour(arrival_.getHour());
workingDay.setArrivalMinute(arrival_.getMinute());
wd.setArrivalHour(arrival_.getHour());
wd.setArrivalMinute(arrival_.getMinute());
workingDay.setOvertimeHour(overtime_.getHour());
workingDay.setOvertimeMinute(overtime_.getMinute());
wd.setOvertimeHour(overtime_.getHour());
wd.setOvertimeMinute(overtime_.getMinute());
workingDayRepository.update(workingDay);
//saveButton.doClick();
workingDayRepository.update(wd);
System.out.println(workingDay);
System.out.println(wd);
while (true) {
if (updateWindow(timeCalcApp, time, clock, minuteBattery, hourBattery,
@ -967,6 +975,11 @@ public class MainWindow extends TWindow {
}
public void decreasePause(TTime tTime) {
pauseTimeTextField.valueProperty.setValue(new TTime(this.pauseTimeTextField.valueProperty.getValue()).remove(tTime).toString().substring(0, 5));
pauseTimeTextField.valueProperty.setValue(
new TTime(this.pauseTimeTextField.valueProperty.getValue())
.remove(tTime).toString().substring(0, 5));
}
public void doSaveButtonClick(){
this.saveButton.doClick();
}
}

View File

@ -24,23 +24,29 @@ import org.nanoboot.utils.timecalc.utils.common.TTime;
* @since 16.02.2024
*/
public class WorkingDaysWindow extends TWindow {
private static final String NO = "NO";
private static final String YES = "YES";
private static final String THREE_DASHES = "---";
//
private static final Color RED = new Color(255,153,153);
public static final String E = "?";
private final WorkingDayRepositoryApi workingDayRepository;
private final Time time;
private final JButton reloadButton;
private JTable table = null;
private final JScrollPane scrollPane;
public WorkingDaysWindow(WorkingDayRepositoryApi workingDayRepository, Time time) {
setSize(800, 700);
setSize(1100, 700);
setTitle("Work Days");
this.workingDayRepository = workingDayRepository;
this.time = time;
int year = time.yearProperty.getValue();
this.setLayout(null);
WorkingDaysWindow workingDaysWindow = this;
List<String> yearsList = workingDayRepository.getYears();
@ -51,25 +57,43 @@ public class WorkingDaysWindow extends TWindow {
JComboBox years = new JComboBox(yearsArray);
years.setMaximumSize(new Dimension(150, 25));
years.setSelectedItem(time.asCalendar().get(Calendar.YEAR));
years.setSelectedItem(String.valueOf(year));
years.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time);
});
add(years);
years.setBounds(SwingUtils.MARGIN,SwingUtils.MARGIN, 100, 30);
this.reloadButton = new JButton("Reload");
reloadButton.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time);
});
add(reloadButton);
reloadButton.setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN, years.getY(), 100, 30);
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(e -> {
this.setVisible(false);
});
add(exitButton);
exitButton.setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN, years.getY(), 100, 30);
exitButton.setBounds(reloadButton.getX() + reloadButton.getWidth() + SwingUtils.MARGIN, reloadButton.getY(), 100, 30);
TLabel deleteLabel = new TLabel("Delete:");
add(deleteLabel);
deleteLabel.setBounds(exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN, exitButton.getY(), 100, 30);
TTextField deleteTextField = new TTextField();
add(deleteTextField);
deleteTextField.setBounds(deleteLabel.getX() + deleteLabel.getWidth() + SwingUtils.MARGIN, deleteLabel.getY(), 100, 30);
deleteTextField.addActionListener(e -> {
workingDayRepository.delete(deleteTextField.getText());
reloadButton.doClick();
});
this.scrollPane
= new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SwingUtils.MARGIN, years.getY() + years.getHeight()+ SwingUtils.MARGIN,
getWidth() - 2 * SwingUtils.MARGIN,
getWidth() - 3 * SwingUtils.MARGIN,
getHeight() - 4 * SwingUtils.MARGIN - 50);
add(scrollPane);
scrollPane.setViewportView(table);
@ -79,9 +103,12 @@ public class WorkingDaysWindow extends TWindow {
}
public void doReloadButtonClick() {
this.reloadButton.doClick();
}
public void loadYear(int year, Time time) {
List<WorkingDay> list = new ArrayList<>();
List<WorkingDay> workingDaysList = new ArrayList<>();
Calendar now = time.asCalendar();
final int currentYear = now.get(Calendar.YEAR);
final int currentMonth = now.get(Calendar.MONTH) + 1;
@ -99,9 +126,9 @@ public class WorkingDaysWindow extends TWindow {
WorkingDay wd = workingDayRepository.read(year, month, day);
if (wd == null) {
wd = new WorkingDay(WorkingDay.createId(year, month,day), year, month, day, -1, -1, -1, -1, -1, -1, WorkingDay.NODATA);
wd = new WorkingDay(WorkingDay.createId(year, month,day), year, month, day, -1, -1, -1, -1, -1, -1, "Fictive day", true);
}
list.add(wd);
workingDaysList.add(wd);
// System.out.println("year=" + year);
// System.out.println("month=" + month);
@ -116,31 +143,46 @@ public class WorkingDaysWindow extends TWindow {
break;
}
}
List<WorkingDayForStats> wdfsList = WorkingDayForStats.createList(workingDaysList);
WorkingDayForStats.fillStatisticsColumns(wdfsList);
List<List<String>> listForArray = new ArrayList<>();
for (WorkingDay wd : list) {
ArrayList<String> l = new ArrayList<>();
listForArray.add(l);
WorkingDayForStats wdfs = new WorkingDayForStats(wd);
if (wdfs.getNote().equals(WorkingDay.NODATA)) {
l.add(wdfs.getDayOfWeekAsString());
l.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
l.add(wdfs.getId());
l.add(THREE_DASHES);
l.add(THREE_DASHES);
l.add(THREE_DASHES);
l.add(THREE_DASHES);
l.add(THREE_DASHES);
l.add(wdfs.getNote());
for (WorkingDayForStats wdfs : wdfsList) {
ArrayList<String> list2 = new ArrayList<>();
listForArray.add(list2);
if (wdfs.isThisDayTimeOff()) {
list2.add(wdfs.getDayOfWeekAsString());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
list2.add(wdfs.getId());
list2.add(THREE_DASHES);
list2.add(THREE_DASHES);
list2.add(THREE_DASHES);
list2.add(THREE_DASHES);
list2.add(THREE_DASHES);
list2.add(wdfs.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(E);
list2.add(E);
list2.add(E);
list2.add(E);
list2.add(E);
} else {
l.add(wdfs.getDayOfWeekAsString());
l.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
l.add(wdfs.getId());
l.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5));
l.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5));
l.add(new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute()).toString().substring(0, 5));
l.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5));
l.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5));
l.add(wdfs.getNote());
list2.add(wdfs.getDayOfWeekAsString());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
list2.add(wdfs.getId());
list2.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5));
list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5));
list2.add(new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute()).toString().substring(0, 5));
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5));
list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5));
list2.add(wdfs.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(E);
list2.add(E);
list2.add(E);
list2.add(E);
list2.add(E);
}
}
@ -154,7 +196,7 @@ public class WorkingDaysWindow extends TWindow {
data[index] = data2;
index++;
}
String[] columns = new String[] {"Day of Week", "Weekend", "Date","Arrival","Departure","Overtime","Working time","Pause time","Note"};
String[] columns = new String[] {"Day of Week", "Weekend", "Date","Arrival","Departure","Overtime","Working time","Pause time","Note", "Time off", "Total overtime", "Arrival MA7", "Arrival MA14", "Arrival MA28", "Arrival MA56"};
if(table != null) {
scrollPane.remove(table);
@ -220,12 +262,5 @@ public class WorkingDaysWindow extends TWindow {
}
private static final String NO = "NO";
private static final String YES = "YES";
private static final String THREE_DASHES = "---";
private static final String TD_END = "</td>";
private static final String TD_START = "<td style=\"border: 1px solid black;border-collapse: collapse;\">";
private static final String TH_END = "</th>";
private static final String TH_START = "<th style=\"border: 1px solid black;background:grey;\">";
private Color RED = new Color(255,153,153);
}

View File

@ -13,13 +13,13 @@ _Time Calc is written in Java programming language and uses the Swing framework.
### Start of application
When "Time Calc" is started", user is asked for:
- start time ... like 7:30
- overtime ... like 0:45 ... overtime is optional and the default value is 0:00
- start time ... like 7:30
- overtime ... like 0:45 ... overtime is optional and the default value is 0:00
### Restart of application
You can restart the app, if you press the **"Restart"** button.
- Then you are asked again for start time and overtime.
- Then you are asked again for start time and overtime.
### End of application
@ -33,7 +33,7 @@ If these files are present, something special happens.
### .tc/starttime.txt
This file contains the default start time - used during the previous run of the app.
This file contains the default start time - used during the previous run of the app.
If file starttime.txt does not exist, then the default start time is 7:00.
### .tc/overtime.txt
@ -64,29 +64,29 @@ Optional assignments of profiles to numbers is stored here.
### 3 Visibility modes
* STRONGLY_COLORED - many colors
* WEAKLY_COLORED - darkened colors
* GRAY - gray colors
* NONE - widgets are hidden
* STRONGLY_COLORED - many colors
* WEAKLY_COLORED - darkened colors
* GRAY - gray colors
* NONE - widgets are hidden
### Widgets
#### Analog Clock
* hour hand
* minute hand (can be disabled in configuration)
* second hand (can be disabled in configuration)
* millisecond hand (can be disabled in configuration)
* shows current year, month, day of month and day of week, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED
* shows yellow highlighted remaining time until end of today working hours, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED
* hands can be long or shorter (can be set in configuration)
* hour hand
* minute hand (can be disabled in configuration)
* second hand (can be disabled in configuration)
* millisecond hand (can be disabled in configuration)
* shows current year, month, day of month and day of week, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED
* shows yellow highlighted remaining time until end of today working hours, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED
* hands can be long or shorter (can be set in configuration)
#### Progress Square
* Show graphically day progress
* Show graphically day progress
#### Progress Circle
* Show graphically day progress
* Show graphically day progress
#### Hour Battery
@ -169,21 +169,28 @@ Smileys can be colored or white-black (can be set in configuration)
* CTRL + {Y,N,D,H,M,S or I} - Decrease test time value
* ALT + {Y,N,D,H,M,S or I} - Rest test time value
* D - Reset custom time values to the real time
* SHIFT + A - Increase arrival time by 1 minute
* CTRL + A - Decrease arrival time by 1 minute
* SHIFT + O - Increase overtime by 1 minute
* CTRL + O - Decrease overtime by 1 minute
* SHIFT + A - Increase arrival time
* CTRL + A - Decrease arrival time
* SHIFT + O - Increase overtime
* CTRL + O - Decrease overtime
* SHIFT + W - Increase working time
* CTRL + W - Decrease worknig time
* SHIFT + P - Increase pause
* CTRL + P - Decrease pause
* SHIFT + C - Increase or decrease of time is change by 1 hour
* CTRL + C - Increase or decrease of time is change by 1 minute
* CTRL + E - Save arrival, overtime, working time, pause time and note
## Command button
## Todos
* Split to Maven modules
* Junit, Mockito, etc.
* Checkstyle
* Sonarlint
* Sonarqube
* Add SQLite support and store times of arrivals and departures and time of activities
* Split to Maven modules
* Junit, Mockito, etc.
* Checkstyle
* Sonarlint
* Sonarqube
* Add SQLite support and store times of arrivals and departures and time of activities
## For Developers