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) {} + }); + } + }); + } +}