package project.client.gadgets;
import project.client.persistence.Message;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class GadgetMessage extends Composite {
private static final int MAX_CHARACTERS = 255;
private static final NumberFormat FORMAT_FLOATS = NumberFormat.getFormat("#0.00");
private static final String STYLE_MAIN = "Message";
private static final String STYLE_HEADER = "header";
private static final String STYLE_CONTENT = "content";
private static final String STYLE_HTML = "html";
private static final String STYLE_PANEL = "panel";
private static final String STYLE_LABEL = "label";
private static final String STYLE_INFO = "label-info";
private static final String STYLE_LINK = "label-link";
private Panel mainPanel = null;
private Panel headerPanel = null;
private Panel contentPanel = null;
private Message message;
private boolean shortedMessage = false;
private GadgetSearchPage searcher = null;
public GadgetMessage (GadgetSearchPage searcher, Message message) {
this.message = message;
this.searcher = searcher;
mainPanel = new VerticalPanel ();
mainPanel.setWidth("100%");
mainPanel.setStyleName(STYLE_MAIN);
initWidget(mainPanel);
headerPanel = new VerticalPanel ();
headerPanel.setWidth("100%");
headerPanel.addStyleName(STYLE_HEADER);
mainPanel.add(headerPanel);
contentPanel = new VerticalPanel ();
contentPanel.setWidth("100%");
contentPanel.addStyleName(STYLE_CONTENT);
mainPanel.add(contentPanel);
this.populateContent();
this.populateHeader();
}
private void populateHeader () {
headerPanel.clear();
Label lbl = null;
Panel hPanel = null;
hPanel = new HorizontalPanel ();
hPanel.addStyleName(STYLE_PANEL);
lbl = new Label ("Original thread ");
lbl.addStyleName(STYLE_LABEL);
hPanel.add(lbl);
lbl = new Label (message.getMessageThread().getName());
lbl.addStyleName(STYLE_INFO);
hPanel.add(lbl);
lbl = new Label (">> view thread");
lbl.addStyleName(STYLE_LINK);
lbl.addClickListener(new ClickListener () {
public void onClick (Widget w) {
searcher.search("thread:" + message.getMessageThread().getName());
}
});
hPanel.add(lbl);
headerPanel.add(hPanel);
hPanel = new HorizontalPanel ();
hPanel.addStyleName(STYLE_PANEL);
lbl = new Label ("User ");
lbl.addStyleName(STYLE_LABEL);
hPanel.add(lbl);
lbl = new Label (message.getUser().getName());
lbl.addStyleName(STYLE_INFO);
hPanel.add(lbl);
lbl = new Label (">> view social data");
lbl.addStyleName(STYLE_LINK);
lbl.addClickListener(new ClickListener () {
public void onClick (Widget w) {
//TODO relay to social data
}
});
hPanel.add(lbl);
headerPanel.add(hPanel);
hPanel = new HorizontalPanel ();
hPanel.addStyleName(STYLE_PANEL);
lbl = new Label ("Relevance ");
lbl.addStyleName(STYLE_LABEL);
hPanel.add(lbl);
lbl = new Label ("" + FORMAT_FLOATS.format(message.getRelevance()));
lbl.addStyleName(STYLE_INFO);
hPanel.add(lbl);
lbl = new Label ("view similar messages");
lbl.addStyleName(STYLE_LINK);
lbl.addClickListener(new ClickListener () {
public void onClick (Widget w) {
searcher.search("similar:" + message.getId());
}
});
hPanel.add(lbl);
headerPanel.add(hPanel);
}
private void populateContent () {
contentPanel.clear();
//
//
//
String content = message.getContent().replaceAll("\n", "<br/>");
content = content.trim();
while (content.startsWith("<br/>")) {
content = content.substring(5);
content = content.trim();
}
if (content.length() > MAX_CHARACTERS) {
content = content.substring(0, MAX_CHARACTERS);
content += " ... <br/><span style=\"color : lightgrey; font-style : italic;\">read the entire message</span>";
shortedMessage = true;
}
final HTML html = new HTML (content);
html.setWidth("100%");
html.addStyleName(STYLE_HTML);
contentPanel.add(html);
if (isTooLong()) {
html.addClickListener(new ClickListener () {
public void onClick (Widget w) {
if (shortedMessage) {
String content = message.getContent().replaceAll("\n", "<br/>");
content = content.trim();
while (content.startsWith("<br/>")) {
content = content.substring(5);
content = content.trim();
}
html.setHTML (content);
shortedMessage = false;
} else {
String content = message.getContent().replaceAll("\n", "<br/>");
content = content.trim();
while (content.startsWith("<br/>")) {
content = content.substring(5);
content = content.trim();
}
if (content.length() > MAX_CHARACTERS) {
content = content.substring(0, MAX_CHARACTERS);
content += " ... <br/><span style=\"color : lightgrey; font-style : italic;\">read the entire message</span>";
html.setHTML (content);
shortedMessage = true;
}
}
}
});
}
}
private boolean isTooLong () {
return (message.getContent().length() > MAX_CHARACTERS);
}
}