Added several improvements
27
Readme.md
@ -8,6 +8,30 @@ _Time Calc is written in Java programming language and uses the Swing framework.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Time Calc is inspired by this document: [report.ods](https://code.nanoboot.org/nanoboot/time-calc/raw/branch/rvc/report.ods)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Screenshots
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### Start of application
|
### Start of application
|
||||||
@ -41,9 +65,6 @@ If file starttime.txt does not exist, then the default start time is 7:00.
|
|||||||
This file contains the default overtime - used during the previous run of the app.
|
This file contains the default overtime - used during the previous run of the app.
|
||||||
If file overtime.txt does not exist, then the default overtime is 0:00.
|
If file overtime.txt does not exist, then the default overtime is 0:00.
|
||||||
|
|
||||||
### .tc/test.txt
|
|
||||||
If file test.txt exists, then user is not asked for start time and overtime. Instead, the values in files starttime.txt and overtime.txt are used.
|
|
||||||
|
|
||||||
### ./tc/timecalc.conf
|
### ./tc/timecalc.conf
|
||||||
|
|
||||||
Configuration is stored here.
|
Configuration is stored here.
|
||||||
|
BIN
images/activities_window.jpg
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
images/config_window_battery.jpg
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
images/config_window_clock.jpg
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
images/config_window_misc.jpg
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
images/config_window_smileys.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
images/config_window_test.jpg
Normal file
After Width: | Height: | Size: 89 KiB |
BIN
images/report.ods.activities.jpg
Normal file
After Width: | Height: | Size: 219 KiB |
BIN
images/report.ods.working_day.jpg
Normal file
After Width: | Height: | Size: 206 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 67 KiB |
BIN
images/working_days_window_chart.jpg
Normal file
After Width: | Height: | Size: 145 KiB |
BIN
images/working_days_window_table.jpg
Normal file
After Width: | Height: | Size: 507 KiB |
@ -1,9 +1,9 @@
|
|||||||
package org.nanoboot.utils.timecalc.app;
|
package org.nanoboot.utils.timecalc.app;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.MainWindow;
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Constants;
|
|
||||||
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
|
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.FileConstants;
|
import org.nanoboot.utils.timecalc.utils.common.FileConstants;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
||||||
@ -56,53 +56,11 @@ public class TimeCalcApp {
|
|||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
boolean test = FileConstants.TEST_TXT.exists();
|
|
||||||
String oldStartTime = Utils.readTextFromFile(
|
|
||||||
FileConstants.STARTTIME_TXT);
|
|
||||||
String oldOvertime = Utils.readTextFromFile(
|
|
||||||
FileConstants.OVERTIME_TXT);
|
|
||||||
String newStartTime
|
|
||||||
= test ? (oldStartTime != null ? oldStartTime
|
|
||||||
: Constants.DEFAULT_START_TIME)
|
|
||||||
: (String) JOptionPane.showInputDialog(
|
|
||||||
null,
|
|
||||||
"Start Time:",
|
|
||||||
"Start Time",
|
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
oldStartTime == null
|
|
||||||
? Constants.DEFAULT_START_TIME
|
|
||||||
: oldStartTime
|
|
||||||
);
|
|
||||||
if (newStartTime == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
String newOvertime
|
|
||||||
= test ? (oldOvertime != null ? oldOvertime
|
|
||||||
: Constants.DEFAULT_OVERTIME)
|
|
||||||
: (String) JOptionPane.showInputDialog(
|
|
||||||
null,
|
|
||||||
"Overtime:",
|
|
||||||
"Overtime",
|
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
oldOvertime == null
|
|
||||||
? Constants.DEFAULT_OVERTIME
|
|
||||||
: oldOvertime
|
|
||||||
);
|
|
||||||
|
|
||||||
if (newOvertime == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Utils.writeTextToFile(FileConstants.STARTTIME_TXT, newStartTime);
|
|
||||||
Utils.writeTextToFile(FileConstants.OVERTIME_TXT, newOvertime);
|
|
||||||
MainWindow timeCalcMainWindow = null;
|
MainWindow timeCalcMainWindow = null;
|
||||||
try {
|
try {
|
||||||
timeCalcMainWindow
|
timeCalcMainWindow = new MainWindow(this);
|
||||||
= new MainWindow(newStartTime, newOvertime, this);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(),
|
JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(),
|
||||||
e.getMessage(), JOptionPane.ERROR_MESSAGE);
|
e.getMessage(), JOptionPane.ERROR_MESSAGE);
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
package org.nanoboot.utils.timecalc.app;
|
package org.nanoboot.utils.timecalc.app;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.MainWindow;
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
||||||
import org.nanoboot.utils.timecalc.swing.progress.WalkingHumanProgress;
|
|
||||||
import org.nanoboot.utils.timecalc.utils.common.FileConstants;
|
import org.nanoboot.utils.timecalc.utils.common.FileConstants;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Jokes;
|
import org.nanoboot.utils.timecalc.utils.common.Jokes;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TButton;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTextField;
|
||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.MouseClickedListener;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.SmallTButton;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTextField;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.nanoboot.utils.timecalc.entity.Activity;
|
import org.nanoboot.utils.timecalc.entity.Activity;
|
||||||
|
@ -33,9 +33,7 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
public class DayPanel extends JPanel {
|
public class DayPanel extends JPanel {
|
||||||
|
|
||||||
private static final String FOR_ACTIVITY_ID = "for-activity-id";
|
|
||||||
private static final Dimension MAXIMUM_SIZE = new Dimension(1300, 40);
|
private static final Dimension MAXIMUM_SIZE = new Dimension(1300, 40);
|
||||||
private static final Dimension MAXIMUM_SIZE_2 = new Dimension(1200, 20);
|
|
||||||
private final String year;
|
private final String year;
|
||||||
private final String month;
|
private final String month;
|
||||||
private final String day;
|
private final String day;
|
||||||
@ -188,11 +186,7 @@ public class DayPanel extends JPanel {
|
|||||||
Utils.showNotification("Current status: done=" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(done) + "h, todo="+ NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(todo));
|
Utils.showNotification("Current status: done=" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(done) + "h, todo="+ NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(todo));
|
||||||
|
|
||||||
});
|
});
|
||||||
// for (int i = 0; i < 10; i++) {
|
sortActivityPanels();
|
||||||
// add(new ActivityPanel(activityRepository,
|
|
||||||
// new Activity("id", 2000, 7, 7, "name", "comment", "ticket", 2, 30,
|
|
||||||
// "a b c", null)));
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
public List<Activity> getActivities() {
|
public List<Activity> getActivities() {
|
||||||
return Arrays
|
return Arrays
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTabbedPane;
|
||||||
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTabbedPane;
|
||||||
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@ -6,6 +6,7 @@ import java.awt.Component;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -1,10 +1,10 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert
|
* @author pc00289
|
||||||
* @since 14.03.2024
|
* @since 14.03.2024
|
||||||
*/
|
*/
|
||||||
public interface MouseClickedListener extends MouseListener {
|
public interface MouseClickedListener extends MouseListener {
|
@ -1,9 +1,9 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert
|
* @author pc00289
|
||||||
* @since 11.03.2024
|
* @since 11.03.2024
|
||||||
*/
|
*/
|
||||||
public class SmallTButton extends TButton {
|
public class SmallTButton extends TButton {
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
@ -10,6 +10,8 @@ import javax.swing.JButton;
|
|||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
@ -10,6 +10,8 @@ import javax.swing.JCheckBox;
|
|||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
@ -10,6 +10,8 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -2,7 +2,7 @@
|
|||||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||||
*/
|
*/
|
||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
@ -13,6 +13,8 @@ import javax.swing.Timer;
|
|||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
||||||
|
|
@ -2,7 +2,7 @@ package org.nanoboot.utils.timecalc.swing.progress;
|
|||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.MainWindow;
|
import org.nanoboot.utils.timecalc.swing.windows.MainWindow;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.Toaster;
|
import org.nanoboot.utils.timecalc.swing.common.Toaster;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.Widget;
|
import org.nanoboot.utils.timecalc.swing.common.Widget;
|
||||||
|
@ -1,17 +1,21 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTabbedPane;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeEvent;
|
||||||
import javax.swing.event.ChangeListener;
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.app.TimeCalcException;
|
import org.nanoboot.utils.timecalc.app.TimeCalcException;
|
||||||
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.MonthPanel;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.YearPanel;
|
||||||
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,5 +1,7 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TButton;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TWindow;
|
||||||
import org.nanoboot.utils.timecalc.app.TimeCalcConfiguration;
|
import org.nanoboot.utils.timecalc.app.TimeCalcConfiguration;
|
||||||
import org.nanoboot.utils.timecalc.app.TimeCalcProperty;
|
import org.nanoboot.utils.timecalc.app.TimeCalcProperty;
|
||||||
import org.nanoboot.utils.timecalc.entity.Visibility;
|
import org.nanoboot.utils.timecalc.entity.Visibility;
|
||||||
@ -15,9 +17,7 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JSeparator;
|
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.SwingConstants;
|
|
||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
@ -33,6 +33,9 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTabbedPane;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
||||||
@ -51,8 +54,12 @@ public class ConfigWindow extends TWindow {
|
|||||||
Arrays.stream(Visibility.values()).map(v -> v.name()).collect(
|
Arrays.stream(Visibility.values()).map(v -> v.name()).collect(
|
||||||
Collectors.toList()).toArray());
|
Collectors.toList()).toArray());
|
||||||
private final TimeCalcConfiguration timeCalcConfiguration;
|
private final TimeCalcConfiguration timeCalcConfiguration;
|
||||||
private final JPanel panelInsideScrollPane;
|
private final JPanel panelInsideScrollPaneClock;
|
||||||
private int currentY = SwingUtils.MARGIN;
|
private final JPanel panelInsideScrollPaneBattery;
|
||||||
|
private final JPanel panelInsideScrollPaneSmileys;
|
||||||
|
private final JPanel panelInsideScrollPaneTest;
|
||||||
|
private final JPanel panelInsideScrollPaneMisc;
|
||||||
|
private final int[] currentY = new int[]{SwingUtils.MARGIN,SwingUtils.MARGIN,SwingUtils.MARGIN,SwingUtils.MARGIN,SwingUtils.MARGIN};
|
||||||
private final List<JComponent> propertiesList = new ArrayList<>();
|
private final List<JComponent> propertiesList = new ArrayList<>();
|
||||||
private final Map<TimeCalcProperty, JComponent> propertiesMap = new HashMap<>();
|
private final Map<TimeCalcProperty, JComponent> propertiesMap = new HashMap<>();
|
||||||
private final TButton enableAsMuchAsPossible
|
private final TButton enableAsMuchAsPossible
|
||||||
@ -173,37 +180,75 @@ public class ConfigWindow extends TWindow {
|
|||||||
= new JTextField(TimeCalcProperty.TEST_CLOCK_CUSTOM_SECOND.getKey());
|
= new JTextField(TimeCalcProperty.TEST_CLOCK_CUSTOM_SECOND.getKey());
|
||||||
private final JTextField testClockCustomMillisecondProperty
|
private final JTextField testClockCustomMillisecondProperty
|
||||||
= new JTextField(TimeCalcProperty.TEST_CLOCK_CUSTOM_MILLISECOND.getKey());
|
= new JTextField(TimeCalcProperty.TEST_CLOCK_CUSTOM_MILLISECOND.getKey());
|
||||||
|
private final TTabbedPane tp;
|
||||||
|
|
||||||
public ConfigWindow(TimeCalcConfiguration timeCalcConfiguration) {
|
public ConfigWindow(TimeCalcConfiguration timeCalcConfiguration) {
|
||||||
this.timeCalcConfiguration = timeCalcConfiguration;
|
this.timeCalcConfiguration = timeCalcConfiguration;
|
||||||
setTitle("Configuration");
|
setTitle("Configuration");
|
||||||
this.setSize(800, 800);
|
this.setSize(780, 800);
|
||||||
|
|
||||||
JPanel mainPanel = new JPanel();
|
JPanel mainPanel = new JPanel();
|
||||||
mainPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE,
|
mainPanel.setMaximumSize(new Dimension(750,
|
||||||
getHeight() - 6 * SwingUtils.MARGIN));
|
getHeight() - 6 * SwingUtils.MARGIN));
|
||||||
this.panelInsideScrollPane = new JPanel();
|
this.tp = new TTabbedPane();
|
||||||
final BoxLayout boxLayout
|
//tp.setBackground(Color.red);
|
||||||
= new BoxLayout(panelInsideScrollPane, BoxLayout.Y_AXIS);
|
this.panelInsideScrollPaneClock = new JPanel();
|
||||||
panelInsideScrollPane.setAlignmentX(LEFT_ALIGNMENT);
|
this.panelInsideScrollPaneBattery = new JPanel();
|
||||||
|
this.panelInsideScrollPaneSmileys = new JPanel();
|
||||||
|
this.panelInsideScrollPaneTest = new JPanel();
|
||||||
|
this.panelInsideScrollPaneMisc = new JPanel();
|
||||||
|
|
||||||
|
List<JPanel> panelsInsideScrollPane = Stream.of(
|
||||||
|
panelInsideScrollPaneClock,
|
||||||
|
panelInsideScrollPaneBattery,
|
||||||
|
panelInsideScrollPaneSmileys,
|
||||||
|
panelInsideScrollPaneTest,
|
||||||
|
panelInsideScrollPaneMisc).toList();
|
||||||
|
panelsInsideScrollPane.forEach(p-> {
|
||||||
|
final BoxLayout boxLayout = new BoxLayout(p, BoxLayout.Y_AXIS);
|
||||||
|
p.setLayout(boxLayout);
|
||||||
|
p.setAlignmentX(LEFT_ALIGNMENT);
|
||||||
|
//p.setMinimumSize(new Dimension(300, 400));
|
||||||
|
p.setMaximumSize(new Dimension(300, 400));
|
||||||
|
//p.setBackground(Color.blue);
|
||||||
|
});
|
||||||
|
|
||||||
|
//mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
|
||||||
mainPanel.setAlignmentX(LEFT_ALIGNMENT);
|
mainPanel.setAlignmentX(LEFT_ALIGNMENT);
|
||||||
|
|
||||||
panelInsideScrollPane.setLayout(boxLayout);
|
|
||||||
panelInsideScrollPane
|
|
||||||
.setMinimumSize(new Dimension(Integer.MAX_VALUE, 400));
|
|
||||||
|
|
||||||
JScrollPane scrollPane = new JScrollPane(panelInsideScrollPane);
|
JScrollPane scrollPaneClock = new JScrollPane(panelInsideScrollPaneClock);
|
||||||
scrollPane.setVerticalScrollBarPolicy(
|
JScrollPane scrollPaneBattery = new JScrollPane(panelInsideScrollPaneBattery);
|
||||||
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
JScrollPane scrollPaneSmileys = new JScrollPane(panelInsideScrollPaneSmileys);
|
||||||
scrollPane.setPreferredSize(
|
JScrollPane scrollPaneTest = new JScrollPane(panelInsideScrollPaneTest);
|
||||||
new Dimension(getWidth() - 50, getHeight() - 100));
|
JScrollPane scrollPaneMisc = new JScrollPane(panelInsideScrollPaneMisc);
|
||||||
scrollPane.setWheelScrollingEnabled(true);
|
|
||||||
scrollPane.setBorder(null);
|
List<JScrollPane> scrollPanes = Stream.of(
|
||||||
// mainPanel.setBackground(Color.red);
|
scrollPaneClock,
|
||||||
// scrollPane.setBackground(Color.green);
|
scrollPaneBattery,
|
||||||
// panelInsideScrollPane.setBackground(Color.blue);
|
scrollPaneSmileys,
|
||||||
|
scrollPaneTest,
|
||||||
|
scrollPaneMisc
|
||||||
|
).toList();
|
||||||
|
|
||||||
|
tp.add("Clock", scrollPaneClock);
|
||||||
|
tp.add("Battery", scrollPaneBattery);
|
||||||
|
tp.add("Smileys", scrollPaneSmileys);
|
||||||
|
tp.add("Test", scrollPaneTest);
|
||||||
|
tp.add("Misc", scrollPaneMisc);
|
||||||
|
scrollPanes.forEach(s->
|
||||||
|
{
|
||||||
|
s.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
|
||||||
|
s.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||||
|
s.setPreferredSize(
|
||||||
|
new Dimension(720, getHeight() - 100));
|
||||||
|
s.setWheelScrollingEnabled(true);
|
||||||
|
s.setBorder(null);
|
||||||
|
// s.setBackground(Color.green);
|
||||||
|
});
|
||||||
|
|
||||||
add(mainPanel);
|
add(mainPanel);
|
||||||
|
//mainPanel.setBackground(Color.ORANGE);
|
||||||
//mainPanel.setLayout(null);
|
//mainPanel.setLayout(null);
|
||||||
mainPanel.add(enableAsMuchAsPossible);
|
mainPanel.add(enableAsMuchAsPossible);
|
||||||
enableAsMuchAsPossible
|
enableAsMuchAsPossible
|
||||||
@ -215,12 +260,10 @@ public class ConfigWindow extends TWindow {
|
|||||||
enableAsMuchAsPossible.getX() + enableAsMuchAsPossible
|
enableAsMuchAsPossible.getX() + enableAsMuchAsPossible
|
||||||
.getWidth() + SwingUtils.MARGIN, SwingUtils.MARGIN, 250,
|
.getWidth() + SwingUtils.MARGIN, SwingUtils.MARGIN, 250,
|
||||||
HEIGHT1);
|
HEIGHT1);
|
||||||
scrollPane.setBounds(enableAsMuchAsPossible.getX(),
|
|
||||||
enableAsMuchAsPossible.getY() + enableAsMuchAsPossible
|
|
||||||
.getHeight() + SwingUtils.MARGIN, Integer.MAX_VALUE,
|
|
||||||
Integer.MAX_VALUE);
|
|
||||||
|
|
||||||
mainPanel.add(scrollPane);
|
scrollPanes.stream().forEach(s->s.setBounds(10, 10, Integer.MAX_VALUE,Integer.MAX_VALUE));
|
||||||
|
|
||||||
|
mainPanel.add(tp);
|
||||||
|
|
||||||
for (boolean enable : new boolean[]{true, false}) {
|
for (boolean enable : new boolean[]{true, false}) {
|
||||||
TButton button
|
TButton button
|
||||||
@ -282,8 +325,7 @@ public class ConfigWindow extends TWindow {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
propertiesList.addAll(Arrays.asList(visibilityDefaultProperty,
|
propertiesList.addAll(Arrays.asList(
|
||||||
visibilitySupportedColoredProperty,
|
|
||||||
clockVisibleProperty,
|
clockVisibleProperty,
|
||||||
clockHandsHourVisibleProperty,
|
clockHandsHourVisibleProperty,
|
||||||
clockHandsMinuteVisibleProperty,
|
clockHandsMinuteVisibleProperty,
|
||||||
@ -333,33 +375,48 @@ public class ConfigWindow extends TWindow {
|
|||||||
circleVisibleProperty,
|
circleVisibleProperty,
|
||||||
walkingHumanVisibleProperty,
|
walkingHumanVisibleProperty,
|
||||||
mainWindowCustomTitleProperty,
|
mainWindowCustomTitleProperty,
|
||||||
profileNameProperty));
|
profileNameProperty,
|
||||||
|
visibilityDefaultProperty,
|
||||||
|
visibilitySupportedColoredProperty));
|
||||||
//
|
//
|
||||||
|
//panelInsideScrollPane
|
||||||
propertiesList.stream().forEach(p -> {
|
propertiesList.stream().forEach(p -> {
|
||||||
p.setAlignmentX(LEFT_ALIGNMENT);
|
p.setAlignmentX(LEFT_ALIGNMENT);
|
||||||
if (p == visibilityDefaultProperty) {
|
if (p == visibilityDefaultProperty) {
|
||||||
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
TimeCalcProperty.VISIBILITY_DEFAULT.getKey());
|
TimeCalcProperty.VISIBILITY_DEFAULT.getKey());
|
||||||
addToNextRow(new JLabel(
|
final JLabel jLabel = new JLabel(
|
||||||
TimeCalcProperty.VISIBILITY_DEFAULT.getDescription()));
|
TimeCalcProperty.VISIBILITY_DEFAULT.getDescription());
|
||||||
|
jLabel.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
|
TimeCalcProperty.VISIBILITY_DEFAULT.getKey());
|
||||||
|
addToNextRow(jLabel);
|
||||||
}
|
}
|
||||||
if (p == clockCircleBorderColorProperty) {
|
if (p == clockCircleBorderColorProperty) {
|
||||||
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
TimeCalcProperty.CLOCK_CIRCLE_BORDER_COLOR.getKey());
|
TimeCalcProperty.CLOCK_CIRCLE_BORDER_COLOR.getKey());
|
||||||
addToNextRow(new JLabel(
|
JComponent label = new JLabel(
|
||||||
TimeCalcProperty.CLOCK_CIRCLE_BORDER_COLOR
|
TimeCalcProperty.CLOCK_CIRCLE_BORDER_COLOR
|
||||||
.getDescription().replace("Clock : ", "")));
|
.getDescription().replace("Clock : ", ""));
|
||||||
|
label.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
|
TimeCalcProperty.CLOCK_CIRCLE_BORDER_COLOR.getKey());
|
||||||
|
addToNextRow(label);
|
||||||
}
|
}
|
||||||
if (p == mainWindowCustomTitleProperty) {
|
if (p == mainWindowCustomTitleProperty) {
|
||||||
addToNextRow(new JLabel(
|
final JLabel jLabel = new JLabel(
|
||||||
TimeCalcProperty.MAIN_WINDOW_CUSTOM_TITLE
|
TimeCalcProperty.MAIN_WINDOW_CUSTOM_TITLE
|
||||||
.getDescription()));
|
.getDescription());
|
||||||
|
jLabel.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
|
TimeCalcProperty.MAIN_WINDOW_CUSTOM_TITLE.getKey());
|
||||||
|
addToNextRow(jLabel);
|
||||||
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
TimeCalcProperty.MAIN_WINDOW_CUSTOM_TITLE.getKey());
|
TimeCalcProperty.MAIN_WINDOW_CUSTOM_TITLE.getKey());
|
||||||
}
|
}
|
||||||
if (p == profileNameProperty) {
|
if (p == profileNameProperty) {
|
||||||
addToNextRow(new JLabel(
|
final JLabel jLabel = new JLabel(
|
||||||
TimeCalcProperty.PROFILE_NAME.getDescription()));
|
TimeCalcProperty.PROFILE_NAME.getDescription());
|
||||||
|
jLabel.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
|
TimeCalcProperty.PROFILE_NAME.getKey());
|
||||||
|
addToNextRow(jLabel);
|
||||||
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
p.putClientProperty(CLIENT_PROPERTY_KEY,
|
||||||
TimeCalcProperty.PROFILE_NAME.getKey());
|
TimeCalcProperty.PROFILE_NAME.getKey());
|
||||||
}
|
}
|
||||||
@ -417,20 +474,20 @@ public class ConfigWindow extends TWindow {
|
|||||||
|
|
||||||
checkBox.setText(array.length > 1 ? (checkBox.getText()
|
checkBox.setText(array.length > 1 ? (checkBox.getText()
|
||||||
.substring(groupName.length() + 3)) : "Visible");
|
.substring(groupName.length() + 3)) : "Visible");
|
||||||
if (array.length == 1) {
|
// if (array.length == 1) {
|
||||||
panelInsideScrollPane
|
// panelInsideScrollPane
|
||||||
.add(new JSeparator(SwingConstants.VERTICAL));
|
// .add(new JSeparator(SwingConstants.VERTICAL));
|
||||||
JLabel label = new JLabel(groupName);
|
// JLabel label = new JLabel(groupName);
|
||||||
label.setFont(BIG_FONT);
|
// label.setFont(BIG_FONT);
|
||||||
panelInsideScrollPane.add(label);
|
// panelInsideScrollPane.add(label);
|
||||||
}
|
// }
|
||||||
}
|
|
||||||
if (timeCalcProperty == TimeCalcProperty.VISIBILITY_DEFAULT
|
|
||||||
|| timeCalcProperty == TimeCalcProperty.JOKES_VISIBLE) {
|
|
||||||
JLabel label = new JLabel("Misc");
|
|
||||||
label.setFont(BIG_FONT);
|
|
||||||
panelInsideScrollPane.add(label);
|
|
||||||
}
|
}
|
||||||
|
// if (timeCalcProperty == TimeCalcProperty.VISIBILITY_DEFAULT
|
||||||
|
// || timeCalcProperty == TimeCalcProperty.JOKES_VISIBLE) {
|
||||||
|
// JLabel label = new JLabel("Misc");
|
||||||
|
// label.setFont(BIG_FONT);
|
||||||
|
// panelInsideScrollPane.add(label);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
if (p instanceof JColorChooser) {
|
if (p instanceof JColorChooser) {
|
||||||
JColorChooser colorChooser = ((JColorChooser) p);
|
JColorChooser colorChooser = ((JColorChooser) p);
|
||||||
@ -497,7 +554,9 @@ public class ConfigWindow extends TWindow {
|
|||||||
String key = textField.getText();
|
String key = textField.getText();
|
||||||
textField.setText("");
|
textField.setText("");
|
||||||
textField.putClientProperty(CLIENT_PROPERTY_KEY, key);
|
textField.putClientProperty(CLIENT_PROPERTY_KEY, key);
|
||||||
addToNextRow(new JLabel(TimeCalcProperty.forKey(key).getDescription()));
|
JComponent label = new JLabel(TimeCalcProperty.forKey(key).getDescription());
|
||||||
|
label.putClientProperty(CLIENT_PROPERTY_KEY, key);
|
||||||
|
addToNextRow(label);
|
||||||
}
|
}
|
||||||
textField.setMaximumSize(new Dimension(150, 25));
|
textField.setMaximumSize(new Dimension(150, 25));
|
||||||
|
|
||||||
@ -600,15 +659,34 @@ public class ConfigWindow extends TWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addToNextRow(JComponent jComponent) {
|
private void addToNextRow(JComponent jComponent) {
|
||||||
panelInsideScrollPane.add(jComponent);
|
int index = 4;
|
||||||
jComponent.setBounds(SwingUtils.MARGIN, currentY, 200,
|
String key = (String) jComponent.getClientProperty(CLIENT_PROPERTY_KEY);
|
||||||
|
if(key == null) {
|
||||||
|
//nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(key.startsWith("clock")) index = 0;
|
||||||
|
if(key.startsWith("battery")) index = 1;
|
||||||
|
if(key.startsWith("smileys")) index = 2;
|
||||||
|
if(key.startsWith("test")) index = 3;
|
||||||
|
|
||||||
|
JPanel panel = null;
|
||||||
|
switch(index) {
|
||||||
|
case 0: panel=panelInsideScrollPaneClock;break;
|
||||||
|
case 1: panel=panelInsideScrollPaneBattery;break;
|
||||||
|
case 2: panel=panelInsideScrollPaneSmileys;break;
|
||||||
|
case 3: panel=panelInsideScrollPaneTest;break;
|
||||||
|
default:panel=panelInsideScrollPaneMisc;
|
||||||
|
}
|
||||||
|
panel.add(jComponent);
|
||||||
|
jComponent.setBounds(SwingUtils.MARGIN, currentY[index], 200,
|
||||||
HEIGHT1);
|
HEIGHT1);
|
||||||
panelInsideScrollPane.add(Box.createRigidArea(new Dimension(5, 10)));
|
panel.add(Box.createRigidArea(new Dimension(5, 10)));
|
||||||
nextRow();
|
nextRow(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nextRow() {
|
private void nextRow(int index) {
|
||||||
currentY = (int) (currentY + 3.0d * SwingUtils.MARGIN);
|
currentY[index] = (int) (currentY[index] + 3.0d * SwingUtils.MARGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doEnableEverything() {
|
public void doEnableEverything() {
|
@ -1,11 +1,13 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TWindow;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
||||||
|
|
||||||
import javax.swing.JEditorPane;
|
import javax.swing.JEditorPane;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -1,5 +1,12 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.SmallTButton;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTextField;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TLabel;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TCheckBox;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TButton;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.ComponentRegistry;
|
||||||
import org.nanoboot.utils.timecalc.app.CommandActionListener;
|
import org.nanoboot.utils.timecalc.app.CommandActionListener;
|
||||||
import org.nanoboot.utils.timecalc.app.GetProperty;
|
import org.nanoboot.utils.timecalc.app.GetProperty;
|
||||||
import org.nanoboot.utils.timecalc.app.TimeCalcApp;
|
import org.nanoboot.utils.timecalc.app.TimeCalcApp;
|
||||||
@ -44,6 +51,11 @@ import org.nanoboot.utils.timecalc.entity.WorkingDay;
|
|||||||
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.ActivityRepositoryApi;
|
||||||
import org.nanoboot.utils.timecalc.persistence.impl.sqlite.ActivityRepositorySQLiteImpl;
|
import org.nanoboot.utils.timecalc.persistence.impl.sqlite.ActivityRepositorySQLiteImpl;
|
||||||
import org.nanoboot.utils.timecalc.persistence.impl.sqlite.WorkingDayRepositorySQLiteImpl;
|
import org.nanoboot.utils.timecalc.persistence.impl.sqlite.WorkingDayRepositorySQLiteImpl;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.AboutButton;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.Toaster;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.WeekStatistics;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.Widget;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,8 +103,8 @@ public class MainWindow extends TWindow {
|
|||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
this.arrivalTextField = new TTextField("", 40);
|
this.arrivalTextField = new TTextField(Constants.DEFAULT_ARRIVAL_TIME, 40);
|
||||||
this.overtimeTextField = new TTextField("", 40);
|
this.overtimeTextField = new TTextField(Constants.DEFAULT_OVERTIME, 40);
|
||||||
this.workingTimeTextField = new TTextField("8:00", 40);
|
this.workingTimeTextField = new TTextField("8:00", 40);
|
||||||
this.pauseTimeTextField = new TTextField("0:30", 40);
|
this.pauseTimeTextField = new TTextField("0:30", 40);
|
||||||
this.noteTextField = new TTextField("", 100);
|
this.noteTextField = new TTextField("", 100);
|
||||||
@ -101,8 +113,7 @@ public class MainWindow extends TWindow {
|
|||||||
this.remainingTextField = new TTextField("", 100);
|
this.remainingTextField = new TTextField("", 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MainWindow(String startTimeIn, String overTimeIn,
|
public MainWindow(TimeCalcApp timeCalcApp) {
|
||||||
TimeCalcApp timeCalcApp) {
|
|
||||||
// ToolTipManager ttm = ToolTipManager.sharedInstance();
|
// ToolTipManager ttm = ToolTipManager.sharedInstance();
|
||||||
// ttm.setInitialDelay(0);
|
// ttm.setInitialDelay(0);
|
||||||
// ttm.setDismissDelay(10000);
|
// ttm.setDismissDelay(10000);
|
||||||
@ -120,11 +131,22 @@ public class MainWindow extends TWindow {
|
|||||||
timeCalcConfiguration.mainWindowCustomTitleProperty.addListener(e -> {
|
timeCalcConfiguration.mainWindowCustomTitleProperty.addListener(e -> {
|
||||||
setTitle(getWindowTitle());
|
setTitle(getWindowTitle());
|
||||||
});
|
});
|
||||||
overTimeIn = (overTimeIn == null || overTimeIn.isEmpty())
|
Time time = new Time();
|
||||||
? Constants.DEFAULT_OVERTIME : overTimeIn;
|
time.yearCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testYearCustomProperty);
|
||||||
arrivalTextField.valueProperty.setValue(startTimeIn);
|
time.monthCustomProperty
|
||||||
overtimeTextField.valueProperty.setValue(overTimeIn);
|
.bindTo(timeCalcConfiguration.testMonthCustomProperty);
|
||||||
|
time.dayCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testDayCustomProperty);
|
||||||
|
time.hourCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testHourCustomProperty);
|
||||||
|
time.minuteCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testMinuteCustomProperty);
|
||||||
|
time.secondCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testSecondCustomProperty);
|
||||||
|
time.millisecondCustomProperty
|
||||||
|
.bindTo(timeCalcConfiguration.testMillisecondCustomProperty);
|
||||||
|
time.allowCustomValuesProperty.setValue(true);
|
||||||
|
|
||||||
arrivalTextField.addVetoableChangeListener(e -> {
|
arrivalTextField.addVetoableChangeListener(e -> {
|
||||||
String newValue = (String) e.getNewValue();
|
String newValue = (String) e.getNewValue();
|
||||||
@ -168,7 +190,6 @@ public class MainWindow extends TWindow {
|
|||||||
}
|
}
|
||||||
Toaster.notificationsVisibleProperty.bindTo(timeCalcConfiguration.notificationsVisibleProperty);
|
Toaster.notificationsVisibleProperty.bindTo(timeCalcConfiguration.notificationsVisibleProperty);
|
||||||
|
|
||||||
Time time = new Time();
|
|
||||||
TimeCalcKeyAdapter timeCalcKeyAdapter
|
TimeCalcKeyAdapter timeCalcKeyAdapter
|
||||||
= new TimeCalcKeyAdapter(timeCalcConfiguration, timeCalcApp,
|
= new TimeCalcKeyAdapter(timeCalcConfiguration, timeCalcApp,
|
||||||
this, time);
|
this, time);
|
||||||
@ -311,7 +332,7 @@ public class MainWindow extends TWindow {
|
|||||||
pauseDecreaseButton.setBounds(pauseTimeTextField.getX() + pauseTimeTextField.getWidth(), pauseTimeTextField.getY() + 15, 15, 15);
|
pauseDecreaseButton.setBounds(pauseTimeTextField.getX() + pauseTimeTextField.getWidth(), pauseTimeTextField.getY() + 15, 15, 15);
|
||||||
|
|
||||||
//
|
//
|
||||||
TLabel noteTextFieldLabel = new TLabel("Note:", 30);
|
TLabel noteTextFieldLabel = new TLabel("Note:", 40);
|
||||||
noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField, 10);
|
noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField, 10);
|
||||||
|
|
||||||
noteTextField.setBoundsFromLeft(noteTextFieldLabel);
|
noteTextField.setBoundsFromLeft(noteTextFieldLabel);
|
||||||
@ -466,21 +487,6 @@ public class MainWindow extends TWindow {
|
|||||||
helpWindow.setVisible(true);
|
helpWindow.setVisible(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
time.yearCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testYearCustomProperty);
|
|
||||||
time.monthCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testMonthCustomProperty);
|
|
||||||
time.dayCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testDayCustomProperty);
|
|
||||||
time.hourCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testHourCustomProperty);
|
|
||||||
time.minuteCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testMinuteCustomProperty);
|
|
||||||
time.secondCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testSecondCustomProperty);
|
|
||||||
time.millisecondCustomProperty
|
|
||||||
.bindTo(timeCalcConfiguration.testMillisecondCustomProperty);
|
|
||||||
time.allowCustomValuesProperty.setValue(true);
|
|
||||||
clock.dayProperty.bindTo(time.dayProperty);
|
clock.dayProperty.bindTo(time.dayProperty);
|
||||||
clock.monthProperty.bindTo(time.monthProperty);
|
clock.monthProperty.bindTo(time.monthProperty);
|
||||||
clock.yearProperty.bindTo(time.yearProperty);
|
clock.yearProperty.bindTo(time.yearProperty);
|
||||||
@ -612,27 +618,6 @@ public class MainWindow extends TWindow {
|
|||||||
+ 3 * SwingUtils.MARGIN,
|
+ 3 * SwingUtils.MARGIN,
|
||||||
focusButton.getY() + focusButton.getHeight() + SwingUtils.MARGIN
|
focusButton.getY() + focusButton.getHeight() + SwingUtils.MARGIN
|
||||||
+ focusButton.getHeight() + 2 * SwingUtils.MARGIN);
|
+ focusButton.getHeight() + 2 * SwingUtils.MARGIN);
|
||||||
|
|
||||||
// progressCircle.visibleProperty.addListener(e -> {
|
|
||||||
// System.out.println("visibility of circle was changed");
|
|
||||||
// if(progressSquare.visibleProperty.isEnabled() || progressCircle.visibleProperty.isEnabled()) {
|
|
||||||
// System.out.println("square or circle is visible");
|
|
||||||
// arrivalTextFieldLabel.setBoundsFromTop(progressSquare);
|
|
||||||
// } else {
|
|
||||||
// System.out.println("square and circle are not visible");
|
|
||||||
// arrivalTextFieldLabel.setBoundsFromTop(clock);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// progressSquare.visibleProperty.addListener(e -> {
|
|
||||||
// System.out.println("visibility of square was changed");
|
|
||||||
// if(progressSquare.visibleProperty.isEnabled() || progressCircle.visibleProperty.isEnabled()) {
|
|
||||||
// System.out.println("square or circle is visible");
|
|
||||||
// arrivalTextFieldLabel.setBoundsFromTop(progressSquare);
|
|
||||||
// } else {
|
|
||||||
// System.out.println("square and circle are not visible");
|
|
||||||
// arrivalTextFieldLabel.setBoundsFromTop(clock);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
saveButton.addActionListener(e -> {
|
saveButton.addActionListener(e -> {
|
||||||
|
|
||||||
@ -645,8 +630,7 @@ public class MainWindow extends TWindow {
|
|||||||
int year = cal.get(Calendar.YEAR);
|
int year = cal.get(Calendar.YEAR);
|
||||||
int month = cal.get(Calendar.MONTH) + 1;
|
int month = cal.get(Calendar.MONTH) + 1;
|
||||||
int day = cal.get(Calendar.DAY_OF_MONTH);
|
int day = cal.get(Calendar.DAY_OF_MONTH);
|
||||||
Utils.writeTextToFile(FileConstants.STARTTIME_TXT, arrivalTextField.asTTime().toString().substring(0, 5));
|
|
||||||
Utils.writeTextToFile(FileConstants.OVERTIME_TXT, overtime_.toString().substring(0, overtime_.isNegative() ? 6 : 5));
|
|
||||||
timeCalcConfiguration.saveToTimeCalcProperties();
|
timeCalcConfiguration.saveToTimeCalcProperties();
|
||||||
WorkingDay workingDay = workingDayRepository.read(time.asCalendar());
|
WorkingDay workingDay = workingDayRepository.read(time.asCalendar());
|
||||||
if (workingDay == null) {
|
if (workingDay == null) {
|
||||||
@ -675,6 +659,10 @@ public class MainWindow extends TWindow {
|
|||||||
WorkingDay wd = workingDayRepository.read(time.asCalendar());
|
WorkingDay wd = workingDayRepository.read(time.asCalendar());
|
||||||
|
|
||||||
if (wd != null) {
|
if (wd != null) {
|
||||||
|
arrivalTextField.valueProperty.setValue(new TTime(wd.getArrivalHour(), wd.getArrivalMinute()).toString().substring(0, 5));
|
||||||
|
TTime overtime = new TTime(wd.getOvertimeHour(), wd.getOvertimeMinute());
|
||||||
|
overtimeTextField.valueProperty.setValue(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5));
|
||||||
|
//
|
||||||
workingTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getWorkingTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
|
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));
|
pauseTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getPauseTimeInMinutes() * 60 * 1000).toString().substring(0, 5));
|
||||||
noteTextField.valueProperty.setValue(wd.getNote());
|
noteTextField.valueProperty.setValue(wd.getNote());
|
||||||
@ -690,26 +678,15 @@ public class MainWindow extends TWindow {
|
|||||||
wd.setYear(year);
|
wd.setYear(year);
|
||||||
wd.setMonth(month);
|
wd.setMonth(month);
|
||||||
wd.setDay(day);
|
wd.setDay(day);
|
||||||
|
wd.setArrivalHour(7);
|
||||||
|
wd.setArrivalMinute(0);
|
||||||
|
wd.setOvertimeHour(0);
|
||||||
|
wd.setOvertimeMinute(0);
|
||||||
wd.setWorkingTimeInMinutes(480);
|
wd.setWorkingTimeInMinutes(480);
|
||||||
wd.setPauseTimeInMinutes(30);
|
wd.setPauseTimeInMinutes(30);
|
||||||
wd.setNote("");
|
wd.setNote("");
|
||||||
wd.setTimeOff(false);
|
wd.setTimeOff(false);
|
||||||
}
|
}
|
||||||
TTime arrival_ = new TTime(arrivalTextField.getText());
|
|
||||||
TTime overtime_ = new TTime(overtimeTextField.getText());
|
|
||||||
// TTime work_ = new TTime(workingTimeTextField.getText());
|
|
||||||
// TTime pause_ = new TTime(pauseTimeTextField.getText());
|
|
||||||
|
|
||||||
// System.out.println("arrival_=" + arrival_);
|
|
||||||
// System.out.println("overtime_=" + overtime_);
|
|
||||||
// System.out.println("work_=" + work_);
|
|
||||||
// System.out.println("pause_=" + pause_);
|
|
||||||
|
|
||||||
wd.setArrivalHour(arrival_.getHour());
|
|
||||||
wd.setArrivalMinute(arrival_.getMinute());
|
|
||||||
|
|
||||||
wd.setOvertimeHour(overtime_.getHour() * (overtime_.isNegative() ? (-1) : 1));
|
|
||||||
wd.setOvertimeMinute(overtime_.getMinute() * (overtime_.isNegative() ? (-1) : 1));
|
|
||||||
|
|
||||||
workingDayRepository.update(wd);
|
workingDayRepository.update(wd);
|
||||||
|
|
||||||
@ -719,12 +696,33 @@ public class MainWindow extends TWindow {
|
|||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
File dbFileBackup = new File(dbFile.getAbsolutePath() + ".backup." + DateFormats.DATE_TIME_FORMATTER_SHORT.format(new Date()).substring(0, 10) + ".sqlite3");
|
if(Math.random() > 0.99) {
|
||||||
if(dbFile.exists() && !dbFileBackup.exists()) {
|
File dbFileBackup = new File(dbFile.getAbsolutePath() + ".backup." + DateFormats.DATE_TIME_FORMATTER_SHORT.format(new Date()).substring(0, 10) + ".sqlite3");
|
||||||
try {
|
if (dbFile.exists() && !dbFileBackup.exists()) {
|
||||||
Files.copy(dbFile.toPath(), dbFileBackup.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
try {
|
||||||
} catch (IOException e) {
|
Files.copy(dbFile.toPath(), dbFileBackup.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
e.printStackTrace();
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(File file: FileConstants.TC_DIRECTORY.listFiles()) {
|
||||||
|
if(file.getName().startsWith(dbFile.getName() + ".backup")) {
|
||||||
|
try {
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
long diff = now - Files.getLastModifiedTime(file.toPath()).toMillis();
|
||||||
|
int fileAgeInDays = (int) (diff/ 1000 / 60 / 60 / 24);
|
||||||
|
System.out.println("Found backup file " + file.getName() + "with age: " + fileAgeInDays);
|
||||||
|
if(fileAgeInDays > 14) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
System.err.println("Deleting old backups failed: " + ex.getMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
||||||
|
|
@ -1,5 +1,10 @@
|
|||||||
package org.nanoboot.utils.timecalc.swing.common;
|
package org.nanoboot.utils.timecalc.swing.windows;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTextField;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TLabel;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TCheckBox;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TWindow;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TTabbedPane;
|
||||||
import org.nanoboot.utils.timecalc.entity.WorkingDay;
|
import org.nanoboot.utils.timecalc.entity.WorkingDay;
|
||||||
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
|
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
|
||||||
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
|
||||||
@ -9,7 +14,6 @@ import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
|
|||||||
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
import org.nanoboot.utils.timecalc.utils.common.Utils;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.InvalidationListener;
|
import org.nanoboot.utils.timecalc.utils.property.InvalidationListener;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.Property;
|
|
||||||
|
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
@ -25,6 +29,9 @@ import java.awt.event.KeyListener;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.ArrivalChart;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.ArrivalChartData;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
@ -6,7 +6,7 @@ package org.nanoboot.utils.timecalc.utils.common;
|
|||||||
*/
|
*/
|
||||||
public class Constants {
|
public class Constants {
|
||||||
|
|
||||||
public static final String DEFAULT_START_TIME = "7:00";
|
public static final String DEFAULT_ARRIVAL_TIME = "7:00";
|
||||||
public static final String DEFAULT_OVERTIME = "0:00";
|
public static final String DEFAULT_OVERTIME = "0:00";
|
||||||
public static final String NEW_LINE = "\n";
|
public static final String NEW_LINE = "\n";
|
||||||
|
|
||||||
|
@ -9,10 +9,6 @@ import java.io.File;
|
|||||||
public class FileConstants {
|
public class FileConstants {
|
||||||
|
|
||||||
public static final File TC_DIRECTORY = new File(".tc");
|
public static final File TC_DIRECTORY = new File(".tc");
|
||||||
public static final File STARTTIME_TXT
|
|
||||||
= new File(TC_DIRECTORY, "starttime.txt");
|
|
||||||
public static final File OVERTIME_TXT
|
|
||||||
= new File(TC_DIRECTORY, "overtime.txt");
|
|
||||||
public static final File TEST_TXT = new File(TC_DIRECTORY, "test.txt");
|
public static final File TEST_TXT = new File(TC_DIRECTORY, "test.txt");
|
||||||
public static final File TIME_CALC_PROFILES_TXT_FILE
|
public static final File TIME_CALC_PROFILES_TXT_FILE
|
||||||
= new File(TC_DIRECTORY, "time-calc-profiles.txt");
|
= new File(TC_DIRECTORY, "time-calc-profiles.txt");
|
||||||
|
@ -8,18 +8,42 @@ _Time Calc is written in Java programming language and uses the Swing framework.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Time Calc is inspired by this document: [report.ods](https://code.nanoboot.org/nanoboot/time-calc/raw/branch/rvc/report.ods)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Screenshots
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### Start of application
|
### Start of application
|
||||||
|
|
||||||
When "Time Calc" is started", user is asked for:
|
When "Time Calc" is started", user is asked for:
|
||||||
- start time ... like 7:30
|
- start time ... like 7:30
|
||||||
- overtime ... like 0:45 ... overtime is optional and the default value is 0:00
|
- overtime ... like 0:45 ... overtime is optional and the default value is 0:00
|
||||||
|
|
||||||
### Restart of application
|
### Restart of application
|
||||||
|
|
||||||
You can restart the app, if you press the **"Restart"** button.
|
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
|
### End of application
|
||||||
|
|
||||||
@ -33,7 +57,7 @@ If these files are present, something special happens.
|
|||||||
|
|
||||||
### .tc/starttime.txt
|
### .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.
|
If file starttime.txt does not exist, then the default start time is 7:00.
|
||||||
|
|
||||||
### .tc/overtime.txt
|
### .tc/overtime.txt
|
||||||
@ -41,9 +65,6 @@ If file starttime.txt does not exist, then the default start time is 7:00.
|
|||||||
This file contains the default overtime - used during the previous run of the app.
|
This file contains the default overtime - used during the previous run of the app.
|
||||||
If file overtime.txt does not exist, then the default overtime is 0:00.
|
If file overtime.txt does not exist, then the default overtime is 0:00.
|
||||||
|
|
||||||
### .tc/test.txt
|
|
||||||
If file test.txt exists, then user is not asked for start time and overtime. Instead, the values in files starttime.txt and overtime.txt are used.
|
|
||||||
|
|
||||||
### ./tc/timecalc.conf
|
### ./tc/timecalc.conf
|
||||||
|
|
||||||
Configuration is stored here.
|
Configuration is stored here.
|
||||||
@ -64,29 +85,29 @@ Optional assignments of profiles to numbers is stored here.
|
|||||||
|
|
||||||
### 3 Visibility modes
|
### 3 Visibility modes
|
||||||
|
|
||||||
* STRONGLY_COLORED - many colors
|
* STRONGLY_COLORED - many colors
|
||||||
* WEAKLY_COLORED - darkened colors
|
* WEAKLY_COLORED - darkened colors
|
||||||
* GRAY - gray colors
|
* GRAY - gray colors
|
||||||
* NONE - widgets are hidden
|
* NONE - widgets are hidden
|
||||||
|
|
||||||
### Widgets
|
### Widgets
|
||||||
|
|
||||||
#### Analog Clock
|
#### Analog Clock
|
||||||
|
|
||||||
* hour hand
|
* hour hand
|
||||||
* minute hand (can be disabled in configuration)
|
* minute hand (can be disabled in configuration)
|
||||||
* second hand (can be disabled in configuration)
|
* second hand (can be disabled in configuration)
|
||||||
* millisecond 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 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
|
* 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)
|
* hands can be long or shorter (can be set in configuration)
|
||||||
|
|
||||||
#### Progress Square
|
#### Progress Square
|
||||||
* Show graphically day progress
|
* Show graphically day progress
|
||||||
|
|
||||||
#### Progress Circle
|
#### Progress Circle
|
||||||
|
|
||||||
* Show graphically day progress
|
* Show graphically day progress
|
||||||
|
|
||||||
#### Hour Battery
|
#### Hour Battery
|
||||||
|
|
||||||
@ -188,12 +209,12 @@ Smileys can be colored or white-black (can be set in configuration)
|
|||||||
|
|
||||||
### New features
|
### New features
|
||||||
|
|
||||||
* Custom arrival target
|
* Custom arrival target
|
||||||
* Split to Maven modules
|
* Split to Maven modules
|
||||||
* Junit, Mockito, etc.
|
* Junit, Mockito, etc.
|
||||||
* Checkstyle
|
* Checkstyle
|
||||||
* Sonarlint
|
* Sonarlint
|
||||||
* Sonarqube
|
* Sonarqube
|
||||||
|
|
||||||
### Fix these known bugs
|
### Fix these known bugs
|
||||||
|
|
||||||
|