/* * 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) 2013 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.property.font; import java.util.ArrayList; import java.util.List; import bibliothek.gui.dock.extension.css.CssProperty; import bibliothek.gui.dock.extension.css.CssPropertyContainerListener; import bibliothek.gui.dock.extension.css.property.IntegerCssProperty; import bibliothek.gui.dock.util.font.FontModifier; import bibliothek.gui.dock.util.font.GenericFontModifier; import bibliothek.gui.dock.util.font.GenericFontModifier.Modify; /** * This {@link CssFontModifier} makes use of a {@link GenericFontModifier} to change size, italic and boldness of a font. * @author Benjamin Sigg */ public class GenericCssFontModifier implements CssFontModifier { /** all observers of this modifier */ private List<CssFontModifierListener> listeners = new ArrayList<CssFontModifierListener>( 2 ); /** the actual algorithm */ private GenericFontModifier delegate = new GenericFontModifier(); /** default value for {@link #italic} */ private Modify defaultItalic = Modify.IGNORE; /** whether the font should be italic */ private FontModifyCssProperty italic = new FontModifyCssProperty(){ @Override public void set( Modify value ){ if( value == null ){ value = defaultItalic; } delegate.setItalic( value ); fireEvent(); } }; /** default value for {@link #bold} */ private Modify defaultBold = Modify.IGNORE; /** whether the font should be bold */ private FontModifyCssProperty bold = new FontModifyCssProperty(){ @Override public void set( Modify value ){ if( value == null ){ value = defaultBold; } delegate.setBold( value ); fireEvent(); } }; /** the default value of {@link #size} */ private int defaultSize = -1; /** the latest value of {@link #size} */ private int sizeCache = -1; /** the size of the font */ private IntegerCssProperty size = new IntegerCssProperty(){ @Override public void set( Integer value ){ if( value == null ){ value = defaultSize; } resize( value, deltaCache ); fireEvent(); } }; /** the default value of {@link #delta} */ private int defaultDelta = 0; /** the latest value of {@link #delta} */ private int deltaCache = -1; /** the delta of the size */ private IntegerCssProperty delta = new IntegerCssProperty(){ @Override public void set( Integer value ){ if( value == null ){ value = defaultDelta; } resize( sizeCache, value ); fireEvent(); } }; private void resize( int size, int delta ){ sizeCache = size; deltaCache = delta; if( size <= 0 ){ delegate.setSizeDelta( true ); delegate.setSize( delta ); } else{ delegate.setSizeDelta( false ); delegate.setSize( size + delta ); } } @Override public FontModifier getModifier(){ GenericFontModifier copy = new GenericFontModifier(); copy.setBold( delegate.getBold() ); copy.setItalic( delegate.getItalic() ); copy.setSize( delegate.getSize() ); copy.setSizeDelta( delegate.isSizeDelta() ); return copy; } @Override public void addFontModifierListener( CssFontModifierListener listener ){ listeners.add( listener ); } @Override public void removeFontModifierListener( CssFontModifierListener listener ){ listeners.remove( listener ); } private void fireEvent(){ for( CssFontModifierListener listener : listeners ){ listener.modifierChanged( this ); } } /** * Gets the behavior of the italic parameter. * @return whether the font is italic or not */ public Modify getItalic(){ return delegate.getItalic(); } /** * Gets the behavior of the bold parameter. * @return whether the font is bold or not */ public Modify getBold(){ return delegate.getBold(); } /** * Gets the current size of the font, without delta. * @return the size, or -1 is not set */ public int getSize(){ return sizeCache; } /** * Gets the current delta in size of the font. * @return the delta */ public int getDelta(){ return deltaCache; } @Override public String[] getPropertyKeys(){ return new String[]{ "size", "delta", "italic", "bold" }; } @Override public CssProperty<?> getProperty( String key ){ if( "size".equals( key )){ return size; } if( "delta".equals( key )){ return delta; } if( "italic".equals( key )){ return italic; } if( "bold".equals( key )){ return bold; } return null; } @Override public void addPropertyContainerListener( CssPropertyContainerListener listener ){ // ignore } @Override public void removePropertyContainerListener( CssPropertyContainerListener listener ){ // ignore } }