/* * 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.plugin.contactinfo; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; /** * The left side panel of ContactInfoDialog. Display all associated subcontacts * and their respective protocols in a JList. If a user is selected, the * ContactInfoDetailsPanel will be updated to the current contact. * * @author Adam Goldstein * @author Yana Stamcheva */ public class ContactInfoContactPanel extends TransparentPanel { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The list of all subcontacts related to the selected contact. */ private JList contactList = new JList(); /** * The scroll pane containing the list of all sub contacts of a selected * contact. */ private JScrollPane contactScrollPane = new JScrollPane(); private DefaultListModel contactListModel = new DefaultListModel(); /** * The parent dialog that makes the connection between the contacts and * the details panel. */ private ContactInfoDialog contactInfoDialog; /** * Create a panel with a list of all sub-contacts associated with the * contact that was originally selected. Whenever a sub-contact is picked, * notifies the protocolPanel of the change and it will update the displayed * details. * * @param contacts the list of contacts * @param dialog the contact info dialog */ public ContactInfoContactPanel( Iterator contacts, ContactInfoDialog dialog) { super(new BorderLayout()); this.contactInfoDialog = dialog; this.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createTitledBorder(Resources.getString("service.gui.CONTACTS")), BorderFactory.createEmptyBorder(5, 5, 5, 5))); this.contactList.setOpaque(false); this.contactList.setModel(contactListModel); this.contactList.setCellRenderer(new ContactPanelCellRenderer()); this.contactList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { // When the user release the mouse button and completes the // selection, getValueIsAdjusting() becomes false if (!e.getValueIsAdjusting()) { JList list = (JList) e.getSource(); Contact selectedContact = (Contact) list.getSelectedValue(); contactInfoDialog.loadContactDetails(selectedContact); } } }); boolean isFirstIter = true; while (contacts.hasNext()) { Contact contact = contacts.next(); this.contactListModel.addElement(contact); if (isFirstIter) { isFirstIter = false; contactInfoDialog.loadContactDetails(contact); contactList.setSelectedIndex(0); } } this.contactScrollPane.setPreferredSize(new Dimension(100, 200)); this.contactScrollPane.getViewport().add(contactList); this.add(contactScrollPane); } /** * A cell renderer that allows both text and icons in our contactList. */ private static class ContactPanelCellRenderer extends DefaultListCellRenderer { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private boolean isSelected; private Color blueGreyBorderColor = new Color(131, 149, 178); private Color selectedColor = new Color(209, 212, 225); public ContactPanelCellRenderer() { this.setOpaque(false); } /** * Renders a Contact object in a JList, by visualizing * the contact name and the protocol icon. * * @param list the rendered JList * @param value the object to be rendered * @param index the index of the object in the list * @param isSelected indicates if the rendered object is selected * @param cellHasFocus indicates if the rendered object is in a focused * cell */ @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); this.isSelected = isSelected; Contact contact = (Contact) value; this.setIcon(new ImageIcon(contact.getProtocolProvider() .getProtocolIcon().getIcon(ProtocolIcon.ICON_SIZE_16x16))); this.setText(((Contact) value).getDisplayName()); return this; } /** * Paint a round blue border and background when a cell is selected. */ @Override public void paintComponent(Graphics g) { if (this.isSelected) { Graphics2D g2 = (Graphics2D) g.create(); try { AntialiasingManager.activateAntialiasing(g2); int width = getWidth(); int height = getHeight(); g2.setColor(selectedColor); g2.fillRoundRect(1, 0, width, height, 7, 7); g2.setColor(blueGreyBorderColor); g2.setStroke(new BasicStroke(1.5f)); g2.drawRoundRect(1, 0, width - 2, height - 1, 7, 7); } finally { g2.dispose(); } } super.paintComponent(g); } } }