package de.unisiegen.gtitool.core.parser.style; import java.awt.Component; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.border.EmptyBorder; /** * This class implements the {@link PrettyPrintable} {@link Component}. * * @author Christian Fehler */ public final class PrettyStringComponent extends JLabel { /** * The serial version uid. */ private static final long serialVersionUID = 6078784158332697414L; /** * The used font. */ private static final Font FONT = new Font ( "Dialog", Font.PLAIN, 12 ); //$NON-NLS-1$ /** * The {@link PrettyString} of this component. */ private PrettyString prettyString; /** * The center horizontal value. */ private boolean centerHorizontal = false; /** * The center vertical value. */ private boolean centerVertical = false; /** * Initializes the {@link PrettyStringComponent}. */ public PrettyStringComponent () { this ( null ); } /** * Initializes the {@link PrettyStringComponent}. * * @param prettyString The {@link PrettyString}. */ public PrettyStringComponent ( PrettyString prettyString ) { super (); this.prettyString = prettyString; setBorder ( new EmptyBorder ( 1, 1, 1, 1 ) ); // used to calculate the preferered size setText ( "PrettyString" ); //$NON-NLS-1$ } /** * Returns the prettyString. * * @return The prettyString. * @see #prettyString */ public final PrettyString getPrettyString () { return this.prettyString; } /** * {@inheritDoc} * * @see JComponent#getToolTipText(MouseEvent) */ @Override public final String getToolTipText ( @SuppressWarnings ( "unused" ) MouseEvent event ) { if ( this.prettyString.toString ().equals ( "" ) || //$NON-NLS-1$ !this.prettyString.isShortVersion () ) { return null; } return this.prettyString.toHTMLString (); } /** * Returns the center horizontal value. * * @return The center horizontal value. * @see #centerHorizontal */ public final boolean isCenterHorizontal () { return this.centerHorizontal; } /** * Returns the center vertical value. * * @return The center vertical value. * @see #centerVertical */ public final boolean isCenterVertical () { return this.centerVertical; } /** * {@inheritDoc} * * @see JComponent#paintComponent(Graphics) */ @Override protected final void paintComponent ( Graphics g ) { g.setColor ( getBackground () ); g.fillRect ( 0, 0, getWidth (), getHeight () ); g.setFont ( FONT ); FontMetrics metrics = g.getFontMetrics (); PrettyString usedPrettyString = new PrettyString (); usedPrettyString.add ( this.prettyString ); // short version if ( metrics.stringWidth ( this.prettyString.toString () ) > getWidth () ) { this.prettyString.setShortVersion ( true ); String dots = " ..."; //$NON-NLS-1$ PrettyToken lastPrettyToken = null; while ( ( !usedPrettyString.isEmpty () ) && ( ( metrics.stringWidth ( usedPrettyString.toString () + dots ) ) > getWidth () ) ) { lastPrettyToken = usedPrettyString.removeLastPrettyToken (); } if ( lastPrettyToken != null ) { char [] chars = lastPrettyToken.getChar (); int i = 0; String addText = ""; //$NON-NLS-1$ while ( ( i < chars.length ) && ( ( metrics.stringWidth ( usedPrettyString.toString () + addText + dots ) ) <= getWidth () ) ) { addText += chars [ i ]; i++ ; } if ( addText.length () > 0 ) { addText = addText.substring ( 0, addText.length () - 1 ); } PrettyToken prettyToken = new PrettyToken ( addText, lastPrettyToken .getStyle () ); prettyToken.setOverwrittenColor ( lastPrettyToken .getOverwrittenColor () ); usedPrettyString.add ( prettyToken ); } // if empty do not use the first space if ( usedPrettyString.isEmpty () ) { dots = "..."; //$NON-NLS-1$ } usedPrettyString.add ( new PrettyToken ( dots, Style.NONE ) ); } else { this.prettyString.setShortVersion ( false ); } int dx = 0; if ( this.centerHorizontal ) { dx = ( getWidth () - metrics.stringWidth ( usedPrettyString.toString () ) ) / 2; } int y = getHeight () - 3; if ( this.centerVertical ) { y = y - ( ( getHeight () - metrics.getHeight () ) / 2 ); } for ( PrettyToken currentToken : usedPrettyString.getPrettyToken () ) { Font font = null; if ( !currentToken.isBold () && !currentToken.isItalic () ) { font = FONT; } else if ( currentToken.isBold () && currentToken.isItalic () ) { font = FONT.deriveFont ( Font.BOLD | Font.ITALIC ); } else if ( currentToken.isBold () ) { font = FONT.deriveFont ( Font.BOLD ); } else if ( currentToken.isItalic () ) { font = FONT.deriveFont ( Font.ITALIC ); } g.setFont ( font ); g.setColor ( currentToken.getColor () ); char [] chars = currentToken.getChar (); for ( int i = 0 ; i < chars.length ; i++ ) { g.drawChars ( chars, i, 1, dx, y ); dx += metrics.charWidth ( chars [ i ] ); } } } /** * Sets the center horizontal value. * * @param centerHorizontal The center horizontal value to set. * @see #centerHorizontal */ public final void setCenterHorizontal ( boolean centerHorizontal ) { this.centerHorizontal = centerHorizontal; } /** * Sets the center vertical. * * @param centerVertical The center vertical to set. * @see #centerVertical */ public final void setCenterVertical ( boolean centerVertical ) { this.centerVertical = centerVertical; } /** * Sets the prettyString. * * @param prettyString The prettyString to set. * @see #prettyString */ public final void setPrettyString ( PrettyString prettyString ) { this.prettyString = prettyString; } }