/*
* 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
* rvguillaume@hotmail.com
* FR - France
*
* Benjamin Sigg
* benjamin_sigg@gmx.ch
* CH - Switzerland
*/
package bibliothek.gui.dock.station.toolbar;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JPanel;
import javax.swing.border.Border;
import bibliothek.gui.DockController;
import bibliothek.gui.DockStation;
import bibliothek.gui.Dockable;
import bibliothek.gui.Orientation;
import bibliothek.gui.dock.displayer.DisplayerRequest;
import bibliothek.gui.dock.station.DisplayerFactory;
import bibliothek.gui.dock.station.DockableDisplayer;
import bibliothek.gui.dock.station.OrientationObserver;
import bibliothek.gui.dock.station.OrientedDockStation;
import bibliothek.gui.dock.themes.basic.BasicDockableDisplayer;
import bibliothek.gui.dock.title.DockTitle;
import bibliothek.gui.dock.util.Transparency;
/**
* A simple implementation of a {@link DockableDisplayer} that can be used by
* toolbar-{@link DockStation}s. This displayer is aware of the fact, that some
* {@link DockStation}s have an orientation and may update its own orientation
* automatically.
*
* @author Benjamin Sigg
*/
public class ToolbarDockableDisplayer extends BasicDockableDisplayer {
/**
* A factory creating new {@link ToolbarDockableDisplayer}s.
*/
public static final DisplayerFactory FACTORY = new DisplayerFactory(){
@Override
public void request( DisplayerRequest request ){
ToolbarDockableDisplayer displayer = new ToolbarDockableDisplayer( request.getParent(), request.getTarget(), request.getTitle() );
displayer.setDefaultBorderHint( false );
displayer.setRespectBorderHint( true );
request.answer( displayer );
}
};
/** Keeps track of the orientation of the current {@link Dockable} and updates the location of the title if necessary */
private OrientationObserver observer;
/** the panel showing the dockable */
private JPanel dockable;
/** the border of this displayer */
private DisplayerBorder toolbarBorder;
/**
* Creates a new displayer.
* @param station the owner of this displayer
* @param dockable the element shown on this displayer, can be <code>null</code>
* @param title the title shown on this displayer, can be <code>null</code>
*/
public ToolbarDockableDisplayer( DockStation station, Dockable dockable, DockTitle title ){
super( station );
setTransparency( Transparency.TRANSPARENT );
setDockable( dockable );
setTitle( title );
}
@Override
protected Component getComponent( Dockable dockable ){
ensureDockable();
return this.dockable;
}
private void ensureDockable(){
if( dockable == null ){
dockable = new JPanel( new GridLayout( 1, 1 ) );
dockable.setOpaque( false );
toolbarBorder = new DisplayerBorder( this.dockable, "toolbar" );
}
}
@Override
protected Border getDefaultBorder(){
return new ToolbarLineBorder( this );
}
@Override
protected void updateBorder(){
if( isSingleTabShowing() ){
super.updateBorder();
}
else{
ensureDockable();
setBaseBorder( null );
setContentBorder( null );
boolean show;
if( isRespectBorderHint() ){
show = getHints().getShowBorderHint();
}
else{
show = getDefaultBorderHint();
}
if( show ){
toolbarBorder.setBorder( getDefaultBorder() );
}
else{
toolbarBorder.setBorder( null );
}
}
}
@Override
public void setController( DockController controller ){
super.setController( controller );
toolbarBorder.setController( controller );
}
@Override
public void setDockable( Dockable dockable ){
Dockable oldDockable = getDockable();
if( oldDockable != dockable ){
if( observer != null ){
observer.destroy();
observer = null;
}
super.setDockable( dockable );
ensureDockable();
this.dockable.removeAll();
if( dockable != null ){
this.dockable.add( dockable.getComponent() );
observer = new OrientationObserver( dockable ){
@Override
protected void orientationChanged( Orientation current ){
setOrientation( current );
}
};
setOrientation( getOrientation() );
}
}
}
@Override
public Insets getDockableInsets(){
Insets insets = super.getDockableInsets();
Border border = dockable.getBorder();
if( border != null ){
Insets borderInsets = border.getBorderInsets( dockable );
insets.left += borderInsets.left;
insets.right += borderInsets.right;
insets.top += borderInsets.top;
insets.bottom += borderInsets.bottom;
}
return insets;
}
/**
* Tries to find out the current {@link Orientation} of the {@link Dockable}.
* @return the current orientation, may be <code>null</code>
*/
protected Orientation getOrientation(){
if( observer != null ){
Orientation result = observer.getOrientation();
if( result != null ){
return result;
}
}
Dockable dockable = getDockable();
if( dockable == null ){
return null;
}
if( dockable instanceof OrientedDockStation ){
return ((OrientedDockStation)dockable).getOrientation();
}
return null;
}
/**
* Called if the orientation of the current {@link Dockable} changed.
* @param orientation the new orientation, can be <code>null</code>
*/
protected void setOrientation( Orientation orientation ){
if( orientation != null ){
if( orientation == Orientation.HORIZONTAL ){
setTitleLocation( Location.LEFT );
}
else{
setTitleLocation( Location.TOP );
}
}
}
}