package org.limewire.ui.swing.friends.chat;
import static org.limewire.ui.swing.util.I18n.tr;
import java.util.List;
import org.limewire.friend.api.ChatState;
import org.limewire.ui.swing.friends.chat.Message.Type;
/**
*
*/
class ChatDocumentBuilder {
static final String LIBRARY_LINK = "#library";
static final String MY_LIBRARY_LINK = "#mylibrary";
private static final String LINE_BREAK = "<br/>";
final static String TOP =
"<html>" +
"<head>" +
"<style>" +
"body { " +
"font-family: Arial;" +
"font-size: 11;" +
"color: #313131;" +
"background-color: #ffffff;}" +
".me { " +
"color: #004e8b;" +
"font-weight: bold;}" +
".them { " +
"color: #af0511;" +
"font-weight: bold;}" +
".typing { " +
"color: #646464;}" +
"form { text-align: center;}" +
"</style>" +
"</head>" +
"<body>";
final static String BOTTOM =
"</body>" +
"</html>";
public static String buildChatText(List<Message> messages, ChatState currentChatState,
String conversationName, boolean friendSignedOff) {
StringBuilder builder = new StringBuilder();
builder.append(TOP);
Type lastMessageType = null;
long lastMessageTimeFromMe = 0;
for(Message message : messages) {
Type type = message.getType();
if (message.getType() != Message.Type.SERVER) {
if (lastMessageType == null) {
//The first message of a conversation
appendMessageSender(builder, message);
} else if (lastMessageType != type || sixtySecondRule(lastMessageTimeFromMe, message)) {
builder.append(LINE_BREAK);
appendMessageSender(builder, message);
}
}
lastMessageType = type;
builder.append(message.format());
builder.append(LINE_BREAK);
if (type == Type.SENT) {
lastMessageTimeFromMe = message.getMessageTimeMillis();
}
}
appendIsTypingMessage(builder, conversationName, currentChatState, friendSignedOff);
builder.append(BOTTOM);
return builder.toString();
}
private static boolean sixtySecondRule(long lastMessageTimeFromMe, Message message) {
return message.getType() == Type.SENT && lastMessageTimeFromMe + 60000 < message.getMessageTimeMillis();
}
private static StringBuilder appendMessageSender(StringBuilder builder, Message message) {
Type type = message.getType();
String cssClass = type == Type.SENT ? "me" : "them";
String content = message.getSenderName();
return builder.append("<div class=\"")
.append(cssClass)
.append("\">")
.append(content)
.append(":")
.append("</div>");
}
private static void appendIsTypingMessage(StringBuilder builder, String senderName, ChatState chatState, boolean friendSignedOff) {
String stateMessage = null;
if (friendSignedOff) {
stateMessage = tr("{0} has signed off", senderName);
} else if (chatState == ChatState.composing) {
stateMessage = tr("{0} is typing...", senderName);
} else if (chatState == ChatState.paused) {
stateMessage = tr("{0} has entered text", senderName);
} else {
return;
}
String cssClass = "typing";
builder.append("<div class=\"")
.append(cssClass)
.append("\">")
.append(stateMessage)
.append("</div>")
.append("<br/>");
}
}