// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.server;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
import org.openstreetmap.josm.gui.widgets.JosmTextField;
import org.openstreetmap.josm.io.MessageNotifier;
import org.openstreetmap.josm.tools.GBC;
/**
* Preferences panel for OSM messages notifier.
* @since 6349
*/
public class FeaturesPanel extends JPanel {
private JCheckBox notifier;
private JLabel intervalLabel;
private final JosmTextField notifierInterval = new JosmTextField(4);
private final JosmTextField notesDaysClosed = new JosmTextField(4);
/**
* Constructs a new {@code MessagesNotifierPanel}.
*/
public FeaturesPanel() {
build();
initFromPreferences();
updateEnabledState();
}
private void build() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
notifier = new JCheckBox(tr("Periodically check for new messages"));
add(notifier, GBC.eol());
notifier.addChangeListener(e -> updateEnabledState());
intervalLabel = new JLabel(tr("Check interval (minutes):"));
intervalLabel.setLabelFor(notifierInterval);
add(intervalLabel, GBC.std().insets(25, 0, 0, 0));
notifierInterval.setToolTipText(tr("Default value: {0}", MessageNotifier.PROP_INTERVAL.getDefaultValue()));
notifierInterval.setMinimumSize(notifierInterval.getPreferredSize());
add(notifierInterval, GBC.eol().insets(5, 0, 0, 0));
final JLabel notesDaysClosedLabel = new JLabel(tr("Max age for closed notes (days):"));
notesDaysClosedLabel.setLabelFor(notesDaysClosed);
notesDaysClosedLabel.setToolTipText(tr("Specifies the number of days a note needs to be closed to no longer be downloaded"));
add(notesDaysClosedLabel, GBC.std().insets(0, 20, 0, 0));
notesDaysClosed.setToolTipText(tr("Default value: {0}", DownloadNotesTask.DAYS_CLOSED.getDefaultValue()));
notesDaysClosed.setMinimumSize(notesDaysClosed.getPreferredSize());
add(notesDaysClosed, GBC.eol().insets(5, 20, 0, 0));
}
private void updateEnabledState() {
boolean enabled = notifier.isSelected();
intervalLabel.setEnabled(enabled);
notifierInterval.setEnabled(enabled);
notifierInterval.setEditable(enabled);
notesDaysClosed.setEditable(enabled);
}
/**
* Initializes the panel from preferences
*/
public final void initFromPreferences() {
notifier.setSelected(MessageNotifier.PROP_NOTIFIER_ENABLED.get());
notifierInterval.setText(Integer.toString(MessageNotifier.PROP_INTERVAL.get()));
notesDaysClosed.setText(Integer.toString(DownloadNotesTask.DAYS_CLOSED.get()));
}
/**
* Saves the current values to preferences
*/
public void saveToPreferences() {
final boolean enabled = notifier.isSelected();
boolean changed = MessageNotifier.PROP_NOTIFIER_ENABLED.put(enabled);
changed |= MessageNotifier.PROP_INTERVAL.parseAndPut(notifierInterval.getText());
changed |= DownloadNotesTask.DAYS_CLOSED.parseAndPut(notesDaysClosed.getText());
// If parameters have changed, restart notifier
if (changed) {
MessageNotifier.stop();
if (enabled) {
MessageNotifier.start();
}
} else {
// Even if they have not changed, notifier should be stopped if user is no more identified enough
if (!MessageNotifier.isUserEnoughIdentified()) {
MessageNotifier.stop();
} else if (enabled && !MessageNotifier.isRunning()) {
// or restarted if user is again identified and notifier was enabled in preferences
MessageNotifier.start();
}
}
}
}