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

bibliothek.gui.dock.station.split.Placeholder Maven / Gradle / Ivy

package bibliothek.gui.dock.station.split;

import java.awt.Dimension;
import java.util.Map;

import bibliothek.gui.Dockable;
import bibliothek.gui.dock.SplitDockStation;
import bibliothek.gui.dock.layout.location.AsideAnswer;
import bibliothek.gui.dock.layout.location.AsideRequest;
import bibliothek.util.Path;

/**
 * A placeholder is a set of {@link Path}-keys, each key stands for a 
 * {@link Dockable} that is currently not visible. Placeholders are not
 * visible to the user (they have no graphical representation), they
 * are only used to place {@link Dockable}s at their former position.
 * @author Benjamin Sigg
 */
public class Placeholder extends SplitNode {
	
	/**
	 * Creates a new placeholder
	 * @param access access to the {@link SplitDockStation}
	 * @param id the unique id of this placeholder
	 */
	public Placeholder( SplitDockAccess access, long id ){
		super( access, id );
	}
	
	@Override
	public void evolve( SplitDockTree.Key key, boolean checkValidity, Map linksToSet ){
		setPlaceholders( key.getTree().getPlaceholders( key ) );
	}

	@Override
	public int getChildLocation( SplitNode child ){
		return -1;
	}

	@Override
	public Node getDividerNode( int x, int y ){
		return null;
	}

	@Override
	public Leaf getLeaf( Dockable dockable ){
		return null;
	}

	@Override
	public Dimension getMinimumSize(){
		return null;
	}
	
	@Override
	public Dimension getPreferredSize(){
		return null;
	}

	@Override
	public PutInfo getPut( int x, int y, double factorW, double factorH, Dockable drop ){
		return null;
	}

	@Override
	public boolean aside( AsideRequest request ){
		if( request.getPlaceholder() != null ){	
			addPlaceholder( request.getPlaceholder() );
			AsideAnswer answer = request.forward( getStation().getCombiner(), getPlaceholderMap() );
	    	if( answer.isCanceled() ){
	    		return false;
	    	}
	    	setPlaceholderMap( answer.getLayout() );
		}
    	return true;
	}
	
	@Override
	public boolean aside( SplitDockPathProperty property, int index, AsideRequest request ){
		if( request.getPlaceholder() != null ){
			if( index < property.size() ){
				Placeholder placeholder = createPlaceholder( property.getLeafId() );
				split( property, index, placeholder );
				placeholder.aside( request );
			}
			else{
				aside( request );
			}
		}
		return true;
	}
	
	@Override
	public boolean insert( SplitDockPlaceholderProperty property, Dockable dockable ){
		Path placeholder = property.getPlaceholder();
		if( hasPlaceholder( placeholder )){
			return replace( placeholder, dockable );
		}
		return false;
	}
	
	@Override
	public boolean insert( SplitDockPathProperty property, int depth, Dockable dockable ){
		if( property.getLeafId() == getId() ){
			return replace( null, dockable );
		}
		else if( depth < property.size() ){
			Leaf leaf = create( dockable, property.getLeafId() );
			if( leaf == null ){
				return false;
			}
			split( property, depth, leaf );
			leaf.setDockable( dockable, null );
			return true;
		}
		else{
			return false;
		}
	}
	
	private boolean replace( Path placeholder, Dockable dockable ){
		// replace this placeholder with a leaf
		Leaf leaf = create( dockable, getId() );
		if( leaf == null )
			return false;
		ensureOnlyOnThisNode( placeholder );
		ensureOnlyOnThisNode( getAccess().getOwner().getPlaceholderStrategy().getPlaceholderFor( dockable ) );
		
		leaf.setPlaceholders( getPlaceholders() );
		replace( leaf );
		leaf.setPlaceholderMap( getPlaceholderMap() );
		leaf.setDockable( dockable, null );
		return true;	
	}
	
	private void ensureOnlyOnThisNode( Path placeholder ){
		if( placeholder != null ){
			getAccess().getPlaceholderSet().set( this, placeholder, this );
		}
	}

	@Override
	public boolean isInOverrideZone( int x, int y, double factorW, double factorH ){
		return false;
	}

	@Override
	public void setChild( SplitNode child, int location ){
		throw new IllegalArgumentException();
	}
	
	@Override
	public int getMaxChildrenCount(){
		return 0;
	}
	
	@Override
	public SplitNode getChild( int location ){
		return null;
	}

	@Override
	public  N submit( SplitTreeFactory factory ){
		return factory.placeholder( getId(), getPlaceholders(), getPlaceholderMap() );
	}
	
	@Override
	public boolean isVisible(){
		return false;
	}
	
	@Override
	public SplitNode getVisible(){
		return null;
	}
	
	@Override
	public boolean isOfUse(){
		if( !getAccess().isTreeAutoCleanupEnabled() ){
			return true;
		}
		return hasPlaceholders();
	}

	@Override
	public void visit( SplitNodeVisitor visitor ){
		visitor.handlePlaceholder( this );
	}

	@Override
	public void toString( int tabs, StringBuilder out ){
		out.append( "Placeholder: " );
		boolean first = true;
		for( Path key : getPlaceholders() ){
			if( first ){
				first = false;
			}
			else{
				out.append( ", " );
			}
			out.append( key );
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy