diff --git a/lib/installer-exclude/fmj.jar b/lib/installer-exclude/fmj.jar index 77403b450..3a6441303 100644 Binary files a/lib/installer-exclude/fmj.jar and b/lib/installer-exclude/fmj.jar differ diff --git a/lib/installer-exclude/ice4j.jar b/lib/installer-exclude/ice4j.jar index ca03d9ae1..feb3fd2a9 100644 Binary files a/lib/installer-exclude/ice4j.jar and b/lib/installer-exclude/ice4j.jar differ diff --git a/lib/installer-exclude/libjitsi.jar b/lib/installer-exclude/libjitsi.jar index a93128055..38ad7d92a 100644 Binary files a/lib/installer-exclude/libjitsi.jar and b/lib/installer-exclude/libjitsi.jar differ diff --git a/src/net/java/sip/communicator/impl/gui/main/SingleWindowContainer.java b/src/net/java/sip/communicator/impl/gui/main/SingleWindowContainer.java index 7db79d786..cdeffa3d4 100644 --- a/src/net/java/sip/communicator/impl/gui/main/SingleWindowContainer.java +++ b/src/net/java/sip/communicator/impl/gui/main/SingleWindowContainer.java @@ -202,7 +202,7 @@ public void close(CallPanel callPanel, boolean delay) * @return true to indicate that a component contained in this * container currently owns the keyboard focus, false - otherwise */ - public boolean containsFocus() + public boolean containsFocusOwner() { ChatPanel chat = getCurrentChat(); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSearchKeyDispatcher.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSearchKeyDispatcher.java index 856b9cf2e..0b080588d 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSearchKeyDispatcher.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSearchKeyDispatcher.java @@ -12,6 +12,7 @@ import javax.swing.text.*; import net.java.sip.communicator.impl.gui.*; +import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.service.gui.*; /** @@ -77,22 +78,31 @@ public void setContactList(ContactList contactList) */ public boolean dispatchKeyEvent(KeyEvent e) { + // If this window is not the focus window or if the event is not of type + // PRESSED, we have nothing more to do here. Also don't re-dispatch any + // events if the menu is active. + if (!contactListContainer.isFocused()) + return false; + + int id = e.getID(); + + if (id != KeyEvent.KEY_PRESSED && id != KeyEvent.KEY_TYPED) + return false; + + SingleWindowContainer singleWindowContainer + = GuiActivator.getUIService().getSingleWindowContainer(); + + if ((singleWindowContainer != null) + && singleWindowContainer.containsFocusOwner()) + return false; + Component focusOwner = keyManager.getFocusOwner(); - // If this window is not the focus window or if the event is not - // of type PRESSED we have nothing more to do here. - // Also don't re-dispatch any events if the menu is active. - if (!contactListContainer.isFocused() - || (e.getID() != KeyEvent.KEY_PRESSED - && e.getID() != KeyEvent.KEY_TYPED) - || (GuiActivator.getUIService() - .getSingleWindowContainer() != null) - && GuiActivator.getUIService() - .getSingleWindowContainer().containsFocus() - || (focusOwner != null + if (focusOwner != null && !searchField.isFocusOwner() && focusOwner instanceof JTextComponent) - || contactListContainer.isMenuSelected()) + return false; + if (contactListContainer.isMenuSelected()) return false; // Ctrl-Enter || Cmd-Enter typed when this window is the focused @@ -106,15 +116,16 @@ public boolean dispatchKeyEvent(KeyEvent e) // This is why we need to do it here and to check if the // permanent focus owner is equal to the focus owner, which is not // the case when a popup menu is opened. - if (e.getKeyCode() == KeyEvent.VK_ENTER - && (e.isControlDown() || e.isMetaDown())) + int keyCode = e.getKeyCode(); + + if (keyCode == KeyEvent.VK_ENTER + && (e.isControlDown() || e.isMetaDown())) { contactListContainer.ctrlEnterKeyTyped(); return false; } - else if (e.getKeyCode() == KeyEvent.VK_ENTER - && keyManager.getFocusOwner() - .equals(keyManager.getPermanentFocusOwner())) + else if (keyCode == KeyEvent.VK_ENTER + && focusOwner.equals(keyManager.getPermanentFocusOwner())) { contactListContainer.enterKeyTyped(); return false; @@ -122,10 +133,10 @@ else if (e.getKeyCode() == KeyEvent.VK_ENTER // If the search field is the focus owner. if (searchField.isFocusOwner() - && (e.getKeyCode() == KeyEvent.VK_UP - || e.getKeyCode() == KeyEvent.VK_DOWN - || e.getKeyCode() == KeyEvent.VK_PAGE_UP - || e.getKeyCode() == KeyEvent.VK_PAGE_DOWN)) + && (keyCode == KeyEvent.VK_UP + || keyCode == KeyEvent.VK_DOWN + || keyCode == KeyEvent.VK_PAGE_UP + || keyCode == KeyEvent.VK_PAGE_DOWN)) { contactList.selectFirstContact(); contactList.getComponent().requestFocus(); @@ -134,54 +145,51 @@ else if (e.getKeyCode() == KeyEvent.VK_ENTER // If the contact list is the focus owner. if (contactList.getComponent().isFocusOwner() - && e.getKeyCode() == KeyEvent.VK_ESCAPE) + && keyCode == KeyEvent.VK_ESCAPE) { // Removes all current selections. contactList.removeSelection(); if (searchField.getText() != null) - { searchField.requestFocus(); - } + return false; } + char keyChar = e.getKeyChar(); UIGroup selectedGroup = contactList.getSelectedGroup(); // No matter who is the focus owner. - if (e.getKeyChar() == KeyEvent.CHAR_UNDEFINED - || e.getKeyCode() == KeyEvent.VK_ENTER - || e.getKeyCode() == KeyEvent.VK_DELETE - || e.getKeyCode() == KeyEvent.VK_BACK_SPACE - || e.getKeyCode() == KeyEvent.VK_TAB - || e.getKeyChar() == '\t' - || e.getKeyCode() == KeyEvent.VK_SPACE - || (selectedGroup != null - && (e.getKeyChar() == '+' - || e.getKeyChar() == '-'))) + if (keyChar == KeyEvent.CHAR_UNDEFINED + || keyCode == KeyEvent.VK_ENTER + || keyCode == KeyEvent.VK_DELETE + || keyCode == KeyEvent.VK_BACK_SPACE + || keyCode == KeyEvent.VK_TAB + || e.getKeyChar() == '\t' + || keyCode == KeyEvent.VK_SPACE + || (selectedGroup != null + && (keyChar == '+' || keyChar == '-'))) { return false; } boolean singleWindowRule - = GuiActivator.getUIService().getSingleWindowContainer() == null + = singleWindowContainer == null || contactList.getComponent().isFocusOwner(); if (!searchField.isFocusOwner() - && keyManager.getFocusOwner() != null - && singleWindowRule - && keyManager.getFocusOwner() - .equals(keyManager.getPermanentFocusOwner())) + && focusOwner != null + && singleWindowRule + && focusOwner.equals(keyManager.getPermanentFocusOwner())) { // Request the focus in the search field if a letter is typed. searchField.requestFocusInWindow(); - // We re-dispatch the event to search field. keyManager.redispatchEvent(searchField, e); - // We don't want to dispatch further this event. return true; } + return false; } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java index c7e28acd1..d10bfb0a2 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java @@ -8,7 +8,6 @@ import java.awt.*; import java.awt.event.*; - import java.util.*; import java.util.List; @@ -16,6 +15,8 @@ import javax.swing.JPopupMenu.Separator; import javax.swing.tree.*; +import org.jitsi.util.*; + import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; @@ -459,14 +460,18 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, * system font (size) so there is no reason to specify any font size * here, let alone a hard-coded absolute one. Anyway, use a * hard-coded absolute font size but at least do not fall bellow the - * default system font size. + * default system font size. On second thought, we are pretty sure + * that we are using the default system font on Windows and it makes + * no sense whatsoever to change its size. */ Font nameLabelFont = nameLabel.getFont(); nameLabel.setFont( nameLabelFont.deriveFont( Font.PLAIN, - Math.max(nameLabelFont.getSize2D(), 13f))); + Math.max( + nameLabelFont.getSize2D(), + OSUtils.IS_WINDOWS ? 0F : 13F))); if (contactForegroundColor != null) nameLabel.setForeground(contactForegroundColor); @@ -537,14 +542,18 @@ else if (value instanceof GroupNode) * system font (size) so there is no reason to specify any font size * here, let alone a hard-coded absolute one. Anyway, use a * hard-coded absolute font size but at least do not fall bellow the - * default system font size. + * default system font size. On second thought, we are pretty sure + * that we are using the default system font on Windows and it makes + * no sense whatsoever to change its size. */ Font nameLabelFont = nameLabel.getFont(); nameLabel.setFont( nameLabelFont.deriveFont( Font.BOLD, - Math.max(nameLabelFont.getSize2D(), 13f))); + Math.max( + nameLabelFont.getSize2D(), + OSUtils.IS_WINDOWS ? 0F : 13F))); nameLabel.setText(groupItem.getDisplayName()); if (groupForegroundColor != null)