package com.soundlooper.system.util;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import javafx.animation.FadeTransition;
import javafx.application.Platform;
import javafx.scene.control.Label;
import javafx.util.Duration;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.soundlooper.system.SoundLooper;
public class MessagingUtil {
private static Logger logger = LogManager.getLogger(MessagingUtil.class);
private static Queue<Message> queue = new ConcurrentLinkedQueue<Message>();
private static Thread threadMessage = new Thread() {
@Override
public void run() {
Label labelState = SoundLooper.getInstance().getController().getLabelState();
FadeTransition fadeTransition = new FadeTransition(Duration.millis(1000), labelState);
while (true) {
try {
Thread.sleep(500);
while (!queue.isEmpty()) {
// if the fade animation is playing, we must stop it
Platform.runLater(new Runnable() {
@Override
public void run() {
fadeTransition.stop();
}
});
Message message = queue.remove();
logger.info("display message : " + message);
labelState.getStyleClass().removeAll("hiddenLabel", "labelInformation", "labelError");
if (StringUtils.equals(message.level, Message.LEVEL_ERROR)) {
labelState.getStyleClass().add("labelError");
} else {
labelState.getStyleClass().add("labelInformation");
}
Platform.runLater(new Runnable() {
@Override
public void run() {
labelState.setText(message.message);
}
});
Thread.sleep(3000);
Platform.runLater(new Runnable() {
@Override
public void run() {
fadeTransition.setFromValue(1.0);
fadeTransition.setToValue(0.0);
fadeTransition.playFromStart();
}
});
}
} catch (InterruptedException e) {
logger.error("Interruption du thread message : ", e);
}
}
};
};
static {
threadMessage.start();
}
public static void displayMessage(String message) {
addMessageToQueue(new Message(message, Message.LEVEL_INFO));
}
public static void displayError(String message, Exception e) {
logger.error(message, e);
addMessageToQueue(new Message(message, Message.LEVEL_ERROR));
}
private static void addMessageToQueue(Message message) {
logger.info("Affichage du message " + message);
queue.add(message);
}
private static class Message {
public final static String LEVEL_INFO = "INFO";
public final static String LEVEL_ERROR = "ERROR";
private String message;
private String level;
public Message(String message, String level) {
super();
this.message = message;
this.level = level;
}
@Override
public String toString() {
return "Message [message=" + message + ", level=" + level + "]";
}
}
}