package fr.lteconsulting.hexa.client.ui.widget;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.BorderStyle;
import com.google.gwt.dom.client.Style.FontStyle;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.TextArea;
public class GrowingTextArea extends TextArea implements KeyDownHandler, KeyUpHandler
{
Element fakeDiv = null;
public GrowingTextArea()
{
addKeyDownHandler( this );
addKeyUpHandler( this );
applyStyle( getElement() );
}
void applyStyle( Element element )
{
element.getStyle().setPadding( 5, Unit.PX );
element.getStyle().setBorderColor( "black" );
element.getStyle().setBorderStyle( BorderStyle.SOLID );
element.getStyle().setBorderWidth( 1, Unit.PX );
element.getStyle().setProperty( "fontFamily", "Arial Unicode MS,Arial,sans-serif" );
element.getStyle().setFontSize( 12, Unit.PT );
element.getStyle().setFontStyle( FontStyle.NORMAL );
element.getStyle().setFontWeight( FontWeight.NORMAL );
}
void resize()
{
if( fakeDiv == null )
{
fakeDiv = DOM.createDiv();
fakeDiv.getStyle().setPosition( Position.FIXED );
fakeDiv.getStyle().setLeft( -10000, Unit.PX );
getElement().getParentElement().insertAfter( fakeDiv, getElement() );
applyStyle( fakeDiv );
}
int width = getElement().getAbsoluteRight() - getElement().getAbsoluteLeft();
fakeDiv.getStyle().setWidth( width - 10 - 2, Unit.PX );
fakeDiv.setInnerText( getText() );
int height = getElement().getClientHeight();
int newHeight = fakeDiv.getClientHeight() + 25;
if( height < newHeight )
getElement().getStyle().setHeight( newHeight, Unit.PX );
}
@Override
public void onKeyUp( KeyUpEvent event )
{
resize();
}
@Override
public void onKeyDown( KeyDownEvent event )
{
resize();
}
}