/* * 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.call; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.skin.*; /** * The <tt>ChooseCallAccountDialog</tt> is the dialog shown when calling a * contact in order to let the user choose the account he'd prefer to use in * order to call this contact. * * @author Yana Stamcheva * @author Adam Netocny */ public class TransferActiveCallsMenu extends SIPCommPopupMenu implements Skinnable { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The invoker component. */ private final JComponent invoker; /** * The initial peer we're aiming to transfer. */ private final CallPeer initialPeer; /** * Creates an instance of the <tt>TransferActiveCallsMenu</tt>. * @param invoker the invoker component * @param peer the initial peer we're aiming to transfer * @param callPeers a list of all possible call peers to transfer to */ public TransferActiveCallsMenu( JComponent invoker, CallPeer peer, Collection<CallPeer> callPeers) { this.invoker = invoker; this.initialPeer = peer; this.init(); for (CallPeer callPeer : callPeers) addCallPeerItem(callPeer); this.addSeparator(); // At the end add the possibility to transfer to anyone // (Unattended transfer). JMenuItem transferToMenuItem = new JMenuItem( GuiActivator.getResources() .getI18NString("service.gui.TRANSFER_TO")); transferToMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { CallManager.openCallTransferDialog(initialPeer); } }); this.add(transferToMenuItem); } /** * Initializes and add some common components. */ private void init() { setInvoker(invoker); this.add(createInfoLabel()); this.addSeparator(); this.setFocusable(true); } /** * Adds the given <tt>callPeer</tt> to the list of available * call peers for call transfer. * @param callPeer the call peer to add item for */ private void addCallPeerItem(final CallPeer callPeer) { final CallPeerMenuItem peerItem = new CallPeerMenuItem(callPeer); peerItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { CallManager.transferCall(initialPeer, callPeer); } }); this.add(peerItem); } /** * Shows the dialog at the given location. * @param x the x coordinate * @param y the y coordinate */ public void showPopupMenu(int x, int y) { setLocation(x, y); setVisible(true); } /** * Shows this popup menu regarding to its invoker location. */ public void showPopupMenu() { Point location = new Point(invoker.getX(), invoker.getY() + invoker.getHeight()); SwingUtilities .convertPointToScreen(location, invoker.getParent()); setLocation(location); setVisible(true); } /** * Creates the info label. * @return the created info label */ private Component createInfoLabel() { JLabel infoLabel = new JLabel(); infoLabel.setText("<html><b>" + GuiActivator.getResources() .getI18NString("service.gui.TRANSFER_CALL_TO") + "</b></html>"); return infoLabel; } /** * Reloads all menu items. */ public void loadSkin() { Component[] components = getComponents(); for(Component component : components) { if(component instanceof Skinnable) { Skinnable skinnableComponent = (Skinnable) component; skinnableComponent.loadSkin(); } } } /** * A custom menu item corresponding to a specific <tt>CallPeer</tt>. */ private static class CallPeerMenuItem extends JMenuItem implements Skinnable { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The <tt>CallPeer</tt> of this instance. */ private final CallPeer callPeer; /** * Constructor. * * @param peer the <tt>CallPeer</tt> */ public CallPeerMenuItem(CallPeer peer) { this.callPeer = peer; this.setText(callPeer.getDisplayName()); loadSkin(); } /** * Reloads icon. */ public void loadSkin() { byte[] peerIcon = callPeer.getImage(); if (peerIcon != null) this.setIcon(new ImageIcon(peerIcon)); } } }