/*
* 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 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
* benjamin_sigg@gmx.ch
* CH - Switzerland
*/
package bibliothek.gui.dock.themes.basic;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import bibliothek.gui.Dockable;
import bibliothek.gui.dock.station.DockableDisplayer;
import bibliothek.gui.dock.station.DockableDisplayer.Location;
import bibliothek.gui.dock.title.DockTitle;
import bibliothek.gui.dock.util.ConfiguredBackgroundPanel;
import bibliothek.gui.dock.util.Transparency;
/**
* The {@link DisplayerContentPane} is used by {@link DockableDisplayer} to show a
* {@link Component} for a {@link DockTitle} and one for a {@link Dockable}.
* @author Benjamin Sigg
*/
public class DisplayerContentPane extends ConfiguredBackgroundPanel{
private Component title;
private Component dockable;
private Location location;
/**
* Creates a new content pane
*/
public DisplayerContentPane(){
super( null, Transparency.DEFAULT );
}
/**
* Sets the location at which the title should be shown.
* @param location the new location of the title
*/
public void setTitleLocation( Location location ){
this.location = location;
revalidate();
}
/**
* Sets the component which represents the dockable
* @param dockable the representation of the dockable, can be <code>null</code>
*/
public void setDockable( Component dockable ){
if( this.dockable != null ){
remove( this.dockable );
}
this.dockable = dockable;
if( this.dockable != null ){
this.add( this.dockable );
}
}
/**
* Sets the component which represents the title.
* @param title the representation of the title, can be <code>null</code>
*/
public void setTitle( Component title ){
if( this.title != null ){
remove( this.title );
}
this.title = title;
if( this.title != null ){
add( this.title );
}
}
@Override
public Dimension getPreferredSize(){
Dimension base;
if( title == null && dockable != null )
base = dockable.getPreferredSize();
else if( dockable == null && title != null )
base = title.getPreferredSize();
else if( dockable == null && title == null )
base = new Dimension( 0, 0 );
else if( location == Location.LEFT || location == Location.RIGHT ){
Dimension titleSize = title.getPreferredSize();
base = dockable.getPreferredSize();
base = new Dimension( base.width + titleSize.width,
Math.max( base.height, titleSize.height ));
}
else{
Dimension titleSize = title.getPreferredSize();
base = dockable.getPreferredSize();
base = new Dimension( Math.max( titleSize.width, base.width ),
titleSize.height + base.height );
}
Insets insets = getInsets();
if( insets != null ){
base = new Dimension( base.width + insets.left + insets.right,
base.height + insets.top + insets.bottom );
}
return base;
}
@Override
public Dimension getMaximumSize(){
Dimension base;
if( title == null && dockable != null )
base = dockable.getMaximumSize();
else if( dockable == null && title != null )
base = title.getMaximumSize();
else if( dockable == null && title == null )
base = new Dimension( 0, 0 );
else if( location == Location.LEFT || location == Location.RIGHT ){
Dimension titleSize = title.getMaximumSize();
base = dockable.getMaximumSize();
base = new Dimension( base.width + titleSize.width,
Math.max( base.height, titleSize.height ));
}
else{
Dimension titleSize = title.getMaximumSize();
base = dockable.getMaximumSize();
base = new Dimension( Math.max( titleSize.width, base.width ),
titleSize.height + base.height );
}
Insets insets = getInsets();
if( insets != null ){
base = new Dimension( base.width + insets.left + insets.right,
base.height + insets.top + insets.bottom );
}
return base;
}
@Override
public Dimension getMinimumSize(){
Dimension base;
if( title == null && dockable != null )
base = dockable.getMinimumSize();
else if( dockable == null && title != null )
base = title.getMinimumSize();
else if( dockable == null && title == null )
base = new Dimension( 0, 0 );
else if( location == Location.LEFT || location == Location.RIGHT ){
Dimension titleSize = title.getMinimumSize();
base = dockable.getMinimumSize();
base = new Dimension( base.width + titleSize.width,
Math.max( base.height, titleSize.height ));
}
else{
Dimension titleSize = title.getMinimumSize();
base = dockable.getMinimumSize();
base = new Dimension( Math.max( titleSize.width, base.width ),
titleSize.height + base.height );
}
Insets insets = getInsets();
if( insets != null ){
base = new Dimension( base.width + insets.left + insets.right,
base.height + insets.top + insets.bottom );
}
return base;
}
@Override
public void doLayout(){
Insets insets = getInsets();
if( insets == null )
insets = new Insets( 0,0,0,0 );
int x = insets.left;
int y = insets.top;
int width = getWidth() - insets.left - insets.right;
int height = getHeight() - insets.top - insets.bottom;
if( title == null && dockable == null )
return;
width = Math.max( 0, width );
height = Math.max( 0, height );
if( title == null )
dockable.setBounds( x, y, width, height );
else if( dockable == null )
title.setBounds( x, y, width, height );
else{
Dimension preferred = title.getPreferredSize();
int preferredWidth = preferred.width;
int preferredHeight = preferred.height;
if( location == Location.LEFT || location == Location.RIGHT ){
preferredWidth = Math.min( preferredWidth, width );
preferredHeight = height;
}
else{
preferredWidth = width;
preferredHeight = Math.min( preferredHeight, height );
}
if( location == Location.LEFT ){
title.setBounds( x, y, preferredWidth, preferredHeight );
dockable.setBounds( x+preferredWidth, y, width - preferredWidth, height );
}
else if( location == Location.RIGHT ){
title.setBounds( x+width-preferredWidth, y, preferredWidth, preferredHeight );
dockable.setBounds( x, y, width - preferredWidth, preferredHeight );
}
else if( location == Location.BOTTOM ){
title.setBounds( x, y+height - preferredHeight, preferredWidth, preferredHeight );
dockable.setBounds( x, y, preferredWidth, height - preferredHeight );
}
else{
title.setBounds( x, y, preferredWidth, preferredHeight );
dockable.setBounds( x, y+preferredHeight, preferredWidth, height - preferredHeight );
}
}
}
}