/**
*
*/
package net.frontlinesms.ui.handler.message;
import java.awt.Image;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import net.frontlinesms.FrontlineUtils;
import net.frontlinesms.data.domain.FrontlineMessage;
import net.frontlinesms.data.domain.FrontlineMultimediaMessage;
import net.frontlinesms.data.domain.FrontlineMultimediaMessagePart;
import net.frontlinesms.messaging.mms.MmsUtils;
import net.frontlinesms.ui.FrontlineUiUtils;
import net.frontlinesms.ui.Icon;
import net.frontlinesms.ui.ThinletUiEventHandler;
import net.frontlinesms.ui.UiGeneratorController;
import net.frontlinesms.ui.i18n.InternationalisationUtils;
/**
* @author Alex Anderson <alex@frontlinesms.com>
*/
public class MessageDetailsDisplay implements ThinletUiEventHandler {
/** Path to the Thinlet XML layout file for the message details form */
private static final String UI_FILE_MSG_DETAILS_FORM = "/ui/core/messages/dgMessageDetails.xml";
private static final String I18N_MESSAGE_NO_CONTENT = "message.no.content";
private static final String UI_COMPONENT_PN_CONTENT = "pnContent";
private static final String UI_COMPONENT_PN_SUBJECT = "pnSubject";
private static final String UI_COMPONENT_TF_CONTENT = "tfContent";
private static final String UI_COMPONENT_TF_DATE = "tfDate";
private static final String UI_COMPONENT_TF_SENDER = "tfSender";
private static final String UI_COMPONENT_TF_RECIPIENT = "tfRecipient";
private static final String UI_COMPONENT_TF_STATUS = "tfStatus";
private static final String UI_COMPONENT_TF_SUBJECT = "tfSubject";
private final UiGeneratorController ui;
private Object dialog;
private final String[] messageFileExtensions = { ".txt", ".htm", ".html" };
public MessageDetailsDisplay(UiGeneratorController ui) {
this.ui = ui;
}
public void show(FrontlineMessage message) {
this.dialog = ui.loadComponentFromFile(UI_FILE_MSG_DETAILS_FORM, this);
setText(UI_COMPONENT_TF_STATUS, InternationalisationUtils.getI18nString(message.getStatus()));
setText(UI_COMPONENT_TF_SENDER, ui.getSenderDisplayValue(message));
setText(UI_COMPONENT_TF_RECIPIENT, ui.getRecipientDisplayValue(message));
setText(UI_COMPONENT_TF_DATE, InternationalisationUtils.getDatetimeFormat().format(message.getDate()));
if (message instanceof FrontlineMultimediaMessage && ((FrontlineMultimediaMessage) message).getSubject().length() > 0) {
setText(UI_COMPONENT_TF_SUBJECT, ((FrontlineMultimediaMessage) message).getSubject());
ui.setVisible(find(UI_COMPONENT_PN_SUBJECT), true);
}
Object contentPanel = find(UI_COMPONENT_PN_CONTENT);
for(Object contentComponent : getContentComponents(message)) {
ui.add(contentPanel, contentComponent);
}
ui.add(this.dialog);
}
private Object[] getContentComponents(FrontlineMessage message) {
if(message instanceof FrontlineMultimediaMessage) {
FrontlineMultimediaMessage mm = (FrontlineMultimediaMessage) message;
List<FrontlineMultimediaMessagePart> parts = mm.getMultimediaParts();
if(parts.size() == 0) {
return new Object[]{ ui.createLabel(InternationalisationUtils.getI18nString(I18N_MESSAGE_NO_CONTENT)) }; // FIXME i18n
} else {
return getContentComponents(parts);
}
} else {
// It's a standard text message
Object textContent = ui.createTextarea(UI_COMPONENT_TF_CONTENT, message.getTextContent(), 8);
this.ui.setWeight(textContent, 1, 1);
this.ui.setEditable(textContent, false);
return new Object[]{textContent};
}
}
private Object[] getContentComponents(List<FrontlineMultimediaMessagePart> parts) {
ArrayList<Object> contentComponents = new ArrayList<Object>(parts.size());
for(FrontlineMultimediaMessagePart part : parts) {
contentComponents.add(getComponent(part));
}
return contentComponents.toArray();
}
private Object getComponent(FrontlineMultimediaMessagePart part) {
Object component;
if(!part.isBinary()) {
component = ui.createTextarea("", part.getTextContent(), (part.toString().length() + 44) / 45);
this.ui.setEditable(component, false);
} else {
Object panel = ui.createPanel("");
ui.setColumns(panel, 1);
File mediaFile = MmsUtils.getFile(part);
String openAction = "openMultimediaPart('" + part.getFilename() + "')";
Image thumb = null;
try {
thumb = FrontlineUiUtils.getLimitedSizeImage(ImageIO.read(mediaFile), 64, 64);
} catch(Exception ex) {}
if(thumb != null) {
Object thumbComponent = ui.createLink("", openAction, panel, this);
ui.setIcon(thumbComponent, thumb);
ui.add(panel, thumbComponent);
}
Object fileLink = ui.createLink("[ " + part.getFilename() + " ]", openAction, panel, this);
if (isTextFile(part.getFilename())) {
this.ui.setIcon(fileLink, Icon.SMS);
}
ui.add(panel, fileLink);
component = panel;
}
ui.setWeight(component, 1, 1);
return component;
}
private boolean isTextFile(String filename) {
for (String textFileExtension : messageFileExtensions ) {
if (filename.endsWith(textFileExtension)) {
return true;
}
}
return false;
}
public void openMultimediaPart(String filename) {
FrontlineUtils.openExternalBrowser(MmsUtils.getAbsolutePath(filename));
}
/**
* Remove the supplied dialog from view.
* @param dialog the dialog to remove
* @see UiGeneratorController#removeDialog(Object)
*/
public void removeDialog(Object dialog) {
this.ui.removeDialog(dialog);
}
private void setText(String componentName, String text) {
ui.setText(find(componentName), text);
}
private Object find(String componentName) {
return this.ui.find(this.dialog, componentName);
}
}