diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/Progress.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/Progress.java index f8aa209..efb90c7 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/Progress.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/Progress.java @@ -13,7 +13,7 @@ import java.util.Date; * @since 21.03.2024 */ public class Progress { - private final double[] array = new double[6]; + private final double[] array = new double[7]; @Getter @Setter private int workDaysInMonth; @@ -30,7 +30,7 @@ public class Progress { if (type == WidgetType.PRESENTATION) { long currentTime = new Date().getTime() / 1000l; - long l = currentTime % 30; + long l = currentTime % 35; if (l >= 0 && l < 5) { type = WidgetType.MINUTE; } @@ -49,6 +49,9 @@ public class Progress { if (l >= 25 && l < 30) { type = WidgetType.YEAR; } + if (l >= 30 && l < 35) { + type = WidgetType.LIFE; + } } return type; @@ -141,6 +144,36 @@ public class Progress { } } + public static final int STARTED_WORKING_AGE = 26; + public static final int RETIREMENT_AGE = 65; + public static double getLifeProgress(Date birthDate, Date currentDate) { + if(birthDate == null) { + Calendar calTmp = Calendar.getInstance(); + calTmp.set(Calendar.YEAR, 2000); + calTmp.set(Calendar.MONTH, 0); + calTmp.set(Calendar.DAY_OF_MONTH, 1); + } + Calendar birthDateCal = Calendar.getInstance(); + Calendar currentDateCal = Calendar.getInstance(); + Calendar birthDateStartedWorkingCal = Calendar.getInstance(); + birthDateCal.setTime(birthDate); + currentDateCal.setTime(currentDate); + birthDateStartedWorkingCal.setTime(birthDate); + birthDateStartedWorkingCal.add(Calendar.YEAR, STARTED_WORKING_AGE); + + Date birthDateStartedWorking = birthDateStartedWorkingCal.getTime(); + if(currentDate.compareTo(birthDateStartedWorking) < 0) { + return 0d; + } + Calendar retirementDateCal = Calendar.getInstance(); + retirementDateCal.setTime(birthDate); + retirementDateCal.add(Calendar.YEAR, RETIREMENT_AGE); + Date retirementDate = retirementDateCal.getTime(); + long secondsForWork = retirementDate.getTime() - birthDateStartedWorking.getTime(); + long alreadyWorked = currentDate.getTime() - birthDateStartedWorking.getTime(); + return (double)alreadyWorked / (double)secondsForWork; + } + // public static double getYearProgress(Integer year, Integer month, // Integer day, Integer hour, Integer minute, Integer second, // Integer millisecond) { diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WidgetType.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WidgetType.java index 12f5531..26ab800 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WidgetType.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WidgetType.java @@ -7,7 +7,7 @@ import org.nanoboot.utils.timecalc.app.TimeCalcException; * @since 21.03.2024 */ public enum WidgetType { - MINUTE, HOUR, DAY, WEEK, MONTH, YEAR, PRESENTATION; + MINUTE, HOUR, DAY, WEEK, MONTH, YEAR, LIFE, PRESENTATION; public int getIndex() { int i = 0; for(WidgetType wt:WidgetType.values()) { 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 35ad36c..f1c8f99 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 @@ -240,7 +240,7 @@ public class Widget extends JPanel implements } if(typeProperty.getValue().equals(WidgetType.PRESENTATION.name())) { long currentTime = new Date().getTime() / 1000l; - long l = currentTime % 30; + long l = currentTime % 35; if (l >= 0 && l < 5) { return getDonePercentForWidgetType(WidgetType.MINUTE); } @@ -259,6 +259,9 @@ public class Widget extends JPanel implements if (l >= 25 && l < 30) { return getDonePercentForWidgetType(WidgetType.YEAR); } + if (l >= 30 && l < 35) { + return getDonePercentForWidgetType(WidgetType.LIFE); + } return getDonePercentForWidgetType(WidgetType.DAY); } return getDonePercentForWidgetType(WidgetType.valueOf(typeProperty.getValue().toUpperCase( diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WidgetMenu.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WidgetMenu.java index 548b028..cc4f748 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WidgetMenu.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WidgetMenu.java @@ -24,6 +24,7 @@ public class WidgetMenu extends JPopupMenu { private final JMenuItem typeWeekMenuItem; private final JMenuItem typeMonthMenuItem; private final JMenuItem typeYearMenuItem; + private final JMenuItem typeLifeMenuItem; private final JMenuItem typePresentationMenuItem; private final Widget widget; private WidgetType selectedType; @@ -48,6 +49,7 @@ public class WidgetMenu extends JPopupMenu { this.typeWeekMenuItem = new JMenuItem(WidgetType.WEEK.name()); this.typeMonthMenuItem = new JMenuItem(WidgetType.MONTH.name()); this.typeYearMenuItem = new JMenuItem(WidgetType.YEAR.name()); + this.typeLifeMenuItem = new JMenuItem(WidgetType.LIFE.name()); this.typePresentationMenuItem = new JMenuItem(WidgetType.PRESENTATION.name()); typeMenuItem.add(typeMinuteMenuItem); typeMenuItem.add(typeHourMenuItem); @@ -55,6 +57,7 @@ public class WidgetMenu extends JPopupMenu { typeMenuItem.add(typeWeekMenuItem); typeMenuItem.add(typeMonthMenuItem); typeMenuItem.add(typeYearMenuItem); + typeMenuItem.add(typeLifeMenuItem); typeMenuItem.add(typePresentationMenuItem); BiConsumer typeActionCreator = (m,w) -> { @@ -73,6 +76,7 @@ public class WidgetMenu extends JPopupMenu { typeActionCreator.accept(typeWeekMenuItem, WidgetType.WEEK); typeActionCreator.accept(typeMonthMenuItem, WidgetType.MONTH); typeActionCreator.accept(typeYearMenuItem, WidgetType.YEAR); + typeActionCreator.accept(typeLifeMenuItem, WidgetType.LIFE); typeActionCreator.accept(typePresentationMenuItem, WidgetType.PRESENTATION); //if(!aClass.getSimpleName().contains("Battery")) { @@ -92,6 +96,7 @@ public class WidgetMenu extends JPopupMenu { this.typeWeekMenuItem.setText(WidgetType.WEEK.name()); this.typeMonthMenuItem.setText(WidgetType.MONTH.name()); this.typeYearMenuItem.setText(WidgetType.YEAR.name()); + this.typeLifeMenuItem.setText(WidgetType.LIFE.name()); this.typePresentationMenuItem.setText(WidgetType.PRESENTATION.name()); switch (widgetType) { case MINUTE: typeMinuteMenuItem.setText(typeMinuteMenuItem.getText() + " (*)");break; @@ -100,6 +105,7 @@ public class WidgetMenu extends JPopupMenu { case WEEK: typeWeekMenuItem.setText(typeWeekMenuItem.getText() + " (*)");break; case MONTH: typeMonthMenuItem.setText(typeMonthMenuItem.getText() + " (*)");break; case YEAR: typeYearMenuItem.setText(typeYearMenuItem.getText() + " (*)");break; + case LIFE: typeLifeMenuItem.setText(typeLifeMenuItem.getText() + " (*)");break; case PRESENTATION: typePresentationMenuItem.setText(typePresentationMenuItem.getText() + " (*)");break; default: throw new TimeCalcException("Unsupported WidgetType: " + widgetType); } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressMoney.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressMoney.java index 40bc2bd..ca124f8 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressMoney.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressMoney.java @@ -1,6 +1,7 @@ package org.nanoboot.utils.timecalc.swing.progress; import org.nanoboot.utils.timecalc.app.GetProperty; +import org.nanoboot.utils.timecalc.entity.Progress; import org.nanoboot.utils.timecalc.entity.Visibility; import org.nanoboot.utils.timecalc.entity.WidgetType; import org.nanoboot.utils.timecalc.swing.common.SwingUtils; @@ -76,6 +77,7 @@ public class ProgressMoney extends Widget implements GetProperty { case WEEK: value = perDay * 5d * progress.getDonePercent(WidgetType.WEEK);break; case MONTH: value = perMonth * progress.getDonePercent(WidgetType.MONTH);break; case YEAR: value = perMonth * 12 * progress.getDonePercent(WidgetType.YEAR);break; + case LIFE: value = perMonth * 12 * (Progress.RETIREMENT_AGE - Progress.STARTED_WORKING_AGE) * progress.getDonePercent(WidgetType.LIFE);break; } Visibility visibility diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java index afc9e64..9f7be05 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java @@ -1334,10 +1334,32 @@ public class MainWindow extends TWindow { double minuteProgress = Progress.getMinuteProgress(secondNow, millisecondNow); double yearProgress = Progress.getYearProgress(clock, monthProgress); + String birthDate = timeCalcConfiguration.lifeBirthDateProperty.getValue(); + Calendar birthDateCal = Calendar.getInstance(); + if(birthDate != null&& !birthDate.isEmpty()) { + String[] array = birthDate.split("-"); + if(array.length == 3) { + try { + int year = Integer.valueOf(array[0]); + int month = Integer.valueOf(array[1]); + int day = Integer.valueOf(array[2]); + birthDateCal.set(Calendar.YEAR, year); + birthDateCal.set(Calendar.MONTH, month - 1); + birthDateCal.set(Calendar.DAY_OF_MONTH, day); + } catch (Exception e) { + System.err.println("Parsing birth date failed: " + birthDate + " : " + birthDate); + birthDateCal = null; + } + } + } + double lifeProgress = Progress.getLifeProgress( + birthDateCal == null ? null : birthDateCal.getTime(), + time.asCalendar().getTime()); progress.set(WidgetType.HOUR, hourProgress); progress.set(WidgetType.WEEK, weekProgress); progress.set(WidgetType.MINUTE, minuteProgress); progress.set(WidgetType.YEAR, yearProgress); + progress.set(WidgetType.LIFE, lifeProgress); progressSquare.setProgress(progress); progressCircle.setProgress(progress); progressSwing.setProgress(progress);