/* * 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.util.font; import java.awt.Font; /** * A {@link FontModifier} that can change a font in more than just one way. * @author Benjamin Sigg */ public class GenericFontModifier implements FontModifier{ /** * Tells how to transform some aspect of a font. * @author Benjamin Sigg */ public static enum Modify{ ON, OFF, REVERSE, IGNORE } private Modify italic = Modify.IGNORE; private Modify bold = Modify.IGNORE; private boolean sizeDelta = true; private int size = 0; /** * Creates a new modifier */ public GenericFontModifier(){ // nothing } /** * Sets the size of the new font. If {@link #setSizeDelta(boolean) delta size} * is set to <code>true</code> then this value is added to the original size * of the font, otherwise this value replaces the original size. * @param size the new size or the delta size */ public void setSize( int size ) { this.size = size; } /** * Gets the size of the new font * @return the new size * @see #setSize(int) */ public int getSize() { return size; } /** * Sets whether the value of {@link #setSize(int) size} should be added * to the original size or replace the original size. * @param sizeDelta <code>true</code> if the two sizes should be summed up, * <code>false</code> if the size specified in this modifier replaces * the original size */ public void setSizeDelta( boolean sizeDelta ) { this.sizeDelta = sizeDelta; } /** * Tells whether the size of the fonts generated by this modifier depend * on the original size of the used font or not. * @return <code>true</code> if the sizes are summed up, <code>false</code> * if not * @see #setSizeDelta(boolean) */ public boolean isSizeDelta() { return sizeDelta; } /** * Sets how to modify the italic aspect of a font. * @param italic the new modification */ public void setItalic( Modify italic ) { this.italic = italic; } /** * Tells how this modifier modifies the italic aspect of a font. * @return the modification */ public Modify getItalic() { return italic; } /** * Sets how to modify the bold aspect of a font. * @param bold the new modification */ public void setBold( Modify bold ) { this.bold = bold; } /** * Tells how this modifier modifies the bold aspect of a font. * @return the modification */ public Modify getBold() { return bold; } public Font modify( Font font ) { int flags = 0; if( font.isBold() ) flags |= Font.BOLD; if( font.isItalic() ) flags |= Font.ITALIC; int newFlags = modify( flags, Font.ITALIC, italic ); newFlags = modify( newFlags, Font.BOLD, bold ); float size = this.size; if( sizeDelta ) size += font.getSize(); return font.deriveFont( newFlags, size ); } private int modify( int flags, int flag, Modify modification ){ switch( modification ){ case IGNORE: return flags; case ON: return flags | flag; case OFF: return flags & ~flag; case REVERSE: return flags ^ flag; } return flags; } }