/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.impl.gui.main.chat.conference; import java.awt.*; import java.util.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.ServerStoredDetails.BinaryDetail; import net.java.sip.communicator.service.protocol.ServerStoredDetails.GenericDetail; /** * The <tt>ChatContactCellRenderer</tt> is the renderer for the chat room * contact list. * * @author Yana Stamcheva * @author Valentin Martinet * @author Lubomir Marinov */ public class ChatContactCellRenderer extends ContactListCellRenderer { /** * Color constant for contacts that are at least available. */ private static final Color COLOR_AVAILABILITY_THRESHOLD = Color.BLACK; /** * Color constant for contacts that are at least away. */ private static final Color COLOR_AWAY_THRESHOLD = Color.GRAY; /** * Implements the <tt>ListCellRenderer</tt> method. Returns this panel that * has been configured to display a chat contact. * * @param list the source list * @param value the value of the current cell * @param index the index of the current cell in the source list * @param isSelected indicates if this cell is selected * @param cellHasFocus indicates if this cell is focused * * @return this panel */ @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { this.index = index; this.rightLabel.setIcon(null); final ChatContact<?> chatContact = (ChatContact<?>) value; if(chatContact == null) return this; ChatRoomMember member = null; if (chatContact.getDescriptor() instanceof ChatRoomMember) member = (ChatRoomMember) chatContact.getDescriptor(); this.setPreferredSize(new Dimension(20, 30)); String displayName; // if(member != null && member.getContact() != null) // { // displayName = member.getContact().getDisplayName(); // } // else displayName = chatContact.getName(); if (displayName == null || displayName.length() < 1) { displayName = GuiActivator.getResources() .getI18NString("service.gui.UNKNOWN"); } this.nameLabel.setFont(this.getFont().deriveFont(Font.PLAIN)); this.nameLabel.setText(displayName); if(member != null) { ChatRoomMemberRole memberRole = member.getRole(); if(memberRole != null) this.nameLabel.setIcon( ChatContactRoleIcon.getRoleIcon(memberRole)); final int presenceStatus = member.getPresenceStatus().getStatus(); if (presenceStatus >= PresenceStatus.AVAILABLE_THRESHOLD) { this.nameLabel.setForeground(COLOR_AVAILABILITY_THRESHOLD); } else if (presenceStatus >= PresenceStatus.AWAY_THRESHOLD) { this.nameLabel.setForeground(COLOR_AWAY_THRESHOLD); } } else if (contactForegroundColor != null) this.nameLabel.setForeground(contactForegroundColor); this.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 1)); ImageIcon avatar = chatContact.getAvatar(); if (avatar != null) this.rightLabel.setIcon(avatar); else if (member != null) { ChatRoom memberChatRoom = member.getChatRoom(); ProtocolProviderService protocolProvider = memberChatRoom.getParentProvider(); if(chatContact.getName().equals( memberChatRoom.getUserNickname())) { // Try to retrieve local user avatar: OperationSetServerStoredAccountInfo opSet = protocolProvider.getOperationSet( OperationSetServerStoredAccountInfo.class); if (opSet != null) { Iterator<GenericDetail> itr; try { itr = opSet.getAllAvailableDetails(); } catch (IllegalStateException isex) { /* * It may be wrong to try to utilize the OperationSet * when the account is logged out but this is painting * we're doing here i.e. we'll screw the whole window * up. */ itr = null; } if (itr != null) while(itr.hasNext()) { GenericDetail detail = itr.next(); if(detail instanceof BinaryDetail) { BinaryDetail bin = (BinaryDetail)detail; byte[] binBytes = bin.getBytes(); if(binBytes != null) this.rightLabel.setIcon( ImageUtils.getScaledRoundedIcon( binBytes, 25, 25)); break; } } } ChatRoomMemberRole role; /* * XXX I don't know why ChatRoom#getUserRole() would not be * implemented when ChatRoomMember#getRole() is or why the * former would exist at all as anything else but as a * convenience delegating to the latter, but IRC seems to be the * case and the whole IRC channel painting fails because of it. */ try { role = memberChatRoom.getUserRole(); } catch (UnsupportedOperationException uoex) { role = member.getRole(); } if (role != null) this.nameLabel.setIcon( ChatContactRoleIcon.getRoleIcon(role)); } else { // Try to retrieve participant's avatar. OperationSetPersistentPresence opSet = protocolProvider.getOperationSet( OperationSetPersistentPresence.class); if (opSet != null) { Contact c = opSet.findContactByID(member.getContactAddress()); if (c != null) { byte[] cImage = c.getImage(); if (cImage != null) this.rightLabel.setIcon( ImageUtils.getScaledRoundedIcon( cImage, 25, 25)); } } } } // We should set the bounds of the cell explicitly in order to make // getComponentAt work properly. int listWidth = list.getWidth(); this.setBounds(0, 0, listWidth - 2, 30); this.nameLabel.setBounds(0, 0, listWidth - 28, 17); this.rightLabel.setBounds(listWidth - 28, 0, 25, 30); this.isLeaf = true; this.isSelected = isSelected; return this; } }