/* * 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) 2008 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.Dimension; import java.awt.Graphics; import java.awt.Insets; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.border.BevelBorder; import bibliothek.gui.DockStation; import bibliothek.gui.Dockable; import bibliothek.gui.dock.themes.ThemeManager; import bibliothek.gui.dock.themes.color.TitleColor; import bibliothek.gui.dock.title.AbstractDockTitle; import bibliothek.gui.dock.title.DockTitleVersion; import bibliothek.gui.dock.util.color.ColorCodes; import bibliothek.gui.dock.util.color.DockColor; import bibliothek.util.Colors; /** * This title is used for {@link DockStation DockStations} which are also * {@link Dockable Dockables} * @author Benjamin Sigg * */ @ColorCodes( {"title.station.active", "title.station.active.text", "title.station.inactive", "title.station.inactive.text", "title.station.disabled" }) public class BasicStationTitle extends AbstractDockTitle { /** The minimal preferred width and height of this title */ private int preferredDimension = 20; /** The background if the title is selected */ private TitleColor activeColor = new BasicStationTitleColor( "title.station.active", Color.WHITE ); /** The foreground if the title is selected */ private TitleColor activeTextColor = new BasicStationTitleColor( "title.station.active.text", Color.BLACK ); /** The background if the title is not selected */ private TitleColor inactiveColor = new BasicStationTitleColor( "title.station.inactive", Color.WHITE ); /** The foreground if the title is not selected */ private TitleColor inactiveTextColor = new BasicStationTitleColor( "title.station.inactive.text", Color.DARK_GRAY ); /** The background if the title disabled */ private TitleColor disabledColor = new BasicStationTitleColor( "title.station.disabled", Color.WHITE ); /** * Creates a new instance * @param dockable the owner of this title * @param origin the version which was used to create this title */ public BasicStationTitle( Dockable dockable, DockTitleVersion origin ) { super(dockable, origin); setBorder( ThemeManager.BORDER_MODIFIER + ".title.station.basic", BorderFactory.createBevelBorder( BevelBorder.RAISED )); setActive( false ); addColor( activeColor ); addColor( activeTextColor ); addColor( inactiveColor ); addColor( inactiveTextColor ); addColor( disabledColor ); } @Override protected void paintBackground( Graphics g, JComponent component ) { Color background = component.getBackground(); Insets insets = component.getInsets(); int x = insets.left; int y = insets.top; int width = component.getWidth() - insets.left - insets.right; int height = component.getHeight() - insets.top - insets.bottom; g.setColor( background ); g.fillRect( 0, 0, getWidth(), getHeight() ); Color bright = Colors.brighter( background, 0.1 ); Color dark = Colors.darker( background, 0.1 ); if( width > height ){ if( height >= 6 ){ for( int i = 0; i < 3; i++ ){ drawLineHorizontal( g, x, height * (i+1)/4, width, bright, dark ); } } else if( height >= 4 ){ drawLineHorizontal( g, x, y, width, bright, dark ); drawLineHorizontal( g, x, y+height-2, width, bright, dark ); } else if( height >= 2 ){ drawLineHorizontal( g, x, y, width, bright, dark ); } } else{ if( width >= 6 ){ for( int i = 0; i < 3; i++ ){ drawLineVertical( g, width * (i+1)/4, y, height, bright, dark ); } } else if( width >= 4 ){ drawLineVertical( g, x, y, height, bright, dark ); drawLineVertical( g, x+width-2, y, height, bright, dark ); } else if( width >= 2 ){ drawLineVertical( g, x, y, height, bright, dark ); } } } /** * Gets the minimum of the preferred width and height. * @return the minimum * @see #setPreferredDimension(int) */ public int getPreferredDimension() { return preferredDimension; } /** * Sets the minimum of the preferred size. The width and the height * of the result of <code>getPreferredSize</code> will always be equal * or greater than <code>preferredDimension</code>. * @param preferredDimension the smallest preferred dimension */ public void setPreferredDimension( int preferredDimension ) { this.preferredDimension = preferredDimension; } @Override public void setActive( boolean active ) { super.setActive(active); updateColors(); } @Override protected void setDisabled( boolean disabled ){ super.setDisabled( disabled ); updateColors(); } /** * Changes the background and the foreground color of this title. If the * title is {@link #isActive() active}, the foreground is set to * {@link #getActiveTextColor() activeTextColor} and the background is * set to {@link #getActiveColor() activeColor}. Otherwise the * foreground is {@link #getInactiveTextColor() inactiveTextColor} and * the background is {@link #getInactiveColor() inacticeColor}. */ protected void updateColors(){ if( isDisabled() ){ if( inactiveTextColor != null && disabledColor != null ){ setBackground( disabledColor.color() ); setForeground( inactiveTextColor.color() ); } } else if( isActive() ){ if( activeTextColor != null && activeColor != null ){ setBackground( activeColor.color() ); setForeground( activeTextColor.color() ); } } else{ if( inactiveColor != null && inactiveTextColor != null ){ setBackground( inactiveColor.color() ); setForeground( inactiveTextColor.color() ); } } repaint(); } /** * Gets the background-color which is used if this title is selected. * @return the background */ public Color getActiveColor() { return activeColor.value(); } /** * Gets the background-color which is used if this title is not selected. * @return the background */ public Color getInactiveColor() { return inactiveColor.value(); } /** * Gets the background-color which is used if this title is disabled. * @return the background */ public Color getDisabledColor(){ return disabledColor.value(); } /** * Gets the foreground-color which is used if this title is selected. * @return the foreground */ public Color getActiveTextColor() { return activeTextColor.value(); } /** * Gets the foreground-color which is used if this title is not selected. * @return the foreground */ public Color getInactiveTextColor() { return inactiveTextColor.value(); } /** * Sets the background-color which is used if this title is selected. * @param activeColor the background */ public void setActiveColor( Color activeColor ) { this.activeColor.setValue( activeColor ); updateColors(); } /** * Sets the foreground-color which is used if this title is selected. * @param activeTextColor the foreground */ public void setActiveTextColor( Color activeTextColor ) { this.activeTextColor.setValue( activeTextColor ); updateColors(); } /** * Sets the background-color which is used if this title is not selected. * @param inactiveColor the background */ public void setInactiveColor( Color inactiveColor ) { this.inactiveColor.setValue( inactiveColor ); updateColors(); } /** * Sets the background-color which is used if this title is disabled. * @param disabledColor the background */ public void setDisabledColor( Color disabledColor ){ this.disabledColor.setValue( disabledColor ); updateColors(); } /** * Sets the foreground-color which is used if this title is not selected. * @param inactiveTextColor the background */ public void setInactiveTextColor( Color inactiveTextColor ) { this.inactiveTextColor.setValue( inactiveTextColor ); updateColors(); } /** * Gets the {@link TitleColor} which represents the background of an active title. * @return the active background */ public TitleColor getActiveTitleColor(){ return activeColor; } /** * Gets the {@link TitleColor} which represents the background of a disabled title. * @return the disabled background */ public TitleColor getDisabledTitleColor(){ return disabledColor; } /** * Gets the {@link TitleColor} which represents the foreground of an active title. * @return the active foreground */ public TitleColor getActiveTextTitleColor(){ return activeTextColor; } /** * Gets the {@link TitleColor} which represents the background of an inactive title. * @return the inactive background */ public TitleColor getInactiveTitleColor(){ return inactiveColor; } /** * Gets the {@link TitleColor} which represents the foreground of an inactive title. * @return the inactive foreground */ public TitleColor getInactiveTextTitleColor(){ return inactiveTextColor; } @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); return new Dimension( Math.max( preferredDimension, size.width ), Math.max( preferredDimension, size.height )); } /** * Draws a horizontal line beginning at <code>x, y</code>. * @param g the graphics context used to paint * @param x the x-coordinate of the left point * @param y the y-coordinate of the line * @param width the length of the line * @param up the color used to draw the upper half * @param down the color used to draw the lower half */ private void drawLineHorizontal( Graphics g, int x, int y, int width, Color up, Color down ){ g.setColor( up ); g.drawLine( x+2, y, x+width-4, y ); g.setColor( down ); g.drawLine( x+2, y+1, x+width-4, y+1 ); } /** * Draws a vertical line beginning at <code>x, y</code>. * @param g the graphics context used to paint * @param x the x-coordinate of the line * @param y the y-coordinate of the top point * @param height the length of the line * @param up the color used to draw the left half * @param down the color used to draw the right half */ private void drawLineVertical( Graphics g, int x, int y, int height, Color up, Color down ){ g.setColor( up ); g.drawLine( x, y+2, x, y+height-4 ); g.setColor( down ); g.drawLine( x+1, y+2, x+1, y+height-4 ); } /** * A {@link DockColor} representing a color of {@link BasicStationTitle}. * @author Benjamin Sigg */ private class BasicStationTitleColor extends TitleColor{ /** * Creates a new color * @param id the unique identifier of the color * @param backup the default value */ public BasicStationTitleColor( String id, Color backup ){ super( id, BasicStationTitle.this, backup ); } @Override protected void changed( Color oldValue, Color newValue ) { updateColors(); } } }