controlp5/src/controlP5/Label.java

543 lines
13 KiB
Java
Executable File

package controlP5;
/**
* controlP5 is a processing gui library.
*
* 2006-2015 by Andreas Schlegel
*
* 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., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*
* @author Andreas Schlegel (http://www.sojamo.de)
* @modified ##date##
* @version ##version##
*
*/
import processing.core.PFont;
import processing.core.PGraphics;
/**
* A custom label using controlP5's BitFonts or PFont based
* ControlFonts.
*
*
* @see controlP5.ControlFont
* @example controllers/ControlP5Textlabel
*
*/
public class Label implements CDrawable {
public static boolean isToUpperCaseDefault = true;
protected int _myLetterSpacing = 0;
protected boolean isMultiline;
protected boolean isFixedSize;
protected ControllerStyle _myControllerStyle = new ControllerStyle( );
protected boolean isVisible = true;
protected int _myColor = 0xffffffff;
protected boolean isColorBackground;
protected boolean isToUpperCase = isToUpperCaseDefault;
protected boolean changed;
protected int _myColorBackground = 0xffffffff;
protected int _myHeight = -1;
protected int _myWidth = -1;
protected String _myText = "";
protected ControlFont _myFontLabel;
protected int _myLineHeight = 0;
protected int alignX = ControlP5.LEFT;
protected int alignY = ControlP5.LEFT;
protected int textAlign = ControlP5.LEFT;
public static int paddingX = 4;
public static int paddingY = 4;
public int _myPaddingX = paddingX;
public int _myPaddingY = paddingY;
protected Labeltype _myLabeltype;
protected int _myTextHeight = 1;
protected float offsetYratio = 0;
private ControlP5 cp5;
private Label( Label theLabel ) {
_myText = theLabel.getText( );
isToUpperCase = theLabel.isToUpperCase( );
_myLetterSpacing = theLabel.getLetterSpacing( );
_myLineHeight = theLabel.getLineHeight( );
_myFontLabel = theLabel.getFont( );
_myLabeltype = theLabel.getLabeltype( );
}
public Label( ControlP5 theControlP5 , String theValue ) {
init( theControlP5 , theValue , 0 , 0 , _myColor );
}
public Label( ControlP5 theControlP5 , String theValue , int theWidth , int theHeight , int theColor ) {
init( theControlP5 , theValue , theWidth , theHeight , theColor );
}
private void init( ControlP5 theControlP5 , String theValue , int theWidth , int theHeight , int theColor ) {
cp5 = theControlP5;
_myWidth = theWidth;
_myHeight = theHeight;
_myText = theValue;
_myColor = theColor;
setLabeltype( new SinglelineLabel( ) );
setFont( cp5.controlFont );
setLabeltype( new SinglelineLabel( ) );
set( _myText );
_myControllerStyle = new ControllerStyle( );
}
Label setLabeltype( Labeltype theType ) {
_myLabeltype = theType;
return this;
}
Labeltype getLabeltype( ) {
return _myLabeltype;
}
public Label align( int[] a ) {
alignX = a[ 0 ];
alignY = a[ 1 ];
return this;
}
public Label align( int theX , int theY ) {
alignX = theX;
alignY = theY;
return this;
}
public Label alignX( int theX ) {
alignX = theX;
return this;
}
public Label alignY( int theY ) {
alignY = theY;
return this;
}
public int[] getAlign( ) {
return new int[] { alignX , alignY };
}
public Label setPadding( int thePaddingX , int thePaddingY ) {
_myPaddingX = thePaddingX;
_myPaddingY = thePaddingY;
return this;
}
public Label setPaddingX( int thePaddingX ) {
_myPaddingX = thePaddingX;
return this;
}
public Label setPaddingY( int thePaddingY ) {
_myPaddingY = thePaddingY;
return this;
}
public void draw( PGraphics theGraphics , int theX , int theY , ControllerInterface< ? > theController ) {
if ( isVisible ) {
getLabeltype( ).draw( this , theGraphics , theX , theY , theController );
}
}
public void draw( PGraphics theGraphics , int theX , int theY , int theW , int theH ) {
if ( isVisible ) {
getLabeltype( ).draw( this , theGraphics , theX , theY , theW , theH );
}
}
@Override public void draw( PGraphics theGraphics ) {
if ( isVisible ) {
_myFontLabel.adjust( theGraphics , this );
draw( theGraphics , 0 , 0 );
}
}
public void draw( PGraphics theGraphics , int theX , int theY ) {
if ( isVisible ) {
theGraphics.pushMatrix( );
theGraphics.translate( _myControllerStyle.marginLeft , _myControllerStyle.marginTop );
theGraphics.translate( theX , theY );
if ( isColorBackground ) {
float ww = getStyle( ).paddingRight + getStyle( ).paddingLeft;
if ( getStyle( ).backgroundWidth > -1 ) {
ww += _myControllerStyle.backgroundWidth;
} else {
ww += _myFontLabel.getWidth( );
}
float hh = getStyle( ).paddingBottom + getStyle( ).paddingTop;
if ( getStyle( ).backgroundHeight > -1 ) {
hh += getStyle( ).backgroundHeight;
} else {
hh += _myFontLabel.getHeight( );
}
theGraphics.fill( _myColorBackground );
theGraphics.rect( 0 , 1 , ww , hh );
}
theGraphics.translate( _myControllerStyle.paddingLeft , _myControllerStyle.paddingTop );
_myFontLabel.draw( theGraphics , this );
theGraphics.popMatrix( );
}
}
public Label hide( ) {
return setVisible( false );
}
public Label show( ) {
return setVisible( true );
}
public Label setVisible( boolean theValue ) {
isVisible = theValue;
return this;
}
public Label updateFont( ControlFont theFont ) {
return setFont( theFont );
}
public Label set( String theValue ) {
return setText( theValue );
}
public Label setText( String theValue ) {
_myText = theValue;
setChanged( true );
return this;
}
public Label setFixedSize( boolean theValue ) {
isFixedSize = theValue;
return this;
}
public boolean isFixedSize( ) {
return isMultiline ? false : isFixedSize;
}
public String getText( ) {
return _myText;
}
public String getTextFormatted( ) {
return getLabeltype( ).getTextFormatted( );
}
public ControllerStyle getStyle( ) {
return _myControllerStyle;
}
public Label setWidth( int theWidth ) {
_myWidth = theWidth;
setChanged( true );
return this;
}
public Label setHeight( int theHeight ) {
_myHeight = theHeight;
setChanged( true );
return this;
}
public int getWidth( ) {
return _myLabeltype.getWidth( );
}
public int getHeight( ) {
return _myLabeltype.getHeight( );
}
public int getOverflow( ) {
return getLabeltype( ).getOverflow( );
}
public Label setMultiline( boolean theValue ) {
isMultiline = theValue;
_myLabeltype = ( isMultiline ) ? new MultilineLabel( ) : new SinglelineLabel( );
return this;
}
public Label toUpperCase( boolean theValue ) {
isToUpperCase = theValue;
setChanged( true );
return this;
}
public ControlFont getFont( ) {
return _myFontLabel;
}
public Label setFont( int theBitFontIndex ) {
ControlP5.logger.warning( "BitFont is now of type PFont, use setFont(PFont) instead." );
return this;
}
public Label setFont( PFont thePFont ) {
return setFont( new ControlFont( thePFont ) );
}
public Label setFont( ControlFont theFont ) {
setLineHeight( theFont.getSize( ) );
_myFontLabel = new ControlFont( theFont.getFont( ) , theFont.getSize( ) );
_myFontLabel.init( this );
setChanged( true );
return this;
}
public Label setSize( int theSize ) {
_myFontLabel.setSize( theSize );
return this;
}
protected boolean isChanged( ) {
return changed;
}
protected Label setChanged( boolean theValue ) {
changed = theValue;
return this;
}
Label setTextHeight( int theHeight ) {
_myTextHeight = theHeight;
return this;
}
public int getTextHeight( ) {
return _myFontLabel.getTextHeight( );
}
public int getLineHeight( ) {
return _myLineHeight;
}
public Label setOffsetY( int theValue ) {
return this;
}
public Label setOffsetYratio( float theValue ) {
offsetYratio = theValue;
setChanged( true );
return this;
}
public float getOffsetYratio( ) {
return offsetYratio;
}
public Label setLineHeight( int theValue ) {
_myLineHeight = theValue;
setChanged( true );
return this;
}
public Label setColor( int theValue , boolean theFlag ) {
setColor( theValue );
setFixedSize( theFlag );
return this;
}
public Label setColor( int theColor ) {
_myColor = theColor;
setChanged( true );
return this;
}
public int getColor( ) {
return _myColor;
}
public Label setColorBackground( int theColor ) {
enableColorBackground( );
_myColorBackground = theColor;
return this;
}
public Label disableColorBackground( ) {
isColorBackground = false;
return this;
}
public Label enableColorBackground( ) {
isColorBackground = true;
return this;
}
public int getLetterSpacing( ) {
return _myLetterSpacing;
}
public Label setLetterSpacing( int theValue ) {
_myLetterSpacing = theValue;
setChanged( true );
return this;
}
public boolean isMultiline( ) {
return isMultiline;
}
public boolean isVisible( ) {
return isVisible;
}
public boolean isToUpperCase( ) {
return isToUpperCase;
}
protected Label copy( ) {
return new Label( this );
}
public static void setUpperCaseDefault( boolean theValue ) {
isToUpperCaseDefault = theValue;
}
interface Labeltype {
public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , ControllerInterface< ? > theController );
public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , int theW , int theH );
public int getWidth( );
public int getHeight( );
public int getOverflow( );
public String getTextFormatted( );
}
class SinglelineTextfield extends SinglelineLabel {
public String getTextFormatted( ) {
return _myText;
}
}
class SinglelineLabel implements Labeltype {
private void align( PGraphics theGraphics , int theAlignX , int theAlignY , int theW , int theH ) {
int x = 0;
int y = 0;
switch ( theAlignX ) {
case ( ControlP5.CENTER ):
x = ( theW - _myFontLabel.getWidth( ) ) / 2;
break;
case ( ControlP5.LEFT ):
x = _myPaddingX;
break;
case ( ControlP5.RIGHT ):
x = theW - _myFontLabel.getWidth( ) - _myPaddingX;
break;
case ( ControlP5.LEFT_OUTSIDE ):
x = -_myFontLabel.getWidth( ) - _myPaddingX;
break;
case ( ControlP5.RIGHT_OUTSIDE ):
x = theW + _myPaddingX;
break;
}
switch ( theAlignY ) {
case ( ControlP5.CENTER ):
y = theH / 2 + _myFontLabel.getTop( ) - _myFontLabel.getCenter( );
break;
case ( ControlP5.TOP ):
y = 0;
break;
case ( ControlP5.BOTTOM ):
y = theH - _myFontLabel.getHeight( ) - 1;
break;
case ( ControlP5.BASELINE ):
y = theH + _myFontLabel.getTop( ) - 1;
break;
case ( ControlP5.BOTTOM_OUTSIDE ):
y = theH + _myPaddingY;
break;
case ( ControlP5.TOP_OUTSIDE ):
y = -_myFontLabel.getHeight( ) - _myPaddingY;
break;
}
theGraphics.translate( x , y );
}
@Override public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , int theW , int theH ) {
_myFontLabel.adjust( theGraphics , theLabel );
theGraphics.pushMatrix( );
align( theGraphics , alignX , alignY , theW , theH );
theLabel.draw( theGraphics , theX , theY );
theGraphics.popMatrix( );
}
@Override public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , ControllerInterface< ? > theController ) {
draw( theLabel , theGraphics , theX , theY , theController.getWidth( ) , theController.getHeight( ) );
}
@Override public int getWidth( ) {
return isFixedSize ? _myWidth : _myFontLabel.getWidth( );
}
@Override public int getHeight( ) {
return _myFontLabel.getHeight( );
}
@Override public int getOverflow( ) {
return -1;
}
@Override public String getTextFormatted( ) {
return ( isToUpperCase ? _myText.toUpperCase( ) : _myText );
}
}
class MultilineLabel implements Labeltype {
@Override public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , int theW , int theH ) {
_myFontLabel.adjust( theGraphics , theLabel );
theLabel.draw( theGraphics , theX , theY );
}
@Override public void draw( Label theLabel , PGraphics theGraphics , int theX , int theY , ControllerInterface< ? > theController ) {
_myFontLabel.adjust( theGraphics , theLabel );
theLabel.draw( theGraphics , theX , theY );
}
@Override public int getWidth( ) {
return _myWidth;
}
@Override public int getHeight( ) {
return _myHeight;
}
@Override public int getOverflow( ) {
return _myFontLabel.getOverflow( );
}
@Override public String getTextFormatted( ) {
return ( isToUpperCase ? _myText.toUpperCase( ) : _myText );
}
}
}