2014-07-22 08:12:30 +02:00
|
|
|
package controlP5;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* controlP5 is a processing gui library.
|
|
|
|
*
|
2016-04-14 12:39:16 +02:00
|
|
|
* 2006-2015 by Andreas Schlegel
|
2014-07-22 08:12:30 +02:00
|
|
|
*
|
|
|
|
* 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 java.util.Arrays;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import processing.core.PApplet;
|
|
|
|
import processing.core.PFont;
|
|
|
|
import processing.core.PGraphics;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* a textarea can be used to leave notes, it uses the controlP5 BitFont to render text. Scrollbars
|
|
|
|
* will automatically be added when text extends the visible area. Textarea extends ControllerGroup,
|
|
|
|
* for more methods available see the ControllerGroup documentation.
|
|
|
|
*
|
|
|
|
* @example controllers/ControlP5textarea
|
|
|
|
*/
|
|
|
|
public class Textarea extends ControllerGroup< Textarea > implements ControlListener {
|
|
|
|
|
|
|
|
protected String _myText;
|
|
|
|
protected Slider _myScrollbar;
|
|
|
|
protected int _myColorBackground = 0x000000;
|
|
|
|
protected boolean isColorBackground = false;
|
|
|
|
protected float _myScrollValue = 0;
|
|
|
|
protected boolean isScrollbarVisible = true;
|
|
|
|
protected int _myBottomOffset = 4;
|
|
|
|
private int _myScrollbarWidth = 5;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convenience constructor to extend Textarea.
|
|
|
|
*
|
|
|
|
* @example use/ControlP5extendController
|
|
|
|
* @param theControlP5
|
|
|
|
* @param theName
|
|
|
|
*/
|
|
|
|
public Textarea( ControlP5 theControlP5 , String theName ) {
|
|
|
|
this( theControlP5 , theControlP5.getDefaultTab( ) , theName , "" , 0 , 0 , 199 , 99 );
|
|
|
|
theControlP5.register( theControlP5.papplet , theName , this );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param theControlP5
|
|
|
|
* ControlP5
|
|
|
|
* @param theGroup
|
|
|
|
* ControllerGroup
|
|
|
|
* @param theName
|
|
|
|
* String
|
|
|
|
* @param theText
|
|
|
|
* String
|
|
|
|
* @param theX
|
|
|
|
* int
|
|
|
|
* @param theY
|
|
|
|
* int
|
|
|
|
* @param theW
|
|
|
|
* int
|
|
|
|
* @param theH
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
protected Textarea( ControlP5 theControlP5 , ControllerGroup< ? > theGroup , String theName , String theText , int theX , int theY , int theW , int theH ) {
|
|
|
|
super( theControlP5 , theGroup , theName , theX , theY );
|
|
|
|
_myWidth = theW;
|
|
|
|
_myHeight = theH;
|
|
|
|
_myText = theText;
|
|
|
|
setup( );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param theText
|
|
|
|
* String
|
|
|
|
* @param theX
|
|
|
|
* int
|
|
|
|
* @param theY
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
public Textarea( String theText , int theX , int theY ) {
|
|
|
|
super( theX , theY );
|
|
|
|
_myText = theText;
|
|
|
|
setup( );
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setup( ) {
|
|
|
|
_myValueLabel = new Label( cp5 , _myText );
|
|
|
|
|
|
|
|
_myValueLabel.setFont( cp5.controlFont == cp5.defaultFont ? cp5.defaultFontForText : cp5.controlFont );
|
|
|
|
|
|
|
|
_myValueLabel.setWidth( ( int ) _myWidth );
|
|
|
|
_myValueLabel.setHeight( ( int ) _myHeight );
|
|
|
|
_myValueLabel.setMultiline( true );
|
|
|
|
_myValueLabel.toUpperCase( false );
|
|
|
|
_myValueLabel.setColor( color.getValueLabel( ) );
|
|
|
|
|
|
|
|
_myScrollbar = new Slider( cp5 , _myParent , getName( ) + "Scroller" , 0 , 1 , 1 , _myWidth - 5 , 0 , 5 , _myHeight );
|
|
|
|
_myScrollbar.init( );
|
|
|
|
_myScrollbar.setBroadcast( false );
|
|
|
|
_myScrollbar.setSliderMode( Slider.FLEXIBLE );
|
|
|
|
_myScrollbar.isMoveable = false;
|
|
|
|
_myScrollbar.isLabelVisible = false;
|
|
|
|
_myScrollbar.setParent( this );
|
|
|
|
_myScrollbar.addListener( this );
|
|
|
|
add( _myScrollbar );
|
|
|
|
setWidth( _myWidth );
|
|
|
|
setHeight( _myHeight );
|
|
|
|
_myScrollbar.color.set( color );
|
|
|
|
_myScrollbar.setColorBackground( 0x00000000 );
|
|
|
|
_myScrollbar.setHandleSize( 40 );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param theEvent
|
|
|
|
* ControlEvent
|
|
|
|
*/
|
|
|
|
public void controlEvent( ControlEvent theEvent ) {
|
|
|
|
_myScrollValue = - ( 1 - theEvent.getValue( ) );
|
|
|
|
scroll( );
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea hideScrollbar( ) {
|
|
|
|
isScrollbarVisible = false;
|
|
|
|
_myScrollbar.hide( );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea showScrollbar( ) {
|
|
|
|
isScrollbarVisible = true;
|
|
|
|
boolean isScrollbar = _myHeight < ( _myValueLabel.getTextHeight( ) + _myValueLabel.getLineHeight( ) );
|
|
|
|
if ( isScrollbar ) {
|
|
|
|
_myScrollbar.show( );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isScrollable( ) {
|
|
|
|
return _myScrollbar.isVisible( );
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public Textarea setColorBackground( int theColor ) {
|
|
|
|
_myColorBackground = theColor;
|
|
|
|
isColorBackground = true;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea disableColorBackground( ) {
|
|
|
|
isColorBackground = false;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea enableColorBackground( ) {
|
|
|
|
isColorBackground = true;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* scroll the Textarea remotely. values must range from 0 to 1.
|
|
|
|
*
|
|
|
|
* @param theValue
|
|
|
|
*/
|
|
|
|
public Textarea scroll( float theValue ) {
|
|
|
|
_myScrollbar.setValue( 1 - theValue );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* private update method for the scrollbar.
|
|
|
|
*/
|
|
|
|
private void scroll( ) {
|
|
|
|
_myScrollValue = PApplet.min( PApplet.max( -1 , _myScrollValue ) , 0 );
|
|
|
|
|
|
|
|
float myLen = _myValueLabel.getTextHeight( ) + _myValueLabel.getLineHeight( );
|
|
|
|
float myOffset = 0;
|
|
|
|
boolean isScrollbar = _myHeight < myLen;
|
|
|
|
if ( isScrollbar ) {
|
|
|
|
myOffset = _myScrollValue * ( myLen - _myHeight + _myBottomOffset );
|
|
|
|
}
|
|
|
|
isScrollbar = ( isScrollbarVisible ) ? isScrollbar : false;
|
|
|
|
_myScrollbar.setVisible( isScrollbar );
|
|
|
|
_myValueLabel.setOffsetYratio( _myScrollValue );
|
|
|
|
}
|
|
|
|
|
|
|
|
@ControlP5.Invisible public void scrolled( int theStep ) {
|
|
|
|
if ( _myScrollbar.isVisible( ) ) {
|
|
|
|
int lines = ( _myValueLabel.getTextHeight( ) / _myValueLabel.getLineHeight( ) );
|
|
|
|
float step = 1.0f / lines;
|
|
|
|
scroll( ( 1 - getScrollPosition( ) ) + ( theStep * step ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ControlP5.Invisible public float getScrollPosition( ) {
|
|
|
|
return _myScrollbar.getValue( );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set the width of the textarea.
|
|
|
|
*
|
|
|
|
* @param theValue
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
@Override public Textarea setWidth( int theValue ) {
|
|
|
|
theValue = ( theValue < 10 ) ? 10 : theValue;
|
|
|
|
_myWidth = theValue;
|
|
|
|
_myValueLabel.setWidth( _myWidth - _myScrollbarWidth - 10 );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set the height of the textarea.
|
|
|
|
*
|
|
|
|
* @param theValue
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
@Override public Textarea setHeight( int theValue ) {
|
|
|
|
theValue = ( theValue < 10 ) ? 10 : theValue;
|
|
|
|
_myHeight = theValue;
|
|
|
|
_myValueLabel.setHeight( _myHeight - 2 );
|
|
|
|
_myScrollbar.setHeight( theValue );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea setSize( int theWidth , int theHeight ) {
|
|
|
|
setWidth( theWidth );
|
|
|
|
setHeight( theHeight );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set the lineheight of the textarea.
|
|
|
|
*
|
|
|
|
* @param theLineHeight
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
public Textarea setLineHeight( int theLineHeight ) {
|
|
|
|
_myValueLabel.setLineHeight( theLineHeight );
|
|
|
|
scroll( );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set the text color of the textarea.
|
|
|
|
*
|
|
|
|
* @param theColor
|
|
|
|
* int
|
|
|
|
*/
|
|
|
|
public Textarea setColor( int theColor ) {
|
|
|
|
_myValueLabel.setColor( theColor , true );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns the instance of the textarea's label.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public Label getValueLabel( ) {
|
|
|
|
return _myValueLabel;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set the text of the textarea.
|
|
|
|
*
|
|
|
|
* @param theText
|
|
|
|
* String
|
|
|
|
*/
|
|
|
|
public Textarea setText( String theText ) {
|
|
|
|
_myValueLabel.set( theText );
|
|
|
|
_myScrollValue = ( float ) ( _myHeight ) / ( float ) ( _myValueLabel.getTextHeight( ) );
|
|
|
|
_myScrollbar.setHeight( _myHeight + _myValueLabel.getStyle( ).paddingTop + _myValueLabel.getStyle( ).paddingBottom );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea clear( ) {
|
|
|
|
return setText( "" );
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea append( String theText ) {
|
|
|
|
return setText( getText( ) + theText );
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea append( String theText , int max ) {
|
|
|
|
String str = getText( ) + theText;
|
|
|
|
|
|
|
|
if ( max == -1 ) {
|
|
|
|
return setText( str );
|
|
|
|
}
|
|
|
|
|
|
|
|
List< String > strs = Arrays.asList( str.split( "\n" ) );
|
|
|
|
return setText( CP.join( strs.subList( Math.max( 0 , strs.size( ) - max ) , strs.size( ) ) , "\n" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns the text content of the textarea.
|
|
|
|
*
|
|
|
|
* @return String
|
|
|
|
*/
|
|
|
|
public String getText( ) {
|
|
|
|
return getStringValue( );
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override protected void preDraw( PGraphics theGraphics ) {
|
|
|
|
if ( isScrollbarVisible ) {
|
|
|
|
_myScrollbar.setVisible( _myValueLabel.getOverflow( ) > 1 );
|
|
|
|
}
|
|
|
|
if ( _myScrollbar.isVisible( ) || isColorBackground ) {
|
|
|
|
float x = _myWidth - _myScrollbarWidth + _myValueLabel.getStyle( ).paddingLeft + _myValueLabel.getStyle( ).paddingRight;
|
|
|
|
float y = y( _myScrollbar.getPosition( ) );
|
|
|
|
set( _myScrollbar.getPosition( ) , x , y );
|
|
|
|
if ( !isColorBackground ) {
|
|
|
|
theGraphics.noFill( );
|
|
|
|
} else {
|
|
|
|
int a = _myColorBackground >> 24 & 0xff;
|
|
|
|
theGraphics.fill( _myColorBackground , a > 0 ? a : 255 );
|
|
|
|
}
|
|
|
|
int ww = _myWidth + _myValueLabel.getStyle( ).paddingLeft + _myValueLabel.getStyle( ).paddingRight;
|
|
|
|
int hh = _myHeight + _myValueLabel.getStyle( ).paddingTop + _myValueLabel.getStyle( ).paddingBottom;
|
|
|
|
theGraphics.rect( 0 , 0 , ww , hh );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// !!! add padding to the box.
|
|
|
|
// padding and margin doesnt work nicely with textarea yet!
|
|
|
|
protected boolean inside( ) {
|
|
|
|
return ( cp5.getWindow( ).mouseX > x( position ) + x( _myParent.absolutePosition ) && cp5.getWindow( ).mouseX < x( position ) + x( _myParent.absolutePosition ) + _myWidth
|
|
|
|
&& cp5.getWindow( ).mouseY > y( position ) + y( _myParent.absolutePosition ) && cp5.getWindow( ).mouseY < y( position ) + y( _myParent.absolutePosition ) + _myHeight );
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getStringValue( ) {
|
|
|
|
return _myValueLabel.getText( );
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea setFont( ControlFont theFont ) {
|
|
|
|
getValueLabel( ).setFont( theFont );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea setFont( PFont thePFont ) {
|
|
|
|
getValueLabel( ).setFont( thePFont );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Textarea setFont( int theFontIndex ) {
|
|
|
|
getValueLabel( ).setFont( theFontIndex );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param theColor
|
|
|
|
* @return Textarea
|
|
|
|
*/
|
|
|
|
public Textarea setScrollBackground( int theColor ) {
|
|
|
|
_myScrollbar.setColorBackground( theColor );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param theColor
|
|
|
|
* @return Textarea
|
|
|
|
*/
|
|
|
|
public Textarea setScrollForeground( int theColor ) {
|
|
|
|
_myScrollbar.setColorForeground( theColor );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param theColor
|
|
|
|
* @return Textarea
|
|
|
|
*/
|
|
|
|
public Textarea setScrollActive( int theColor ) {
|
|
|
|
_myScrollbar.setColorActive( theColor );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param theColor
|
|
|
|
* @return Textarea
|
|
|
|
*/
|
|
|
|
public Textarea setBorderColor( int theColor ) {
|
|
|
|
color.setBackground( theColor );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override public float getValue( ) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Deprecated public float value( ) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Deprecated public String stringValue( ) {
|
|
|
|
return getStringValue( );
|
|
|
|
}
|
|
|
|
|
|
|
|
@Deprecated public Label valueLabel( ) {
|
|
|
|
return getValueLabel( );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @exclude
|
|
|
|
* @deprecated
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
@Deprecated public boolean isScrollbarVisible( ) {
|
|
|
|
return isScrollbarVisible;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @deprecated
|
|
|
|
* @exclude
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
@Deprecated public String text( ) {
|
|
|
|
return getText( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// @todo linebreaking algorithm.
|
|
|
|
// http://www.leverkruid.eu/GKPLinebreaking/index.html
|
|
|
|
// found at http://www.texone.org/?p=43
|
|
|
|
|