/*
Copywrite 2017 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.ugs.nbp.core.services;
import com.willwinder.ugs.nbp.lib.lookup.CentralLookup;
import com.willwinder.universalgcodesender.i18n.Localization;
import com.willwinder.universalgcodesender.model.BackendAPI;
import com.willwinder.universalgcodesender.model.UGSEvent;
import org.apache.commons.lang3.StringUtils;
import org.openide.LifecycleManager;
import org.openide.awt.Notification;
import org.openide.awt.NotificationDisplayer;
import org.openide.util.ImageUtilities;
import org.openide.util.lookup.ServiceProvider;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* A service that will listen for setting changes that requires a restart and notifies the user.
*
* @author Joacim Breiler
*/
@ServiceProvider(service = SettingsChangedNotificationService.class)
public class SettingsChangedNotificationService {
private static final String RESTART_ICON = "org/netbeans/core/windows/resources/restart.png";
private final BackendAPI backend;
private Notification restartNotification;
private String lastSelectedLanguage;
public SettingsChangedNotificationService() {
backend = CentralLookup.getDefault().lookup(BackendAPI.class);
backend.addUGSEventListener(this::checkForLanguageChangeAndAskForRestart);
lastSelectedLanguage = backend.getSettings().getLanguage();
}
private void checkForLanguageChangeAndAskForRestart(UGSEvent ugsEvent) {
if (ugsEvent.isSettingChangeEvent() && !StringUtils.equalsIgnoreCase(lastSelectedLanguage, backend.getSettings().getLanguage())) {
if (null != restartNotification) {
restartNotification.clear();
}
lastSelectedLanguage = backend.getSettings().getLanguage();
Localization.initialize(backend.getSettings().getLanguage());
restartNotification = NotificationDisplayer.getDefault().notify(Localization.getString("restart"),
ImageUtilities.loadImageIcon(RESTART_ICON, false), //NOI18N
createRestartNotificationDetails(), createRestartNotificationDetails(),
NotificationDisplayer.Priority.HIGH, NotificationDisplayer.Category.INFO);
}
}
private JComponent createRestartNotificationDetails() {
JPanel panel = new JPanel(new BorderLayout(10, 10));
panel.setOpaque(false);
JLabel label = new JLabel(Localization.getString("platform.window.restart.changed.settings")); //NOI18N
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
panel.add(label, BorderLayout.CENTER);
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (null != restartNotification) {
restartNotification.clear();
restartNotification = null;
}
LifecycleManager.getDefault().markForRestart();
LifecycleManager.getDefault().exit();
}
});
return panel;
}
}