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

bibliothek.gui.dock.station.toolbar.ToolbarGroupDockPerspective Maven / Gradle / Ivy

/*
 * 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) 2012 Herve Guillaume, 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
 * 
 * Herve Guillaume
 * [email protected]
 * FR - France
 *
 * Benjamin Sigg
 * [email protected]
 * CH - Switzerland
 */
package bibliothek.gui.dock.station.toolbar;

import java.util.Map;

import bibliothek.gui.DockStation;
import bibliothek.gui.Orientation;
import bibliothek.gui.dock.ToolbarGroupDockStation;
import bibliothek.gui.dock.layout.DockableProperty;
import bibliothek.gui.dock.perspective.PerspectiveDockable;
import bibliothek.gui.dock.perspective.PerspectiveStation;
import bibliothek.gui.dock.station.support.ConvertedPlaceholderListItem;
import bibliothek.gui.dock.station.support.PlaceholderMap;
import bibliothek.gui.dock.station.toolbar.group.ToolbarColumnModel;
import bibliothek.gui.dock.station.toolbar.group.ToolbarGroupProperty;
import bibliothek.gui.dock.station.toolbar.layout.PerspectivePlaceholderToolbarGrid;
import bibliothek.gui.dock.station.toolbar.layout.PlaceholderToolbarGridConverter;
import bibliothek.gui.dock.toolbar.expand.ExpandedState;
import bibliothek.gui.dock.util.DockUtilities;
import bibliothek.util.Path;

/**
 * A {@link PerspectiveStation} representing a {@link ToolbarGroupDockStation}.
 * @author Benjamin Sigg
 */
public class ToolbarGroupDockPerspective implements PerspectiveStation, PerspectiveDockable{
	/** the children of this station */
	private PerspectivePlaceholderToolbarGrid dockables;
	
	/** the parent station of this dockable */
	private PerspectiveStation parent;

	/** the default size of this station */
	private ExpandedState state = ExpandedState.SHRUNK;

	/** the orientation of the children */
	private Orientation orientation = Orientation.HORIZONTAL;
	
	/**
	 * Creates a new, empty station.
	 */
	public ToolbarGroupDockPerspective(){
		dockables = new PerspectivePlaceholderToolbarGrid();
	}
	
	/**
	 * Creates a new station.
	 * @param layout the layout of the station
	 * @param children the unique identifiers of the children
	 */
	public ToolbarGroupDockPerspective( ToolbarGroupDockStationLayout layout, Map children ){
		dockables = new PerspectivePlaceholderToolbarGrid();
		read( layout, children );
	}
	
	/**
	 * Updates the layout of this station by reading layout.
	 * @param layout the new layout
	 * @param children the new children of this station
	 */
	public void read( ToolbarGroupDockStationLayout layout, Map children ){
		state = layout.getState();
		dockables.fromMap( layout.getPlaceholders(), children, new PlaceholderToolbarGridConverter(){
			@Override
			public PerspectiveDockable convert( PerspectiveDockable dockable, ConvertedPlaceholderListItem item ){
				return dockable;
			}
			
			@Override
			public void added( PerspectiveDockable item ){
				item.setParent( ToolbarGroupDockPerspective.this );
			}
		});
		orientation = ToolbarGroupDockStationLayout.readOrientation( layout.getPlaceholders() );
	}
	
	/**
	 * Allows access to the internal data structure of this station. Clients should be very
	 * carefull when using this structure, as there are no options to ensure the validity of the structure. If
	 * possible, clients should only read data from the structure, and should not execute any write
	 * operations.
	 * @return the internal data structure
	 */
	public PerspectivePlaceholderToolbarGrid getDockables(){
		return dockables;
	}
	
	/**
	 * Converts this station into a map of {@link PerspectiveDockable}s.
	 * @param children the unique identifiers of the children
	 * @return the map of dockables
	 */
	public PlaceholderMap toMap( Map children ){
		PlaceholderMap map = dockables.toMap( children );
		ToolbarGroupDockStationLayout.writeOrientation( map, orientation );
		return map;
	}
	
	/***
	 * Sets the default size of this station
	 * @param state the size, not null
	 */
	public void setExpandedtState( ExpandedState state ){
		if( state == null ){
			throw new IllegalArgumentException( "state must not be null" );
		}
		this.state = state;
	}
	
	/**
	 * Gets the default size of this station.
	 * @return the size, not null
	 */
	public ExpandedState getExpandedState(){
		return state;
	}
	
