From f7bc773cd009bdad50864d205d4fefb367bc6a80 Mon Sep 17 00:00:00 2001 From: DennisTurco Date: Thu, 23 Jul 2026 11:07:15 +0200 Subject: [PATCH] bug fixes and small improvements --- RemindMe_convert_to_exe_launch4j.xml | 4 +- RemindMe_installer_inno_setup.iss | 4 +- .../java/remindme/Dialogs/ManageRemind.java | 16 +++- .../java/remindme/Dialogs/ReminderDialog.java | 80 ++++++++++--------- .../remindme/Enums/TranslationLoaderEnum.java | 1 + .../GUI/Controllers/MainController.java | 39 +++++---- src/main/java/remindme/Table/RemindTable.java | 2 +- .../java/remindme/Table/TableDataManager.java | 4 +- src/main/resources/res/config/config.json | 2 +- src/main/resources/res/languages/deu.json | 1 + src/main/resources/res/languages/eng.json | 1 + src/main/resources/res/languages/esp.json | 1 + src/main/resources/res/languages/fra.json | 1 + src/main/resources/res/languages/ita.json | 1 + 14 files changed, 88 insertions(+), 69 deletions(-) diff --git a/RemindMe_convert_to_exe_launch4j.xml b/RemindMe_convert_to_exe_launch4j.xml index 4f57de3..af5efda 100644 --- a/RemindMe_convert_to_exe_launch4j.xml +++ b/RemindMe_convert_to_exe_launch4j.xml @@ -25,11 +25,11 @@ - 1.2.2.0 + 1.2.3.0 2.0.RC1 A lightweight executable that schedules and triggers custom, recurring reminders via pop-up notifications. Copyright © 2026 Shard - 1.2.2.0 + 1.2.3.0 2.0.RC1 Remind Me Shard diff --git a/RemindMe_installer_inno_setup.iss b/RemindMe_installer_inno_setup.iss index 5be3241..f39a97a 100644 --- a/RemindMe_installer_inno_setup.iss +++ b/RemindMe_installer_inno_setup.iss @@ -4,14 +4,14 @@ [Setup] AppName=RemindMe -AppVersion=1.2.2 +AppVersion=1.2.3 AppPublisher=Shard AppPublisherURL=https://www.shardpc.it/ DefaultDirName={userdocs}\Shard\RemindMe DisableDirPage=yes DisableProgramGroupPage=no PrivilegesRequired=lowest -OutputBaseFilename=RemindMe_v1.2.2_Setup +OutputBaseFilename=RemindMe_v1.2.3_Setup SetupIconFile=src\main\resources\res\img\logo.ico SetupLogging=yes Compression=lzma diff --git a/src/main/java/remindme/Dialogs/ManageRemind.java b/src/main/java/remindme/Dialogs/ManageRemind.java index 8f9914d..cbe0727 100644 --- a/src/main/java/remindme/Dialogs/ManageRemind.java +++ b/src/main/java/remindme/Dialogs/ManageRemind.java @@ -132,9 +132,17 @@ public boolean isTimeRangeValid() { return true; } - isTimeRangeValid(timeFrom.getTime(), timeTo.getTime()); + return isTimeRangeValid(timeFrom.getTime(), timeTo.getTime()); + } + + public String getRemindName() { + return remindNameTextField.getText(); + } - return true; + @Override + public void setVisible(boolean visible) { + if (visible) closeOk = false; + super.setVisible(visible); } public static boolean isTimeRangeValid(LocalTime timeFrom, LocalTime timeTo) { @@ -203,7 +211,6 @@ private void setIcons() { iconComboBox.addItem(IconsEnum.EYE_CLOSED.getIconName()); iconComboBox.addItem(IconsEnum.MAN.getIconName()); iconComboBox.addItem(IconsEnum.MAN_BEER.getIconName()); - iconComboBox.addItem(IconsEnum.MAN.getIconName()); iconComboBox.addItem(IconsEnum.MAN_CALCULATOR.getIconName()); iconComboBox.addItem(IconsEnum.MAN_COMPUTER.getIconName()); iconComboBox.addItem(IconsEnum.MAN_JOGGING.getIconName()); @@ -211,7 +218,6 @@ private void setIcons() { iconComboBox.addItem(IconsEnum.MAN_SLEEPING.getIconName()); iconComboBox.addItem(IconsEnum.MAN_WEARING_TIE.getIconName()); iconComboBox.addItem(IconsEnum.MAN_WITH_DIETARY.getIconName()); - iconComboBox.addItem(IconsEnum.MAN_WITH_DIETARY.getIconName()); iconComboBox.addItem(IconsEnum.MAN_YOGA.getIconName()); iconComboBox.addItem(IconsEnum.MUSIC1.getIconName()); iconComboBox.addItem(IconsEnum.MUSIC2.getIconName()); @@ -535,12 +541,14 @@ private void executionMethodComboBoxActionPerformed(java.awt.event.ActionEvent e else if (oneTimePerDayEnable) { enableBasedOnExecutionMethod(true, false); timeIntervalBtn.setEnabled(false); + timeFrequencyLabel.setText("N/A"); return; } else if (pcStartupEnable) { enableBasedOnExecutionMethod(false, false); } timeIntervalBtn.setEnabled(true); + timeFrequencyLabel.setText(timeInterval != null ? timeInterval.toString() : TimeInterval.getDefaultTimeInterval().toString()); }//GEN-LAST:event_executionMethodComboBoxActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables diff --git a/src/main/java/remindme/Dialogs/ReminderDialog.java b/src/main/java/remindme/Dialogs/ReminderDialog.java index 4af3a21..dc25270 100644 --- a/src/main/java/remindme/Dialogs/ReminderDialog.java +++ b/src/main/java/remindme/Dialogs/ReminderDialog.java @@ -49,7 +49,7 @@ private void initDialog(RemindNotification remind) { setNameLabelText(remind.name()); descriptionEditor.setText(remind.description()); - iconLabel.setSvgImage(remind.icon().getIconPath(), 50, 50); + iconLabel.setSvgImage(remind.icon().getIconPath(), 60, 60); SoundPlayer.playSound(remind.sound()); setAlwaysOnTop(remind.topLevel()); @@ -93,55 +93,61 @@ private void initComponents() { setTitle("Remind Me"); setResizable(false); - descriptionEditor.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); + // Header: icon + name with bottom separator + iconLabel.setPreferredSize(new java.awt.Dimension(60, 60)); + iconLabel.setMinimumSize(new java.awt.Dimension(60, 60)); + + nameLabel.setFont(new java.awt.Font("Segoe UI", java.awt.Font.BOLD, 17)); + nameLabel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 6, 0, 0)); + + javax.swing.JPanel headerInner = new javax.swing.JPanel(new java.awt.BorderLayout(8, 0)); + headerInner.setBorder(javax.swing.BorderFactory.createEmptyBorder(14, 14, 14, 14)); + headerInner.add(iconLabel, java.awt.BorderLayout.WEST); + headerInner.add(nameLabel, java.awt.BorderLayout.CENTER); + + javax.swing.JPanel headerPanel = new javax.swing.JPanel(new java.awt.BorderLayout()); + headerPanel.add(headerInner, java.awt.BorderLayout.CENTER); + headerPanel.add(new javax.swing.JSeparator(), java.awt.BorderLayout.SOUTH); + + // Description + descriptionEditor.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2)); descriptionEditor.setFocusable(false); descriptionEditor.setRequestFocusEnabled(false); jScrollPane1.setViewportView(descriptionEditor); + jScrollPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder()); + jScrollPane1.setPreferredSize(new java.awt.Dimension(380, 80)); - nameLabel.setFont(new java.awt.Font("Segoe UI", 1, 16)); // NOI18N - nameLabel.setText("jLabel1"); + javax.swing.JPanel contentPanel = new javax.swing.JPanel(new java.awt.BorderLayout()); + contentPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 14, 12, 14)); + contentPanel.add(jScrollPane1, java.awt.BorderLayout.CENTER); + + // Footer: time label + OK button with top separator + timeLabel.setFont(new java.awt.Font("Segoe UI", java.awt.Font.PLAIN, 11)); okBtn.setText("Ok"); + okBtn.setPreferredSize(new java.awt.Dimension(80, 30)); okBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okBtnActionPerformed(evt); } }); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 406, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addComponent(iconLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(nameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(timeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(okBtn))) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(iconLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(nameLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(okBtn) - .addComponent(timeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); + javax.swing.JPanel footerInner = new javax.swing.JPanel(new java.awt.BorderLayout()); + footerInner.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 14, 14, 14)); + footerInner.add(timeLabel, java.awt.BorderLayout.WEST); + footerInner.add(okBtn, java.awt.BorderLayout.EAST); + + javax.swing.JPanel footerPanel = new javax.swing.JPanel(new java.awt.BorderLayout()); + footerPanel.add(new javax.swing.JSeparator(), java.awt.BorderLayout.NORTH); + footerPanel.add(footerInner, java.awt.BorderLayout.CENTER); + + // Assemble main layout + getContentPane().setLayout(new java.awt.BorderLayout()); + getContentPane().add(headerPanel, java.awt.BorderLayout.NORTH); + getContentPane().add(contentPanel, java.awt.BorderLayout.CENTER); + getContentPane().add(footerPanel, java.awt.BorderLayout.SOUTH); + setMinimumSize(new java.awt.Dimension(400, 200)); pack(); setLocationRelativeTo(null); }// //GEN-END:initComponents diff --git a/src/main/java/remindme/Enums/TranslationLoaderEnum.java b/src/main/java/remindme/Enums/TranslationLoaderEnum.java index a3fea02..e096224 100644 --- a/src/main/java/remindme/Enums/TranslationLoaderEnum.java +++ b/src/main/java/remindme/Enums/TranslationLoaderEnum.java @@ -104,6 +104,7 @@ public enum TranslationKey { IS_ACTIVE_COLUMN("IsActiveColumn", "Active"), IS_TOP_LEVEL_COLUMN("IsTopLevelColumn", "Show On Top"), TIME_INTERVAL_COLUMN("TimeIntervalColumn", "Time Interval"), + EXECUTION_METHOD_COLUMN("ExecutionMethodColumn", "Execution Method"), NAME_DETAIL("NameDetail", "Name"), DESCRIPTION_DETAIL("DescriptionDetail", "Description"), COUNT_DETAIL("CountDetail", "Count"), diff --git a/src/main/java/remindme/GUI/Controllers/MainController.java b/src/main/java/remindme/GUI/Controllers/MainController.java index d654c7c..24d6944 100644 --- a/src/main/java/remindme/GUI/Controllers/MainController.java +++ b/src/main/java/remindme/GUI/Controllers/MainController.java @@ -144,23 +144,21 @@ private void loadTheme() { } private static Remind retriveRemindInsertedByDialog(ManageRemind dialog) { - Remind remind; - do { dialog.setVisible(true); - remind = dialog.getRemindInserted(); - if (remind == null) return null; - - if (dialog.isClosedOk()) { - if (remind.getName().trim().isEmpty()) { - JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_EMPTY_REMIND_NAME), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); - } else if (remindService.isRemindNameDuplicated(remind.getName())) { - JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_DUPLICATED_REMIND), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_FILE_EXTENSION_TITLE), JOptionPane.ERROR_MESSAGE); - } else if (!dialog.isTimeRangeValid()) { - JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_TIME_RANGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); - } else { - return remind; - } + + if (!dialog.isClosedOk()) return null; + + String name = dialog.getRemindName(); + + if (name.trim().isEmpty()) { + JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_EMPTY_REMIND_NAME), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + } else if (remindService.isRemindNameDuplicated(name)) { + JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_DUPLICATED_REMIND), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_FILE_EXTENSION_TITLE), JOptionPane.ERROR_MESSAGE); + } else if (!dialog.isTimeRangeValid()) { + JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_TIME_RANGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); + } else { + return dialog.getRemindInserted(); } } while (true); } @@ -173,7 +171,8 @@ public String[] getColumnTranslations() { TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.IS_TOP_LEVEL_COLUMN), TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.LAST_EXECUTION_COLUMN), TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.NEXT_EXECUTION_COLUMN), - TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.TIME_INTERVAL_COLUMN) + TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.TIME_INTERVAL_COLUMN), + TranslationCategory.REMIND_LIST.getTranslation(TranslationKey.EXECUTION_METHOD_COLUMN) }; return columnNames; } @@ -209,17 +208,15 @@ public MainGUI getMain() { } private static Remind retriveRemindUpdatedByDialog(ManageRemind dialog) { - Remind updatedRemind; do { dialog.setVisible(true); - updatedRemind = dialog.getRemindInserted(); - if (updatedRemind == null) return null; + if (!dialog.isClosedOk()) return null; - if (!dialog.isTimeRangeValid() && dialog.isClosedOk()) { + if (!dialog.isTimeRangeValid()) { JOptionPane.showMessageDialog(main, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_WRONG_TIME_RANGE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE); } else { - return updatedRemind; + return dialog.getRemindInserted(); } } while (true); } diff --git a/src/main/java/remindme/Table/RemindTable.java b/src/main/java/remindme/Table/RemindTable.java index 6e415e9..50bf466 100644 --- a/src/main/java/remindme/Table/RemindTable.java +++ b/src/main/java/remindme/Table/RemindTable.java @@ -26,7 +26,7 @@ public String getToolTipText(java.awt.event.MouseEvent e) { if (col == 6) { Object value = getValueAt(row, col); - return value != null ? "dd.HH:mm" : null; + return (value != null && !"N/A".equals(value.toString())) ? "dd.HH:mm" : null; } return null; } diff --git a/src/main/java/remindme/Table/TableDataManager.java b/src/main/java/remindme/Table/TableDataManager.java index bcc455c..640c7f6 100644 --- a/src/main/java/remindme/Table/TableDataManager.java +++ b/src/main/java/remindme/Table/TableDataManager.java @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory; import remindme.Entities.Remind; +import remindme.Enums.ExecutionMethod; import remindme.GUI.MainGUI; public class TableDataManager { @@ -29,7 +30,8 @@ public static void updateTableWithNewRemindList(List updatedReminds, Dat remind.isTopLevel(), remind.getLastExecution() != null ? remind.getLastExecution().format(formatter) : "", remind.getNextExecution() != null ? remind.getNextExecution().format(formatter) : "", - remind.getTimeInterval() != null ? remind.getTimeInterval().toString() : "" + remind.getExecutionMethod() == ExecutionMethod.ONE_TIME_PER_DAY ? "N/A" : (remind.getTimeInterval() != null ? remind.getTimeInterval().toString() : ""), + remind.getExecutionMethod() != null ? remind.getExecutionMethod().getExecutionMethodName() : "" }); } }); diff --git a/src/main/resources/res/config/config.json b/src/main/resources/res/config/config.json index c2c01dd..7978ef1 100644 --- a/src/main/resources/res/config/config.json +++ b/src/main/resources/res/config/config.json @@ -18,7 +18,7 @@ "EMAIL": "assistenza@shardpc.it", "SHARD_WEBSITE": "https://www.shardpc.it/", "LOGO_IMG": "/res/img/logo.png", - "VERSION": "1.2.2", + "VERSION": "1.2.3", "GUI_WIDTH": "982", "GUI_HEIGHT": "715", diff --git a/src/main/resources/res/languages/deu.json b/src/main/resources/res/languages/deu.json index 259335a..7089ca4 100644 --- a/src/main/resources/res/languages/deu.json +++ b/src/main/resources/res/languages/deu.json @@ -45,6 +45,7 @@ "IsActiveColumn": "Aktiv", "IsTopLevelColumn": "Oben anzeigen", "TimeIntervalColumn": "Zeitintervall", + "ExecutionMethodColumn": "Ausführungsmethode", "NameDetail": "Name", "DescriptionDetail": "Beschreibung", diff --git a/src/main/resources/res/languages/eng.json b/src/main/resources/res/languages/eng.json index 338c12f..048e039 100644 --- a/src/main/resources/res/languages/eng.json +++ b/src/main/resources/res/languages/eng.json @@ -45,6 +45,7 @@ "IsActiveColumn": "Active", "IsTopLevelColumn": "Show on Top", "TimeIntervalColumn": "Time Interval", + "ExecutionMethodColumn": "Execution Method", "NameDetail": "Name", "DescriptionDetail": "Description", diff --git a/src/main/resources/res/languages/esp.json b/src/main/resources/res/languages/esp.json index 4e38935..6df0988 100644 --- a/src/main/resources/res/languages/esp.json +++ b/src/main/resources/res/languages/esp.json @@ -45,6 +45,7 @@ "IsActiveColumn": "Activo", "IsTopLevelColumn": "Mostrar arriba", "TimeIntervalColumn": "Intervalo de tiempo", + "ExecutionMethodColumn": "Método de ejecución", "NameDetail": "Nombre", "DescriptionDetail": "Descripción", diff --git a/src/main/resources/res/languages/fra.json b/src/main/resources/res/languages/fra.json index 959c514..e8a755f 100644 --- a/src/main/resources/res/languages/fra.json +++ b/src/main/resources/res/languages/fra.json @@ -45,6 +45,7 @@ "IsActiveColumn": "Actif", "IsTopLevelColumn": "Afficher en haut", "TimeIntervalColumn": "Intervalle de temps", + "ExecutionMethodColumn": "Méthode d'exécution", "NameDetail": "Nom", "DescriptionDetail": "Description", diff --git a/src/main/resources/res/languages/ita.json b/src/main/resources/res/languages/ita.json index ecb147b..bcb3920 100644 --- a/src/main/resources/res/languages/ita.json +++ b/src/main/resources/res/languages/ita.json @@ -45,6 +45,7 @@ "IsActiveColumn": "Attivo", "IsTopLevelColumn": "Mostra in alto", "TimeIntervalColumn": "Intervallo di tempo", + "ExecutionMethodColumn": "Metodo di esecuzione", "NameDetail": "Nome", "DescriptionDetail": "Descrizione",