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",