/* * 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.basic; import java.awt.Color; import java.awt.Component; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JComponent; import bibliothek.gui.Dockable; import bibliothek.gui.dock.themes.color.TitleColor; import bibliothek.gui.dock.themes.font.TitleFont; import bibliothek.gui.dock.title.AbstractDockTitle; import bibliothek.gui.dock.title.DockTitleFactory; import bibliothek.gui.dock.title.DockTitleRequest; import bibliothek.gui.dock.title.DockTitleVersion; import bibliothek.gui.dock.util.color.ColorCodes; import bibliothek.gui.dock.util.font.DockFont; import bibliothek.util.Condition; /** * The default-title that is used most times in the framework. This title * shows an icon, a text, some small buttons and a gradient as background. * @author Benjamin Sigg */ @ColorCodes({ "title.active.left", "title.inactive.left", "title.disabled.left", "title.active.right", "title.inactive.right", "title.disabled.right", "title.active.text", "title.inactive.text" }) public class BasicDockTitle extends AbstractDockTitle { /** * A factory for the {@link BasicDockTitle}. */ public static final DockTitleFactory FACTORY = new DockTitleFactory(){ public void install( DockTitleRequest request ){ // ignore } public void uninstall( DockTitleRequest request ){ // ignore } public void request( DockTitleRequest request ){ request.answer( new BasicDockTitle( request.getTarget(), request.getVersion() ) ); } }; /** The left color of the gradient if the title is active */ private TitleColor activeLeftColor = new BasicTitleColor( "title.active.left", Color.BLACK ); /** The left color of the gradient if the title is not active */ private TitleColor inactiveLeftColor = new BasicTitleColor( "title.inactive.left", Color.DARK_GRAY ); /** The left color of the gradient if the title is disabled */ private TitleColor disabledLeftColor = new BasicTitleColor( "title.disabled.left", Color.LIGHT_GRAY ); /** The right color of the gradient if the title is active */ private TitleColor activeRightColor = new BasicTitleColor( "title.active.right", Color.DARK_GRAY ); /** The right color of the gradient if the title is not active */ private TitleColor inactiveRightColor = new BasicTitleColor( "title.inactive.right", Color.LIGHT_GRAY ); /** The right color of the gradient if the title is disabled */ private TitleColor disabledRightColor = new BasicTitleColor( "title.disabled.right", Color.LIGHT_GRAY ); /** The color of the text if the title is active */ private TitleColor activeTextColor = new BasicTitleColor( "title.active.text", Color.WHITE ); /** The color of the text if the title is not active */ private TitleColor inactiveTextColor = new BasicTitleColor( "title.inactive.text", Color.BLACK ); /** The gradient used to paint this title */ private GradientPaint gradient; /** * Creates a new title * @param dockable the owner of this title * @param origin the version which was used to create this title */ public BasicDockTitle( Dockable dockable, DockTitleVersion origin ){ this( dockable, origin, true ); } /** * Creates a new title * @param dockable the owner of this title * @param origin the version which was used to create this title * @param setDefaultConditionalFonts whether to set the default set of * conditional fonts for {@link DockFont#ID_TITLE_ACTIVE} and * {@link DockFont#ID_TITLE_INACTIVE} */ protected BasicDockTitle( Dockable dockable, DockTitleVersion origin, boolean setDefaultConditionalFonts ){ super( dockable, origin ); setActive( false ); addColor( activeLeftColor ); addColor( inactiveLeftColor ); addColor( disabledLeftColor ); addColor( activeRightColor ); addColor( inactiveRightColor ); addColor( disabledRightColor ); addColor( activeTextColor ); addColor( inactiveTextColor ); if( setDefaultConditionalFonts ){ addConditionalFont( DockFont.ID_TITLE_ACTIVE, TitleFont.KIND_TITLE_FONT, new Condition(){ public boolean getState() { return isActive(); } }, null ); addConditionalFont( DockFont.ID_TITLE_INACTIVE, TitleFont.KIND_TITLE_FONT, new Condition(){ public boolean getState() { return !isActive(); } }, null ); } } @Override @Deprecated public void reshape( int x, int y, int w, int h ){ super.reshape( x, y, w, h ); gradient = null; } @Override public void validate() { gradient = null; super.validate(); } @Override public void setOrientation( Orientation orientation ) { gradient = null; super.setOrientation(orientation); } @Override protected void paintBackground( Graphics g, JComponent component ) { Graphics2D g2 = (Graphics2D)g; if( gradient == null ){ if( isDisabled() ){ gradient = getGradient( disabledLeftColor.value(), disabledRightColor.value(), component ); } else if ( isActive() ){ gradient = getGradient( activeLeftColor.value(), activeRightColor.value(), component ); } else{ gradient = getGradient( inactiveLeftColor.value(), inactiveRightColor.value(), component ); } } g2.setPaint( gradient ); g.fillRect( 0, 0, component.getWidth(), component.getHeight() ); } /** * Gets the gradient which is used to fill the background of <code>component</code>. * @param left the first color of the gradient * @param right the second color of the gradient * @param component the component on which the gradient will be used * @return the new gradient */ protected GradientPaint getGradient( Color left, Color right, Component component ){ GradientPaint gradient; if( getOrientation().isHorizontal() ){ float h = component.getHeight() / 2.0f; gradient = new GradientPaint( 0, h, left, component.getWidth(), h, right, false ); } else{ float w = component.getWidth() / 2.0f; gradient = new GradientPaint( w, 0, left, w, component.getHeight(), right, false ); } return gradient; } /** * Gets the color that is used on the left side if this title * is active. This method does the same as * <code>getActiveLeftTitleColor().color();</code>. * @return the color * @see #setActiveLeftColor(Color) * @see #getActiveLeftTitleColor() */ public Color getActiveLeftColor() { return activeLeftColor.value(); } /** * Gets the handle for the left active color. * @return the handle, can be used to change the color of this title */ public TitleColor getActiveLeftTitleColor(){ return activeLeftColor; } /** * Sets the color that is used on the left side if this * title is active. This method does the same as * <code>getActiveLeftTitleColor().setValue( activeLeftColor );</code>. * @param activeLeftColor the color * @see #getActiveLeftTitleColor() */ public void setActiveLeftColor( Color activeLeftColor ) { this.activeLeftColor.setValue( activeLeftColor ); } /** * Changes the identifier that is used for the active left color. * @param id the new identifier, not <code>null</code> */ public void setActiveLeftColorId( String id ){ activeLeftColor.setId( id ); } /** * Gets the color that is used on the right side in the * gradient of this title. This method does the same * as <code>getActiveRightTitleColor().color();</code>. * @return the color */ public Color getActiveRightColor() { return activeRightColor.value(); } /** * Gets the handle for the left active color. * @return the handle, can be used to change the color of this title */ public TitleColor getActiveRightTitleColor(){ return activeRightColor; } /** * Sets the color which is used on the right side in the * gradient of this title. This method does the same as * <code>getActiveRightTitleColor().setValue( activeRightColor );</code>. * @param activeRightColor the color */ public void setActiveRightColor( Color activeRightColor ) { this.activeRightColor.setValue( activeRightColor ); } /** * Changes the identifier that is used for the active right color. * @param id the new identifier, not <code>null</code> */ public void setActiveRightColorId( String id ){ activeRightColor.setId( id ); } /** * Gets the color that is used for text if this title is active. This * method does the same as <code>getActiveTextTitleColor().color();</code>. * @return the color */ public Color getActiveTextColor() { return activeTextColor.value(); } /** * Gets a handle for the foreground color of an active title. * @return the handle, can be used to change the color of this title */ public TitleColor getActiveTextTitleColor(){ return activeTextColor; } /** * Sets the color which is used to paint the text if this title * is active. This method does the same as * <code>getActiveTextTitleColor().setValue( activeTextColor );</code>. * @param activeTextColor the color */ public void setActiveTextColor( Color activeTextColor ) { this.activeTextColor.setValue( activeTextColor ); } /** * Changes the identifier that is used for the active text color. * @param id the new identifier, not <code>null</code> */ public void setActiveTextColorId( String id ){ activeTextColor.setId( id ); } /** * Gets the color that is used on the left side if this title is disabled. This method * does the same as <code>getDisabledLeftTitleColor().color();</code>. * @return the color * @see #setDisabledLeftColor(Color) * @see #getDisabledLeftTitleColor() */ public Color getDisabledLeftColor(){ return disabledLeftColor.value(); } /** * Gets the handle for the left disabled color. * @return the handle, can be used to change the color of this title */ public TitleColor getDisabledLeftTitleColor(){ return disabledLeftColor; } /** * Sets the color that is used on the left side if this * title is disabled. This method does the same as * <code>getDisabledLeftTitleColor().setValue( activeLeftColor );</code>. * @param disabledLeftColor the color * @see #getDisabledLeftTitleColor() */ public void setDisabledLeftColor( Color disabledLeftColor ){ this.disabledLeftColor.setValue( disabledLeftColor ); } /** * Changes the identifier that is used for the disabled left color. * @param id the new identifier, not <code>null</code> */ public void setDisabledLeftColorId( String id ){ disabledLeftColor.setId( id ); } /** * Gets the color that is used on the right side if this title is disabled. This method * does the same as <code>getDisabledRightTitleColor().color();</code>. * @return the color * @see #setDisabledRightColor(Color) * @see #getDisabledRightTitleColor() */ public Color getDisabledRightColor(){ return disabledRightColor.value(); } /** * Gets the handle for the right disabled color. * @return the handle, can be used to change the color of this title */ public TitleColor getDisabledRightTitleColor(){ return disabledRightColor; } /** * Sets the color that is used on the right side if this * title is disabled. This method does the same as * <code>getDisabledRightTitleColor().setValue( activeLeftColor );</code>. * @param disabledRightColor the color * @see #getDisabledRightTitleColor() */ public void setDisabledRightColor( Color disabledRightColor ){ this.disabledRightColor.setValue( disabledRightColor ); } /** * Changes the identifier that is used for the disabled right color. * @param id the new identifier, not <code>null</code> */ public void setDisabledRightColorId( String id ){ disabledRightColor.setId( id ); } /** * Gets the color which is used on the left side of the * gradient if this title is not active. This method does the * same as <code>getInactiveLeftTitleColor().color();</code>. * @return the color */ public Color getInactiveLeftColor() { return inactiveLeftColor.value(); } /** * Gets a handle for the left inactive color. * @return the handle, can be used to change the color of this title */ public TitleColor getInactiveLeftTitleColor(){ return inactiveLeftColor; } /** * Sets the color which will be used on the left side of * the gradient if this title is not active. This method does the * same as <code>getInactiveLeftTitleColor().setValue( inactiveLeftColor );</code>. * @param inactiveLeftColor the color */ public void setInactiveLeftColor( Color inactiveLeftColor ) { this.inactiveLeftColor.setValue( inactiveLeftColor ); } /** * Changes the identifier that is used for the inactive left color. * @param id the new identifier, not <code>null</code> */ public void setInactiveLeftColorId( String id ){ inactiveLeftColor.setId( id ); } /** * Gets the color which is used on the right side of the * gradient if this title is not active. This method does * the same as <code>getInactiveRightTitleColor().color();</code>. * @return the color on the right side */ public Color getInactiveRightColor() { return inactiveRightColor.value(); } /** * Gets a handle for the inactive right background color. * @return a handle, can be used to change the colors of this title */ public TitleColor getInactiveRightTitleColor(){ return inactiveRightColor; } /** * Sets the color of the right side of the gradient. The color * will only be used if this title is not active. This method does * the same as <code>getInactiveRightTitleColor().setValue( inactiveRightColor );</code>. * @param inactiveRightColor the color */ public void setInactiveRightColor( Color inactiveRightColor ) { this.inactiveRightColor.setValue( inactiveRightColor ); } /** * Changes the identifier that is used for the inactive right color. * @param id the new identifier, not <code>null</code> */ public void setInactiveRightColorId( String id ){ activeRightColor.setId( id ); } /** * Gets the color of the text. This color is used if this title is not active. * This method does the same as <code>getInactiveTextTitleColor().color();</code>. * @return the color */ public Color getInactiveTextColor() { return inactiveTextColor.value(); } /** * Gets a handle for the inactive foreground color. * @return a handle, can be used to change the color of this title. */ public TitleColor getInactiveTextTitleColor(){ return inactiveTextColor; } /** * Sets the color of the text. The color will only be used if this title * is not active. This method does the same as * <code>getInactiveTextTitleColor().setValue( inactiveTextColor );</code>. * @param inactiveTextColor the color */ public void setInactiveTextColor( Color inactiveTextColor ) { this.inactiveTextColor.setValue( inactiveTextColor ); } /** * Changes the identifier that is used for the inactive text color. * @param id the new identifier, not <code>null</code> */ public void setInactiveTextColorId( String id ){ inactiveTextColor.setId( id ); } @Override public void setActive( boolean active ) { super.setActive( active ); updateColors(); updateFonts(); } @Override protected void setDisabled( boolean disabled ){ super.setDisabled( disabled ); updateColors(); updateFonts(); } /** * Invoked after a color has changed. This method ensures that the * gradient is recreated. */ protected void updateColors(){ gradient = null; if( isActive() ){ if( activeTextColor != null ){ setForeground( activeTextColor.value() ); } } else{ if( inactiveTextColor != null ){ setForeground( inactiveTextColor.value() ); } } repaint(); } /** * A implementation of {@link TitleColor} that calls <code>repaint</code> * when the color changes. * @author Benjamin Sigg */ private class BasicTitleColor extends TitleColor{ /** * Creates a new color * @param id the id of the color * @param backup a backup color */ public BasicTitleColor( String id, Color backup ){ super( id, BasicDockTitle.this, backup ); } @Override protected void changed( Color oldColor, Color newColor ) { gradient = null; updateColors(); } } }