/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.spark.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.ActionEvent; import java.awt.event.ActionListener; 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 javax.swing.JWindow; import javax.swing.Timer; import org.jivesoftware.resource.SparkRes; import org.jivesoftware.smackx.packet.VCard; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.UserManager; import org.jivesoftware.spark.util.GraphicUtils; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.log.Log; /** * UI to display VCard Information in Wizards, Dialogs, Chat Rooms and any other container. * * @author Derek DeMoro */ public class VCardPanel extends JPanel { private static final long serialVersionUID = -5810110243694315630L; private Cursor DEFAULT_CURSOR = new Cursor(Cursor.DEFAULT_CURSOR); private Cursor LINK_CURSOR = new Cursor(Cursor.HAND_CURSOR); private JWindow _avatarHoverWindow = new JWindow(); private final String jid; private final JLabel avatarImage; private String emailAddress = ""; /** * Generate a VCard Panel using the specified jid. * * @param jid the jid to use when retrieving the vcard information. */ public VCardPanel(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)); buildAvatarHover(); Image aImage = SparkRes.getImageIcon(SparkRes.BLANK_24x24).getImage(); aImage = aImage.getScaledInstance(-1, 64, Image.SCALE_SMOOTH); ImageIcon ico = new ImageIcon(aImage); avatarImage.setIcon(ico); VCard vcard = SparkManager.getVCardManager().getVCard(jid); if (vcard == null) { // Do nothing. return; } ImageIcon icon = null; byte[] bytes = vcard.getAvatar(); if (bytes != null && bytes.length > 0) { try { icon = new ImageIcon(bytes); Image newImage = icon.getImage(); if (icon.getIconHeight() > 48 || icon.getIconWidth() > 48) { newImage = newImage.getScaledInstance(-1, 48, Image.SCALE_SMOOTH); } icon = new ImageIcon(newImage); } catch (Exception e) { Log.error(e); } } else { icon = SparkRes.getImageIcon(SparkRes.DEFAULT_AVATAR_32x32_IMAGE); } if (icon != null && icon.getIconWidth() > 0) { avatarImage.setIcon(icon); avatarImage.setBorder(BorderFactory.createBevelBorder(0, Color.white, Color.lightGray)); } vcard.setJabberId(jid); buildUI(vcard); } private void buildAvatarHover() { _avatarHoverWindow.addMouseListener(new MouseAdapter() { public void mouseExited(MouseEvent e) { showAvatarBig(false, null); }; }); } private void showAvatarBig(boolean bool, VCard vcard) { if (bool && !_avatarHoverWindow.isVisible()) { _avatarHoverWindow.setLocation(avatarImage.getLocationOnScreen().x+2,avatarImage.getLocationOnScreen().y+2); _avatarHoverWindow.setVisible(true); ImageIcon icon = null; JLabel label = new JLabel(); _avatarHoverWindow.add(label); byte[] bytes = vcard.getAvatar(); Image newImage = null; if (bytes != null && bytes.length > 0) { try { icon = new ImageIcon(bytes); newImage = icon.getImage(); if (icon.getIconHeight() > 128 || icon.getIconWidth() > 128) { newImage = newImage.getScaledInstance(-1, 128, Image.SCALE_SMOOTH); } icon = new ImageIcon(newImage); } catch (Exception e1) { Log.error(e1); } } else { icon = SparkRes.getImageIcon(SparkRes.DEFAULT_AVATAR_32x32_IMAGE); } label.setIcon(icon); _avatarHoverWindow.pack(); _avatarHoverWindow.invalidate(); _avatarHoverWindow.validate(); _avatarHoverWindow.repaint(); } else { _avatarHoverWindow.setVisible(false); } } private void buildUI(final VCard vcard) { avatarImage.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent mouseEvent) { if (mouseEvent.getClickCount() == 2) { SparkManager.getVCardManager().viewProfile(vcard.getJabberId(), avatarImage); } } final Timer timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { showAvatarBig(true, vcard); } }); @Override public void mouseEntered(MouseEvent e) { super.mouseEntered(e); timer.start(); } @Override public void mouseExited(MouseEvent e) { super.mouseExited(e); timer.stop(); } }); 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("Dialog", Font.BOLD, 15)); usernameLabel.setForeground(Color.GRAY); if (ModelUtil.hasLength(firstName) && ModelUtil.hasLength(lastName)) { usernameLabel.setText(firstName + " " + lastName); } else { String nickname = SparkManager.getUserManager().getUserNicknameFromJID(jid); usernameLabel.setText(UserManager.unescapeJID(nickname)); } final Icon icon = SparkManager.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("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, 5, 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); } } }