/*
* 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 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.extension.css.theme;
import java.awt.Graphics;
import javax.swing.JComponent;
import bibliothek.gui.Dockable;
import bibliothek.gui.dock.extension.css.CssPath;
import bibliothek.gui.dock.extension.css.CssScheme;
import bibliothek.gui.dock.extension.css.DefaultCssItem;
import bibliothek.gui.dock.extension.css.doc.CssDocKey;
import bibliothek.gui.dock.extension.css.doc.CssDocPath;
import bibliothek.gui.dock.extension.css.doc.CssDocPathNode;
import bibliothek.gui.dock.extension.css.doc.CssDocProperty;
import bibliothek.gui.dock.extension.css.doc.CssDocSeeAlso;
import bibliothek.gui.dock.extension.css.doc.CssDocText;
import bibliothek.gui.dock.extension.css.path.DefaultCssNode;
import bibliothek.gui.dock.extension.css.path.DefaultCssPath;
import bibliothek.gui.dock.extension.css.path.MultiCssPath;
import bibliothek.gui.dock.extension.css.property.paint.CssPaint;
import bibliothek.gui.dock.extension.css.property.shape.CssShape;
import bibliothek.gui.dock.extension.css.property.shape.ShapeCssProperty;
import bibliothek.gui.dock.extension.css.theme.title.TitleFontModifierProperty;
import bibliothek.gui.dock.extension.css.theme.title.TitleIconTextGapProperty;
import bibliothek.gui.dock.extension.css.transition.CssPaintTransitionProperty;
import bibliothek.gui.dock.extension.css.tree.CssTree;
import bibliothek.gui.dock.extension.css.util.CssMouseAdapter;
import bibliothek.gui.dock.title.AbstractDockTitle;
import bibliothek.gui.dock.title.DockTitleVersion;
/**
* This title makes use of a {@link CssScheme} to set up its look.
* @author Benjamin Sigg
*/
@CssDocSeeAlso({
TitleFontModifierProperty.class,
TitleIconTextGapProperty.class})
public class CssDockTitle extends AbstractDockTitle{
private CssScheme css;
private DefaultCssNode self;
private CssPath selfPath;
private DefaultCssItem item;
@CssDocProperty(
path=@CssDocPath(referenceId="self"),
property=@CssDocKey(key="background"))
private CssPaint background;
@CssDocProperty(
path=@CssDocPath(referenceId="self"),
property=@CssDocKey(key="shape"))
private CssShape shape;
/**
* Creates a new title
* @param css access to all the css data
* @param dockable the dockable whose title this is
* @param origin the version which was used to create this title
*/
public CssDockTitle( CssScheme css, Dockable dockable, DockTitleVersion origin ){
super( dockable, origin, true );
this.css = css;
self = new DefaultCssNode( "title" );
updateSelf();
CssMouseAdapter adapter = new CssMouseAdapter(){
@Override
protected void added( String pseudoClass ){
self.addPseudoClass( pseudoClass );
}
@Override
protected void removed( String pseudoClass ){
self.removePseudoClass( pseudoClass );
}
};
addMouseInputListener( adapter );
}
@Override
public void bind(){
super.bind();
CssPath elementPath = css.getTree().getPathFor( getElement() );
selfPath = new MultiCssPath( elementPath, new DefaultCssPath( self ) );
item = new DefaultCssItem( selfPath );
item.putProperty( "background", new CssPaintTransitionProperty( css, item ){
@Override
protected void propertyChanged( CssPaint value ){
background = value;
repaint();
}
});
item.putProperty( "shape", new ShapeCssProperty(){
@Override
protected void propertyChanged( CssShape value ){
shape = value;
repaint();
}
} );
item.putProperty( "fontmodifier", new TitleFontModifierProperty( this, css, item ));
item.putProperty( "icontextgap", new TitleIconTextGapProperty( this ));
css.add( item );
}
@Override
public void unbind(){
super.unbind();
css.remove( item );
item = null;
}
@Override
protected void paintBackground( Graphics g, JComponent component ) {
if( background != null ){
background.paintArea( g, component, shape );
}
}
@Override
public boolean contains( int x, int y ){
if( !super.contains( x, y )){
return false;
}
if( shape != null ){
shape.setSize( getWidth(), getHeight() );
return shape.contains( x, y );
}
return true;
}
@Override
public void setActive( boolean active ){
super.setActive( active );
updateSelf();
}
@Override
public void setOrientation( Orientation orientation ){
super.setOrientation( orientation );
updateSelf();
}
@CssDocPath(id="self",
parentId="getPathFor",
parentClass = CssTree.class,
description=@CssDocText(format="Path to a %s.", arguments={"CssDockTitle"}),
nodes={@CssDocPathNode(
name=@CssDocKey(key="title"),
pseudoClasses={
@CssDocKey(key="selected", description=@CssDocText(text="Applied if the title is selected"))},
properties={
@CssDocKey(key="side", description=@CssDocText(text="Depends on the orientation of the title, one of 'east', 'west', 'south', 'north' or 'free'")),
@CssDocKey(key="horizontal", description=@CssDocText(text="'true' if the title is horizontal")),
@CssDocKey(key="vertical", description=@CssDocText(text="'true' if the title is vertical")),
@CssDocKey(reference=CssMouseAdapter.class)}
)})
private void updateSelf(){
if( self != null ){
if( isActive() ){
self.addPseudoClass( "selected" );
}
else{
self.removePseudoClass( "selected" );
}
String side = null;
boolean horizontal = false;
switch( getOrientation() ){
case EAST_SIDED:
side = "east";
horizontal = false;
break;
case FREE_HORIZONTAL:
side = "free";
horizontal = true;
break;
case FREE_VERTICAL:
side = "free";
horizontal = false;
break;
case NORTH_SIDED:
side = "north";
horizontal = true;
break;
case SOUTH_SIDED:
side = "south";
horizontal = true;
break;
case WEST_SIDED:
side = "west";
horizontal = false;
break;
}
self.putProperty( "side", side );
if( horizontal ){
self.putProperty( "horizontal", "true" );
self.putProperty( "vertical", null );
}
else{
self.putProperty( "horizontal", null );
self.putProperty( "vertical", "true" );
}
}
}
}