package org.chartsy.chatsy.chat.ui;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.jivesoftware.smackx.packet.VCard;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.UserManager;
import org.chartsy.chatsy.chat.util.GraphicUtils;
import org.chartsy.chatsy.chat.util.ModelUtil;
import org.chartsy.chatsy.chat.util.SwingWorker;
import org.chartsy.chatsy.chat.util.log.Log;
import org.openide.util.ImageUtilities;
public class VCardViewer extends JPanel
{
private Cursor DEFAULT_CURSOR = new Cursor(Cursor.DEFAULT_CURSOR);
private Cursor LINK_CURSOR = new Cursor(Cursor.HAND_CURSOR);
private final String jid;
private final JLabel avatarImage;
private String emailAddress = "";
public VCardViewer(final String jid)
{
setLayout(new GridBagLayout());
setOpaque(false);
this.jid = jid;
avatarImage = new JLabel();
add(avatarImage, new GridBagConstraints(0, 0, 1, 3, 0.0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(5, 0, 5, 0), 0, 0));
Image aImage = ImageUtilities.loadImage("org/chartsy/chatsy/resources/default-avatar-64.png", true);
ImageIcon ico = new ImageIcon(aImage);
avatarImage.setIcon(ico);
final SwingWorker vcardLoader = new SwingWorker()
{
VCard vcard = null;
public Object construct()
{
vcard = ChatsyManager.getVCardManager().getVCard(jid);
return vcard;
}
public void finished()
{
if (vcard == null)
return;
ImageIcon icon = null;
byte[] bytes = vcard.getAvatar();
if (bytes != null && bytes.length > 0)
{
try
{
icon = new ImageIcon(bytes);
Image aImage = icon.getImage();
aImage = aImage.getScaledInstance(-1, 48, Image.SCALE_SMOOTH);
icon = new ImageIcon(aImage);
}
catch (Exception e)
{
Log.error(e);
}
}
else
{
Image newImage = ImageUtilities.loadImage("org/chartsy/chatsy/resources/default-avatar-64.png", true);
newImage = newImage.getScaledInstance(-1, 32, Image.SCALE_SMOOTH);
icon = new ImageIcon(newImage);
}
if (icon != null && icon.getIconWidth() > 0)
{
avatarImage.setIcon(icon);
avatarImage.setBorder(BorderFactory.createBevelBorder(0, Color.white, Color.lightGray));
}
vcard.setJabberId(jid);
buildUI(vcard);
}
};
vcardLoader.start();
}
private void buildUI(final VCard vcard)
{
avatarImage.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouseEvent)
{
if (mouseEvent.getClickCount() == 2)
ChatsyManager.getVCardManager().viewProfile(vcard.getJabberId(), avatarImage);
}
});
String firstName = vcard.getFirstName();
if (firstName == null)
firstName = "";
String lastName = vcard.getLastName();
if (lastName == null)
lastName = "";
final JLabel usernameLabel = new JLabel();
usernameLabel.setHorizontalTextPosition(JLabel.LEFT);
usernameLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 15));
usernameLabel.setForeground(Color.GRAY);
if (ModelUtil.hasLength(firstName) && ModelUtil.hasLength(lastName))
usernameLabel.setText(firstName + " " + lastName);
else
{
String nickname = ChatsyManager.getUserManager().getUserNicknameFromJID(jid);
usernameLabel.setText(UserManager.unescapeJID(nickname));
}
final Icon icon = ChatsyManager.getChatManager().getIconForContactHandler(vcard.getJabberId());
if (icon != null)
usernameLabel.setIcon(icon);
add(usernameLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(5, 5, 0, 0), 0, 0));
String title = vcard.getField("TITLE");
if (ModelUtil.hasLength(title))
{
final JLabel titleLabel = new JLabel(title);
titleLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 11));
add(titleLabel, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 0, 0), 0, 0));
}
if (ModelUtil.hasLength(vcard.getEmailHome()))
emailAddress = vcard.getEmailHome();
final Color linkColor = new Color(49, 89, 151);
final String unselectedText = "<html><body><font color=" + GraphicUtils.toHTMLColor(linkColor) + "><u>" + emailAddress + "</u></font></body></html>";
final String hoverText = "<html><body><font color=red><u>" + emailAddress + "</u></font></body></html>";
final JLabel emailTime = new JLabel(unselectedText);
emailTime.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
startEmailClient(emailAddress);
}
public void mouseEntered(MouseEvent e)
{
emailTime.setText(hoverText);
setCursor(LINK_CURSOR);
}
public void mouseExited(MouseEvent e)
{
emailTime.setText(unselectedText);
setCursor(DEFAULT_CURSOR);
}
});
add(emailTime, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 10, 0), 0, 0));
final String jid = UserManager.unescapeJID(vcard.getJabberId());
final JLabel jidLabel = new JLabel("<html><body>JID: <font color=" + GraphicUtils.toHTMLColor(linkColor) + "><u>" + jid + "</u></font></body></html>");
jidLabel.setToolTipText("Click to copy jid to clipboard.");
jidLabel.addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent mouseEvent)
{
jidLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent mouseEvent)
{
jidLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public void mouseClicked(MouseEvent mouseEvent)
{
ChatsyManager.setClipboard(jid);
}
});
add(jidLabel, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 2, 0), 0, 0));
String homeNumber = vcard.getPhoneHome("VOICE");
if (!ModelUtil.hasLength(homeNumber))
homeNumber = "n/a";
final JLabel homePhoneLabel = new JLabel("Home: " + homeNumber);
add(homePhoneLabel, new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 2, 0), 0, 0));
String workNumber = vcard.getPhoneWork("VOICE");
if (!ModelUtil.hasLength(workNumber))
workNumber = "n/a";
final JLabel workPhoneLabel = new JLabel("Work: " + workNumber);
add(workPhoneLabel, new GridBagConstraints(1, 5, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 2, 0), 0, 0));
String cellNumber = vcard.getPhoneWork("CELL");
if (!ModelUtil.hasLength(cellNumber))
cellNumber = "n/a";
final JLabel cellPhoneLabel = new JLabel("Cell: " + cellNumber);
add(cellPhoneLabel, new GridBagConstraints(1, 6, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 2, 0), 0, 0));
String company = vcard.getOrganization();
final JLabel orgLabel = new JLabel("Company: " + company);
add(orgLabel, new GridBagConstraints(1, 7, 1, 1, 1.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(0, 7, 2, 0), 0, 0));
}
private void startEmailClient(String emailAddress)
{
try
{
Desktop.getDesktop().mail(new URI("mailto:" + emailAddress));
}
catch (IOException e)
{
Log.error("Can't open Mailer", e);
}
catch (URISyntaxException e)
{
Log.error("URI Wrong", e);
}
}
}