package org.limewire.ui.swing.friends.chat;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import org.jdesktop.application.Resource;
import org.limewire.friend.api.FriendPresence;
import org.limewire.ui.swing.util.GuiUtils;
/**
* Draws the list of names to show who is online, what there status is,
* and whether a chat is currently active.
*/
class ChatFriendRenderer extends JLabel implements TableCellRenderer {
private @Resource Font font;
private @Resource Color fontColor;
private @Resource Color selectionColor;
private @Resource Color lineColor;
private @Resource Icon closeIcon;
private @Resource Icon unviewedMessageIcon;
private @Resource Icon chattingIcon;
private @Resource Icon availableIcon;
private @Resource Icon doNotDisturbIcon;
private @Resource Icon awayIcon;
private final Border emptyBorder;
private final Border underlineBorder;
private final ConversationPanel conversationPanel;
public ChatFriendRenderer(ConversationPanel conversationPanel) {
this.conversationPanel = conversationPanel;
GuiUtils.assignResources(this);
setFont(font);
setForeground(fontColor);
setBackground(selectionColor);
emptyBorder = BorderFactory.createEmptyBorder(0,2,1,2);
underlineBorder = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0,2,0,2),
BorderFactory.createMatteBorder(0,0,1,0, lineColor));
setBorder(emptyBorder);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if(value instanceof ChatFriend) {
ChatFriend chatFriend = (ChatFriend) value;
setIcon(getIcon(chatFriend, table.getMousePosition(), table.getCellRect(row, column, true), table));
setText(chatFriend.getName());
if(chatFriend.equals(conversationPanel.getCurrentConversationFriend())) {
setBorder(underlineBorder);
} else {
setBorder(emptyBorder);
}
} else {
setIcon(null);
setText("");
setBorder(emptyBorder);
}
setOpaque(isSelected);
return this;
}
/**
* Returns the correct icon depending on the state of the friend and whether
* the user is currently chatting with them.
*/
private Icon getIcon(ChatFriend chatFriend, Point mousePosition, Rectangle cellRectangle, JTable table) {
//If chatting
if (chatFriend.isChatting()) {
// if mouse over close button
if(displayCloseIcon(mousePosition, cellRectangle)) {
return closeIcon;
} else {
// if new messages but not selected
if(!chatFriend.equals(conversationPanel.getCurrentConversationFriend()) && chatFriend.hasUnviewedMessages()) {
if(chatFriend.isFlashState())
return chattingIcon;
else
return unviewedMessageIcon;
} else {
return chattingIcon;
}
}
}
FriendPresence.Mode mode = chatFriend.getMode();
switch(mode) {
case available:
return availableIcon;
case chat:
return chattingIcon;
case dnd:
return doNotDisturbIcon;
default:
return awayIcon;
}
}
/**
* Returns true if the given table cell contains the mouse coordinates.
*/
private boolean displayCloseIcon(Point mousePosition, Rectangle cellRectangle) {
if(mousePosition == null)
return false;
return cellRectangle.contains(mousePosition);
}
}