From 597346e5d884174e6f57abceb055b3ea8600452e Mon Sep 17 00:00:00 2001 From: Robert Vokac Date: Sun, 4 Feb 2024 17:34:56 +0000 Subject: [PATCH] Added new improvements --- .../utils/timecalc/app/TimeCalcApp.java | 2 +- .../utils/timecalc/app/TimeCalcManager.java | 10 ++- .../utils/timecalc/swing/common/Widget.java | 2 +- .../utils/timecalc/swing/progress/Time.java | 72 +++++++++++++++++++ .../timecalc/utils/common/DateFormats.java | 2 + .../utils/property/ChangeListener.java | 9 +++ .../utils/property/IntegerProperty.java | 16 +++++ .../utils/property/InvalidationListener.java | 13 ++++ .../utils/property/ObjectProperty.java | 16 +++++ .../timecalc/utils/property/Property.java | 50 +++++++++++-- .../utils/property/ReadOnlyProperty.java | 7 +- .../utils/property/WriteOnlyProperty.java | 4 +- 12 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Time.java create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ChangeListener.java create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/IntegerProperty.java create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/InvalidationListener.java create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ObjectProperty.java diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcApp.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcApp.java index 99d3bff..3e26392 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcApp.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcApp.java @@ -18,7 +18,7 @@ import java.io.IOException; public class TimeCalcApp { private long startNanoTime = 0l; - public StringProperty visibilityProperty = new StringProperty("visibilityReadWriteProperty", Visibility.STRONGLY_COLORED.name()); + public StringProperty visibilityProperty = new StringProperty("timeCalcApp.visibilityReadWriteProperty", Visibility.WEAKLY_COLORED.name()); public BooleanProperty wavesProperty = new BooleanProperty("waves", true); diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java index 4baccdb..e8f1384 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java @@ -14,6 +14,7 @@ import org.nanoboot.utils.timecalc.swing.progress.HourBattery; import org.nanoboot.utils.timecalc.swing.progress.MonthBattery; import org.nanoboot.utils.timecalc.swing.progress.ProgressCircle; import org.nanoboot.utils.timecalc.swing.progress.ProgressSquare; +import org.nanoboot.utils.timecalc.swing.progress.Time; import org.nanoboot.utils.timecalc.swing.progress.WalkingHumanProgressAsciiArt; import org.nanoboot.utils.timecalc.swing.progress.WeekBattery; import org.nanoboot.utils.timecalc.utils.common.Constants; @@ -51,6 +52,7 @@ public class TimeCalcManager { private final TimeHM endTime; private final TimeCalcApp timeCalcApp; private boolean stopBeforeEnd = false; + private Time time = new Time(); public TimeCalcManager(String startTimeIn, String overTimeIn, TimeCalcApp timeCalcApp) { @@ -170,7 +172,6 @@ public class TimeCalcManager { this.windowTitle = createWindowTitle(); window.setTitle(windowTitle); - weatherButton .addActionListener(e -> new WeatherWindow().setVisible(true)); commandButton @@ -350,8 +351,15 @@ public class TimeCalcManager { restartButton.setVisible(!Visibility.valueOf(restartButton.visibilityProperty.getValue()).isNone()); exitButton.setVisible(!Visibility.valueOf(exitButton.visibilityProperty.getValue()).isNone()); +// timeCalcApp.visibilityProperty.addListener((Property p, String oldValue, String newValue)-> { +// System.out.println("Visibility of timeCalcApp was changed FROM " + oldValue + " TO " + newValue); +// } ); +// analogClock.visibilityProperty.addListener((Property p, String oldValue, String newValue)-> { +// System.out.println("Visibility of analogClock was changed FROM " + oldValue + " TO " + newValue); +// } ); window.setSize(520 + 20 + 100, exitButton.getY() + 3 * exitButton.getHeight() + MARGIN); while (true) { + //time.writeString(); if(Math.random() > 0.95) { window.requestFocus(); } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java index bce3442..895c631 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java @@ -23,7 +23,7 @@ public class Widget extends JPanel { protected double donePercent = 0; protected boolean mouseOver = false; - public StringProperty visibilityProperty = new StringProperty("visibilityProperty", Visibility.STRONGLY_COLORED.name()); + public StringProperty visibilityProperty = new StringProperty("widget.visibilityProperty", Visibility.STRONGLY_COLORED.name()); public Widget() { setBackground(BACKGROUND_COLOR); diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Time.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Time.java new file mode 100644 index 0000000..9b676a0 --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Time.java @@ -0,0 +1,72 @@ +package org.nanoboot.utils.timecalc.swing.progress; + +import org.nanoboot.utils.timecalc.utils.property.IntegerProperty; +import org.nanoboot.utils.timecalc.utils.property.ReadOnlyProperty; + +import javax.swing.Timer; +import java.awt.Graphics; +import java.util.Calendar; +import java.util.Date; + +public class Time extends Thread { + + private IntegerProperty yearReadWriteProperty = new IntegerProperty("yearProperty"); + private IntegerProperty monthReadWriteProperty = new IntegerProperty("monthProperty"); + private IntegerProperty dayReadWriteProperty = new IntegerProperty("dayProperty"); + private IntegerProperty hourReadWriteProperty = new IntegerProperty("hourProperty"); + private IntegerProperty minuteReadWriteProperty = new IntegerProperty("minuteProperty"); + private IntegerProperty secondReadWriteProperty = new IntegerProperty("secondProperty"); + private IntegerProperty millisecondReadWriteProperty = new IntegerProperty("millisecondProperty"); + private IntegerProperty dayOfWeekReadWriteProperty = new IntegerProperty("dayOfWeek"); + public ReadOnlyProperty yearProperty = yearReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty monthProperty = monthReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty dayProperty = dayReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty hourProperty = hourReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty minuteProperty = minuteReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty secondProperty = secondReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty millisecondProperty = millisecondReadWriteProperty.asReadOnlyProperty(); + public ReadOnlyProperty dayOfWeek = dayOfWeekReadWriteProperty.asReadOnlyProperty(); + //private long lastUpdateNanoTime = 0l; + + public Time() { + this.setDaemon(true); + start(); + } + public void run() { + + while(true) { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + yearReadWriteProperty.setValue(cal.get(Calendar.YEAR)); + monthReadWriteProperty.setValue(cal.get(Calendar.MONTH) + 1); + dayReadWriteProperty.setValue(cal.get(Calendar.DAY_OF_MONTH)); + hourReadWriteProperty.setValue(cal.get(Calendar.HOUR_OF_DAY)); + minuteReadWriteProperty.setValue(cal.get(Calendar.MINUTE)); + secondReadWriteProperty.setValue(cal.get(Calendar.SECOND)); + millisecondReadWriteProperty + .setValue(cal.get(Calendar.MILLISECOND)); + int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); + dayOfWeekReadWriteProperty + .setValue(dayOfWeek == 1 ? 7 : dayOfWeek - 1); + try { + Thread.sleep(1); + } catch (InterruptedException e) { + System.out.println(e); + } + } + } + + public void writeString() { + System.out.println( + yearProperty.getValue() + " " + + monthProperty.getValue() + " " + + dayProperty.getValue() + " " + + hourProperty.getValue() + " " + + minuteProperty.getValue() + " " + + secondProperty.getValue() + " " + + millisecondProperty.getValue() + " " + + dayOfWeek.getValue() + " " + + ); + } +} \ No newline at end of file diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java index 37bbda4..bc309ed 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java @@ -20,4 +20,6 @@ public class DateFormats { // public static DateFormat DATE_TIME_FORMATTER_TIME = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH); + public static DateFormat DATE_TIME_FORMATTER_VERY_LONG = + new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss:EEEE", Locale.ENGLISH); } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ChangeListener.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ChangeListener.java new file mode 100644 index 0000000..3a65621 --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ChangeListener.java @@ -0,0 +1,9 @@ +package org.nanoboot.utils.timecalc.utils.property; + +/** + * @author Robert + * @since 23.02.2024 + */ + public interface ChangeListener { + void changed(Property property, T oldValue, T newValue); +} diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/IntegerProperty.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/IntegerProperty.java new file mode 100644 index 0000000..b6efcd9 --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/IntegerProperty.java @@ -0,0 +1,16 @@ +package org.nanoboot.utils.timecalc.utils.property; + +/** + * @author Robert + * @since 16.02.2024 + */ +public class IntegerProperty extends Property { + + public IntegerProperty(String name, Integer valueIn) { + super(name, valueIn); + } + + public IntegerProperty(String name) { + this(name, 0); + } +} diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/InvalidationListener.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/InvalidationListener.java new file mode 100644 index 0000000..9bfc896 --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/InvalidationListener.java @@ -0,0 +1,13 @@ +package org.nanoboot.utils.timecalc.utils.property; + +import javafx.beans.Observable; + +/** + * @author Robert + * @since 23.02.2024 + */ +public interface InvalidationListener { + + void invalidated(Property property); +} + diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ObjectProperty.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ObjectProperty.java new file mode 100644 index 0000000..9e9d49d --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ObjectProperty.java @@ -0,0 +1,16 @@ +package org.nanoboot.utils.timecalc.utils.property; + +/** + * @author Robert + * @since 16.02.2024 + */ +public class ObjectProperty extends Property { + + public ObjectProperty(String name, Object valueIn) { + super(name, valueIn); + } + + public ObjectProperty() { + this("", null); + } +} diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/Property.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/Property.java index 66c8ae5..0128122 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/Property.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/Property.java @@ -1,18 +1,25 @@ package org.nanoboot.utils.timecalc.utils.property; import lombok.Getter; -import lombok.Setter; import org.nanoboot.utils.timecalc.app.TimeCalcException; +import java.util.ArrayList; +import java.util.List; + /** * @author Robert * @since 23.02.2024 */ public class Property { + private boolean valid = true; @Getter private final String name; private T value; private Property boundToProperty = null; + private List invalidationListeners = new ArrayList<>(); + private List> + changeListeners = new ArrayList>(); + public Property(String name, T valueIn) { this.name = name; this.value = valueIn; } @@ -34,16 +41,51 @@ public class Property { } public void bindTo(Property anotherProperty) { this.boundToProperty = anotherProperty; + this.boundToProperty.addListener((Property p, T oldValue, T newValue) -> {this.markInvalid();this.fireValueChangedEvent(oldValue); + //System.out.println("bindTo markInvalid " + p.getName() + " " + p.getValue()); + } ); } public T getValue() { return isBound() ? this.boundToProperty.getValue() : value; } - public void setValue(T value) { + public void setValue(T newValue) { if(isBound()) { - this.boundToProperty.setValue(value); + this.boundToProperty.setValue(newValue); } else { - this.value = value; + T oldValue = value; + this.value = newValue; + if(!oldValue.equals(newValue)) + { + fireValueChangedEvent(oldValue); + markInvalid(); + } } } + public boolean isValid() { + return isBound() ? this.boundToProperty.isValid() : valid; + } + protected void markInvalid() { +// System.out.println(name + " is invalid now"); + valid = false; + for (InvalidationListener listener : invalidationListeners) { + listener.invalidated(this); + } + } + protected void fireValueChangedEvent(T oldValue) { +// System.out.println(name + " was changed"); + for (ChangeListener listener : changeListeners) { + listener.changed(this, oldValue, value); + } + + } + + public void addListener(InvalidationListener listener) { + this.invalidationListeners.add(listener); + } + public void addListener(ChangeListener listener) { + this.changeListeners.add(listener); + } + + } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ReadOnlyProperty.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ReadOnlyProperty.java index c6aa81c..2d898ef 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ReadOnlyProperty.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/ReadOnlyProperty.java @@ -15,8 +15,9 @@ public class ReadOnlyProperty extends Property { public ReadOnlyProperty(Property property) { super(property.getName(), null); this.innerProperty = property; + this.innerProperty.addListener((Property p) -> {markInvalid();} ); } - public final void setValue(T valueIn) { + public final void setValue(T newValue) { throw new TimeCalcException("This is a read only property. New value cannot be set."); } @@ -29,5 +30,9 @@ public class ReadOnlyProperty extends Property { public final void bindTo(Property anotherProperty) { throw new TimeCalcException("This is a write only property. Bounding to another property is forbiden."); } + public boolean isValid() { + return this.innerProperty.isValid(); + } + } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/WriteOnlyProperty.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/WriteOnlyProperty.java index 50e45d5..3d08ff7 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/WriteOnlyProperty.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/property/WriteOnlyProperty.java @@ -16,8 +16,8 @@ public class WriteOnlyProperty extends Property { super(property.getName(), null); this.innerProperty = property; } - public final void setValue(T valueIn) { - this.innerProperty.setValue(valueIn); + public final void setValue(T newValue) { + this.innerProperty.setValue(newValue); } public final T getValue(T valueIn) {