From ed37976640969b1befc83c85a0a47b8316eaf889 Mon Sep 17 00:00:00 2001 From: Yana Stamcheva Date: Wed, 12 Dec 2007 18:07:31 +0000 Subject: [PATCH] ContactEventHandler service was added. It is meant to be used from other bundles in order to change the default behavior of events generated when clicking a contact. The GUI implementation takes now in consideration all registered ContactEventHandler-s when managing contact list events. --- build.xml | 13 +++- lib/felix.client.run.properties | 1 + .../communicator/impl/gui/GuiActivator.java | 6 +- .../communicator/impl/gui/UIServiceImpl.java | 21 ++--- .../communicator/impl/gui/main/MainFrame.java | 76 ++++++++++++++++++- .../gui/main/contactlist/ContactList.java | 3 +- .../main/contactlist/ContactListPanel.java | 73 ++++++++++++++---- .../impl/gui/main/login/LoginManager.java | 3 +- .../impl/gui/swing.ui.manifest.mf | 1 + .../ContactEventHandler.java | 28 +++++++ .../contact.event.handler.manifest.mf | 7 ++ 11 files changed, 199 insertions(+), 33 deletions(-) create mode 100644 src/net/java/sip/communicator/service/contacteventhandler/ContactEventHandler.java create mode 100644 src/net/java/sip/communicator/service/contacteventhandler/contact.event.handler.manifest.mf diff --git a/build.xml b/build.xml index 5942b39e6..09cdeaccd 100644 --- a/build.xml +++ b/build.xml @@ -877,7 +877,7 @@ bundle-irc,bundle-plugin-ircaccregwizz, bundle-pluginmanager,bundle-notification, bundle-ssh,bundle-plugin-sshaccregwizz, - bundle-plugin-exampleplugin"/> + bundle-plugin-exampleplugin,bundle-contacteventhandler"/> @@ -1745,7 +1745,6 @@ javax.swing.event, javax.swing.border"/> - @@ -1755,4 +1754,14 @@ javax.swing.event, javax.swing.border"/> prefix="net/java/sip/communicator/plugin/whiteboard"/> + + + + + + + + diff --git a/lib/felix.client.run.properties b/lib/felix.client.run.properties index 9f6f1f786..ad5e592db 100644 --- a/lib/felix.client.run.properties +++ b/lib/felix.client.run.properties @@ -104,6 +104,7 @@ felix.auto.start.60= \ reference:file:sc-bundles/rssaccregwizz.jar \ reference:file:sc-bundles/zeroconfaccregwizz.jar \ reference:file:sc-bundles/ircaccregwizz.jar \ + reference:file:sc-bundles/contacteventhandler.jar \ reference:file:sc-bundles/shutdown.jar # Uncomment the following lines if you want to run the architect viewer diff --git a/src/net/java/sip/communicator/impl/gui/GuiActivator.java b/src/net/java/sip/communicator/impl/gui/GuiActivator.java index 0a7f18d4c..6af9a1419 100644 --- a/src/net/java/sip/communicator/impl/gui/GuiActivator.java +++ b/src/net/java/sip/communicator/impl/gui/GuiActivator.java @@ -75,9 +75,9 @@ public void start(BundleContext bundleContext) throws Exception { logger.info("UI Service...[ STARTED ]"); - bundleContext.registerService(UIService.class.getName(), - this.uiService, null); - + bundleContext.registerService( UIService.class.getName(), + this.uiService, null); + logger.info("UI Service ...[REGISTERED]"); this.uiService.loadApplicationGui(); diff --git a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java index c85743cdc..861f5789d 100644 --- a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java +++ b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java @@ -18,7 +18,6 @@ import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.chat.conference.*; import net.java.sip.communicator.impl.gui.main.configforms.*; -import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.main.contactlist.addcontact.*; import net.java.sip.communicator.impl.gui.main.login.*; import net.java.sip.communicator.impl.gui.utils.*; @@ -43,11 +42,14 @@ public class UIServiceImpl private AccountRegWizardContainerImpl wizardContainer; - private Map registeredPlugins = new Hashtable(); + private Map> registeredPlugins + = new Hashtable>(); - private Vector pluginComponentListeners = new Vector(); + private Vector + pluginComponentListeners = new Vector(); - private static final List supportedContainers = new ArrayList(); + private static final List supportedContainers + = new ArrayList(); static { supportedContainers.add(UIService.CONTAINER_MAIN_TOOL_BAR); @@ -61,14 +63,13 @@ public class UIServiceImpl supportedContainers.add(UIService.CONTAINER_CHAT_HELP_MENU); } - private static final Hashtable exportedWindows = new Hashtable(); + private static final Hashtable exportedWindows + = new Hashtable(); private MainFrame mainFrame; private LoginManager loginManager; - private ContactListPanel contactListPanel; - private ConfigurationFrame configurationFrame; private boolean exitOnClose = true; @@ -91,8 +92,6 @@ public void loadApplicationGui() this.loginManager = new LoginManager(mainFrame); - this.contactListPanel = mainFrame.getContactListPanel(); - this.popupDialog = new PopupDialogImpl(); this.wizardContainer = new AccountRegWizardContainerImpl(mainFrame); @@ -728,6 +727,10 @@ public ConfigurationWindow getConfigurationWindow() return this.configurationFrame; } + /** + * Returns an instance of AuthenticationWindow for the given + * protocol provider, realm and user credentials. + */ public ExportedWindow getAuthenticationWindow( ProtocolProviderService protocolProvider, String realm, UserCredentials userCredentials) diff --git a/src/net/java/sip/communicator/impl/gui/main/MainFrame.java b/src/net/java/sip/communicator/impl/gui/main/MainFrame.java index 64d7beb9e..0570e44da 100755 --- a/src/net/java/sip/communicator/impl/gui/main/MainFrame.java +++ b/src/net/java/sip/communicator/impl/gui/main/MainFrame.java @@ -28,9 +28,10 @@ import net.java.sip.communicator.impl.gui.main.menus.*; import net.java.sip.communicator.impl.gui.main.presence.*; import net.java.sip.communicator.impl.gui.utils.*; -import net.java.sip.communicator.impl.gui.utils.Constants; import net.java.sip.communicator.service.configuration.*; +import net.java.sip.communicator.service.contacteventhandler.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.*; @@ -77,7 +78,11 @@ public class MainFrame private HistoryWindowManager historyWindowManager = new HistoryWindowManager(); - + + private Hashtable + providerContactHandlers + = new Hashtable(); + /** * Creates an instance of MainFrame. */ @@ -317,13 +322,21 @@ public void addProtocolProvider(ProtocolProviderService protocolProvider) { logger.trace("Add the following protocol provider to the gui: " + protocolProvider.getAccountID().getAccountAddress()); - + this.protocolProviders.put(protocolProvider, new Integer(initiateProviderIndex(protocolProvider))); this.addProtocolSupportedOperationSets(protocolProvider); this.addAccount(protocolProvider); + + ContactEventHandler contactHandler + = this.getContactHandlerForProvider(protocolProvider); + + if (contactHandler == null) + contactHandler = new DefaultContactEventHandler(this); + + this.addProviderContactHandler(protocolProvider, contactHandler); } /** @@ -1108,4 +1121,61 @@ public void actionPerformed(ActionEvent e) tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); } }; + + /** + * + * @param protocolProvider + * @param contactHandler + */ + public void addProviderContactHandler( + ProtocolProviderService protocolProvider, + ContactEventHandler contactHandler) + { + providerContactHandlers.put(protocolProvider, contactHandler); + } + + /** + * Returns the ContactEventHandler registered for this protocol + * provider. + * + * @param protocolProvider the ProtocolProviderService for which + * we are searching a ContactEventHandler. + * @return the ContactEventHandler registered for this protocol + * provider + */ + public ContactEventHandler getContactHandler( + ProtocolProviderService protocolProvider) + { + return providerContactHandlers.get(protocolProvider); + } + + /** + * + * @param protocolProvider + * @return + */ + private ContactEventHandler getContactHandlerForProvider( + ProtocolProviderService protocolProvider) + { + ServiceReference[] serRefs = null; + + String osgiFilter = "(" + + ProtocolProviderFactory.PROTOCOL + + "=" + protocolProvider.getProtocolName()+")"; + + try + { + serRefs = GuiActivator.bundleContext.getServiceReferences( + ContactEventHandler.class.getName(), osgiFilter); + } + catch (InvalidSyntaxException ex){ + logger.error("GuiActivator : " + ex); + } + + if(serRefs == null) + return null; + + return (ContactEventHandler) GuiActivator.bundleContext + .getService(serRefs[0]); + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java index 8a2133602..2cd75b15c 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java @@ -642,7 +642,8 @@ else if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) contactRightButtonMenu.setVisible(true); } // Left click on the contact label opens Chat window - else if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) + else if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0 + && e.getClickCount() > 1) { fireContactListEvent(contact, ContactListEvent.CONTACT_SELECTED, e.getClickCount()); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java index 372052699..3c5a43989 100755 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java @@ -18,6 +18,7 @@ import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.contacteventhandler.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; @@ -127,13 +128,53 @@ public ContactList getContactList() */ public void contactClicked(ContactListEvent evt) { - if (evt.getClickCount() > 1) + MetaContact metaContact = evt.getSourceContact(); + + // Searching for the right proto contact to use as default for the + // chat conversation. + Contact defaultContact = metaContact.getDefaultContact(); + + ProtocolProviderService defaultProvider + = defaultContact.getProtocolProvider(); + + OperationSetBasicInstantMessaging + defaultIM = (OperationSetBasicInstantMessaging) + defaultProvider.getOperationSet( + OperationSetBasicInstantMessaging.class); + + ProtocolProviderService protoContactProvider; + OperationSetBasicInstantMessaging protoContactIM; + + if (defaultContact.getPresenceStatus().getStatus() < 1 + && (!defaultIM.isOfflineMessagingSupported() + || !defaultProvider.isRegistered())) { - SwingUtilities - .invokeLater(new RunMessageWindow(evt.getSourceContact())); + Iterator protoContacts = metaContact.getContacts(); + + while(protoContacts.hasNext()) + { + Contact contact = protoContacts.next(); + + protoContactProvider = contact.getProtocolProvider(); + + protoContactIM = (OperationSetBasicInstantMessaging) + protoContactProvider.getOperationSet( + OperationSetBasicInstantMessaging.class); + + if(protoContactIM.isOfflineMessagingSupported() + && protoContactProvider.isRegistered()) + { + defaultContact = contact; + } + } } + + ContactEventHandler contactHandler = mainFrame + .getContactHandler(defaultContact.getProtocolProvider()); + + contactHandler.contactClicked(defaultContact, evt.getClickCount()); } - + /** * Implements the ContactListListener.groupSelected method. */ @@ -145,8 +186,12 @@ public void groupSelected(ContactListEvent evt) */ public void protocolContactClicked(ContactListEvent evt) { - SwingUtilities.invokeLater(new RunMessageWindow(evt.getSourceContact(), - evt.getSourceProtoContact())); + Contact protoContact = evt.getSourceProtoContact(); + + ContactEventHandler contactHandler = mainFrame + .getContactHandler(protoContact.getProtocolProvider()); + + contactHandler.contactClicked(protoContact, evt.getClickCount()); } /** @@ -296,29 +341,29 @@ else if(eventType == MessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED) public void messageDelivered(MessageDeliveredEvent evt) { Contact contact = evt.getDestinationContact(); - + MetaContact metaContact = mainFrame.getContactList() .findMetaContactByContact(contact); logger.trace("MESSAGE DELIVERED to contact: " + evt.getDestinationContact().getAddress()); - - Message msg = evt.getSourceMessage(); - + + Message msg = evt.getSourceMessage(); + ChatWindowManager chatWindowManager = mainFrame.getChatWindowManager(); MetaContactChatPanel chatPanel = null; - + if(chatWindowManager.isChatOpenedForContact(metaContact)) chatPanel = chatWindowManager.getContactChat(metaContact); - + if (chatPanel != null) - { + { ProtocolProviderService protocolProvider = evt .getDestinationContact().getProtocolProvider(); logger.trace("MESSAGE DELIVERED: process message to chat for contact: " + evt.getDestinationContact().getAddress()); - + chatPanel.processMessage(this.mainFrame .getAccount(protocolProvider), evt.getTimestamp(), Constants.OUTGOING_MESSAGE, msg.getContent(), diff --git a/src/net/java/sip/communicator/impl/gui/main/login/LoginManager.java b/src/net/java/sip/communicator/impl/gui/main/login/LoginManager.java index 96cda87ca..a6f2fe920 100644 --- a/src/net/java/sip/communicator/impl/gui/main/login/LoginManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/login/LoginManager.java @@ -81,8 +81,9 @@ public LoginManager(MainFrame mainFrame) public ProtocolProviderService installAccount( ProtocolProviderFactory providerFactory, String user, String passwd) { + Hashtable accountProperties + = new Hashtable(); - Hashtable accountProperties = new Hashtable(); accountProperties.put(ProtocolProviderFactory.PASSWORD, passwd); AccountID accountID = providerFactory.installAccount(user, diff --git a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf index eb91eeb1c..dd7f6244b 100644 --- a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf +++ b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf @@ -23,6 +23,7 @@ Import-Package: org.osgi.framework, net.java.sip.communicator.service.browserlauncher, net.java.sip.communicator.service.notification, net.java.sip.communicator.service.systray, + net.java.sip.communicator.service.contacteventhandler, javax.swing, javax.swing.event, javax.swing.table, diff --git a/src/net/java/sip/communicator/service/contacteventhandler/ContactEventHandler.java b/src/net/java/sip/communicator/service/contacteventhandler/ContactEventHandler.java new file mode 100644 index 000000000..96ca4be26 --- /dev/null +++ b/src/net/java/sip/communicator/service/contacteventhandler/ContactEventHandler.java @@ -0,0 +1,28 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.contacteventhandler; + +import net.java.sip.communicator.service.protocol.*; + +/** + * The ContactEventHandler is meant to be used from other bundles in + * order to change the default behavior of events generated when clicking + * a contact. The GUI implementation should take in consideration all registered + * ContactEventHandlers when managing contact list events. + * + * @author Yana Stamcheva + */ +public interface ContactEventHandler +{ + /** + * Indicates that a contact in the contact list was clicked. + * + * @param contact the selected Contact + * @param clickCount the count of clicks + */ + public void contactClicked(Contact contact, int clickCount); +} diff --git a/src/net/java/sip/communicator/service/contacteventhandler/contact.event.handler.manifest.mf b/src/net/java/sip/communicator/service/contacteventhandler/contact.event.handler.manifest.mf new file mode 100644 index 000000000..506aad70a --- /dev/null +++ b/src/net/java/sip/communicator/service/contacteventhandler/contact.event.handler.manifest.mf @@ -0,0 +1,7 @@ +Bundle-Name: Contact Event Handler service +Bundle-Description: Contact Event Handler service +Bundle-Vendor: sip-communicator.org +Bundle-Version: 0.0.1 +Import-Package: org.osgi.framework, + net.java.sip.communicator.service.protocol +Export-Package: net.java.sip.communicator.service.contacteventhandler