/* * 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; import javax.swing.*; import net.java.sip.communicator.plugin.desktoputil.*; /** * The <tt>ChatContact</tt> is a wrapping class for the <tt>Contact</tt> and * <tt>ChatRoomMember</tt> interface. * * @param <T> the type of the descriptor * * @author Yana Stamcheva * @author Lubomir Marinov */ public abstract class ChatContact<T> { /** * The height of the avatar icon. */ public static final int AVATAR_ICON_HEIGHT = 25; /** * The width of the avatar icon. */ public static final int AVATAR_ICON_WIDTH = 25; /** * The avatar image corresponding to the source contact in the form of an * <code>ImageIcon</code>. */ private ImageIcon avatar; /** * The avatar image corresponding to the source contact in the form of an * array of bytes. */ private byte[] avatarBytes; /** * The descriptor being adapted by this instance. */ protected final T descriptor; /** * If this instance is selected. */ private boolean selected; /** * Initializes a new <tt>ChatContact</tt> instance with a specific * descriptor. * * @param descriptor the descriptor to be adapted by the new instance */ protected ChatContact(T descriptor) { this.descriptor = descriptor; } /** * Determines whether a specific <tt>Object</tt> represents the same value * as this <tt>ChatContact</tt>. * * @param obj the <tt>Object</tt> to be checked for value equality with this * <tt>ChatContact</tt> * @return <tt>true</tt> if <tt>obj</tt> represents the same value as this * <tt>ChatContact</tt>; otherwise, <tt>false</tt>. */ @Override public boolean equals(Object obj) { if (this == obj) return true; /* * ChatContact is an adapter so two ChatContacts of the same runtime * type with equal descriptors are equal. */ if (!getClass().isInstance(obj)) return false; @SuppressWarnings("unchecked") ChatContact<T> chatContact = (ChatContact<T>) obj; return getDescriptor().equals(chatContact.getDescriptor()); } /** * Returns the avatar image corresponding to the source contact. In the case * of multi user chat contact returns null. * * @return the avatar image corresponding to the source contact. In the case * of multi user chat contact returns null */ public ImageIcon getAvatar() { byte[] avatarBytes = getAvatarBytes(); if (this.avatarBytes != avatarBytes) { this.avatarBytes = avatarBytes; this.avatar = null; } if ((this.avatar == null) && (this.avatarBytes != null) && (this.avatarBytes.length > 0)) this.avatar = ImageUtils.getScaledRoundedIcon( this.avatarBytes, AVATAR_ICON_WIDTH, AVATAR_ICON_HEIGHT); return this.avatar; } /** * Gets the avatar image corresponding to the source contact in the form of * an array of bytes. * * @return an array of bytes which represents the avatar image corresponding * to the source contact */ protected abstract byte[] getAvatarBytes(); /** * Returns the descriptor object corresponding to this chat contact. In the * case of single chat this could be the <tt>MetaContact</tt> and in the * case of conference chat this could be the <tt>ChatRoomMember</tt>. * * @return the descriptor object corresponding to this chat contact. */ public T getDescriptor() { return descriptor; } /** * Returns the contact name. * * @return the contact name */ public abstract String getName(); /** * Gets the implementation-specific identifier which uniquely specifies this * contact. * * @return an identifier which uniquely specifies this contact */ public abstract String getUID(); /** * Gets a hash code value for this object for the benefit of hashtables. * * @return a hash code value for this object */ @Override public int hashCode() { /* * ChatContact is an adapter so two ChatContacts of the same runtime * type with equal descriptors are equal. */ return getDescriptor().hashCode(); } /** * Returns <code>true</code> if this is the currently selected contact in * the list of contacts for the chat, otherwise returns <code>false</code>. * @return <code>true</code> if this is the currently selected contact in * the list of contacts for the chat, otherwise returns <code>false</code>. */ public boolean isSelected() { return selected; } /** * Sets this isSelected property of this chat contact. * * @param selected <code>true</code> to indicate that this contact would be * the selected contact in the list of chat window contacts; otherwise, * <code>false</code> */ public void setSelected(boolean selected) { this.selected = selected; } }