workaround for sticky focused components and windows
[fedora-idea.git] / platform-impl / src / com / intellij / openapi / wm / impl / IdeFocusManagerImpl.java
blobc504f385ffd5318161a000993998cab05e10f1b5
1 package com.intellij.openapi.wm.impl;
3 import com.intellij.openapi.ui.popup.JBPopup;
4 import com.intellij.openapi.util.ActionCallback;
5 import com.intellij.openapi.wm.FocusCommand;
6 import com.intellij.openapi.wm.IdeFocusManager;
7 import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
8 import com.intellij.ui.FocusTrackback;
9 import org.jetbrains.annotations.NotNull;
10 import org.jetbrains.annotations.Nullable;
12 import javax.swing.*;
13 import java.awt.*;
14 import java.awt.event.KeyEvent;
16 public class IdeFocusManagerImpl extends IdeFocusManager {
17 private final ToolWindowManagerImpl myToolWindowManager;
19 public IdeFocusManagerImpl(ToolWindowManagerImpl toolWindowManager) {
20 myToolWindowManager = toolWindowManager;
23 @NotNull
24 public ActionCallback requestFocus(@NotNull final Component c, final boolean forced) {
25 return myToolWindowManager.requestFocus(c, forced);
28 @NotNull
29 public ActionCallback requestFocus(@NotNull final FocusCommand command, final boolean forced) {
30 return myToolWindowManager.requestFocus(command, forced);
33 public JComponent getFocusTargetFor(@NotNull final JComponent comp) {
34 return IdeFocusTraversalPolicy.getPreferredFocusedComponent(comp);
37 public void doWhenFocusSettlesDown(@NotNull final Runnable runnable) {
38 myToolWindowManager.doWhenFocusSettlesDown(runnable);
41 @Nullable
42 public Component getFocusedDescendantFor(@NotNull final Component comp) {
43 final Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
44 if (focused == null) return null;
46 if (focused == comp || SwingUtilities.isDescendingFrom(focused, comp)) return focused;
48 final JBPopup popup = FocusTrackback.getChildPopup(comp);
50 if (popup != null && popup.isFocused()) return focused;
52 return null;
55 public boolean dispatch(KeyEvent e) {
56 return myToolWindowManager.dispatch(e);
59 @Override
60 public void suspendKeyProcessingUntil(@NotNull ActionCallback done) {
61 myToolWindowManager.suspendKeyProcessingUntil(done);
65 public ActionCallback requestDefaultFocus(boolean forced) {
66 return myToolWindowManager.requestDefaultFocus(forced);
69 public boolean isFocusBeingTransferred() {
70 return !myToolWindowManager.isFocusTransferReady();