package fr.lteconsulting.hexa.client.ui.colorpicker;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.user.client.ui.Widget;
public class ColorPicker extends Widget implements HasSelectionHandlers<String>
{
private static Bundle bundle = GWT.create( Bundle.class );
interface Bundle extends ClientBundle
{
@Source( "ColorPicker.css" )
Css css();
}
interface Css extends CssResource
{
String colorZone();
}
public ColorPicker()
{
bundle.css().ensureInjected();
setElement( Document.get().createDivElement() );
getElement().getStyle().setWidth( 180, Unit.PX );
Element emptyColor = addDivForColor( "" );
emptyColor.getStyle().setBorderColor( "black" );
emptyColor.getStyle().setBorderWidth( 1, Unit.PX );
for( String color : Colors.colors )
addDivForColor( color );
addDomHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
String color = findColor( Element.as( event.getNativeEvent().getEventTarget() ) );
if( color != null )
SelectionEvent.fire( ColorPicker.this, color );
}
}, ClickEvent.getType() );
}
private Element addDivForColor( String color )
{
Element div = Document.get().createDivElement();
div.getStyle().setBackgroundColor( color );
div.addClassName( bundle.css().colorZone() );
div.setAttribute( "value", color );
getElement().appendChild( div );
return div;
}
private String findColor( Element element )
{
if( element == null )
return null;
if( element == getElement() )
return null;
String color = element.getAttribute( "value" );
if( color != null )
return color;
return findColor( element.getParentElement() );
}
@Override
public HandlerRegistration addSelectionHandler( SelectionHandler<String> handler )
{
return addHandler( handler, SelectionEvent.getType() );
}
}