/****************************************************************************
* Copyright (c) 2007 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Jacek Pospychala <jacek.pospychala@pl.ibm.com> - bug 197329, 190851
*****************************************************************************/
package org.eclipse.ecf.presence.ui.chatroom;
import java.text.SimpleDateFormat;
import java.util.*;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.internal.presence.ui.Messages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.themes.ITheme;
/**
* Default implementation of {@link IMessageRenderer}.
*
*/
public class MessageRenderer implements IMessageRenderer {
/**
* Messages sent by local user
*/
protected static final String SENT_COLOR = "org.eclipse.ecf.presence.ui.sentColor"; //$NON-NLS-1$
protected static final String SENT_FONT = "org.eclipse.ecf.presence.ui.sentFont"; //$NON-NLS-1$
/**
* Any received messages
*/
protected static final String RECEIVED_COLOR = "org.eclipse.ecf.presence.ui.receivedColor"; //$NON-NLS-1$
protected static final String RECEIVED_FONT = "org.eclipse.ecf.presence.ui.receivedFont"; //$NON-NLS-1$
/**
* System messages, eg. server notifications
*/
protected static final String SYSTEM_COLOR = "org.eclipse.ecf.presence.ui.systemColor"; //$NON-NLS-1$
protected static final String SYSTEM_FONT = "org.eclipse.ecf.presence.ui.systemFont"; //$NON-NLS-1$
/**
* The default color used to highlight message when the user's
* name is referred to in the chatroom. The default color is red.
*/
protected static final String RECEIVEDHIGHLIGHT_COLOR = "org.eclipse.ecf.presence.ui.receivedHighlightColor"; //$NON-NLS-1$
protected static final String RECEIVEDHIGHLIGHT_FONT = "org.eclipse.ecf.presence.ui.receivedHighlightFont"; //$NON-NLS-1$
/**
* Date stamp in message window
*/
protected static final String DATE_COLOR = "org.eclipse.ecf.presence.ui.dateColor"; //$NON-NLS-1$
protected static final String DATE_FONT = "org.eclipse.ecf.presence.ui.dateFont"; //$NON-NLS-1$
protected static final String DEFAULT_TIME_FORMAT = Messages.MessageRenderer_DEFAULT_TIME_FORMAT;
protected static final String DEFAULT_DATE_FORMAT = Messages.MessageRenderer_DEFAULT_DATE_FORMAT;
private StringBuffer buffer;
private List styleRanges = new ArrayList();
protected boolean nickContained;
protected boolean isSent;
protected String message;
protected String originator;
private String font;
private String color;
public StyleRange[] getStyleRanges() {
return (StyleRange[]) styleRanges.toArray(new StyleRange[styleRanges.size()]);
}
public String render(String msg, String orig, String localUserName) {
Assert.isNotNull(localUserName);
styleRanges.clear();
if (msg == null) {
return null;
}
buffer = new StringBuffer();
this.message = msg;
this.originator = orig;
// check to see if the message has the user's name contained within
// and make sure that the person referring to the user's name
// is not the user himself, no highlighting is required in this case
// as the user is already aware that his name is being referenced
nickContained = (msg.indexOf(localUserName) != -1) && (!localUserName.equals(orig));
isSent = (orig != null) && (orig.equals(localUserName));
if (orig == null) {
color = SYSTEM_COLOR;
font = SYSTEM_FONT;
} else if (isSent) {
color = SENT_COLOR;
font = SENT_FONT;
} else if (nickContained) {
color = RECEIVEDHIGHLIGHT_COLOR;
font = RECEIVEDHIGHLIGHT_FONT;
} else {
color = RECEIVED_COLOR;
font = RECEIVED_FONT;
}
doRender();
return buffer.toString();
}
protected void doRender() {
appendDateTime();
if (originator != null) {
appendNickname();
}
appendMessage();
}
protected void appendDateTime() {
String msg = NLS.bind(Messages.MessageRenderer_DEFAULT_DATETIME_FORMAT, getCurrentDate(DEFAULT_TIME_FORMAT)) + " "; //$NON-NLS-1$
append(msg, DATE_COLOR, null, DATE_FONT);
}
protected void appendNickname() {
String msg = originator + ": "; //$NON-NLS-1$
append(msg, color, null, font);
}
protected void appendMessage() {
append(message, color, null, font);
}
protected void append(String msg, String foreground, String background, String font1) {
if (msg == null) {
return;
}
int start = buffer.length();
buffer.append(msg);
if (foreground == null && background == null && font1 == null) {
return;
}
StyleRange styleRange = new StyleRange(start, msg.length(), getColor(foreground), getColor(background));
styleRange.font = getFont(font1);
styleRanges.add(styleRange);
}
private Color getColor(String name) {
if (name == null) {
return null;
}
ITheme theme = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
Color c = theme.getColorRegistry().get(name);
if (c == null) {
return Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
}
return c;
}
private Font getFont(String name) {
if (name == null) {
return null;
}
ITheme theme = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
Font f = theme.getFontRegistry().get(name);
if (f == null) {
return Display.getDefault().getSystemFont();
}
return f;
}
protected String getCurrentDate(String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String res = sdf.format(new Date());
return res;
}
protected String getDateTime() {
StringBuffer buf = new StringBuffer();
buf.append(getCurrentDate(DEFAULT_DATE_FORMAT)).append(" ").append( //$NON-NLS-1$
getCurrentDate(DEFAULT_TIME_FORMAT));
return buf.toString();
}
}