From 718254af15323bf3b1c308dbd50ba1080187d261 Mon Sep 17 00:00:00 2001 From: Yana Stamcheva Date: Wed, 24 Sep 2008 09:34:00 +0000 Subject: [PATCH] Round corners for avatars and account photo. --- .../images/impl/gui/common/personPhoto.png | Bin 4045 -> 4681 bytes .../contactlist/ContactListCellRenderer.java | 82 +++++++++--------- .../gui/main/presence/AccountStatusPanel.java | 73 +++++++++++----- 3 files changed, 93 insertions(+), 62 deletions(-) diff --git a/resources/images/impl/gui/common/personPhoto.png b/resources/images/impl/gui/common/personPhoto.png index 47a8837b7c9f8ddeb52c01df1daa0dcdded9650f..5029cdeaa08e08df38929fb992eb780c63634125 100644 GIT binary patch delta 4673 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 delta 4032 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 is the custom cell renderer used in the @@ -33,16 +35,13 @@ public class ContactListCellRenderer extends JPanel implements ListCellRenderer { + private Logger logger = Logger.getLogger(ContactListCellRenderer.class); private JLabel nameLabel = new JLabel(); private JLabel photoLabel = new JLabel(); private JPanel buttonsPanel; - private SIPCommButton extendPanelButton = new SIPCommButton(ImageLoader - .getImage(ImageLoader.MORE_INFO_ICON), ImageLoader - .getImage(ImageLoader.MORE_INFO_ICON)); - private int rowTransparency = GuiActivator.getResources() .getSettingsInt("contactListRowTransparency"); @@ -55,11 +54,6 @@ public class ContactListCellRenderer private MainFrame mainFrame; - private int CONTACT_PROTOCOL_BUTTON_WIDTH = 20; - - private Color bgColor = new Color(GuiActivator.getResources() - .getColor("contactListRowColor"), true); - /** * Initialize the panel containing the node. */ @@ -104,8 +98,6 @@ public Component getListCellRendererComponent(JList list, Object value, ContactList contactList = (ContactList) list; ContactListModel listModel = (ContactListModel) contactList.getModel(); - - if (value instanceof MetaContact) { this.setPreferredSize(new Dimension(20, 30)); @@ -129,15 +121,10 @@ public Component getListCellRendererComponent(JList list, Object value, this.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 1)); byte[] avatar = contactItem.getAvatar(true); - if (avatar != null) + if (avatar != null && avatar.length > 0) { - ImageIcon imageIcon = new ImageIcon(avatar); - - Image newImage = imageIcon.getImage() - .getScaledInstance(25, 30, Image.SCALE_SMOOTH); - imageIcon.setImage(newImage); - - this.photoLabel.setIcon(imageIcon); + Image roundedAvatar = createRoundImage(avatar); + this.photoLabel.setIcon(new ImageIcon(roundedAvatar)); } // We should set the bounds of the cell explicitely in order to @@ -208,28 +195,41 @@ else if (value instanceof MetaContactGroup) } /** - * Adds the protocol provider index to the given source image. - * @param sourceImage - * @param index - * @return + * Creates a rounded avatar image. + * + * @param avatarBytes The bytes of the initial avatar image. + * + * @return The rounded corner image. */ - private Image createIndexedImage(Image sourceImage, int index) - { - BufferedImage buffImage = new BufferedImage( - 22, 16, BufferedImage.TYPE_INT_ARGB); - - Graphics2D g = (Graphics2D)buffImage.getGraphics(); - AlphaComposite ac = - AlphaComposite.getInstance(AlphaComposite.SRC_OVER); - - AntialiasingManager.activateAntialiasing(g); - g.setColor(Color.DARK_GRAY); - g.setFont(Constants.FONT.deriveFont(Font.BOLD, 9)); - g.drawImage(sourceImage, 0, 0, null); - g.setComposite(ac); - g.drawString(new Integer(index+1).toString(), 14, 8); - - return buffImage; + private Image createRoundImage(byte[] avatarBytes) + { + BufferedImage destImage + = new BufferedImage(25, 30, BufferedImage.TYPE_INT_ARGB); + + BufferedImage avatarImage; + + try + { + InputStream in = new ByteArrayInputStream(avatarBytes); + avatarImage = ImageIO.read(in); + + Graphics2D g = destImage.createGraphics(); + AntialiasingManager.activateAntialiasing(g); + g.setColor(Color.WHITE); + g.fillRoundRect(0, 0, 25, 30, 10, 10); + g.setComposite(AlphaComposite.SrcIn); + + g.drawImage(avatarImage + .getScaledInstance(25, 30, Image.SCALE_SMOOTH), 0, 0, null); + + return destImage; + } + catch (Exception e) + { + logger.error("Could not create image.", e); + } + + return null; } /** diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/AccountStatusPanel.java b/src/net/java/sip/communicator/impl/gui/main/presence/AccountStatusPanel.java index 4bf256bde..3db370e5d 100644 --- a/src/net/java/sip/communicator/impl/gui/main/presence/AccountStatusPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/presence/AccountStatusPanel.java @@ -7,7 +7,10 @@ package net.java.sip.communicator.impl.gui.main.presence; import java.awt.*; +import java.awt.image.*; +import java.io.*; +import javax.imageio.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; @@ -22,10 +25,11 @@ public class AccountStatusPanel extends JPanel implements RegistrationStateChangeListener { + private Logger logger = Logger.getLogger(AccountStatusPanel.class); - static final int AVATAR_ICON_HEIGHT = 45; + private static final int AVATAR_ICON_HEIGHT = 45; - static final int AVATAR_ICON_WIDTH = 40; + private static final int AVATAR_ICON_WIDTH = 40; private JMenuBar statusMenuBar = new JMenuBar(); @@ -75,10 +79,6 @@ public AccountStatusPanel(MainFrame mainFrame) this.rightPanel.add(accountNameLabel); this.rightPanel.add(statusMenuBar); - - this.initAccountImageLabel(); - - this.initAccountNameLabel(); } public void addAccount(ProtocolProviderService protocolProvider) @@ -131,16 +131,6 @@ public boolean hasSelectedMenus() return statusComboBox.hasSelectedMenus(); } - private void initAccountImageLabel() - { - - } - - private void initAccountNameLabel() - { - - } - public void registrationStateChanged(RegistrationStateChangeEvent evt) { final ProtocolProviderService protocolProvider = evt.getProvider(); @@ -164,11 +154,10 @@ public void run() if (accountImage != null) { - accountImageLabel.setIcon( ImageUtils - .scaleIconWithinBounds( - new ImageIcon(accountImage), - AVATAR_ICON_WIDTH, - AVATAR_ICON_HEIGHT)); + Image roundedImage = createRoundImage(accountImage); + + accountImageLabel + .setIcon(new ImageIcon(roundedImage)); } String firstName @@ -224,4 +213,46 @@ protected void paintComponent(Graphics g) g.fillRoundRect(5, 5, this.getWidth() - 10, this.getHeight() - 10, 8, 8); } + + /** + * Creates a rounded avatar image. + * + * @param avatarBytes The bytes of the initial avatar image. + * + * @return The rounded corner image. + */ + private Image createRoundImage(byte[] avatarBytes) + { + BufferedImage destImage + = new BufferedImage(AVATAR_ICON_WIDTH, + AVATAR_ICON_HEIGHT, + BufferedImage.TYPE_INT_ARGB); + + BufferedImage avatarImage; + + try + { + InputStream in = new ByteArrayInputStream(avatarBytes); + avatarImage = ImageIO.read(in); + + Graphics2D g = destImage.createGraphics(); + AntialiasingManager.activateAntialiasing(g); + g.setColor(Color.WHITE); + g.fillRoundRect(0, 0, AVATAR_ICON_WIDTH, AVATAR_ICON_HEIGHT, 10, 10); + g.setComposite(AlphaComposite.SrcIn); + + g.drawImage(avatarImage + .getScaledInstance( AVATAR_ICON_WIDTH, + AVATAR_ICON_HEIGHT, + Image.SCALE_SMOOTH), 0, 0, null); + + return destImage; + } + catch (Exception e) + { + logger.error("Could not create image.", e); + } + + return null; + } }