diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java index d97710f79..41790c8f1 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java @@ -1111,6 +1111,15 @@ private Contact getDefaultContact(MetaContact metaContact) Contact defaultContact = metaContact.getDefaultContact( OperationSetBasicInstantMessaging.class); + if(defaultContact == null) + { + defaultContact = metaContact.getDefaultContact( + OperationSetSmsMessaging.class); + + if(defaultContact == null) + return null; + } + ProtocolProviderService defaultProvider = defaultContact.getProtocolProvider(); @@ -1170,6 +1179,9 @@ private ChatPanel createChat( MetaContact metaContact, if (protocolContact == null) protocolContact = getDefaultContact(metaContact); + if(protocolContact == null) + return null; + ChatContainer chatContainer = getChatContainer(); ChatPanel chatPanel = new ChatPanel(chatContainer); @@ -1456,6 +1468,9 @@ public void run() { ChatPanel chatPanel = getContactChat(metaContact, protocolContact); + if(chatPanel == null) + return; + // if not explicitly set, do not set it, leave it to default or // internally make the decision if(isSmsSelected != null) diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java index 08c88b12b..9862e70a4 100755 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java @@ -10,6 +10,7 @@ import java.awt.event.*; import java.io.*; import java.util.*; +import java.util.List; import javax.swing.*; import javax.swing.Timer; @@ -24,6 +25,8 @@ import net.java.sip.communicator.impl.gui.main.chat.menus.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.plugin.desktoputil.*; +import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.contactsource.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.protocol.*; @@ -282,6 +285,31 @@ private void initSmsLabel(final JPanel centerPanel) @Override public void actionPerformed(ActionEvent e) { + if(smsMode) + { + // check are we allowed to change back to im mode + Object descr = chatPanel.getChatSession().getDescriptor(); + + if(descr instanceof MetaContact) + { + List imContact + = ((MetaContact)descr).getContactsForOperationSet( + OperationSetBasicInstantMessaging.class); + + if(imContact == null || imContact.size() == 0) + return; + } + else if(descr instanceof SourceContact) + { + List imContact + = ((SourceContact)descr).getContactDetails( + OperationSetBasicInstantMessaging.class); + + if(imContact == null || imContact.size() == 0) + return; + } + } + smsMode = smsButton.isSelected(); Color bgColor; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java index 26b73ea46..6deddafc4 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java @@ -167,7 +167,13 @@ public void contactClicked(ContactListEvent evt) // do nothing if(defaultContact == null) - return; + { + defaultContact = metaContact.getDefaultContact( + OperationSetSmsMessaging.class); + + if(defaultContact == null) + return; + } ProtocolProviderService defaultProvider = defaultContact.getProtocolProvider(); @@ -262,6 +268,17 @@ else if(mucDetails != null && mucDetails.size() > 0) if(room != null) GuiActivator.getMUCService().openChatRoom(room); } + else + { + List smsDetails = contact.getContactDetails( + OperationSetSmsMessaging.class); + + if(smsDetails != null && smsDetails.size() > 0) + { + GuiActivator.getUIService().getChatWindowManager() + .startChat(contact.getContactAddress(), true); + } + } } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java index 29e8e70c1..8dfb86606 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java @@ -1903,6 +1903,17 @@ else if(mucDetails != null && mucDetails.size() > 0) if(room != null) GuiActivator.getMUCService().openChatRoom(room); } + else + { + List smsDetails = contact.getContactDetails( + OperationSetSmsMessaging.class); + + if(smsDetails != null && smsDetails.size() > 0) + { + GuiActivator.getUIService().getChatWindowManager() + .startChat(contact.getContactAddress(), true); + } + } } } } diff --git a/src/net/java/sip/communicator/impl/msghistory/MessageSourceContact.java b/src/net/java/sip/communicator/impl/msghistory/MessageSourceContact.java index bb661f30f..e1473446c 100644 --- a/src/net/java/sip/communicator/impl/msghistory/MessageSourceContact.java +++ b/src/net/java/sip/communicator/impl/msghistory/MessageSourceContact.java @@ -110,15 +110,20 @@ public ProtocolProviderService getProtocolProviderService() { update(source); - if(source instanceof MessageDeliveredEvent - || source instanceof MessageReceivedEvent) + if(source instanceof MessageDeliveredEvent) + { + initDetails(false, + ((MessageDeliveredEvent)source).getDestinationContact()); + } + else if(source instanceof MessageReceivedEvent) { - initDetails(false); + initDetails(false, + ((MessageReceivedEvent)source).getSourceContact()); } else if(source instanceof ChatRoomMessageDeliveredEvent || source instanceof ChatRoomMessageReceivedEvent) { - initDetails(true); + initDetails(true, null); } this.service = service; @@ -277,7 +282,7 @@ public String toString() * Will skip OperationSetBasicInstantMessaging for chat rooms. * @param isChatRoom is current source contact a chat room. */ - private void initDetails(boolean isChatRoom) + private void initDetails(boolean isChatRoom, Contact contact) { ContactDetail contactDetail = new ContactDetail( @@ -290,6 +295,13 @@ private void initDetails(boolean isChatRoom) ProtocolProviderService preferredProvider = this.ppService; + OperationSetContactCapabilities capOpSet + = preferredProvider + .getOperationSet(OperationSetContactCapabilities.class); + Map opsetCapabilities = null; + if(capOpSet != null) + opsetCapabilities = capOpSet.getSupportedOperationSets(contact); + if (preferredProvider != null) { preferredProviders @@ -312,6 +324,11 @@ private void initDetails(boolean isChatRoom) continue; } + if(!isChatRoom + && opsetCapabilities != null + && !opsetCapabilities.containsKey(opset.getName())) + continue; + preferredProviders.put(opset, preferredProvider); supportedOpSets.add(opset);