blob: 5a64a1cd8bd634e20672dbb3c798d275832264ea [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.wm.ex;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.registry.Registry;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
/**
* @author Vladimir Kondratyev
*/
public class LayoutFocusTraversalPolicyExt extends LayoutFocusTraversalPolicy{
/**
* Overriden default component
*/
private static JComponent myOverridenDefaultComponent;
private boolean myNoDefaultComponent;
private Object myNoDefaultComponentRequestor;
private boolean myQueryImpl = false;
public void setNoDefaultComponent(boolean noDefaultComponent, Object requestor) {
if (noDefaultComponent) {
myNoDefaultComponent = noDefaultComponent;
myNoDefaultComponentRequestor = requestor;
} else {
if (myNoDefaultComponentRequestor == requestor) {
myNoDefaultComponent = false;
myNoDefaultComponentRequestor = null;
}
}
}
public boolean isNoDefaultComponent() {
if (myQueryImpl) return false;
return myNoDefaultComponent || Registry.is("actionSystem.noDefaultComponent");
}
@Nullable
public static LayoutFocusTraversalPolicyExt findWindowPolicy(Component c) {
Window wnd;
if (c instanceof Window) {
wnd = (Window)c;
} else {
wnd = SwingUtilities.getWindowAncestor(c);
}
final FocusTraversalPolicy policy = wnd.getFocusTraversalPolicy();
if (policy instanceof LayoutFocusTraversalPolicyExt) {
return (LayoutFocusTraversalPolicyExt)policy;
} else {
return null;
}
}
/**
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
*
* THIS IS AN "ABSOLUTELY-GURU METHOD".
* NOBODY SHOULD ADD OTHER USAGES OF IT :)
* ONLY ANTON AND VOVA ARE PERMITTED TO USE THIS METHOD!!!
*
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
* !!!!! CAUTION !!!!!
*
* This is absolutely guru method. Please do not use it without deep understanding
* of Swing concepts, especially Swing focus management. <b>do not forget to clear
* this "overiden" component!</b>
*/
public static void setOverridenDefaultComponent(final JComponent overridenDefaultComponent) {
myOverridenDefaultComponent = overridenDefaultComponent;
}
// Made non-final for Fabrique
public Component getDefaultComponent(final Container focusCycleRoot) {
if (isNoDefaultComponent()) return null;
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getDefaultComponentImpl(focusCycleRoot);
}
protected Component getDefaultComponentImpl(final Container focusCycleRoot) {
return super.getDefaultComponent(focusCycleRoot);
}
public Component getFirstComponent(final Container focusCycleRoot) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getFirstComponentImpl(focusCycleRoot);
}
protected Component getFirstComponentImpl(final Container focusCycleRoot) {
return super.getFirstComponent(focusCycleRoot);
}
public Component getLastComponent(final Container focusCycleRoot) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getLastComponentImpl(focusCycleRoot);
}
protected Component getLastComponentImpl(final Container focusCycleRoot) {
return super.getLastComponent(focusCycleRoot);
}
public Component getComponentAfter(final Container focusCycleRoot, final Component aComponent) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getComponentAfterImpl(focusCycleRoot, aComponent);
}
protected Component getComponentAfterImpl(final Container focusCycleRoot, final Component aComponent) {
return super.getComponentAfter(focusCycleRoot, aComponent);
}
public Component getComponentBefore(final Container focusCycleRoot, final Component aComponent) {
if (myOverridenDefaultComponent != null) {
return myOverridenDefaultComponent;
}
return getComponentBeforeImpl(focusCycleRoot, aComponent);
}
@Override
public Component getInitialComponent(JInternalFrame frame) {
if (isNoDefaultComponent()) return null;
return super.getInitialComponent(frame);
}
@Override
public Component getInitialComponent(Window window) {
if (isNoDefaultComponent()) return null;
return super.getInitialComponent(window);
}
protected Component getComponentBeforeImpl(final Container focusCycleRoot, final Component aComponent) {
return super.getComponentBefore(focusCycleRoot, aComponent);
}
public Component queryImpl(Computable<Component> runnable) {
try {
myQueryImpl = true;
return runnable.compute();
}
finally {
myQueryImpl = false;
}
}
}