package org.chartsy.chatsy.chatimpl.profile; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smackx.packet.VCard; import org.chartsy.chatsy.chat.ChatsyManager; import org.chartsy.chatsy.chat.component.TitlePanel; import org.chartsy.chatsy.chat.ui.VCardViewer; import org.chartsy.chatsy.chat.ui.status.StatusBar; import org.chartsy.chatsy.chat.util.GraphicUtils; import org.chartsy.chatsy.chat.util.ModelUtil; import org.chartsy.chatsy.chat.util.log.Log; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTabbedPane; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.net.MalformedURLException; import org.openide.util.ImageUtilities; public class VCardEditor { private final ImageIcon defaultAvatar = ImageUtilities.loadImageIcon("org/chartsy/chatsy/resources/default-avatar-64.png", true); private BusinessPanel businessPanel; private PersonalPanel personalPanel; private HomePanel homePanel; private AvatarPanel avatarPanel; private JLabel avatarLabel; public void editProfile(final VCard vCard, JComponent parent) { final JTabbedPane tabbedPane = new JTabbedPane(); personalPanel = new PersonalPanel(); personalPanel.showJID(false); tabbedPane.addTab("Primary", personalPanel); businessPanel = new BusinessPanel(); tabbedPane.addTab("Work", businessPanel); homePanel = new HomePanel(); tabbedPane.addTab("Home", homePanel); avatarPanel = new AvatarPanel(); tabbedPane.addTab("Display Image", avatarPanel); buildUI(vCard); final JOptionPane pane; final JDialog dlg; TitlePanel titlePanel; ImageIcon icon = VCardManager.getAvatarIcon(vCard); if (icon == null) icon = defaultAvatar; titlePanel = new TitlePanel("Contact Details", "", icon, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Save", "Cancel"}; pane = new JOptionPane( tabbedPane, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); JOptionPane p = new JOptionPane(); dlg = p.createDialog(parent, "Contact Details"); dlg.setModal(false); dlg.pack(); dlg.setSize(600, 400); dlg.setResizable(true); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(parent); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String value = (String)pane.getValue(); if ("Cancel".equals(value)) { pane.removePropertyChangeListener(this); dlg.dispose(); } else if ("Save".equals(value)) { pane.removePropertyChangeListener(this); dlg.dispose(); saveVCard(); } } }; pane.addPropertyChangeListener(changeListener); avatarPanel.setParentDialog(dlg); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); personalPanel.focus(); } public void viewFullProfile(final VCard vCard, JComponent parent) { final JTabbedPane tabbedPane = new JTabbedPane(); personalPanel = new PersonalPanel(); personalPanel.allowEditing(false); personalPanel.showJID(false); tabbedPane.addTab("Primary", personalPanel); businessPanel = new BusinessPanel(); businessPanel.allowEditing(false); tabbedPane.addTab("Work", businessPanel); homePanel = new HomePanel(); homePanel.allowEditing(false); tabbedPane.addTab("Home", homePanel); avatarPanel = new AvatarPanel(); avatarPanel.allowEditing(false); tabbedPane.addTab("Display Image", avatarPanel); buildUI(vCard); final JOptionPane pane; final JDialog dlg; TitlePanel titlePanel; ImageIcon icon = VCardManager.getAvatarIcon(vCard); if (icon == null) icon = defaultAvatar; titlePanel = new TitlePanel("Profile Information", "", icon, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Close"}; pane = new JOptionPane( tabbedPane, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); JOptionPane p = new JOptionPane(); dlg = p.createDialog(parent, "Profile Information"); dlg.setModal(false); dlg.pack(); dlg.setSize(600, 400); dlg.setResizable(true); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(parent); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { Object o = pane.getValue(); if (o instanceof Integer) { pane.removePropertyChangeListener(this); dlg.dispose(); return; } String value = (String)pane.getValue(); if ("Close".equals(value)) { pane.removePropertyChangeListener(this); dlg.dispose(); } } }; pane.addPropertyChangeListener(changeListener); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); personalPanel.focus(); } public void displayProfile(final String jid, VCard vcard, JComponent parent) { VCardViewer viewer = new VCardViewer(jid); final JFrame dlg = new JFrame(jid + "'s Profile"); avatarLabel = new JLabel(); avatarLabel.setHorizontalAlignment(JButton.RIGHT); avatarLabel.setBorder(BorderFactory.createBevelBorder(0, Color.white, Color.lightGray)); Object[] options = {"View Full Profile", "Close"}; final JOptionPane pane = new JOptionPane( viewer, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); dlg.pack(); dlg.setSize(350, 250); dlg.setResizable(true); dlg.setContentPane(pane); dlg.setLocationRelativeTo(parent); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if (pane.getValue() instanceof Integer) { pane.removePropertyChangeListener(this); dlg.dispose(); return; } String value = (String)pane.getValue(); if ("Close".equals(value)) { pane.removePropertyChangeListener(this); dlg.dispose(); } else if ("View Full Profile".equals(value)) { pane.setValue(JOptionPane.UNINITIALIZED_VALUE); ChatsyManager.getVCardManager().viewFullProfile(jid, pane); } } }; pane.addPropertyChangeListener(changeListener); dlg.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent keyEvent) { if (keyEvent.getKeyChar() == KeyEvent.VK_ESCAPE) dlg.dispose(); } }); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); } private void buildUI(VCard vcard) { personalPanel.setFirstName(vcard.getFirstName()); personalPanel.setMiddleName(vcard.getMiddleName()); personalPanel.setLastName(vcard.getLastName()); personalPanel.setEmailAddress(vcard.getEmailHome()); personalPanel.setNickname(vcard.getNickName()); personalPanel.setJID(vcard.getJabberId()); businessPanel.setCompany(vcard.getOrganization()); businessPanel.setDepartment(vcard.getOrganizationUnit()); businessPanel.setStreetAddress(vcard.getAddressFieldWork("STREET")); businessPanel.setCity(vcard.getAddressFieldWork("LOCALITY")); businessPanel.setState(vcard.getAddressFieldWork("REGION")); businessPanel.setZipCode(vcard.getAddressFieldWork("PCODE")); businessPanel.setCountry(vcard.getAddressFieldWork("CTRY")); businessPanel.setJobTitle(vcard.getField("TITLE")); businessPanel.setPhone(vcard.getPhoneWork("VOICE")); businessPanel.setFax(vcard.getPhoneWork("FAX")); businessPanel.setPager(vcard.getPhoneWork("PAGER")); businessPanel.setMobile(vcard.getPhoneWork("CELL")); businessPanel.setWebPage(vcard.getField("URL")); homePanel.setStreetAddress(vcard.getAddressFieldHome("STREET")); homePanel.setCity(vcard.getAddressFieldHome("LOCALITY")); homePanel.setState(vcard.getAddressFieldHome("REGION")); homePanel.setZipCode(vcard.getAddressFieldHome("PCODE")); homePanel.setCountry(vcard.getAddressFieldHome("CTRY")); homePanel.setPhone(vcard.getPhoneHome("VOICE")); homePanel.setFax(vcard.getPhoneHome("FAX")); homePanel.setPager(vcard.getPhoneHome("PAGER")); homePanel.setMobile(vcard.getPhoneHome("CELL")); byte[] bytes = vcard.getAvatar(); if (bytes != null && bytes.length > 0) { ImageIcon icon = new ImageIcon(bytes); avatarPanel.setAvatar(icon); avatarPanel.setAvatarBytes(bytes); if (avatarLabel != null) { icon = GraphicUtils.scaleImageIcon(icon, 48, 48); avatarLabel.setIcon(icon); } } } private void saveVCard() { final VCard vcard = new VCard(); vcard.setFirstName(personalPanel.getFirstName()); vcard.setLastName(personalPanel.getLastName()); vcard.setMiddleName(personalPanel.getMiddleName()); vcard.setEmailHome(personalPanel.getEmailAddress()); vcard.setNickName(personalPanel.getNickname()); vcard.setOrganization(businessPanel.getCompany()); vcard.setAddressFieldWork("STREET", businessPanel.getStreetAddress()); vcard.setAddressFieldWork("LOCALITY", businessPanel.getCity()); vcard.setAddressFieldWork("REGION", businessPanel.getState()); vcard.setAddressFieldWork("PCODE", businessPanel.getZipCode()); vcard.setAddressFieldWork("CTRY", businessPanel.getCountry()); vcard.setField("TITLE", businessPanel.getJobTitle()); vcard.setOrganizationUnit(businessPanel.getDepartment()); vcard.setPhoneWork("VOICE", businessPanel.getPhone()); vcard.setPhoneWork("FAX", businessPanel.getFax()); vcard.setPhoneWork("PAGER", businessPanel.getPager()); vcard.setPhoneWork("CELL", businessPanel.getMobile()); vcard.setField("URL", businessPanel.getWebPage()); vcard.setAddressFieldHome("STREET", homePanel.getStreetAddress()); vcard.setAddressFieldHome("LOCALITY", homePanel.getCity()); vcard.setAddressFieldHome("REGION", homePanel.getState()); vcard.setAddressFieldHome("PCODE", homePanel.getZipCode()); vcard.setAddressFieldHome("CTRY", homePanel.getCountry()); vcard.setPhoneHome("VOICE", homePanel.getPhone()); vcard.setPhoneHome("FAX", homePanel.getFax()); vcard.setPhoneHome("PAGER", homePanel.getPager()); vcard.setPhoneHome("CELL", homePanel.getMobile()); final File avatarFile = avatarPanel.getAvatarFile(); byte[] avatarBytes = avatarPanel.getAvatarBytes(); if (avatarFile != null) { try { ImageIcon icon = new ImageIcon(avatarFile.toURI().toURL()); Image image = icon.getImage(); image = image.getScaledInstance(-1, 48, Image.SCALE_SMOOTH); avatarBytes = GraphicUtils.getBytesFromImage(image); } catch (MalformedURLException e) { Log.error("Unable to set avatar.", e); } } if (avatarBytes != null) vcard.setAvatar(avatarBytes); try { final VCardManager vcardManager = ChatsyManager.getVCardManager(); vcardManager.setPersonalVCard(vcard); vcard.save(ChatsyManager.getConnection()); if (avatarBytes != null) { Presence presence = ChatsyManager.getWorkspace().getStatusBar().getPresence(); Presence newPresence = new Presence(presence.getType(), presence.getStatus(), presence.getPriority(), presence.getMode()); ChatsyManager.getSessionManager().changePresence(newPresence); StatusBar statusBar = ChatsyManager.getWorkspace().getStatusBar(); statusBar.setAvatar(GraphicUtils.scale(new ImageIcon(vcard.getAvatar()), 64, 64)); } else { String firstName = vcard.getFirstName(); String lastName = vcard.getLastName(); StatusBar statusBar = ChatsyManager.getWorkspace().getStatusBar(); if (ModelUtil.hasLength(firstName) && ModelUtil.hasLength(lastName)) statusBar.setNickname(firstName + " " + lastName); else if (ModelUtil.hasLength(firstName)) statusBar.setNickname(firstName); statusBar.setAvatar(null); } ChatsyManager.getVCardManager().notifyVCardListeners(); } catch (XMPPException e) { } } }