/*
* 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) 2007 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;
import bibliothek.gui.DockController;
import bibliothek.gui.DockStation;
import bibliothek.gui.DockTheme;
import bibliothek.gui.dock.StackDockStation;
import bibliothek.gui.dock.accept.DockAcceptance;
import bibliothek.gui.dock.dockable.DockableMovingImageFactory;
import bibliothek.gui.dock.focus.DockableSelection;
import bibliothek.gui.dock.station.Combiner;
import bibliothek.gui.dock.station.DisplayerFactory;
import bibliothek.gui.dock.station.StationPaint;
import bibliothek.gui.dock.themes.nostack.NoStackAcceptance;
import bibliothek.gui.dock.themes.nostack.NoStackTitleFactory;
import bibliothek.gui.dock.title.DockTitleFactory;
/**
* A {@link DockTheme} that wraps another theme and ensures that there
* is no {@link StackDockStation} in another <code>StackDockStation</code>.
* This theme hides some titles for the {@link StackDockStation}.
* @author Benjamin Sigg
*/
public class NoStackTheme implements DockTheme {
/**
* Creates a {@link ThemeFactory} for this theme encapsulating another
* theme.
* @param <T> the type of the internal {@link DockTheme}
* @param theme the theme to encapsulate
* @return the new factory
*/
public static <T extends DockTheme> ThemeFactory getFactory( final Class<T> theme ){
final ThemeFactory factory = new ThemePropertyFactory<T>( theme );
return new ThemeFactory(){
public DockTheme create( DockController controller ) {
return new NoStackTheme( factory.create( controller ) );
}
public ThemeMeta createMeta( DockController controller ){
return new Meta( this, controller, factory.createMeta( controller ));
}
};
}
/** The delegate theme to get the basic factories */
private DockTheme base;
/** {@link DockAcceptance} ensuring no nested stacks */
private NoStackAcceptance acceptance = new NoStackAcceptance();
/**
* Creates a new theme
* @param base the wrapped theme, it is used as a delegate to get
* some factories.
*/
public NoStackTheme( DockTheme base ){
if( base == null )
throw new IllegalArgumentException( "Base theme must not be null" );
this.base = base;
}
public Combiner getCombiner( DockStation station ) {
return base.getCombiner( station );
}
public DisplayerFactory getDisplayFactory( DockStation station ) {
return base.getDisplayFactory( station );
}
public StationPaint getPaint( DockStation station ) {
return base.getPaint( station );
}
public DockTitleFactory getTitleFactory( DockController controller ) {
return new NoStackTitleFactory( base.getTitleFactory(controller));
}
public DockableMovingImageFactory getMovingImageFactory( DockController controller ) {
return base.getMovingImageFactory( controller );
}
public DockableSelection getDockableSelection( DockController controller ) {
return base.getDockableSelection( controller );
}
public void install( DockController controller, DockThemeExtension[] extensions ){
base.install( controller, extensions );
controller.addAcceptance( acceptance );
}
public void uninstall(DockController controller) {
base.uninstall( controller );
controller.removeAcceptance( acceptance );
}
private static class Meta extends DefaultThemeMeta implements ThemeMetaListener{
private ThemeMeta meta;
public Meta( ThemeFactory factory, DockController controller, ThemeMeta meta ){
super( factory, controller, "theme.small", "theme.small.description", meta.getAuthors(), meta.getWebpages() );
this.meta = meta;
}
@Override
public void addListener( ThemeMetaListener listener ){
if( !hasListeners() ){
meta.addListener( this );
}
super.addListener( listener );
}
@Override
public void removeListener( ThemeMetaListener listener ){
super.removeListener( listener );
if( !hasListeners() ){
meta.removeListener( this );
}
}
@Override
public String getName(){
String small = super.getName();
String factory = meta.getName();
return small + " \"" + factory + "\"";
}
@Override
public String[] getAuthors(){
String[] authors = getAuthors();
final String BENI = "Benjamin Sigg";
for( String author : authors ){
if( author.equals( BENI ))
return authors;
}
String[] result = new String[ authors.length + 1 ];
System.arraycopy( authors, 0, result, 0, authors.length );
result[ authors.length ] = BENI;
return result;
}
public void authorsChanged( ThemeMeta meta ){
setAuthors( meta.getAuthors() );
}
public void webpagesChanged( ThemeMeta meta ){
setWebpages( meta.getWebpages() );
}
public void descriptionChanged( ThemeMeta meta ){
// ignore
}
public void nameChanged( ThemeMeta meta ){
fireNameChanged();
}
}
}