diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/MetaContactChatPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/MetaContactChatPanel.java index 32c114e14..1d4fef291 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/MetaContactChatPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/MetaContactChatPanel.java @@ -7,6 +7,7 @@ package net.java.sip.communicator.impl.gui.main.chat; +import java.awt.*; import java.awt.event.*; import java.util.*; @@ -39,6 +40,8 @@ public class MetaContactChatPanel private static final Logger logger = Logger .getLogger(MetaContactChatPanel.class.getName()); + private ChatWindow chatWindow; + private MetaContact metaContact; private Date firstHistoryMsgTimestamp; @@ -73,6 +76,8 @@ public MetaContactChatPanel( ChatWindow chatWindow, { super(chatWindow); + this.chatWindow = chatWindow; + this.metaContact = metaContact; ChatContact chatContact = new ChatContact(metaContact, protocolContact); @@ -769,80 +774,122 @@ public void inviteChatContact(String contactAddress, String reason) private void sendSmsMessage(String text) { - Contact contact = (Contact) contactSelectorBox.getMenu() - .getSelectedObject(); + OperationSetSmsMessaging smsOpSet = null; + Contact contact = null; + Iterator contacts = metaContact.getContacts(); - OperationSetSmsMessaging smsOpSet - = (OperationSetSmsMessaging) contact.getProtocolProvider() - .getOperationSet(OperationSetSmsMessaging.class); - - if (smsOpSet == null) + while (contacts.hasNext()) { - logger.error("Failed to send SMS."); + contact = (Contact) contacts.next(); - this.refreshWriteArea(); + smsOpSet + = (OperationSetSmsMessaging) contact.getProtocolProvider() + .getOperationSet(OperationSetSmsMessaging.class); - this.processMessage( - contact.getDisplayName(), - new Date(System.currentTimeMillis()), - Constants.OUTGOING_MESSAGE, - text, "plain/text"); + if (smsOpSet != null) + break; + } - this.processMessage( - contact.getDisplayName(), - new Date(System.currentTimeMillis()), - Constants.ERROR_MESSAGE, - Messages.getI18NString("sendSmsNotSupported") - .getText(), "plain/text"); + if (smsOpSet != null) + { + Message message = smsOpSet.createMessage(text); + try + { + smsOpSet.sendSmsMessage(contact, message); + } + catch (IllegalStateException ex) + { + logger.error("Failed to send SMS.", ex); + + this.refreshWriteArea(); + + this.processMessage( + contact.getDisplayName(), + new Date(System.currentTimeMillis()), + Constants.OUTGOING_MESSAGE, + message.getContent(), + message.getContentType()); + + this.processMessage( + contact.getDisplayName(), + new Date(System.currentTimeMillis()), + Constants.ERROR_MESSAGE, + Messages.getI18NString("msgSendConnectionProblem") + .getText(), "text"); + } + catch (Exception ex) + { + logger.error("Failed to send SMS.", ex); + + this.refreshWriteArea(); + + this.processMessage( + contact.getDisplayName(), + new Date(System.currentTimeMillis()), + Constants.OUTGOING_MESSAGE, + message.getContent(), message.getContentType()); + + this.processMessage( + contact.getDisplayName(), + new Date(System.currentTimeMillis()), + Constants.ERROR_MESSAGE, + Messages.getI18NString("msgDeliveryInternalError") + .getText(), "text"); + } + return; } - Message message = smsOpSet.createMessage(text); + // If we didn't find a Sms operation set in the current meta contact. + Iterator protocolProviders + = chatWindow.getMainFrame().getProtocolProviders(); - try + while (protocolProviders.hasNext()) { - smsOpSet.sendSmsMessage(contact, message); - } - catch (IllegalStateException ex) - { - logger.error("Failed to send SMS.", ex); - - this.refreshWriteArea(); + ProtocolProviderService protocolProvider + = (ProtocolProviderService) protocolProviders.next(); - this.processMessage( - contact.getDisplayName(), - new Date(System.currentTimeMillis()), - Constants.OUTGOING_MESSAGE, - message.getContent(), - message.getContentType()); + smsOpSet = (OperationSetSmsMessaging) protocolProvider + .getOperationSet(OperationSetSmsMessaging.class); - this.processMessage( - contact.getDisplayName(), - new Date(System.currentTimeMillis()), - Constants.ERROR_MESSAGE, - Messages.getI18NString("msgSendConnectionProblem") - .getText(), "text"); + // When we find the first SMS operation set we stop searching. + if (smsOpSet != null) + break; } - catch (Exception ex) + + // If there's no operation set we show some "not supported" messages + // and we return. + if (smsOpSet == null) { - logger.error("Failed to send SMS.", ex); + logger.error("Failed to send SMS."); this.refreshWriteArea(); this.processMessage( - contact.getDisplayName(), + metaContact.getDisplayName(), new Date(System.currentTimeMillis()), Constants.OUTGOING_MESSAGE, - message.getContent(), message.getContentType()); + text, "plain/text"); this.processMessage( - contact.getDisplayName(), + metaContact.getDisplayName(), new Date(System.currentTimeMillis()), Constants.ERROR_MESSAGE, - Messages.getI18NString("msgDeliveryInternalError") - .getText(), "text"); + Messages.getI18NString("sendSmsNotSupported") + .getText(), "plain/text"); + + return; } + + // Otherwise we create the message. + Message message = smsOpSet.createMessage(text); + + // We open the send SMS dialog. + SendSmsDialog smsDialog = new SendSmsDialog(this, message, null); + + smsDialog.setPreferredSize(new Dimension(300, 300)); + smsDialog.setVisible(true); } private void sendInstantMessage(String text) diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/SendSmsDialog.java b/src/net/java/sip/communicator/impl/gui/main/chat/SendSmsDialog.java new file mode 100644 index 000000000..b1453f67f --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/chat/SendSmsDialog.java @@ -0,0 +1,185 @@ +/* + * 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.impl.gui.main.chat; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; + +import javax.swing.*; + +import net.java.sip.communicator.impl.gui.customcontrols.*; +import net.java.sip.communicator.impl.gui.i18n.*; +import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.*; + +/** + * The dialog, shown when user click on the chat "Send" button, while the + * "Send as SMS" option is selected. This dialog allow the user to choose or + * enter its new own phone number to which the SMS would be sent. + * + * @author Yana Stamcheva + */ +public class SendSmsDialog + extends SIPCommDialog +{ + private Logger logger = Logger.getLogger(SendSmsDialog.class); + + private String title = Messages.getI18NString("sendSms").getText(); + + private JLabel phoneNumberLabel = new JLabel( + Messages.getI18NString("enterPhoneNumber").getText()); + + private JTextField phoneNumberBox + = new JTextField(); + + private JTextArea detailsArea = new JTextArea( + Messages.getI18NString("sendSmsDetails").getText()); + + private JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); + + private JButton sendButton = new JButton( + Messages.getI18NString("send").getText()); + + private JPanel buttonPanel = new JPanel( + new FlowLayout(FlowLayout.RIGHT)); + + private ChatPanel chatPanel; + + private OperationSetSmsMessaging smsOpSet; + + private Message smsMessage; + + private MetaContact metaContact; + + /** + * Creates and constructs the SendSmsDialog, by specifying its parent chat, + * the message that will be send at the end and the + * OperationSetSmsMessaging to be used for sending the message. + * + * @param chatPanel the chat sending the message + * @param message the SMS message + * @param opSet the OperationSetSmsMessaging that will be used to + * send the message + */ + public SendSmsDialog( ChatPanel chatPanel, + Message message, + OperationSetSmsMessaging opSet) + { + super(chatPanel.getChatWindow()); + + this.chatPanel = chatPanel; + + this.smsOpSet = opSet; + + this.smsMessage = message; + + this.metaContact = (MetaContact) chatPanel.getChatIdentifier(); + + this.setTitle(title); + + this.getContentPane().add(mainPanel, BorderLayout.CENTER); + this.getContentPane().add(buttonPanel, BorderLayout.SOUTH); + + this.mainPanel.setBorder( + BorderFactory.createEmptyBorder(20, 20, 20, 20)); + this.mainPanel.add(phoneNumberLabel, BorderLayout.WEST); + this.mainPanel.add(phoneNumberBox, BorderLayout.CENTER); + this.mainPanel.add(detailsArea, BorderLayout.SOUTH); + + List detailsList = metaContact.getDetails("mobile"); + + if (detailsList != null && detailsList.size() > 0) + { + String detail = (String) detailsList.iterator().next(); + + phoneNumberBox.setText(detail); + } + + this.detailsArea.setOpaque(false); + this.detailsArea.setLineWrap(true); + this.detailsArea.setWrapStyleWord(true); + this.detailsArea.setEditable(false); + + this.buttonPanel.add(sendButton); + + this.sendButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent event) + { + sendSmsMessage( phoneNumberBox.getText(), + smsMessage); + } + }); + } + + @Override + protected void close(boolean isEscaped) + { + } + + /** + * Sends the given message to the given phoneNumber, using the current + * SMS operation set. + * + * @param phoneNumber the phone number to which the message should be sent. + * @param message the message to send. + */ + private void sendSmsMessage(String phoneNumber, Message message) + { + metaContact.addDetail("mobile", phoneNumber); + + try + { + smsOpSet.sendSmsMessage(phoneNumber, message); + } + catch (IllegalStateException ex) + { + logger.error("Failed to send SMS.", ex); + + chatPanel.refreshWriteArea(); + + chatPanel.processMessage( + phoneNumber, + new Date(System.currentTimeMillis()), + Constants.OUTGOING_MESSAGE, + message.getContent(), + message.getContentType()); + + chatPanel.processMessage( + phoneNumber, + new Date(System.currentTimeMillis()), + Constants.ERROR_MESSAGE, + Messages.getI18NString("msgSendConnectionProblem") + .getText(), "text"); + } + catch (Exception ex) + { + logger.error("Failed to send SMS.", ex); + + chatPanel.refreshWriteArea(); + + chatPanel.processMessage( + phoneNumber, + new Date(System.currentTimeMillis()), + Constants.OUTGOING_MESSAGE, + message.getContent(), message.getContentType()); + + chatPanel.processMessage( + phoneNumber, + new Date(System.currentTimeMillis()), + Constants.ERROR_MESSAGE, + Messages.getI18NString("msgDeliveryInternalError") + .getText(), "text"); + } + + this.dispose(); + } +}