package org.chartsy.chatsy.chat.ui;
import org.jivesoftware.smack.packet.DefaultPacketExtension;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Presence;
import org.chartsy.chatsy.chat.ChatManager;
import org.chartsy.chatsy.chat.PresenceManager;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.util.GraphicUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.MalformedURLException;
import java.net.URL;
import org.chartsy.chatsy.chat.util.FontLoader;
import org.openide.util.ImageUtilities;
public final class ContactItem extends JPanel implements MouseListener
{
private ContactItemInfo itemInfo;
private AvatarLabel avatarLabel;
private String nickname;
private String alias;
private String fullyQualifiedJID;
private String status;
private String groupName;
private Icon icon;
private Presence presence;
private int fontSize = 12;
private int iconSize = 32;
private boolean mouseOver = false;
private boolean selected = false;
boolean isOffline = true;
public ContactItem(String alias, String nickname, String fullyQualifiedJID)
{
setLayout(new BorderLayout());
setOpaque(true);
setBackground(Color.WHITE);
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setFocusable(true);
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
avatarLabel = new AvatarLabel();
itemInfo = new ContactItemInfo();
add(avatarLabel, BorderLayout.WEST);
add(itemInfo, BorderLayout.CENTER);
this.alias = alias;
this.nickname = nickname;
this.fullyQualifiedJID = fullyQualifiedJID;
setName(fullyQualifiedJID);
setDisplayName();
presence = PresenceManager.INVISIBLE;
updatePresenceIcon(presence);
updateAvatar();
updateAvatarInSideIcon();
addMouseListener((MouseListener)this);
}
public String getDisplayName()
{
final String displayName;
if (alias != null)
displayName = alias;
else if (nickname != null)
displayName = nickname;
else
displayName = getJID();
if (displayName != null)
return displayName;
else
return "";
}
public String getNickname()
{
return nickname;
}
public void setNickname(String nickname)
{
this.nickname = nickname;
if (alias == null)
setDisplayName();
}
public String getAlias()
{
return alias;
}
public void setAlias(String alias)
{
this.alias = alias;
setDisplayName();
}
private void setDisplayName()
{
final String displayName = getDisplayName();
itemInfo.setNickname(displayName);
}
public String getJID()
{
return fullyQualifiedJID;
}
public Icon getIcon()
{
return icon;
}
public void setIcon(Icon icon)
{
this.icon = icon;
itemInfo.getDisplayNameLabel().setIcon(icon);
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getGroupName()
{
return groupName;
}
public void setGroupName(String groupName)
{
this.groupName = groupName;
}
public boolean isOffline()
{
return isOffline;
}
public void setOffline(boolean offline)
{
isOffline = offline;
setVisible(!offline);
}
public JLabel getNicknameLabel()
{
return itemInfo.getDisplayNameLabel();
}
public JLabel getDescriptionLabel()
{
return itemInfo.getDescriptionLabel();
}
public Presence getPresence()
{
return presence;
}
public void setPresence(Presence presence)
{
this.presence = presence;
final PacketExtension packetExtension = presence.getExtension("x", "vcard-temp:x:update");
if (packetExtension != null)
{
DefaultPacketExtension o = (DefaultPacketExtension) packetExtension;
String hash = o.getValue("photo");
if (hash != null)
{
updateAvatar();
updateAvatarInSideIcon();
}
}
updatePresenceIcon(presence);
}
public URL getAvatarURL() throws MalformedURLException
{
return ChatsyManager.getVCardManager().getAvatarURL(getJID());
}
private void updateAvatar()
{
ChatsyManager.getVCardManager().addToQueue(getJID());
}
public String toString()
{
return itemInfo.getNickname();
}
public void updatePresenceIcon(Presence presence)
{
getNicknameLabel().setForeground(Color.decode("0x111111"));
getNicknameLabel().setFont(FontLoader.getDroidFont(Font.PLAIN, fontSize));
ChatManager chatManager = ChatsyManager.getChatManager();
boolean handled = chatManager.fireContactItemPresenceChanged(this, presence);
if (handled)
return;
if (presence.isAvailable())
{
String statusText = presence.getStatus();
if (statusText == null)
{
setStatus(PresenceManager._AVAILABLE);
setIcon(PresenceManager.getIconFromPresence(PresenceManager.AVAILABLE));
setOffline(false);
return;
}
if (statusText.equals(PresenceManager._AVAILABLE))
{
setStatusText(PresenceManager._AVAILABLE);
setIcon(PresenceManager.getIconFromPresence(PresenceManager.AVAILABLE));
setOffline(false);
}
else if (statusText.equals(PresenceManager._AWAY))
{
setStatusText(PresenceManager._AWAY);
setIcon(PresenceManager.getIconFromPresence(PresenceManager.AWAY));
setOffline(false);
}
else if (statusText.equals(PresenceManager._BUSY))
{
setStatusText(PresenceManager._BUSY);
setIcon(PresenceManager.getIconFromPresence(PresenceManager.BUSY));
setOffline(false);
}
else if (statusText.equals(PresenceManager._INVISIBLE))
{
setStatusText("");
setIcon(PresenceManager.getIconFromPresence(PresenceManager.INVISIBLE));
setOffline(true);
}
}
else
{
getNicknameLabel().setForeground(Color.decode("0xeeeeee"));
setStatusText("");
setIcon(PresenceManager.getIconFromPresence(PresenceManager.INVISIBLE));
setOffline(true);
}
}
public void setStatusText(String status)
{
setStatus(status);
getDescriptionLabel().setText(status);
}
public void setAvatarImage(Icon icon)
{
avatarLabel.setIcon(icon);
avatarLabel.validate();
avatarLabel.repaint();
}
public void showUserComingOnline()
{
getNicknameLabel().setFont(FontLoader.getDroidFont(Font.BOLD, fontSize));
getNicknameLabel().setForeground(new Color(255, 128, 0));
}
public void showUserGoingOfflineOnline()
{
getNicknameLabel().setFont(FontLoader.getDroidFont(Font.BOLD, fontSize));
getNicknameLabel().setForeground(Color.decode("0xcc0000"));
}
public void updateAvatarInSideIcon()
{
try
{
final URL url = getAvatarURL();
if (url != null)
{
ImageIcon imageIcon = GraphicUtils.scale(new ImageIcon(url), iconSize, iconSize);
setAvatarImage(imageIcon);
}
else
{
setAvatarImage(ImageUtilities.loadImageIcon("org/chartsy/chatsy/resources/default-avatar-32.png", true));
}
}
catch (MalformedURLException e)
{
setAvatarImage(ImageUtilities.loadImageIcon("org/chartsy/chatsy/resources/default-avatar-32.png", true));
}
}
public Dimension getPreferredSize()
{
Dimension dimension = super.getPreferredSize();
return new Dimension(dimension.width, 42);
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D graphics2D = (Graphics2D) g;
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics2D.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
if (mouseOver && !selected)
{
Color color = Color.decode("0x0298db");
Color bgColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), 100);
graphics2D.setColor(bgColor);
graphics2D.fill(new Rectangle(0, 0, getWidth(), getHeight()-1));
}
if (selected)
{
Color color = Color.decode("0x0298db");
Color bgColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), 200);
graphics2D.setColor(bgColor);
graphics2D.fill(new Rectangle(0, 0, getWidth(), getHeight()-1));
}
GradientPaint gradientPaint;
gradientPaint = new GradientPaint(0, getHeight()-1, Color.decode("0xefefef"), getWidth()/2, getHeight()-1, Color.decode("0xadaaad"));
graphics2D.setPaint(gradientPaint);
graphics2D.drawLine(0, getHeight()-1, getWidth()/2, getHeight()-1);
gradientPaint = new GradientPaint(getWidth()/2, getHeight()-1, Color.decode("0xadaaad"), getWidth(), getHeight()-1, Color.decode("0xefefef"));
graphics2D.setPaint(gradientPaint);
graphics2D.drawLine(getWidth()/2, getHeight()-1, getWidth(), getHeight()-1);
}
public void setSelected(boolean flag)
{
selected = flag;
repaint();
}
public void setMouseOver(boolean flag)
{
mouseOver = flag;
repaint();
}
@Override public void mouseClicked(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1
|| ChatsyManager.getWorkspace().getContactList().getSelectedUsers().size() == 1)
{
Component parent = getParent();
if (parent != null)
{
if (!(parent.getParent() instanceof ContactGroup))
return;
ContactGroup contactGroup = (ContactGroup) parent.getParent();
if (e.getClickCount() == 2)
contactGroup.contactItemDoubleClicked(this);
else if (e.getClickCount() == 1)
contactGroup.contactItemClicked(this);
}
}
if (e.getButton() == MouseEvent.BUTTON3)
{
checkPopup(e);
}
}
@Override public void mousePressed(MouseEvent e)
{
}
@Override public void mouseReleased(MouseEvent e)
{
}
@Override public void mouseEntered(MouseEvent e)
{
setMouseOver(true);
}
@Override public void mouseExited(MouseEvent e)
{
setMouseOver(false);
}
private void checkPopup(MouseEvent e)
{
ContactGroup group = ChatsyManager.getWorkspace().getContactList().getContactGroup(groupName);
if (group != null)
group.checkPopup(e);
}
private static class ContactItemInfo extends JPanel
{
private JLabel displayNameLabel = new JLabel(" ");
private JLabel descriptionLabel = new JLabel(" ");
private ContactItemInfo()
{
super(new BorderLayout());
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
displayNameLabel.setFont(FontLoader.getDroidFont(Font.PLAIN, 12));
displayNameLabel.setForeground(Color.decode("0x111111"));
displayNameLabel.setHorizontalAlignment(JLabel.LEFT);
displayNameLabel.setHorizontalTextPosition(JLabel.LEFT);
displayNameLabel.setVerticalAlignment(JLabel.CENTER);
displayNameLabel.setVerticalTextPosition(JLabel.CENTER);
displayNameLabel.setIconTextGap(5);
descriptionLabel.setFont(FontLoader.getDroidFont(Font.PLAIN, 11));
descriptionLabel.setForeground(Color.decode("0xbdbebd"));
descriptionLabel.setHorizontalTextPosition(JLabel.LEFT);
descriptionLabel.setHorizontalAlignment(JLabel.LEFT);
add(displayNameLabel, BorderLayout.CENTER);
add(descriptionLabel, BorderLayout.SOUTH);
}
public void setNickname(String nickname)
{
displayNameLabel.setText(nickname);
}
public String getNickname()
{
return displayNameLabel.getText();
}
public JLabel getDisplayNameLabel()
{
return displayNameLabel;
}
public void setStatus(String status)
{
descriptionLabel.setText(status);
}
public String getStatus()
{
return descriptionLabel.getText();
}
public JLabel getDescriptionLabel()
{
return descriptionLabel;
}
}
private static class AvatarLabel extends JLabel
{
private AvatarLabel()
{
super();
setOpaque(false);
setPreferredSize(new Dimension(32, 32));
setMinimumSize(new Dimension(32, 32));
setMaximumSize(new Dimension(32, 32));
setHorizontalAlignment(JLabel.CENTER);
setVerticalAlignment(JLabel.CENTER);
}
}
}