001    package org.springframework.richclient.components;
002    
003    import javax.swing.*;
004    import javax.swing.text.JTextComponent;
005    import java.util.List;
006    import java.awt.*;
007    
008    /**
009     * Traversal policy designed to skip certain components
010     */
011    public class SkipComponentsFocusTraversalPolicy extends LayoutFocusTraversalPolicy
012    {
013        List<JComponent> componentsToSkip;
014    
015        public static final SkipComponentsFocusTraversalPolicy skipJTextComponentTraversalPolicy = new SkipComponentsFocusTraversalPolicy();
016    
017        public SkipComponentsFocusTraversalPolicy()
018        {}
019    
020        public SkipComponentsFocusTraversalPolicy(List<JComponent> componentsToSkip)
021        {
022            this.componentsToSkip = componentsToSkip;
023        }
024    
025        @Override
026        protected boolean accept(Component aComponent)
027        {
028            if( !super.accept(aComponent))
029                return false;
030    
031            if (aComponent instanceof JTextComponent && ((JTextComponent)aComponent).isEditable() == false)
032                return false;
033    
034            if (componentsToSkip != null)
035            {
036                for (JComponent component : componentsToSkip)
037                {
038                    if (component == aComponent || component.isAncestorOf(aComponent))
039                        return false;
040                }
041            }
042            return true;
043        }
044    }