phonemanager.java.svn-base
来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 332 行
SVN-BASE
332 行
/** * $Revision$ * $Date$ * * Copyright (C) 1999-2005 Jive Software. All rights reserved. * This software is the proprietary information of Jive Software. Use is subject to license terms. */package org.jivesoftware.spark.phone;import org.jivesoftware.resource.Res;import org.jivesoftware.resource.SparkRes;import org.jivesoftware.spark.ChatManager;import org.jivesoftware.spark.SparkManager;import org.jivesoftware.spark.plugin.ContextMenuListener;import org.jivesoftware.spark.ui.ChatRoom;import org.jivesoftware.spark.ui.ChatRoomButton;import org.jivesoftware.spark.ui.ChatRoomListener;import org.jivesoftware.spark.ui.ContactItem;import org.jivesoftware.spark.ui.ContactList;import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;import org.jivesoftware.spark.util.SwingWorker;import org.jivesoftware.sparkimpl.plugin.phone.JMFInit;import org.jivesoftware.Spark;import javax.swing.Action;import javax.swing.JMenu;import javax.swing.JPopupMenu;import javax.media.MediaLocator;import javax.media.protocol.DataSource;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;/** * Handles general phone behavior in Spark. This allows for many different phone systems * to plug into Spark in a more elegant way. */public class PhoneManager implements ChatRoomListener, ContextMenuListener { private static PhoneManager singleton; private static final Object LOCK = new Object(); private List<Phone> phones = new CopyOnWriteArrayList<Phone>(); private List<String> currentCalls = new ArrayList<String>(); // Static Media Locator static private MediaLocator mediaLocator = null; // Static Media Locator Preference static private boolean useStaticLocator = false; // Static using MediaLocator static private boolean usingMediaLocator = false; // Static DataSource static private DataSource ds; /** * Returns the singleton instance of <CODE>PhoneManager</CODE>, * creating it if necessary. * <p/> * * @return the singleton instance of <Code>PhoneManager</CODE> */ public static PhoneManager getInstance() { // Synchronize on LOCK to ensure that we don't end up creating // two singletons. synchronized (LOCK) { if (null == singleton) { PhoneManager controller = new PhoneManager(); singleton = controller; return controller; } } return singleton; } private PhoneManager() { JMFInit.start(false); if (Spark.isVista() || Spark.isLinux()) { setUseStaticLocator(true); } } private void addListeners() { // Handle ChatRooms. final ChatManager chatManager = SparkManager.getChatManager(); chatManager.addChatRoomListener(this); // Handle ContextMenus. final ContactList contactList = SparkManager.getWorkspace().getContactList(); contactList.addContextMenuListener(this); } public void addPhone(Phone phone) { if (phones.isEmpty()) { addListeners(); } phones.add(phone); } public void removePhone(Phone phone) { phones.remove(phone); } public void chatRoomOpened(final ChatRoom room) { if (!phones.isEmpty() && room instanceof ChatRoomImpl) { final ChatRoomImpl chatRoomImpl = (ChatRoomImpl) room; final ChatRoomButton dialButton = new ChatRoomButton(SparkRes.getImageIcon(SparkRes.DIAL_PHONE_IMAGE_24x24)); dialButton.setToolTipText(Res.getString("tooltip.place.voice.call")); final List<Action> actions = new ArrayList<Action>(); SwingWorker actionWorker = new SwingWorker() { public Object construct() { for (Phone phone : phones) { final Collection<Action> phoneActions = phone.getPhoneActions(chatRoomImpl.getParticipantJID()); if (phoneActions != null) { for (Action action : phoneActions) { actions.add(action); } } } return actions; } public void finished() { if (!actions.isEmpty()) { room.getToolBar().addChatRoomButton(dialButton); room.getToolBar().invalidate(); room.getToolBar().validate(); room.getToolBar().repaint(); } } }; actionWorker.start(); dialButton.addMouseListener(new MouseAdapter() { public void mousePressed(final MouseEvent e) { SwingWorker worker = new SwingWorker() { public Object construct() { try { Thread.sleep(50); } catch (InterruptedException e1) { e1.printStackTrace(); } return true; } public void finished() { // Handle actions. if (actions.size() > 0) { // Display PopupMenu final JPopupMenu menu = new JPopupMenu(); for (Action action : actions) { menu.add(action); } menu.show(dialButton, e.getX(), e.getY()); } } }; worker.start(); } }); } } public void chatRoomLeft(ChatRoom room) { } public void chatRoomClosed(ChatRoom room) { } public void chatRoomActivated(ChatRoom room) { } public void userHasJoined(ChatRoom room, String userid) { } public void userHasLeft(ChatRoom room, String userid) { } public void poppingUp(Object object, final JPopupMenu popup) { if (!phones.isEmpty()) { if (object instanceof ContactItem) { final ContactItem contactItem = (ContactItem) object; final List<Action> actions = new ArrayList<Action>(); SwingWorker worker = new SwingWorker() { public Object construct() { for (Phone phone : phones) { final Collection<Action> itemActions = phone.getPhoneActions(contactItem.getJID()); for (Action action : itemActions) { actions.add(action); } } return null; } public void finished() { if (actions.size() > 0) { final JMenu dialMenu = new JMenu(Res.getString("title.dial.phone")); dialMenu.setIcon(SparkRes.getImageIcon(SparkRes.DIAL_PHONE_IMAGE_16x16)); for (Action action : actions) { dialMenu.add(action); } int count = popup.getComponentCount(); if (count > 2) { popup.insert(dialMenu, 2); } popup.invalidate(); popup.validate(); popup.repaint(); } } }; worker.start(); } } } public void poppingDown(JPopupMenu popup) { } public boolean handleDefaultAction(MouseEvent e) { return false; } public void addCurrentCall(String phoneNumber) { currentCalls.add(phoneNumber); } public void removeCurrentCall(String phoneNumber) { currentCalls.remove(phoneNumber); } public boolean containsCurrentCall(String phoneNumber) { return currentCalls.contains(phoneNumber); } public static String getNumbersFromPhone(String number) { if (number == null) { return null; } number = number.replace("-", ""); number = number.replace("(", ""); number = number.replace(")", ""); number = number.replace(" ", ""); if (number.startsWith("1")) { number = number.substring(1); } return number; } public static MediaLocator getMediaLocator(String locator) { MediaLocator auxLocator; if (useStaticLocator) { if (mediaLocator == null) { mediaLocator = new MediaLocator(locator); } auxLocator = mediaLocator; //usingMediaLocator=true; } else { auxLocator = new MediaLocator(locator); } return auxLocator; } public static DataSource getDataSource(String locator) { if (ds == null) { try { ds = javax.media.Manager.createDataSource(getMediaLocator(locator)); } catch (Exception e) { e.printStackTrace(); return null; } } return ds; } public static DataSource getDataSource(MediaLocator locator) { if (ds == null) { try { ds = javax.media.Manager.createDataSource(locator); } catch (Exception e) { e.printStackTrace(); return null; } } return ds; } public static boolean isUsingMediaLocator() { return usingMediaLocator; } public static void setUsingMediaLocator(boolean usingMediaLocator) { PhoneManager.usingMediaLocator = usingMediaLocator; } public static boolean isUseStaticLocator() { return useStaticLocator; } public static void setUseStaticLocator(boolean useStaticLocator) { PhoneManager.useStaticLocator = useStaticLocator; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?