/* * 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.extension.gui.dock.theme; import javax.swing.JComponent; import bibliothek.extension.gui.dock.theme.eclipse.DefaultEclipseThemeConnector; import bibliothek.extension.gui.dock.theme.eclipse.EclipseButtonTitle; import bibliothek.extension.gui.dock.theme.eclipse.EclipseColorScheme; import bibliothek.extension.gui.dock.theme.eclipse.EclipseDockTitleFactory; import bibliothek.extension.gui.dock.theme.eclipse.EclipseDockableSelection; import bibliothek.extension.gui.dock.theme.eclipse.EclipseStationPaint; import bibliothek.extension.gui.dock.theme.eclipse.EclipseThemeConnector; import bibliothek.extension.gui.dock.theme.eclipse.RoundRectButton; import bibliothek.extension.gui.dock.theme.eclipse.RoundRectDropDownButton; import bibliothek.extension.gui.dock.theme.eclipse.displayer.EclipseDisplayerFactory; import bibliothek.extension.gui.dock.theme.eclipse.stack.EclipseTabPane; import bibliothek.extension.gui.dock.theme.eclipse.stack.tab.ArchGradientPainter; import bibliothek.extension.gui.dock.theme.eclipse.stack.tab.BasicTabDockTitle; import bibliothek.extension.gui.dock.theme.eclipse.stack.tab.DockTitleTab; import bibliothek.extension.gui.dock.theme.eclipse.stack.tab.RectGradientPainter; import bibliothek.extension.gui.dock.theme.eclipse.stack.tab.TabPainter; import bibliothek.gui.DockController; import bibliothek.gui.Dockable; import bibliothek.gui.dock.FlapDockStation; import bibliothek.gui.dock.ScreenDockStation; import bibliothek.gui.dock.SplitDockStation; import bibliothek.gui.dock.StackDockStation; import bibliothek.gui.dock.accept.DockAcceptance; import bibliothek.gui.dock.action.ActionType; import bibliothek.gui.dock.action.ButtonDockAction; import bibliothek.gui.dock.action.DropDownAction; import bibliothek.gui.dock.action.MenuDockAction; import bibliothek.gui.dock.action.SelectableDockAction; import bibliothek.gui.dock.action.view.ActionViewConverter; import bibliothek.gui.dock.action.view.ViewGenerator; import bibliothek.gui.dock.action.view.ViewTarget; import bibliothek.gui.dock.dockable.DockableMovingImageFactory; import bibliothek.gui.dock.dockable.MovingImage; import bibliothek.gui.dock.station.stack.StackDockComponent; import bibliothek.gui.dock.station.stack.StackDockComponentFactory; import bibliothek.gui.dock.station.stack.StackDockComponentParent; import bibliothek.gui.dock.station.stack.tab.MenuLineLayout; import bibliothek.gui.dock.station.stack.tab.TabPane; import bibliothek.gui.dock.station.stack.tab.layouting.TabPlacement; import bibliothek.gui.dock.themes.BasicTheme; import bibliothek.gui.dock.themes.ColorScheme; import bibliothek.gui.dock.themes.ThemeProperties; import bibliothek.gui.dock.themes.basic.BasicDockTitle; import bibliothek.gui.dock.themes.basic.BasicDockTitleFactory; import bibliothek.gui.dock.themes.basic.NoSpanFactory; import bibliothek.gui.dock.themes.basic.action.BasicButtonHandler; import bibliothek.gui.dock.themes.basic.action.BasicDropDownButtonHandler; import bibliothek.gui.dock.themes.basic.action.BasicMenuHandler; import bibliothek.gui.dock.themes.basic.action.BasicSelectableHandler; import bibliothek.gui.dock.themes.basic.action.BasicTitleViewItem; import bibliothek.gui.dock.themes.nostack.NoStackAcceptance; import bibliothek.gui.dock.title.ControllerTitleFactory; import bibliothek.gui.dock.title.DockTitle; import bibliothek.gui.dock.title.DockTitleFactory; import bibliothek.gui.dock.title.DockTitleManager; import bibliothek.gui.dock.title.DockTitleRequest; import bibliothek.gui.dock.title.DockTitleVersion; import bibliothek.gui.dock.util.DockProperties; import bibliothek.gui.dock.util.Priority; import bibliothek.gui.dock.util.PropertyKey; import bibliothek.gui.dock.util.icon.DefaultIconScheme; import bibliothek.gui.dock.util.property.ConstantPropertyFactory; import bibliothek.gui.dock.util.property.DynamicPropertyFactory; /** * A theme imitating the look and feel of the Eclipse-IDE. * @author Janni Kovacs * @author Benjamin Sigg */ @ThemeProperties(authors = { "Janni Kovacs", "Benjamin Sigg" }, descriptionBundle = "theme.eclipse.description", nameBundle = "theme.eclipse", webpages = { "" }) public class EclipseTheme extends BasicTheme { /** Tells whether icons on tabs that are not selected should be painted or not. */ public static final PropertyKey<Boolean> PAINT_ICONS_WHEN_DESELECTED = new PropertyKey<Boolean>( "EclipseTheme paint icons when deselected", new ConstantPropertyFactory<Boolean>( false ), true ); /** * Tells in which way the tabs should be painted. * @see ArchGradientPainter * @see RectGradientPainter */ public static final PropertyKey<TabPainter> TAB_PAINTER = new PropertyKey<TabPainter>( "EclipseTheme tab painter", new ConstantPropertyFactory<TabPainter>( ArchGradientPainter.FACTORY ), true ); /** * Provides additional dockable-wise information used to layout components * in the EclipseTheme. Note that changing this property will show full effect * only after re-installing the EclipseTheme. * @see DefaultEclipseThemeConnector */ public static final PropertyKey<EclipseThemeConnector> THEME_CONNECTOR = new PropertyKey<EclipseThemeConnector>( "EclipseTheme theme connector", new ConstantPropertyFactory<EclipseThemeConnector>( new DefaultEclipseThemeConnector() ), true ); /** Access to the {@link ColorScheme} used for this theme */ public static final PropertyKey<ColorScheme> ECLIPSE_COLOR_SCHEME = new PropertyKey<ColorScheme>( "dock.ui.EclipseTheme.ColorScheme", new DynamicPropertyFactory<ColorScheme>(){ public ColorScheme getDefault( PropertyKey<ColorScheme> key, DockProperties properties ){ return new EclipseColorScheme(); } }, true ); /** * The id of the {@link DockTitleVersion} that is intended to create * {@link DockTitle}s used as tabs by the {@link DockTitleTab}. Clients * which want to use {@link DockTitle}s as tabs, should exchange the * {@link TabPainter} by executing this code:<br> * <code>controller.getProperties().set( EclipseTheme.TAB_PAINTER, DockTitleTab.FACTORY );</code> * @deprecated While still possible to use, implementing a custom {@link TabPainter} is the preferred option to * replace tabs */ @Deprecated public static final String TAB_DOCK_TITLE = "eclipse.tab"; /** An acceptance that permits combinations of dockables and stations that do not look good */ private DockAcceptance acceptance = new NoStackAcceptance(); /** * Creates a new theme */ public EclipseTheme(){ setColorSchemeKey( ECLIPSE_COLOR_SCHEME ); setStackDockComponentFactory( new StackDockComponentFactory(){ public StackDockComponent create( StackDockComponentParent station ){ return new EclipseTabPane( EclipseTheme.this, station.getStackDockParent() ); } }, Priority.DEFAULT ); setDisplayerFactory( new EclipseDisplayerFactory( this ), Priority.DEFAULT ); setPaint( new EclipseStationPaint(), Priority.DEFAULT ); setMovingImageFactory( new DockableMovingImageFactory(){ public MovingImage create( DockController controller, Dockable dockable ){ return null; } public MovingImage create( DockController controller, DockTitle snatched ){ return null; } }, Priority.DEFAULT ); setTitleFactory( new BasicDockTitleFactory(){ @Override public void request( DockTitleRequest request ){ request.answer( new BasicDockTitle( request.getTarget(), request.getVersion() ) ); } }, Priority.DEFAULT ); setDockableSelection( new EclipseDockableSelection(), Priority.DEFAULT ); setTabPlacement( TabPlacement.TOP_OF_DOCKABLE, Priority.DEFAULT ); setSpanFactory( new NoSpanFactory() ); } @Override public void install( DockController controller ){ DockTitleManager titleManager = controller.getDockTitleManager(); titleManager.registerTheme( EclipseTheme.TAB_DOCK_TITLE, BasicTabDockTitle.FACTORY ); super.install( controller ); controller.getIcons().setScheme( Priority.THEME, new DefaultIconScheme( "data/bibliothek/gui/dock/core/eclipse/icons.ini", EclipseTheme.class.getClassLoader(), controller ) ); EclipseDockTitleFactory factory = new EclipseDockTitleFactory( this, new ControllerTitleFactory() ); titleManager.registerTheme( SplitDockStation.TITLE_ID, factory ); titleManager.registerTheme( FlapDockStation.WINDOW_TITLE_ID, factory ); titleManager.registerTheme( ScreenDockStation.TITLE_ID, factory ); titleManager.registerTheme( StackDockStation.TITLE_ID, factory ); controller.addAcceptance( acceptance ); controller.getProperties().set( TabPane.LAYOUT_MANAGER, new MenuLineLayout(), Priority.THEME ); titleManager.registerTheme( FlapDockStation.BUTTON_TITLE_ID, new DockTitleFactory(){ public void install( DockTitleRequest request ){ // ignore } public void uninstall( DockTitleRequest request ){ // ignore } public void request( DockTitleRequest request ){ // request.answer( new FlatButtonTitle( request.getTarget(), request.getVersion() ) ); request.answer( new EclipseButtonTitle( request.getTarget(), request.getVersion() ) ); } } ); controller.getActionViewConverter().putTheme( ActionType.BUTTON, ViewTarget.TITLE, new ViewGenerator<ButtonDockAction, BasicTitleViewItem<JComponent>>(){ public BasicTitleViewItem<JComponent> create( ActionViewConverter converter, ButtonDockAction action, Dockable dockable ){ BasicButtonHandler handler = new BasicButtonHandler( action, dockable ); RoundRectButton button = new RoundRectButton( handler, handler ); handler.setModel( button.getModel() ); return handler; } } ); controller.getActionViewConverter().putTheme( ActionType.CHECK, ViewTarget.TITLE, new ViewGenerator<SelectableDockAction, BasicTitleViewItem<JComponent>>(){ public BasicTitleViewItem<JComponent> create( ActionViewConverter converter, SelectableDockAction action, Dockable dockable ){ BasicSelectableHandler.Check handler = new BasicSelectableHandler.Check( action, dockable ); RoundRectButton button = new RoundRectButton( handler, handler ); handler.setModel( button.getModel() ); return handler; } } ); controller.getActionViewConverter().putTheme( ActionType.MENU, ViewTarget.TITLE, new ViewGenerator<MenuDockAction, BasicTitleViewItem<JComponent>>(){ public BasicTitleViewItem<JComponent> create( ActionViewConverter converter, MenuDockAction action, Dockable dockable ){ BasicMenuHandler handler = new BasicMenuHandler( action, dockable ); RoundRectButton button = new RoundRectButton( handler, handler ); handler.setModel( button.getModel() ); return handler; } } ); controller.getActionViewConverter().putTheme( ActionType.RADIO, ViewTarget.TITLE, new ViewGenerator<SelectableDockAction, BasicTitleViewItem<JComponent>>(){ public BasicTitleViewItem<JComponent> create( ActionViewConverter converter, SelectableDockAction action, Dockable dockable ){ BasicSelectableHandler.Radio handler = new BasicSelectableHandler.Radio( action, dockable ); RoundRectButton button = new RoundRectButton( handler, handler ); handler.setModel( button.getModel() ); return handler; } } ); controller.getActionViewConverter().putTheme( ActionType.DROP_DOWN, ViewTarget.TITLE, new ViewGenerator<DropDownAction, BasicTitleViewItem<JComponent>>(){ public BasicTitleViewItem<JComponent> create( ActionViewConverter converter, DropDownAction action, Dockable dockable ){ BasicDropDownButtonHandler handler = new BasicDropDownButtonHandler( action, dockable ); RoundRectDropDownButton button = new RoundRectDropDownButton( handler ); handler.setModel( button.getModel() ); return handler; } } ); } // @Override // protected void updateColors() { // DockController controller = getController(); // if( controller != null && getColorScheme() != null ){ // controller.getColors().lockUpdate(); // // super.updateColors(); // // updateColor( "stack.tab.border", null ); // updateColor( "stack.tab.border.selected", null ); // updateColor( "stack.tab.border.selected.focused", null ); // updateColor( "stack.tab.border.selected.focuslost", null ); // // updateColor( "stack.tab.top", null ); // updateColor( "stack.tab.top.selected", null ); // updateColor( "stack.tab.top.selected.focused", null ); // updateColor( "stack.tab.top.selected.focuslost", null ); // // updateColor( "stack.tab.bottom", null ); // updateColor( "stack.tab.bottom.selected", null ); // updateColor( "stack.tab.bottom.selected.focused", null ); // updateColor( "stack.tab.bottom.selected.focuslost", null ); // // updateColor( "stack.tab.text", null ); // updateColor( "stack.tab.text.selected", null ); // updateColor( "stack.tab.text.selected.focused", null ); // updateColor( "stack.tab.text.selected.focuslost", null ); // // updateColor( "stack.border", null ); // // updateColor( "selection.border", null ); // // controller.getColors().unlockUpdate(); // } // else{ // super.updateColors(); // } // } @Override public void uninstall( DockController controller ){ super.uninstall( controller ); controller.getIcons().setScheme( Priority.THEME, null ); controller.getDockTitleManager().clearThemeFactories(); controller.removeAcceptance( acceptance ); controller.getProperties().unset( TabPane.LAYOUT_MANAGER, Priority.THEME ); controller.getActionViewConverter().putTheme( ActionType.BUTTON, ViewTarget.TITLE, null ); controller.getActionViewConverter().putTheme( ActionType.CHECK, ViewTarget.TITLE, null ); controller.getActionViewConverter().putTheme( ActionType.MENU, ViewTarget.TITLE, null ); controller.getActionViewConverter().putTheme( ActionType.RADIO, ViewTarget.TITLE, null ); controller.getActionViewConverter().putTheme( ActionType.DROP_DOWN, ViewTarget.TITLE, null ); } /** * Gets the connector which is used for decisions which are normally * altered by the client. * @param controller the controller in whose realm the decisions will take * effect. * @return the connector, either the connector that is installed in * the {@link DockProperties} under {@link #THEME_CONNECTOR} or * a default-value. */ public EclipseThemeConnector getThemeConnector( DockController controller ){ EclipseThemeConnector connector = null; if( controller != null ) connector = controller.getProperties().get( THEME_CONNECTOR ); if( connector == null ) connector = THEME_CONNECTOR.getDefault( null ); return connector; } }