diff options
author | Yana Stamcheva <yana@jitsi.org> | 2012-08-13 09:56:31 +0000 |
---|---|---|
committer | Yana Stamcheva <yana@jitsi.org> | 2012-08-13 09:56:31 +0000 |
commit | 8992d147b79b0311f1211d0e1a9d7222ce0a9486 (patch) | |
tree | 78688cbbba1ca95044e6dfee2c7d9e587d894f86 /src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java | |
parent | 3301f2a10dd2999f830629bdc73b50fff0e40a59 (diff) | |
download | jitsi-8992d147b79b0311f1211d0e1a9d7222ce0a9486.zip jitsi-8992d147b79b0311f1211d0e1a9d7222ce0a9486.tar.gz jitsi-8992d147b79b0311f1211d0e1a9d7222ce0a9486.tar.bz2 |
A new custom contact action service allowing to represent more actions for a contact entry in the contact list.
Diffstat (limited to 'src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java')
-rw-r--r-- | src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java new file mode 100644 index 0000000..6bc3884 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java @@ -0,0 +1,233 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main.contactlist; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import java.util.*; +import java.util.List; + +import javax.swing.*; + +import net.java.sip.communicator.impl.gui.*; +import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; + +/** + * 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 ChooseUIContactDetailPopupMenu + extends SIPCommPopupMenu + implements Skinnable +{ + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + /** + * The invoker component. + */ + private final JComponent invoker; + + /** + * Creates this dialog by specifying a list of telephony contacts to choose + * from. + * + * @param invoker the invoker of this pop up + * @param telephonyObjects the list of telephony contacts to select through + * @param opSetClass the operation class, which indicates what action would + * be performed if an item is selected from the list + */ + public ChooseUIContactDetailPopupMenu(JComponent invoker, + List<UIContactDetail> contactDetails, + UIContactDetailAction action) + { + this.invoker = invoker; + this.init(GuiActivator.getResources() + .getI18NString("service.gui.CHOOSE_CONTACT")); + + for (UIContactDetail detail : contactDetails) + { + this.addContactDetailItem(detail, action); + } + } + + /** + * Initializes and add some common components. + * + * @param infoString the string we'd like to show on the top of this + * popup menu + */ + private void init(String infoString) + { + setInvoker(invoker); + + this.add(createInfoLabel(infoString)); + + this.addSeparator(); + + this.setFocusable(true); + } + + /** + * Adds the given <tt>telephonyContact</tt> to the list of available + * telephony contact. + * + * @param telephonyContact the telephony contact to add + * @param opSetClass the operation set class, that indicates the action that + * would be performed when an item is selected + */ + private void addContactDetailItem( + final UIContactDetail contactDetail, + final UIContactDetailAction contactDetailAction) + { + final ContactMenuItem contactItem + = new ContactMenuItem(contactDetail); + + contactItem.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + contactDetailAction.actionPerformed(contactDetail); + + ChooseUIContactDetailPopupMenu.this.setVisible(false); + } + }); + + add(contactItem); + } + + /** + * 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. + * + * @param infoString the string we'd like to show on the top of this + * popup menu + * @return the created info label + */ + private Component createInfoLabel(String infoString) + { + JMenuItem infoLabel = new JMenuItem(); + + infoLabel.setEnabled(false); + infoLabel.setFocusable(false); + + infoLabel.setText("<html><b>" + infoString + "</b></html>"); + + return infoLabel; + } + + /** + * A custom menu item corresponding to a specific protocol <tt>Contact</tt>. + */ + private class ContactMenuItem + extends JMenuItem + implements Skinnable + { + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + private final UIContactDetail contact; + + public ContactMenuItem(UIContactDetail contact) + { + this.contact = contact; + + String itemName = "<html>"; + Iterator<String> labels = contact.getLabels(); + + if (labels != null && labels.hasNext()) + while (labels.hasNext()) + itemName += "<b style=\"color: gray\">" + + labels.next().toLowerCase() + "</b> "; + + itemName += contact.getAddress() + "</html>"; + + this.setText(itemName); + loadSkin(); + } + + /** + * Reloads contact icon. + */ + public void loadSkin() + { + ImageIcon contactIcon = contact.getStatusIcon(); + + if (contactIcon == null) + { + PresenceStatus status = contact.getPresenceStatus(); + + BufferedImage statusIcon = null; + if (status != null) + statusIcon = Constants.getStatusIcon(status); + + if (statusIcon != null) + contactIcon = ImageLoader.getIndexedProtocolIcon( + statusIcon, + contact.getPreferredProtocolProvider(null)); + } + + if (contactIcon != null) + this.setIcon(ImageLoader.getIndexedProtocolIcon( + contactIcon.getImage(), + contact.getPreferredProtocolProvider(null))); + } + } + + /** + * Reloads all menu items. + */ + public void loadSkin() + { + Component[] components = getComponents(); + for(Component component : components) + { + if(component instanceof Skinnable) + { + Skinnable skinnableComponent = (Skinnable) component; + skinnableComponent.loadSkin(); + } + } + } +} |