Added sqlite support - wip 2

This commit is contained in:
Robert Vokac 2024-03-09 12:06:06 +00:00
parent 9c4577dddd
commit 32fc2a338d
No known key found for this signature in database
GPG Key ID: 693D30BEE3329055
17 changed files with 810 additions and 144 deletions

View File

@ -165,10 +165,14 @@ Smileys can be colored or white-black (can be set in configuration)
* LEFT - switch to previous profile
* RIGHT - switch to next profile
* K - hide or show clock
* SHIFT + {Y,O,D,H,M,S or I} - Increase test time value
* CTRL + {Y,O,D,H,M,S or I} - Decrease test time value
* ALT + {Y,O,D,H,M,S or I} - Rest test time value
* SHIFT + {Y,N,D,H,M,S or I} - Increase test time value
* 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 time by 1 minute
## Command button

View File

@ -69,6 +69,7 @@ public class TimeCalcApp {
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(),
e.getMessage(), JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}

View File

@ -55,12 +55,15 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
private void processTestModeKeyCode(int keyCode, boolean shiftDown,
boolean ctrlDown, boolean altDown) {
if (shiftDown && ctrlDown) {
Utils.showNotification("Following key shortcut is not supported: SHIFT + CTRL");
return;
}
if (shiftDown && altDown) {
Utils.showNotification("Following key shortcut is not supported: SHIFT + ALT");
return;
}
if (ctrlDown && altDown) {
Utils.showNotification("Following key shortcut is not supported: CTRL + ALT");
return;
}
boolean increase = shiftDown;
@ -73,7 +76,7 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
Calendar.YEAR);
break;
}
case KeyEvent.VK_O: {
case KeyEvent.VK_N: {
//Utils.showNotification((increase ? "Increasing" : (decrease ? "Decreasing" : "Reseting")) + " month.");
updateProperty(timeCalcConfiguration.testMonthCustomProperty, increase, decrease, reset,
Calendar.MONTH);
@ -109,10 +112,30 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
Calendar.MILLISECOND);
break;
}
case KeyEvent.VK_A: {
//Utils.showNotification((increase ? "Increasing" : (decrease ? "Decreasing" : "Reseting")) + " millisecond.");
if(increase) {
window.increaseArrivalByOneMinute();
}
if(decrease) {
window.decreaseArrivalByOneMinute();
}
break;
}
case KeyEvent.VK_O: {
//Utils.showNotification((increase ? "Increasing" : (decrease ? "Decreasing" : "Reseting")) + " millisecond.");
if(increase) {
window.increaseOvertimeByOneMinute();
}
if(decrease) {
window.decreaseOvertimeByOneMinute();
}
break;
}
default:
Utils.showNotification(
"Unsupported key was pressed. There is no key shortcut for this key: "
+ keyCode);
// Utils.showNotification(
// "Unsupported key was pressed. There is no key shortcut for this key: "
// + keyCode);
}
}
@ -229,7 +252,7 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
} else {
timeCalcApp.visibilityProperty
.setValue(Visibility.GRAY.name());
MainWindow.hideShowCheckBox.setSelected(false);
MainWindow.hideShowFormsCheckBox.setSelected(false);
}
break;
}
@ -341,8 +364,8 @@ public class TimeCalcKeyAdapter extends KeyAdapter {
}
case KeyEvent.VK_B: {
MainWindow.hideShowCheckBox
.setSelected(!MainWindow.hideShowCheckBox.isSelected());
MainWindow.hideShowFormsCheckBox
.setSelected(!MainWindow.hideShowFormsCheckBox.isSelected());
break;
}
case KeyEvent.VK_F: {

View File

@ -33,10 +33,12 @@ class WorkingDayTable {
public static final String YEAR = "YEAR";
public static final String MONTH = "MONTH";
public static final String DAY = "DAY";
public static final String ARRIVAL_HOUR = "ARRIVAL_HOUR";
public static final String ARRIVAL_MINUTE = "ARRIVAL_MINUTE";
public static final String HALF_DAY = "HALF_DAY";
public static final String OVERTIME_HOUR = "OVERTIME_HOUR";
public static final String OVERTIME_MINUTE = "OVERTIME_MINUTE";
public static final String PAUSE_TIME_IN_MINUTES = "PAUSE_TIME_IN_MINUTES";
public static final String NOTE = "NOTE";

View File

@ -36,8 +36,8 @@ public class ComponentRegistry<T extends Component> {
public void setVisible(Predicate<Component> predicate, boolean b) {
for (T c : set) {
if (c instanceof TButton) {
if (!MainWindow.hideShowCheckBox.isSelected() && b) {
if (c instanceof TButton || c instanceof TTextField || c instanceof TLabel || c instanceof TCheckBox) {
if (!MainWindow.hideShowFormsCheckBox.isSelected() && b) {
continue;
}
}

View File

@ -281,7 +281,7 @@ public class ConfigWindow extends TWindow {
squareVisibleProperty.setSelected(enable);
circleVisibleProperty.setSelected(enable);
walkingHumanVisibleProperty.setSelected(enable);
MainWindow.hideShowCheckBox.setSelected(enable);
MainWindow.hideShowFormsCheckBox.setSelected(enable);
});
}

View File

@ -22,16 +22,15 @@ import org.nanoboot.utils.timecalc.swing.progress.WeekBattery;
import org.nanoboot.utils.timecalc.swing.progress.YearBattery;
import org.nanoboot.utils.timecalc.utils.common.Constants;
import org.nanoboot.utils.timecalc.utils.common.Jokes;
import org.nanoboot.utils.timecalc.utils.common.TimeHM;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Component;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Calendar;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
/**
* @author Robert Vokac
@ -41,7 +40,7 @@ public class MainWindow extends TWindow {
public static final Color BACKGROUND_COLOR = new Color(238, 238, 238);
public static final Color FOREGROUND_COLOR = new Color(210, 210, 210);
public static final JCheckBox hideShowCheckBox = new JCheckBox();
public static final JCheckBox hideShowFormsCheckBox = new JCheckBox();
private final TButton workDaysButton;
private final TButton activitiesButton;
private final TButton exitButton;
@ -55,12 +54,30 @@ public class MainWindow extends TWindow {
private final AboutButton aboutButton;
private final TimeCalcConfiguration timeCalcConfiguration
= new TimeCalcConfiguration();
private final TTextField arrivalTextField;
private final TTextField overtimeTextField;
private final TCheckBox halfDayCheckBox;
private final TTextField pauseTimeInMinutesTextField;
private final TTextField noteTextField;
private final TTextField departureTextField;
private final TTextField elapsedTextField;
private final TTextField remainingTextField;
private HelpWindow helpWindow = null;
private ConfigWindow configWindow = null;
private ActivitiesWindow activitiesWindow = null;
private WorkingDaysWindow workingDaysWindow = null;
private boolean stopBeforeEnd = false;
{
this.arrivalTextField = new TTextField();
this.overtimeTextField = new TTextField();
this.halfDayCheckBox = new TCheckBox("Half day:", false);
this.pauseTimeInMinutesTextField = new TTextField("30");
this.noteTextField = new TTextField();
this.departureTextField = new TTextField();
this.elapsedTextField = new TTextField("", 100);
this.remainingTextField = new TTextField("", 100);
}
public MainWindow(String startTimeIn, String overTimeIn,
TimeCalcApp timeCalcApp) {
setFocusable(true);
@ -77,23 +94,25 @@ public class MainWindow extends TWindow {
timeCalcConfiguration.mainWindowCustomTitleProperty.addListener(e -> {
setTitle(getWindowTitle());
});
overTimeIn = (overTimeIn == null || overTimeIn.isEmpty())
? Constants.DEFAULT_OVERTIME : overTimeIn;
TimeHM startTime = new TimeHM(startTimeIn);
TimeHM overtime = new TimeHM(overTimeIn);
arrivalTextField.valueProperty.setValue(startTimeIn);
overtimeTextField.valueProperty.setValue(overTimeIn);
TimeHM endTime = new TimeHM(
startTime.getHour() + Constants.WORKING_HOURS_LENGTH + overtime
.getHour(),
startTime.getMinute() + Constants.WORKING_MINUTES_LENGTH
+ overtime.getMinute());
int totalMinutes = TimeHM.countDiffInMinutes(startTime, endTime);
int totalSeconds = totalMinutes * TimeHM.SECONDS_PER_MINUTE;
int totalMilliseconds = totalSeconds * TimeHM.MILLISECONDS_PER_SECOND;
arrivalTextField.addVetoableChangeListener(e -> {
String newValue = (String) e.getNewValue();
if(newValue.isEmpty()) {
throw new PropertyVetoException("Arrival must not be empty.", new PropertyChangeEvent(e.getSource(), e.getPropertyName(), e.getOldValue(), e.getNewValue()));
}
});
overtimeTextField.addVetoableChangeListener(e -> {
String newValue = (String) e.getNewValue();
if(newValue.isEmpty()) {
throw new PropertyVetoException("Overtime must not be empty.", new PropertyChangeEvent(e.getSource(), e.getPropertyName(), e.getOldValue(), e.getNewValue()));
}
});
this.configButton = new TButton("Config");
this.workDaysButton = new TButton("Work Days");
this.activitiesButton = new TButton("Activities"
@ -110,7 +129,7 @@ public class MainWindow extends TWindow {
//window.add(weatherButton);
addAll(configButton, workDaysButton, activitiesButton, restartButton,
exitButton, focusButton, helpButton, commandButton, jokeButton,
hideShowCheckBox);
hideShowFormsCheckBox);
timeCalcApp.visibilityProperty
.bindTo(timeCalcConfiguration.visibilityDefaultProperty);
@ -124,7 +143,29 @@ public class MainWindow extends TWindow {
this, time);
addKeyListener(timeCalcKeyAdapter);
AnalogClock analogClock = new AnalogClock(startTime, endTime);
AnalogClock analogClock = new AnalogClock();
{
arrivalTextField.valueProperty.addListener(e -> {
if (!arrivalTextField.valueProperty.getValue().isEmpty()) {
TTime startTime_ = arrivalTextField.asTimeHM();
analogClock.startHourProperty
.setValue(startTime_.getHour());
analogClock.startMinuteProperty
.setValue(startTime_.getMinute());
}
});
departureTextField.valueProperty.addListener(e -> {
if (!departureTextField.valueProperty.getValue().isEmpty()) {
TTime endTime = arrivalTextField.asTimeHM();
analogClock.endHourProperty
.setValue(endTime.getHour());
analogClock.endMinuteProperty
.setValue(endTime.getMinute());
}
});
}
analogClock.setBounds(SwingUtils.MARGIN, SwingUtils.MARGIN, 200);
add(analogClock);
@ -160,7 +201,71 @@ public class MainWindow extends TWindow {
+ walkingHumanProgress.getHeight()
+ SwingUtils.MARGIN);
configButton.setBoundsFromTop(walkingHumanProgress);
TLabel arrivalTextFieldLabel = new TLabel("Arrival:");
arrivalTextFieldLabel.setBoundsFromTop(walkingHumanProgress);
arrivalTextField.setBoundsFromLeft(arrivalTextFieldLabel);
//
TLabel overtimeTextFieldLabel = new TLabel("Overtime:");
overtimeTextFieldLabel.setBoundsFromLeft(arrivalTextField);
overtimeTextField.setBoundsFromLeft(overtimeTextFieldLabel);
//
halfDayCheckBox.setBoundsFromLeft(overtimeTextField);
//
TLabel pauseTimeInMinutesFieldLabel = new TLabel("Pause:");
pauseTimeInMinutesFieldLabel.setBoundsFromLeft(halfDayCheckBox);
pauseTimeInMinutesTextField.setBoundsFromLeft(pauseTimeInMinutesFieldLabel);
//
TLabel noteTextFieldLabel = new TLabel("Note:");
noteTextFieldLabel.setBoundsFromLeft(pauseTimeInMinutesTextField);
noteTextField.setBoundsFromLeft(noteTextFieldLabel);
//half day, pause time in minutes, note
arrivalTextField.setEditable(false);
overtimeTextField.setEditable(false);
add(arrivalTextFieldLabel);
add(arrivalTextField);
add(overtimeTextFieldLabel);
add(overtimeTextField);
add(halfDayCheckBox);
add(pauseTimeInMinutesFieldLabel);
add(pauseTimeInMinutesTextField);
add(noteTextFieldLabel);
add(noteTextField);
//
TLabel departureTextFieldLabel = new TLabel("Departure:");
departureTextFieldLabel.setBoundsFromTop(arrivalTextFieldLabel);
departureTextField.setBoundsFromLeft(departureTextFieldLabel);
departureTextField.setEditable(false);
//
TLabel elapsedTextFieldLabel = new TLabel("Elapsed:");
elapsedTextFieldLabel.setBoundsFromLeft(departureTextField);
elapsedTextField.setBoundsFromLeft(elapsedTextFieldLabel);
elapsedTextField.setEditable(false);
elapsedTextField.setEditable(false);
//
TLabel remainingTextFieldLabel = new TLabel("Remaining:", 100);
remainingTextFieldLabel.setBoundsFromLeft(elapsedTextField);
remainingTextField.setBoundsFromLeft(remainingTextFieldLabel);
remainingTextField.setEditable(false);
//
add(departureTextFieldLabel);
add(departureTextField);
add(elapsedTextFieldLabel);
add(elapsedTextField);
add(remainingTextFieldLabel);
add(remainingTextField);
//
configButton.setBoundsFromTop(departureTextFieldLabel);
workDaysButton.setBoundsFromLeft(configButton);
activitiesButton.setBoundsFromLeft(workDaysButton);
restartButton.setBoundsFromLeft(activitiesButton);
@ -171,8 +276,8 @@ public class MainWindow extends TWindow {
focusButton.setBoundsFromLeft(helpButton);
commandButton.setBoundsFromLeft(focusButton);
jokeButton.setBoundsFromLeft(commandButton);
hideShowCheckBox.setSelected(true);
hideShowCheckBox.setBounds(
hideShowFormsCheckBox.setSelected(true);
hideShowFormsCheckBox.setBounds(
jokeButton.getX() + jokeButton.getWidth() + SwingUtils.MARGIN,
jokeButton.getY(), 20, 20);
//
@ -194,11 +299,7 @@ public class MainWindow extends TWindow {
Jokes.showRandom();
}
});
hideShowCheckBox.addItemListener(e ->
{
this.requestFocus();
});
hideShowFormsCheckBox.addItemListener(e -> this.requestFocus());
exitButton.addActionListener(e
-> {
timeCalcConfiguration.saveToTimeCalcProperties();
@ -422,9 +523,20 @@ public class MainWindow extends TWindow {
focusButton.getY() + focusButton.getHeight() + SwingUtils.MARGIN
+ focusButton.getHeight() + 2 * SwingUtils.MARGIN);
while (true) {
//System.out.println("timeCalcConfiguration.handsLongProperty=" + timeCalcConfiguration.clockHandLongProperty.isEnabled());
{
TTime startTime = arrivalTextField.asTimeHM();
TTime overtime = overtimeTextField.asTimeHM();
departureTextField.valueProperty.setValue(new TTime(
startTime.getHour() + Constants.WORKING_HOURS_LENGTH + overtime
.getHour(),
startTime.getMinute() + Constants.WORKING_MINUTES_LENGTH
+ overtime.getMinute()).toString().substring(0, 5));
}
Visibility currentVisibility = Visibility
.valueOf(timeCalcApp.visibilityProperty.getValue());
if (!timeCalcConfiguration.visibilitySupportedColoredProperty
@ -465,7 +577,7 @@ public class MainWindow extends TWindow {
TimeCalcProperties.getInstance().getBooleanProperty(
TimeCalcProperty.JOKES_VISIBLE)
&& !currentVisibility.isNone()
&& MainWindow.hideShowCheckBox.isSelected());
&& MainWindow.hideShowFormsCheckBox.isSelected());
setTitle(currentVisibility.isNone() ? "" : getWindowTitle());
@ -474,17 +586,39 @@ public class MainWindow extends TWindow {
int secondNow = analogClock.secondProperty.getValue();
int millisecondNow = analogClock.millisecondProperty.getValue();
TimeHM timeRemains = new TimeHM(endTime.getHour() - hourNow,
endTime.getMinute() - minuteNow);
TTime startTime = arrivalTextField.asTimeHM();
TTime endTime = departureTextField.asTimeHM();
TTime nowTime = TTime.of(time.asCalendar());
TTime timeElapsed = TTime
.computeTimeDiff(startTime, nowTime);
TTime timeRemains = TTime.computeTimeDiff(nowTime, endTime);
String timeElapsedString = timeElapsed.toString();
String timeRemainsString = timeRemains.toString();
int secondsRemains = 60 - secondNow;
int millisecondsRemains = 1000 - millisecondNow;
if (!remainingTextField.valueProperty.getValue()
.equals(timeRemainsString)) {
remainingTextField.valueProperty.setValue(timeRemainsString);
}
if (!elapsedTextField.valueProperty.getValue()
.equals(timeElapsedString)) {
elapsedTextField.valueProperty.setValue(timeElapsedString);
}
// if (!elapsedTextField.valueProperty.getValue()
// .equals(timeElapsed.remove(new TimeHM(0,1)).toString())) {
// String s = timeElapsed.remove(new TimeHM(0,1)).toString();
// elapsedTextField.valueProperty.setValue(s + ":" + (secondNow < 10 ? "0" : "") + secondNow + ":" + (millisecondNow < 10 ? "00" : (millisecondNow < 100 ? "0" : millisecondNow)) + millisecondNow);
// }
int hourDone = Constants.WORKING_HOURS_LENGTH + overtime.getHour()
- timeRemains.getHour();
TTime overtime = overtimeTextField.asTimeHM();
int hourDone = (int) (Constants.WORKING_HOURS_LENGTH + overtime.getHour()
- timeRemains.getHour());
int minutesDone
= Constants.WORKING_MINUTES_LENGTH + overtime.getMinute()
- timeRemains.getMinute();
= (int) (Constants.WORKING_MINUTES_LENGTH + overtime.getMinute()
- timeRemains.getMinute());
int secondsDone = secondNow;
int millisecondsDone = millisecondNow;
@ -493,6 +627,13 @@ public class MainWindow extends TWindow {
int totalMillisecondsDone
= totalSecondsDone * 1000 + millisecondsDone;
int totalMinutes = TTime.countDiffInMinutes(arrivalTextField.asTimeHM(),
departureTextField.asTimeHM());
int totalSeconds = totalMinutes * TTime.SECONDS_PER_MINUTE;
int totalMilliseconds = totalSeconds * TTime.MILLISECONDS_PER_SECOND;
double done = ((double) totalMillisecondsDone)
/ ((double) totalMilliseconds);
progressSquare.setDonePercent(done);
@ -532,9 +673,9 @@ public class MainWindow extends TWindow {
yearBattery.setLabel("");
//yearBattery.setDonePercent(YearBattery.getYearProgress(2024,0,1,0,0,0,0));
int totalSecondsRemains
= (timeRemains.getHour() * 60 * 60
+ timeRemains.getMinute() * 60
+ secondsRemains);
= (int) (timeRemains.getHour() * 60 * 60
+ timeRemains.getMinute() * 60
+ secondsRemains);
int totalMillisecondsRemains
= totalSecondsRemains * 1000 + millisecondsRemains;
double totalSecondsRemainsDouble
@ -655,4 +796,18 @@ public class MainWindow extends TWindow {
this.configWindow.doDisableAlmostEverything();
}
public void increaseArrivalByOneMinute() {
arrivalTextField.valueProperty.setValue(new TTime(this.arrivalTextField.valueProperty.getValue()).add(new TTime(0, 1)).toString().substring(0, 5));
}
public void decreaseArrivalByOneMinute() {
arrivalTextField.valueProperty.setValue(new TTime(this.arrivalTextField.valueProperty.getValue()).remove(new TTime(0, 1)).toString().substring(0, 5));
}
public void increaseOvertimeByOneMinute() {
TTime newOvertime = new TTime(this.overtimeTextField.valueProperty.getValue()).add(new TTime(0, 1));
overtimeTextField.valueProperty.setValue(newOvertime.toString().substring(0, newOvertime.isNegative() ? 6 :5));
}
public void decreaseOvertimeByOneMinute() {
TTime newOvertime = new TTime(this.overtimeTextField.valueProperty.getValue()).remove(new TTime(0, 1));
overtimeTextField.valueProperty.setValue(newOvertime.toString().substring(0, newOvertime.isNegative() ? 6 :5));
}
}

View File

@ -32,7 +32,7 @@ public class TButton extends JButton implements GetProperty {
public TButton(String label) {
super(label);
new Timer(100, e -> {
if (!MainWindow.hideShowCheckBox.isSelected()) {
if (!MainWindow.hideShowFormsCheckBox.isSelected()) {
setVisible(false);
return;
} else {

View File

@ -0,0 +1,104 @@
package org.nanoboot.utils.timecalc.swing.common;
import org.nanoboot.utils.timecalc.app.GetProperty;
import org.nanoboot.utils.timecalc.entity.Visibility;
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
import org.nanoboot.utils.timecalc.utils.property.Property;
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.Timer;
import java.awt.Color;
/**
* @author Robert Vokac
* @since 21.02.2024
*/
public class TCheckBox extends JCheckBox implements GetProperty {
private static final int WIDTH = 100;
private static final int HEIGHT = 30;
private Color originalBackground;
private Color originalForeground;
public TCheckBox(String text) {
this(text, false);
}
public final BooleanProperty visibilitySupportedColoredProperty
= new BooleanProperty("visibilitySupportedColoredProperty", true);
public final BooleanProperty visibleProperty
= new BooleanProperty("visibleProperty", true);
public StringProperty visibilityProperty
= new StringProperty("visibilityProperty",
Visibility.STRONGLY_COLORED.name());
public TCheckBox(String text, boolean b) {
super(text, b);
valueProperty.setValue(b);
addActionListener( e -> valueProperty.setValue(isSelected()));
valueProperty.addListener(e ->
{
if (valueProperty.getValue().equals(getText())) {
setSelected(valueProperty.isEnabled());
}
});
new Timer(100, e -> {
if (!MainWindow.hideShowFormsCheckBox.isSelected()) {
setVisible(false);
return;
} else {
//setVisible(true);
}
Visibility visibility
= Visibility.valueOf(visibilityProperty.getValue());
setVisible(visibility.isNotNone() && visibleProperty.isEnabled());
if (!visibility.isStronglyColored() || visibility.isGray()) {
setBackground(MainWindow.BACKGROUND_COLOR);
setForeground(MainWindow.FOREGROUND_COLOR);
} else {
setOriginalBackground();
setOriginalForeground();
}
}).start();
}
public final BooleanProperty valueProperty = new BooleanProperty("");
public void setBounds(int x, int y) {
setBounds(x, y, WIDTH, HEIGHT);
this.originalBackground = getBackground();
this.originalForeground = getForeground();
}
public void setBoundsFromLeft(JComponent jComponent) {
setBounds(jComponent.getX() + jComponent.getWidth() + SwingUtils.MARGIN,
jComponent.getY());
}
public void setBoundsFromTop(JComponent jComponent) {
setBoundsFromTop(jComponent, 1);
}
public void setBoundsFromTop(JComponent jComponent, int marginCount) {
setBounds(SwingUtils.MARGIN, jComponent.getY()
+ jComponent.getHeight()
+ marginCount * SwingUtils.MARGIN);
}
public void setOriginalBackground() {
this.setBackground(originalBackground);
}
public void setOriginalForeground() {
this.setForeground(originalForeground);
}
@Override
public Property getVisibilityProperty() {
return visibilityProperty;
}
@Override
public Property getVisibilitySupportedColoredProperty() {
return visibilitySupportedColoredProperty;
}
}

View File

@ -0,0 +1,96 @@
package org.nanoboot.utils.timecalc.swing.common;
import org.nanoboot.utils.timecalc.app.GetProperty;
import org.nanoboot.utils.timecalc.entity.Visibility;
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
import org.nanoboot.utils.timecalc.utils.property.Property;
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.Color;
/**
* @author Robert Vokac
* @since 21.02.2024
*/
public class TLabel extends JLabel implements GetProperty {
private static final int WIDTH = 60;
private static final int HEIGHT = 30;
private int customWidth = 0;
private Color originalBackground;
private Color originalForeground;
public final BooleanProperty visibilitySupportedColoredProperty
= new BooleanProperty("visibilitySupportedColoredProperty", true);
public final BooleanProperty visibleProperty
= new BooleanProperty("visibleProperty", true);
public StringProperty visibilityProperty
= new StringProperty("visibilityProperty",
Visibility.STRONGLY_COLORED.name());
public TLabel(String text) {
this(text, 0);
}
public TLabel(String text, int customWidth) {
super(text);
this.customWidth = customWidth;
new Timer(100, e -> {
if (!MainWindow.hideShowFormsCheckBox.isSelected()) {
setVisible(false);
return;
} else {
//setVisible(true);
}
Visibility visibility
= Visibility.valueOf(visibilityProperty.getValue());
setVisible(visibility.isNotNone() && visibleProperty.isEnabled());
if (!visibility.isStronglyColored() || visibility.isGray()) {
setBackground(MainWindow.BACKGROUND_COLOR);
setForeground(MainWindow.FOREGROUND_COLOR);
} else {
setOriginalBackground();
setOriginalForeground();
}
}).start();
}
public void setBounds(int x, int y) {
setBounds(x, y, customWidth == 0 ? WIDTH : customWidth, HEIGHT);
this.originalBackground = getBackground();
this.originalForeground = getForeground();
}
public void setBoundsFromLeft(JComponent jComponent) {
setBounds(jComponent.getX() + jComponent.getWidth() + SwingUtils.MARGIN,
jComponent.getY());
}
public void setBoundsFromTop(JComponent jComponent) {
setBoundsFromTop(jComponent, 1);
}
public void setBoundsFromTop(JComponent jComponent, int marginCount) {
setBounds(SwingUtils.MARGIN, jComponent.getY()
+ jComponent.getHeight()
+ marginCount * SwingUtils.MARGIN);
}
public void setOriginalBackground() {
this.setBackground(originalBackground);
}
public void setOriginalForeground() {
this.setForeground(originalForeground);
}
@Override
public Property getVisibilityProperty() {
return visibilityProperty;
}
@Override
public Property getVisibilitySupportedColoredProperty() {
return visibilitySupportedColoredProperty;
}
}

View File

@ -0,0 +1,132 @@
package org.nanoboot.utils.timecalc.swing.common;
import org.nanoboot.utils.timecalc.app.GetProperty;
import org.nanoboot.utils.timecalc.entity.Visibility;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
import org.nanoboot.utils.timecalc.utils.property.Property;
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.Color;
/**
* @author Robert Vokac
* @since 21.02.2024
*/
public class TTextField extends JTextField implements GetProperty {
private static final int WIDTH = 50;
private static final int HEIGHT = 30;
private int customWidth = 0;
private Color originalBackground;
private Color originalForeground;
public final BooleanProperty visibilitySupportedColoredProperty
= new BooleanProperty("visibilitySupportedColoredProperty", true);
public final BooleanProperty visibleProperty
= new BooleanProperty("visibleProperty", true);
public StringProperty visibilityProperty
= new StringProperty("visibilityProperty",
Visibility.STRONGLY_COLORED.name());
public final StringProperty valueProperty = new StringProperty();
public TTextField() {
this("", 0);
}
public TTextField(String s) {
this(s, 0);
}
public TTextField(String s, int customWidth) {
super(s);
this.customWidth = customWidth;
valueProperty.setValue(s);
getDocument()
.addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
update(e);
}
public void removeUpdate(DocumentEvent e) {
update(e);
}
public void insertUpdate(DocumentEvent e) {
update(e);
}
private void update(DocumentEvent e) {
valueProperty.setValue(getText());
}
});
valueProperty.addListener(e ->
{
if (!valueProperty.getValue().equals(getText())) {
setText(valueProperty.getValue());
}
});
new Timer(100, e -> {
if (!MainWindow.hideShowFormsCheckBox.isSelected()) {
setVisible(false);
return;
} else {
//setVisible(true);
}
Visibility visibility
= Visibility.valueOf(visibilityProperty.getValue());
setVisible(visibility.isNotNone() && visibleProperty.isEnabled());
if (!visibility.isStronglyColored() || visibility.isGray()) {
setBackground(MainWindow.BACKGROUND_COLOR);
setForeground(MainWindow.FOREGROUND_COLOR);
} else {
setOriginalBackground();
setOriginalForeground();
}
}).start();
}
public void setBounds(int x, int y) {
setBounds(x, y, customWidth == 0 ? WIDTH : customWidth, HEIGHT);
this.originalBackground = getBackground();
this.originalForeground = getForeground();
}
public void setBoundsFromLeft(JComponent jComponent) {
setBounds(jComponent.getX() + jComponent.getWidth() + SwingUtils.MARGIN,
jComponent.getY());
}
public void setBoundsFromTop(JComponent jComponent) {
setBoundsFromTop(jComponent, 1);
}
public void setBoundsFromTop(JComponent jComponent, int marginCount) {
setBounds(SwingUtils.MARGIN, jComponent.getY()
+ jComponent.getHeight()
+ marginCount * SwingUtils.MARGIN);
}
public void setOriginalBackground() {
this.setBackground(originalBackground);
}
public void setOriginalForeground() {
this.setForeground(originalForeground);
}
@Override
public Property getVisibilityProperty() {
return visibilityProperty;
}
@Override
public Property getVisibilitySupportedColoredProperty() {
return visibilitySupportedColoredProperty;
}
public TTime asTimeHM() {
return new TTime(valueProperty.getValue());
}
}

View File

@ -5,7 +5,7 @@ import org.nanoboot.utils.timecalc.entity.Visibility;
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
import org.nanoboot.utils.timecalc.swing.common.Widget;
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
import org.nanoboot.utils.timecalc.utils.common.TimeHM;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
@ -59,8 +59,7 @@ public class AnalogClock extends Widget {
= new BooleanProperty(
TimeCalcProperty.CLOCK_DATE_VISIBLE_ONLY_IF_MOUSE_MOVING_OVER
.getKey());
private final TimeHM endTime;
private final int endAngle;
public IntegerProperty startHourProperty
= new IntegerProperty("startHourProperty");
public IntegerProperty startMinuteProperty
@ -93,25 +92,9 @@ public class AnalogClock extends Widget {
= new BooleanProperty("handsLongProperty", true);
public BooleanProperty handsColoredProperty
= new BooleanProperty("handsColoredProperty", true);
private TimeHM startTime;
private int startAngle;
private Color customCircleColor = null;
public AnalogClock(TimeHM startTimeIn,
TimeHM endTimeIn) {
this.endTime = endTimeIn.cloneInstance();
this.endAngle
= (int) ((endTime.getHour() + endTime.getMinute() / 60d) / 12d
* 360d);
if (endTime.getHour() > 12) {
endTime.setHour(endTime.getHour() - 12);
}
this.startTime = startTimeIn.cloneInstance();
this.startAngle
=
(int) ((startTime.getHour() + startTime.getMinute() / 60d) / 12d
* 360d);
public AnalogClock() {
setPreferredSize(new Dimension(200, 200));
@ -119,12 +102,31 @@ public class AnalogClock extends Widget {
-> customCircleColor = SwingUtils.getColorFromString(
centreCircleBorderColorProperty.getValue()));
}
private int computeStartAngle() {
return computeAngle(startHourProperty.getValue(), startMinuteProperty.getValue());
}
private int computeEndAngle() {
return computeAngle(endHourProperty.getValue(), endMinuteProperty.getValue());
}
private int computeAngle(TTime TTime) {
if (TTime.getHour() > 12) {
TTime.setHour(TTime.getHour() - 12);
}
return computeAngle(TTime.getHour(), TTime.getMinute());
}
private int computeAngle(int hour, int minute) {
return (int) ((hour + minute / 60d) / 12d
* 360d);
}
public static void main(String[] args) {
JFrame window = new JFrame("Analog Clock");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
AnalogClock clock
= new AnalogClock(new TimeHM("6:30"), new TimeHM("19:00"));
= new AnalogClock();
clock.startHourProperty.setValue(6);
clock.startMinuteProperty.setValue(30);
clock.endHourProperty.setValue(19);
clock.endMinuteProperty.setValue(0);
window.add(clock);
window.pack();
Time time = new Time();
@ -184,15 +186,13 @@ public class AnalogClock extends Widget {
}
if ((mouseOver || progressVisibleOnlyIfMouseMovingOverProperty
.isDisabled()) && visibility.isStronglyColored()) {
this.startTime = new TimeHM(hour, minute);
this.startAngle
= (int) ((startTime.getHour() + startTime.getMinute() / 60d)
/ 12d * 360d);
Color currentColor = g2d.getColor();
g2d.setColor(Color.YELLOW);
int startAngle = computeStartAngle();
g2d.fillArc(0, 0, side, side, -startAngle + 90,
startAngle - endAngle);
startAngle - computeEndAngle());
//System.out.println("ANGLES: " + startAngle + " " + endAngle + " " + angleDiff );
g2d.setColor(currentColor);

View File

@ -1,6 +1,6 @@
package org.nanoboot.utils.timecalc.swing.progress;
import org.nanoboot.utils.timecalc.utils.common.TimeHM;
import org.nanoboot.utils.timecalc.utils.common.TTime;
/**
* @author Robert Vokac
@ -14,7 +14,7 @@ public class HourBattery extends Battery {
super(HOUR, x, i, i1);
}
public static double getHourProgress(TimeHM timeRemains, int secondsRemains,
public static double getHourProgress(TTime timeRemains, int secondsRemains,
int millisecondsRemains) {
if (secondsRemains < 0 || millisecondsRemains < 0
|| timeRemains.getHour() < 0 || timeRemains.getMinute() < 0) {

View File

@ -8,7 +8,7 @@ import org.nanoboot.utils.timecalc.swing.common.Toaster;
import org.nanoboot.utils.timecalc.swing.common.Widget;
import org.nanoboot.utils.timecalc.utils.common.Constants;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import org.nanoboot.utils.timecalc.utils.common.TimeHM;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import org.nanoboot.utils.timecalc.utils.property.Property;
@ -40,7 +40,7 @@ public class WalkingHumanProgress extends Widget implements
private int minuteRemains;
private double done;
private double totalSecondsRemainsDouble;
private TimeHM endTime;
private TTime endTime;
public WalkingHumanProgress() {
setFont(new Font(Font.MONOSPACED, Font.PLAIN, 11));
@ -214,12 +214,12 @@ public class WalkingHumanProgress extends Widget implements
return sb.toString();
}
public void printPercentToAscii(double percent, int hourRemains,
int minuteRemains, double done,
double totalSecondsRemainsDouble, TimeHM endTime) {
public void printPercentToAscii(double percent, long hourRemains,
long minuteRemains, double done,
double totalSecondsRemainsDouble, TTime endTime) {
this.percent = percent;
this.hourRemains = hourRemains;
this.minuteRemains = minuteRemains;
this.hourRemains = (int) hourRemains;
this.minuteRemains = (int) minuteRemains;
this.done = done;
this.totalSecondsRemainsDouble = totalSecondsRemainsDouble;
this.endTime = endTime;
@ -227,7 +227,7 @@ public class WalkingHumanProgress extends Widget implements
private String createMessage(int hourRemains, int minuteRemains,
double done,
double totalSecondsRemainsDouble, TimeHM endTime) {
double totalSecondsRemainsDouble, TTime endTime) {
String msg
= "Done=" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(
done * 100) + "% Remains="

View File

@ -0,0 +1,195 @@
package org.nanoboot.utils.timecalc.utils.common;
import lombok.Getter;
import lombok.Setter;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
/**
* @author Robert Vokac
* @since 21.02.2024
*/
public class TTime implements Comparable<TTime> {
public static final int MINUTES_PER_HOUR = 60;
public static final int MILLISECONDS_PER_SECOND = 1000;
public static final int SECONDS_PER_MINUTE = 60;
@Getter
@Setter
private boolean negative;
@Getter
@Setter
private Integer hour;
@Getter
@Setter
private Integer minute;
@Getter
@Setter
private Integer second;
@Getter
@Setter
private Integer millisecond;
public TTime(long hour, long minute, long second, long millisecond) {
this((int)hour, (int)minute, (int)second, (int)millisecond);
}
public TTime(int hour, int minute) {
this(hour, minute, 0, 0);
}
public static TTime computeTimeDiff(TTime tTime1, TTime tTime2) {
return tTime2.remove(tTime1);
}
public static String printDuration(Duration duration) {
long hour = duration.get(ChronoUnit.HOURS);
long minute = duration.get(ChronoUnit.MINUTES);
long second = duration.get(ChronoUnit.SECONDS);
long millisecond = duration.get(ChronoUnit.MILLIS);
StringBuilder sb = new StringBuilder();
if (hour < 10) {
sb.append("0");
}
sb.append(minute).append(":");
if (minute < 10) {
sb.append("0");
}
sb.append(minute).append(":");
if (second < 10) {
sb.append("0");
}
sb.append(second).append(":");
if (millisecond < 10) {
sb.append("00");
} else {
if (millisecond < 100) {
sb.append("0");
}
}
return sb.toString();
}
public static TTime of(Calendar cal) {
return new TTime(
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
cal.get(Calendar.SECOND),
cal.get(Calendar.MILLISECOND));
}
public static TTime of(Duration duration) {
return new TTime(
duration.get(ChronoUnit.HOURS),
duration.get(ChronoUnit.MINUTES),
duration.get(ChronoUnit.SECONDS),
duration.get(ChronoUnit.MILLIS));
}
public TTime(String string) {
this.negative = string.startsWith("-");
if (negative) {
string = string.replace("-", "");
}
String[] array = string.split(":");
this.hour = (negative ? (1) : 1) * Integer.valueOf(array[0]);
this.minute = (negative ? (1) : 1) * Integer.valueOf(array[1]);
this.second = array.length >= 3 ? ((negative ? (1) : 1) * Integer.valueOf(array[2])) : 0;
this.millisecond = array.length >= 4 ? ((negative ? (1) : 1) * Integer.valueOf(array[3])) : 0;
}
public TTime(int hourIn, int minuteIn, int secondIn, int millisecondIn) {
this(false, hourIn, minuteIn, secondIn, millisecondIn);
}
public TTime(boolean negative, int hourIn, int minuteIn, int secondIn, int millisecondIn) {
this.hour = hourIn;
this.minute = minuteIn;
this.second = secondIn;
this.millisecond = millisecondIn;
this.negative = negative;
while (minute >= MINUTES_PER_HOUR) {
minute = minute - MINUTES_PER_HOUR;
hour = hour + 1;
}
if (minute < 0) {
minute = minute + 60;
hour = hour - 1;
}
}
public TTime remove(TTime tTimeToBeRemoved) {
TTime firstTime = this;
TTime secondTime = tTimeToBeRemoved;
boolean negative = false;
if (firstTime.compareTo(secondTime) < 0) {
secondTime = firstTime;
firstTime = tTimeToBeRemoved;
negative = true;
}
Calendar cal = firstTime.asCalendar();
cal.add(Calendar.HOUR_OF_DAY, -secondTime.hour);
cal.add(Calendar.MINUTE, -secondTime.minute);
cal.add(Calendar.SECOND, -secondTime.second);
cal.add(Calendar.MILLISECOND, -secondTime.millisecond);
TTime result = TTime.of(cal);
result.setNegative(negative);
return result;
}
public TTime add(TTime tTimeToBeAdded) {
TTime result = this.cloneInstance();
// if(result.isNegative()) {
// result.setNegative(false);
// result.remove(tTimeToBeAdded);
// result.setNegative(true);
// return result;
// }
Calendar cal = asCalendar();
cal.add(Calendar.HOUR_OF_DAY, tTimeToBeAdded.hour);
cal.add(Calendar.MINUTE, tTimeToBeAdded.minute);
cal.add(Calendar.SECOND, tTimeToBeAdded.second);
cal.add(Calendar.MILLISECOND, tTimeToBeAdded.millisecond);
result = TTime.of(cal);
return result;
}
public static int countDiffInMinutes(TTime startTime, TTime endTime) {
return (endTime.getHour() * TTime.MINUTES_PER_HOUR + endTime
.getMinute()) - (startTime.getHour() * TTime.MINUTES_PER_HOUR
+ startTime.getMinute());
}
public TTime cloneInstance() {
return new TTime(negative, hour, minute, second, millisecond);
}
public String toString() {
return (negative ? "-" : "") + (hour < 10 ? "0" : "") + hour + ":" + (minute < 10 ? "0" : "") + minute + ":" + (second < 10 ? "0" : "") + second + ":" + (millisecond < 10 ? "00" : (millisecond < 100 ? "0": "")) + millisecond;
}
public Calendar asCalendar() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, second);
cal.set(Calendar.MILLISECOND, millisecond);
return cal;
}
public Date asDate() {
return asCalendar().getTime();
}
public int toTotalMilliseconds() {
return ((negative ? (-1) : 1)) * (hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000 + millisecond) ;
}
@Override
public int compareTo(TTime o) {
int result = Integer.valueOf(toTotalMilliseconds()).compareTo(o.toTotalMilliseconds());
if(this.isNegative()) {
System.out.println("this.toTotalMilliseconds()=" + this.toTotalMilliseconds());
System.out.println("o.toTotalMilliseconds()=" + o.toTotalMilliseconds());
System.out.println("comparing: " + this + " " + o + " = " + result);
}
return result;
}
}

View File

@ -1,55 +0,0 @@
package org.nanoboot.utils.timecalc.utils.common;
import lombok.Getter;
import lombok.Setter;
/**
* @author Robert Vokac
* @since 21.02.2024
*/
public class TimeHM {
public static final int MINUTES_PER_HOUR = 60;
public static final int MILLISECONDS_PER_SECOND = 1000;
public static final int SECONDS_PER_MINUTE = 60;
@Getter
@Setter
private Integer hour;
@Getter
@Setter
private Integer minute;
public TimeHM(String string) {
boolean isNegative = string.startsWith("-");
if (isNegative) {
string = string.replace("-", "");
}
String[] array = string.split(":");
this.hour = (isNegative ? (-1) : 1) * Integer.valueOf(array[0]);
this.minute = (isNegative ? (-1) : 1) * Integer.valueOf(array[1]);
}
public TimeHM(int hourIn, int minuteIn) {
this.hour = hourIn;
this.minute = minuteIn;
while (minute >= MINUTES_PER_HOUR) {
minute = minute - MINUTES_PER_HOUR;
hour = hour + 1;
}
if (minute < 0) {
minute = minute + 60;
hour = hour - 1;
}
}
public static int countDiffInMinutes(TimeHM startTime, TimeHM endTime) {
return (endTime.getHour() * TimeHM.MINUTES_PER_HOUR + endTime
.getMinute()) - (startTime.getHour() * TimeHM.MINUTES_PER_HOUR
+ startTime.getMinute());
}
public TimeHM cloneInstance() {
return new TimeHM(hour, minute);
}
}

View File

@ -51,6 +51,10 @@ public class Property<T> {
}
public void bindTo(Property<T> anotherProperty) {
if(this == anotherProperty) {
new RuntimeException().printStackTrace();
throw new TimeCalcException("Cannot bind to self: " + getName());
}
fireValueChangedEvent(value);
this.boundToProperty = anotherProperty;
this.boundChangeListener
@ -93,7 +97,12 @@ public class Property<T> {
}
}
protected void fireValueChangedEvent(T oldValue) {
public void fireValueChangedEvent(T oldValue) {
// if (isBound()) {
// System.out.println("Property " + getName() + " calling boundProperty fire event for: " + this.boundToProperty.getName());
// this.boundToProperty.fireValueChangedEvent(oldValue);
// return;
// }
// System.out.println(name + " was changed");
for (ChangeListener listener : changeListeners) {
listener.changed(this, oldValue, value);