diff --git a/src/net/java/sip/communicator/impl/gui/customcontrols/BoxPopupMenu.java b/src/net/java/sip/communicator/impl/gui/customcontrols/BoxPopupMenu.java
index a116857da..7126a0f60 100644
--- a/src/net/java/sip/communicator/impl/gui/customcontrols/BoxPopupMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/customcontrols/BoxPopupMenu.java
@@ -7,7 +7,8 @@
package net.java.sip.communicator.impl.gui.customcontrols;
import java.awt.*;
-import javax.swing.*;
+
+import net.java.sip.communicator.util.swing.*;
/**
* The BoxPopupMenu is a JPopupMenu, which orders its
@@ -16,8 +17,9 @@
*
* @author Yana Stamcheva
*/
-public class BoxPopupMenu extends JPopupMenu {
-
+public class BoxPopupMenu
+ extends SIPCommPopupMenu
+{
private static final long serialVersionUID = -8488327445916201464L;
private int itemsCount;
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java
index fe24a3edf..606abd0f4 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java
@@ -23,6 +23,7 @@
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChooseCallAccountDialog is the dialog shown when calling a
@@ -33,7 +34,7 @@
* @author Adam Netocny
*/
public class ChooseCallAccountPopupMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements Skinnable
{
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/TransferActiveCallsMenu.java b/src/net/java/sip/communicator/impl/gui/main/call/TransferActiveCallsMenu.java
index d72d3931a..00bc48c7c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/TransferActiveCallsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/TransferActiveCallsMenu.java
@@ -15,6 +15,7 @@
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChooseCallAccountDialog is the dialog shown when calling a
@@ -25,7 +26,7 @@
* @author Adam Netocny
*/
public class TransferActiveCallsMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements Skinnable
{
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatContactRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatContactRightButtonMenu.java
index c6c0ec7d6..89565d11b 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatContactRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatContactRightButtonMenu.java
@@ -18,6 +18,7 @@
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChatContactRightButtonMenu is the menu, opened when user clicks
@@ -30,7 +31,7 @@
* @author Ingo Bauersachs
*/
public class ChatContactRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
Skinnable
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/menus/ChatRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chat/menus/ChatRightButtonMenu.java
index c15cc7c21..c619a3433 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/menus/ChatRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/menus/ChatRightButtonMenu.java
@@ -15,6 +15,7 @@
import net.java.sip.communicator.impl.gui.main.chat.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChatRightButtonMenu appears when the user makes a right button
@@ -25,7 +26,7 @@
* @author Adam Netocny
*/
public class ChatRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
Skinnable
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/menus/WritePanelRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chat/menus/WritePanelRightButtonMenu.java
index e3c9b619f..598a252ed 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/menus/WritePanelRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/menus/WritePanelRightButtonMenu.java
@@ -15,6 +15,7 @@
import net.java.sip.communicator.impl.gui.main.chat.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The WritePanelRightButtonMenu appears when the user makes a right
@@ -24,7 +25,7 @@
* @author Adam Netocny
*/
public class WritePanelRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
Skinnable
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomCommonRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomCommonRightButtonMenu.java
index c339f3b73..8b691ac1c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomCommonRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomCommonRightButtonMenu.java
@@ -22,6 +22,7 @@
import net.java.sip.communicator.service.gui.Container;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
import org.osgi.framework.*;
@@ -34,7 +35,7 @@
* @author Adam Netocny
*/
public class ChatRoomCommonRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
PluginComponentListener,
Skinnable
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java
index 4229035a5..576a49002 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java
@@ -19,6 +19,7 @@
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.resources.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChatRoomsListRightButtonMenu is the menu, opened when user clicks
@@ -29,7 +30,7 @@
* @author Lubomir Marinov
*/
public class ChatRoomRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener
{
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomServerRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomServerRightButtonMenu.java
index 1547118b7..f11fa8b5f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomServerRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomServerRightButtonMenu.java
@@ -16,6 +16,7 @@
import net.java.sip.communicator.impl.gui.main.chatroomslist.joinforms.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The ChatRoomsListRightButtonMenu is the menu, opened when user clicks
@@ -26,7 +27,7 @@
* @author Adam Netocny
*/
public class ChatRoomServerRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
Skinnable
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/CommonRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/CommonRightButtonMenu.java
index 494ce45a1..8fa2da815 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/CommonRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/CommonRightButtonMenu.java
@@ -15,6 +15,7 @@
import net.java.sip.communicator.impl.gui.main.contactlist.addgroup.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
/**
* The GroupRightButtonMenu is the menu, opened when user clicks with the
@@ -25,7 +26,7 @@
* @author Adam Netocny
*/
public class CommonRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
Skinnable
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupRightButtonMenu.java
index 769d7d993..8c45425e6 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupRightButtonMenu.java
@@ -19,6 +19,7 @@
import net.java.sip.communicator.service.gui.Container;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
+import net.java.sip.communicator.util.swing.*;
import org.osgi.framework.*;
@@ -31,7 +32,7 @@
* @author Adam Netocny
*/
public class GroupRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
PluginComponentListener,
Skinnable
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
index 09761db3b..031cef6eb 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
@@ -40,7 +40,7 @@
* @author Adam Netocny
*/
public class MetaContactRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener,
PluginComponentListener,
ContactListListener,
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java
index ea306383f..c9b129c28 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SourceContactRightButtonMenu.java
@@ -31,7 +31,7 @@
* @author Adam Netocny
*/
public class SourceContactRightButtonMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements Skinnable
{
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/avatar/SelectAvatarMenu.java b/src/net/java/sip/communicator/impl/gui/main/presence/avatar/SelectAvatarMenu.java
index 86a6aac1e..f7b2cf5e9 100644
--- a/src/net/java/sip/communicator/impl/gui/main/presence/avatar/SelectAvatarMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/presence/avatar/SelectAvatarMenu.java
@@ -24,7 +24,7 @@
* @author Damian Minkov
*/
public class SelectAvatarMenu
- extends JPopupMenu
+ extends SIPCommPopupMenu
implements ActionListener
{
/**
diff --git a/src/net/java/sip/communicator/util/swing/SIPCommPopupMenu.java b/src/net/java/sip/communicator/util/swing/SIPCommPopupMenu.java
new file mode 100644
index 000000000..e1a3675f1
--- /dev/null
+++ b/src/net/java/sip/communicator/util/swing/SIPCommPopupMenu.java
@@ -0,0 +1,60 @@
+/*
+ * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.util.swing;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+
+/**
+ * A custom popup menu that detects parent focus lost.
+ *
+ * @author Yana Stamcheva
+ */
+public class SIPCommPopupMenu
+ extends JPopupMenu
+{
+ public SIPCommPopupMenu()
+ {
+ // Hides the popup menu when the parent window loses focus.
+ addComponentListener(new ComponentAdapter()
+ {
+ public void componentResized(ComponentEvent evt)
+ {
+ Window parentWindow;
+
+ Component parent = getParent();
+
+ // If this is a submenu get the invoker first.
+ if (parent instanceof JPopupMenu)
+ parentWindow = SwingUtilities.getWindowAncestor(
+ ((JPopupMenu) parent).getInvoker());
+ else
+ parentWindow
+ = SwingUtilities.getWindowAncestor(getInvoker());
+
+ if (!parentWindow.isActive())
+ {
+ setVisible(false);
+ }
+
+ parentWindow.addWindowFocusListener(new WindowFocusListener()
+ {
+ public void windowLostFocus(WindowEvent e)
+ {
+ if (SIPCommPopupMenu.this != null
+ && SIPCommPopupMenu.this.isVisible())
+ SIPCommPopupMenu.this.setVisible(false);
+ }
+
+ public void windowGainedFocus(WindowEvent e) {}
+ });
+ }
+ });
+ }
+}