All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bibliothek.gui.dock.control.focus.RepeatingFocusRequest Maven / Gradle / Ivy

The newest version!
/*
 * Bibliothek - DockingFrames
 * Library built on Java/Swing, allows the user to "drag and drop"
 * panels containing any Swing-Component the developer likes to add.
 * 
 * Copyright (C) 2011 Benjamin Sigg
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Benjamin Sigg
 * [email protected]
 * CH - Switzerland
 */
package bibliothek.gui.dock.control.focus;

import java.awt.Component;
import java.awt.KeyboardFocusManager;

import bibliothek.gui.dock.DockElementRepresentative;
import bibliothek.gui.dock.event.FocusVetoListener.FocusVeto;

/**
 * Ensures that a specific {@link Component} is focused by calling 
 * {@link Component#requestFocus()} multiple times.
 * @author Benjamin Sigg
 */
public class RepeatingFocusRequest implements FocusRequest{
	private int delay;
	private int attempts;
	private DockElementRepresentative source;
	private Component component;
	private boolean hardRequest;
	
	/**
	 * Creates a new request
	 * @param source the element that gets focused, not null
	 * @param component the {@link Component} that actually gains the focus, not null
	 * @param hardRequest whether this request should be executed even if the application is invisible
	 */
	public RepeatingFocusRequest( DockElementRepresentative source, Component component, boolean hardRequest ){
		this( source, component, 10, 20, hardRequest );
	}
	
	/**
	 * Creates a new request
	 * @param source the element that gets focused, can be null
	 * @param component the {@link Component} that actually gains the focus, not null
	 * @param delay how long to wait until requesting the focus, at least 1
	 * @param attempts how often to try and gain the focus, at least 1
	 * @param hardRequest whether this request should be executed even if the application is invisible
	 */
	public RepeatingFocusRequest( DockElementRepresentative source, Component component, int delay, int attempts, boolean hardRequest ){
		if( component == null ){
			throw new IllegalArgumentException( "component must not be null" );
		}
		if( delay < 1 ){
			throw new IllegalArgumentException( "delay must be >= 1: " + delay );
		}
		if( attempts < 1 ){
			throw new IllegalArgumentException( "attempts must be >= 1: " + attempts );
		}
		
		this.source = source;
		this.component = component;
		this.delay = delay;
		this.attempts = attempts;
		this.hardRequest = hardRequest;
	}
	
	public boolean validate( FocusController controller ){
		return true;
	}
	
	public int getDelay(){
		return delay;
	}
	
	public DockElementRepresentative getSource(){
		return source;
	}
	
	public Component getComponent(){
		return component;
	}
	
	public boolean acceptable( Component component ){
		return this.component == component;
	}
	
	public boolean isHardRequest(){
		return hardRequest;
	}
	
	public void veto( FocusVeto veto ){
		// ignore
	}
	
	public FocusRequest grant( Component component ){
		attempts--;
		KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        if( manager.getPermanentFocusOwner() != component ){
            manager.clearGlobalFocusOwner();
            component.requestFocus();
        }
        if( attempts > 0 ){
        	return this;
        }
        return null;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy