001         package com.croftsoft.core.awt.font;
002    
003         import java.awt.*;
004         import java.awt.font.*;
005         import java.awt.geom.*;
006    
007         /*********************************************************************
008         * Library of static methods for manipulating Fonts.
009         *
010         * @version
011         *   2003-02-10
012         * @since
013         *   2002-03-02
014         * @author
015         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
016         *********************************************************************/
017    
018         public final class  FontLib
019         //////////////////////////////////////////////////////////////////////
020         //////////////////////////////////////////////////////////////////////
021         {
022    
023         public static Rectangle2D  getTextLayoutBounds (
024           Component  component,
025           String     text )
026         //////////////////////////////////////////////////////////////////////
027         {
028           Graphics2D  graphics2D
029             = ( Graphics2D ) component.getGraphics ( );
030    
031           FontRenderContext  fontRenderContext
032             = graphics2D.getFontRenderContext ( );
033    
034           Font  font = component.getFont ( );
035    
036           TextLayout  textLayout = new TextLayout (
037             text, font, fontRenderContext );
038    
039           Rectangle2D  textLayoutBounds = textLayout.getBounds ( );
040    
041           graphics2D.dispose ( );
042    
043           return textLayoutBounds;
044         }
045    
046         /*********************************************************************
047         * Sets the Graphics Font size so that it maximizes the bounded text.
048         *********************************************************************/
049         public static void  setMaxFont (
050           Graphics  graphics,
051           String    text,
052           String    fontName,
053           int       fontStyle,
054           double    maxWidth,
055           double    maxHeight )
056         //////////////////////////////////////////////////////////////////////
057         {
058           int  fontSize = 2;
059    
060           while ( true )
061           {
062             graphics.setFont ( new Font ( fontName, fontStyle, fontSize ) );
063    
064             FontMetrics  fontMetrics = graphics.getFontMetrics ( );
065    
066             Rectangle2D  textBounds
067               = fontMetrics.getStringBounds ( text, graphics );
068    
069             if ( ( textBounds.getWidth  ( ) > maxWidth  )
070               || ( textBounds.getHeight ( ) > maxHeight ) )
071             {
072               graphics.setFont (
073                 new Font ( fontName, fontStyle, fontSize - 1 ) );
074    
075               break;
076             }
077    
078             fontSize++;
079           }
080         }
081    
082         /*********************************************************************
083         * Sets the Graphics Font size so that it maximizes the bounded text.
084         *********************************************************************/
085         public static void  setMaxFont (
086           Component  component,
087           String     text,
088           String     fontName,
089           int        fontStyle,
090           double     maxWidth,
091           double     maxHeight )
092         //////////////////////////////////////////////////////////////////////
093         {
094           Graphics  graphics = component.getGraphics ( );
095    
096           setMaxFont (
097             graphics, text, fontName, fontStyle, maxWidth, maxHeight );
098    
099           component.setFont ( graphics.getFont ( ) );
100    
101           graphics.dispose ( );
102         }
103    
104         //////////////////////////////////////////////////////////////////////
105         //////////////////////////////////////////////////////////////////////
106    
107         private FontLib ( ) { }
108    
109         //////////////////////////////////////////////////////////////////////
110         //////////////////////////////////////////////////////////////////////
111         }