	/**
	 * Sets the orientation of this station. Please note that the orientation can be overridden
	 * by the parent {@link DockStation}.
	 * @param orientation the orientation, must not be null
	 */
	public void setOrientation( Orientation orientation ){
		if( orientation == null ){
			throw new IllegalArgumentException( "orientation must not be null" );
		}
		this.orientation = orientation;
	}
	
	/**
	 * Gets the orientation of this station.
	 * @return the orientation, not null
	 */
	public Orientation getOrientation(){
		return orientation;
	}
	
	/**
	 * Gets access to an abstraction of the model of this station. This is the same class that is used
	 * by the {@link ToolbarGroupDockStation}, hence it's behavior is identical.
	 * @return the model, can be monitored to receive information about changes
	 */
	public ToolbarColumnModel getModel(){
		return dockables.getModel();
	}
	
	/**
	 * Gets the item that is stored in column column at line line.
	 * @param column the column in which to search
	 * @param line the line in which the dockable should be found
	 * @return the item at column/line
	 */
	public PerspectiveDockable getDockable( int column, int line ){
		return getModel().getColumn( column ).getDockable( line );
	}
	
	/**
	 * Gets the number of columns, only includes columns that contain at least one child.
	 * @return the number of non-empty columns
	 */
	public int getColumnCount(){
		return dockables.getColumnCount();
	}
	
	/**
	 * Gets the number of items in column.
	 * @param column the column whose size is asked
	 * @return the number of children in column
	 */
	public int getLineCount( int column ){
		return dockables.getLineCount( column );
	}
	
	/**
	 * Adds dockable at the end of column column. This method
	 * may create a new column. 
	 * @param column the index of a column
	 * @param dockable the item to add to column
	 */
	public void add( int column, PerspectiveDockable dockable ){
		int line = 0;
		if( column >= 0 && column < getColumnCount() ){
			line = getLineCount( column );
		}
		insert( column, line, dockable );
	}
	
	/**
	 * Adds dockable to column column at position line.
	 * This method may create a new column.
	 * @param column the column in which to insert the new item
	 * @param line the position in the column
	 * @param dockable the new item
	 */
	public void insert( int column, int line, PerspectiveDockable dockable ){
		DockUtilities.ensureTreeValidity( this, dockable );
		dockables.insert( column, line, dockable );
		dockable.setParent( this );
	}
	
	/**
	 * Adds a new column to the grid and inserts dockable as first child. This method
	 * will try to reuse existing but empty columns if possible.
	 * @param column The index of the new column, can be -1 to create a column at the
	 * beginning of the list
	 * @param dockable the new item
	 */
	public void insert( int column, PerspectiveDockable dockable ){
		DockUtilities.ensureTreeValidity( this, dockable );
		dockables.insert( column, dockable );
		dockable.setParent( this );
	}
	
	/**
	 * Removes the item at column/line.
	 * @param column the column from which the dockable should be removed
	 * @param line the line in which the dockable is currently stored
	 */
	public void remove( int column, int line ){
		remove( getDockable( column, line ) );
	}
	
	@Override
	public String getFactoryID(){
		return ToolbarGroupDockStationFactory.ID;
	}

	@Override
	public PerspectiveStation asStation(){
		return this;
	}

	@Override
	public PerspectiveDockable asDockable(){
		return this;
	}

	@Override
	public Path getPlaceholder(){
		return null;
	}

	@Override
	public PerspectiveStation getParent(){
		return parent;
	}

	@Override
	public void setParent( PerspectiveStation parent ){
		this.parent = parent;
	}

	@Override
	public int getDockableCount(){
		return dockables.size();
	}

	@Override
	public PerspectiveDockable getDockable( int index ){
		return dockables.get( index );
	}

	@Override
	public DockableProperty getDockableProperty( PerspectiveDockable child, PerspectiveDockable target ){
		int column = dockables.getColumn( child );
		int line = dockables.getLine( column, child );
		Path placeholder;
		if( target == null ){
			placeholder = child.getPlaceholder();
		}
		else{
			placeholder = target.getPlaceholder();
		}
		return new ToolbarGroupProperty( column, line, placeholder );
	}

	@Override
	public PlaceholderMap getPlaceholders(){
		PlaceholderMap map = dockables.toMap();
		ToolbarGroupDockStationLayout.writeOrientation( map, orientation );
		return map;
	}

	@Override
	public void setPlaceholders( PlaceholderMap placeholders ){
		dockables.fromMap( placeholders );
	}

	@Override
	public boolean remove( PerspectiveDockable dockable ){
		return dockables.remove( dockable );
	}

	@Override
	public void replace( PerspectiveDockable oldDockable, PerspectiveDockable newDockable ){
		dockables.replace( oldDockable, newDockable );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy