diff --git a/src/java/org/jivesoftware/spark/Workspace.java b/src/java/org/jivesoftware/spark/Workspace.java index 192e78a5..c584a84e 100644 --- a/src/java/org/jivesoftware/spark/Workspace.java +++ b/src/java/org/jivesoftware/spark/Workspace.java @@ -43,13 +43,6 @@ import org.jivesoftware.sparkimpl.plugin.gateways.GatewayPlugin; import org.jivesoftware.sparkimpl.plugin.manager.Enterprise; import org.jivesoftware.sparkimpl.plugin.transcripts.ChatTranscriptPlugin; -import javax.swing.AbstractAction; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; - import java.awt.CardLayout; import java.awt.Color; import java.awt.GridBagConstraints; @@ -60,6 +53,13 @@ import java.util.ArrayList; import java.util.List; import java.util.TimerTask; +import javax.swing.AbstractAction; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; + /** * The inner Container for Spark. The Workspace is the container for all plugins into the Spark @@ -322,11 +322,11 @@ public class Workspace extends JPanel implements PacketListener { boolean broadcast = message.getProperty("broadcast") != null; if (body == null || - isGroupChat || - broadcast || - message.getType() == Message.Type.normal || - message.getType() == Message.Type.headline || - message.getType() == Message.Type.error) { + isGroupChat || + broadcast || + message.getType() == Message.Type.normal || + message.getType() == Message.Type.headline || + message.getType() == Message.Type.error) { return; } diff --git a/src/java/org/jivesoftware/spark/ui/ContactGroup.java b/src/java/org/jivesoftware/spark/ui/ContactGroup.java index 6e985ee5..0046b69e 100644 --- a/src/java/org/jivesoftware/spark/ui/ContactGroup.java +++ b/src/java/org/jivesoftware/spark/ui/ContactGroup.java @@ -471,6 +471,9 @@ public class ContactGroup extends CollapsiblePane implements MouseListener { Object o = null; try { int loc = contactItemList.locationToIndex(e.getPoint()); + if(loc == -1){ + return; + } o = model.getElementAt(loc); if (!(o instanceof ContactItem)) { diff --git a/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayButton.java b/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayButton.java index cc5193a2..534475aa 100644 --- a/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayButton.java +++ b/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayButton.java @@ -124,7 +124,7 @@ public class GatewayButton extends JPanel { final JMenuItem unregisterMenu = new JMenuItem(Res.getString("menuitem.delete.login.information")); unregisterMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { - int confirm = JOptionPane.showConfirmDialog(SparkManager.getMainWindow(), Res.getString("message.disable.transport"), Res.getString("title.disable.transport"), JOptionPane.YES_NO_OPTION); + int confirm = JOptionPane.showConfirmDialog(SparkManager.getMainWindow(), Res.getString("message.disable.transport", transport.getName()), Res.getString("title.disable.transport"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { try { TransportUtils.unregister(SparkManager.getConnection(), transport.getServiceName()); diff --git a/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java b/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java index 34131f6e..20c8f08d 100644 --- a/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java +++ b/src/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java @@ -10,11 +10,14 @@ package org.jivesoftware.sparkimpl.plugin.gateways; +import org.jivesoftware.resource.SparkRes; import org.jivesoftware.smack.PacketListener; -import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.filter.OrFilter; +import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; +import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.provider.ProviderManager; @@ -25,8 +28,8 @@ import org.jivesoftware.smackx.packet.DiscoverInfo.Identity; import org.jivesoftware.smackx.packet.DiscoverItems; import org.jivesoftware.smackx.packet.DiscoverItems.Item; import org.jivesoftware.spark.ChatManager; -import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.PresenceManager; +import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.plugin.Plugin; import org.jivesoftware.spark.ui.ContactGroup; import org.jivesoftware.spark.ui.ContactItem; @@ -41,16 +44,16 @@ import org.jivesoftware.sparkimpl.plugin.gateways.transports.MSNTransport; import org.jivesoftware.sparkimpl.plugin.gateways.transports.Transport; import org.jivesoftware.sparkimpl.plugin.gateways.transports.TransportUtils; import org.jivesoftware.sparkimpl.plugin.gateways.transports.YahooTransport; -import org.jivesoftware.resource.SparkRes; - -import javax.swing.Icon; -import javax.swing.JPanel; -import javax.swing.JLabel; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import javax.swing.Icon; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + /** * Handles Gateways/Transports in Spark. * @@ -88,7 +91,7 @@ public class GatewayPlugin implements Plugin, ContactItemHandler { return; } - if(TransportUtils.getTransports().size() > 0){ + if (TransportUtils.getTransports().size() > 0) { final JPanel commandPanel = SparkManager.getWorkspace().getCommandPanel(); final JLabel dividerLabel = new JLabel(SparkRes.getImageIcon("DIVIDER_IMAGE")); commandPanel.add(dividerLabel); @@ -132,7 +135,7 @@ public class GatewayPlugin implements Plugin, ContactItemHandler { info = discoveryManager.discoverInfo(item.getEntityID()); } catch (XMPPException e) { - Log.debug("Unable to locate "+item); + Log.debug("Unable to locate " + item); continue; } Iterator identities = info.getIdentities(); @@ -168,23 +171,40 @@ public class GatewayPlugin implements Plugin, ContactItemHandler { } private void registerPresenceListener() { + PacketFilter orFilter = new OrFilter(new PacketTypeFilter(Presence.class), new PacketTypeFilter(Message.class)); + SparkManager.getConnection().addPacketListener(new PacketListener() { public void processPacket(Packet packet) { - Presence presence = (Presence)packet; - Transport transport = TransportUtils.getTransport(packet.getFrom()); - if (transport != null) { - boolean registered = true; - if (presence.getType() == Presence.Type.unavailable) { - registered = false; + if (packet instanceof Presence) { + Presence presence = (Presence)packet; + Transport transport = TransportUtils.getTransport(packet.getFrom()); + if (transport != null) { + boolean registered = true; + if (presence.getType() == Presence.Type.unavailable) { + registered = false; + } + + GatewayButton button = uiMap.get(transport); + button.signedIn(registered); } - - GatewayButton button = uiMap.get(transport); - button.signedIn(registered); } + else if (packet instanceof Message) { + Message message = (Message)packet; + String from = message.getFrom(); + boolean hasError = message.getType() == Message.Type.error; + String body = message.getBody(); - + if (from != null && hasError) { + Transport transport = TransportUtils.getTransport(from); + String title = "Alert from " + transport.getName(); + if (transport != null) { + // Show error + JOptionPane.showMessageDialog(SparkManager.getMainWindow(), body, title, JOptionPane.ERROR_MESSAGE); + } + } + } } - }, new PacketTypeFilter(Presence.class)); + }, orFilter); ChatManager chatManager = SparkManager.getChatManager(); diff --git a/src/resources/i18n/spark_i18n.properties b/src/resources/i18n/spark_i18n.properties index 209b3800..225cbfd7 100644 --- a/src/resources/i18n/spark_i18n.properties +++ b/src/resources/i18n/spark_i18n.properties @@ -412,7 +412,7 @@ message.unable.to.send.file = You were unable to send the file to {0}. message.sending.file.to = Sending file to {0}. message.you.have.sent = You have sent a file to {0}. message.file.transfer.rejected = The file transfer was not accepted by {0}. -message.disable.transport = Remove login information from gateway? +message.disable.transport = Remove login information from {0}? message.register.transports = Register with these available transports. message.enter.aim = Enter your AIM username and password below. message.enter.msn = Enter your MSN username and password below.