package knorxx.framework.generator.javaeesampleapp.client;
import static knorxx.framework.generator.javaeesampleapp.client.appearance.Appearance.HEADING;
import knorxx.framework.generator.javaeesampleapp.client.util.AbstractWebPage;
import knorxx.framework.generator.javaeesampleapp.server.model.Data;
import knorxx.framework.generator.javaeesampleapp.server.service.ChatQueue;
import knorxx.framework.generator.web.client.messagequeue.MessageQueueCallbacks;
import knorxx.framework.generator.web.client.messagequeue.MessageQueueConnection;
import knorxx.framework.generator.web.client.messagequeue.MessageQueueResponse;
import org.stjs.javascript.Date;
import org.stjs.javascript.dom.Element;
import org.stjs.javascript.functions.Callback1;
import org.stjs.javascript.jquery.Event;
import org.stjs.javascript.jquery.EventHandler;
import static org.stjs.javascript.jquery.GlobalJQuery.$;
import org.stjs.javascript.jquery.JQuery;
/**
* @author sj
*/
public class ChatWebPage extends AbstractWebPage {
private static ChatQueue chatQueue = new ChatQueue();
private JQuery content;
private JQuery input;
private JQuery status;
private MessageQueueConnection<Data> connection;
private String myName = null;
private String author = null;
private boolean logged = false;
@Override
public void onLoad() {
createGui();
subscribeQueue();
}
private void createGui() {
final ChatWebPage that = this;
$(TITLE_ID).text("Chat WebPage").addClass(HEADING);
$(CONTENT_ID).append(content = $("<div id=\"chatContent\"></div>"));
$(CONTENT_ID).append(input = $("<input id=\"chatInput\" type=\"text\"></input>"));
$(CONTENT_ID).append(status = $("<div id=\"chatStatus\"></div>"));
input.keydown(new EventHandler() {
@Override
public boolean onEvent(Event event, Element THIS) {
that.onInputKeyDown(event);
return true;
}
});
}
private void subscribeQueue() {
final ChatWebPage that = this;
MessageQueueCallbacks<Data> callbacks = new MessageQueueCallbacks<Data>();
callbacks.onOpen = new Callback1<MessageQueueResponse>() {
@Override
public void $invoke(MessageQueueResponse response) {
that.onOpen(response);
}
};
callbacks.onMessage = new Callback1<MessageQueueResponse<Data>>() {
@Override
public void $invoke(MessageQueueResponse<Data> response) {
that.onMessage(response);
}
};
callbacks.onClose = new Callback1<MessageQueueResponse>() {
@Override
public void $invoke(MessageQueueResponse response) {
that.onClose(response);
}
};
connection = chatQueue.subscribe(callbacks);
}
private void onOpen(MessageQueueResponse response) {
content.html("<p>Atmosphere connected using " + response.transport + "</p>");
input.removeAttr("disabled").focus();
status.text("Choose name:");
}
private void onMessage(MessageQueueResponse<Data> response) {
// We need to be logged first.
if(myName == null) {
return;
}
if(!logged) {
logged = true;
status.text(myName + ": ").css("color", "blue");
input.removeAttr("disabled").focus();
} else {
input.removeAttr("disabled");
addMessage(response.data, (response.data.getAuthor() == author) ? "blue" : "black");
}
}
private void onInputKeyDown(Event event) {
if(event.keyCode == 13) {
String msg = (String) $(input).val();
if(author == null) {
author = msg;
}
Data data = new Data();
data.setAuthor(author);
data.setMessage(msg);
input.val("");
connection.push(data);
input.attr("disabled", "disabled");
if(myName == null) {
myName = msg;
}
}
}
private void addMessage(Data data, String color) {
Date datetime = new Date(data.getTime());
content.append("<p><span style=\"color:" + color + "\">" + data.getAuthor() + "</span> @ " +
+(datetime.getHours() < 10 ? '0' + datetime.getHours() : datetime.getHours()) + ':'
+ (datetime.getMinutes() < 10 ? '0' + datetime.getMinutes() : datetime.getMinutes())
+ ": " + data.getMessage() + "</p>");
}
private void onClose(MessageQueueResponse response) {
logged = false;
}
}