package fr.lteconsulting.hexa.client.ui.containers;
import java.util.ArrayList;
import java.util.Iterator;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
import fr.lteconsulting.hexa.client.tools.HexaTools;
import fr.lteconsulting.hexa.client.tools.JQuery;
public class Accordion extends Panel
{
public Accordion()
{
Element main = DOM.createDiv();
main.setClassName( "Accordion" );
setElement( main );
}
ArrayList<Item> items = new ArrayList<Item>();
public Item addItem()
{
Item item = new Item();
items.add( item );
return item;
}
@Override
public void clear()
{
while( items.size() > 0 )
items.remove( 0 ).removeFromAccordion();
}
public class Item
{
boolean fExpanded = true;
Element itemHeader;
Element itemContentDecorator;
Element itemContentContainer;
Widget headerWidget = null;
Widget contentWidget = null;
public Item()
{
itemHeader = DOM.createDiv();
itemHeader.setClassName( "Accordion-ItemHeader" );
itemContentDecorator = DOM.createDiv();
itemContentDecorator.setClassName( "Accordion-ItemContentDecorator" );
itemContentContainer = DOM.createDiv();
itemContentContainer.setClassName( "Accordion-ItemContentContainer" );
itemContentDecorator.appendChild( itemContentContainer );
getElement().appendChild( itemHeader );
getElement().appendChild( itemContentDecorator );
}
public void removeFromAccordion()
{
setHeaderWidget( null );
setContentWidget( null );
itemContentDecorator.removeFromParent();
itemHeader.removeFromParent();
}
public void setExpanded( boolean fExpanded )
{
this.fExpanded = fExpanded;
String effect = "blind";
if( !fExpanded )
JQuery.get().jqHide( effect, itemContentDecorator, null );
else
{
// for( Item item: items )
// if( item != this )
// item.setExpanded( false );
JQuery.get().jqShow( effect, itemContentDecorator );
}
}
public boolean getExpanded()
{
return fExpanded;
}
public void setHeaderWidget( Widget widget )
{
if( widget != null )
widget.removeFromParent();
if( headerWidget != null )
{
try
{
orphan( headerWidget );
}
finally
{
itemHeader.removeChild( headerWidget.getElement() );
headerWidget = null;
}
}
headerWidget = widget;
if( widget != null )
{
DOM.appendChild( itemHeader, widget.getElement() );
adopt( widget );
}
}
public void setContentWidget( Widget widget )
{
if( widget != null )
widget.removeFromParent();
if( contentWidget != null )
{
try
{
orphan( contentWidget );
}
finally
{
itemContentContainer.removeChild( contentWidget.getElement() );
contentWidget = null;
}
}
contentWidget = widget;
if( widget != null )
{
DOM.appendChild( itemContentContainer, widget.getElement() );
adopt( widget );
}
}
}
@Override
public boolean remove( Widget child )
{
return false;
}
class ItWidgets implements Iterator<Widget>
{
ArrayList<Widget> wList = new ArrayList<Widget>();
int idx = 0;
public ItWidgets()
{
for( Item item : items )
{
if( item.headerWidget != null )
wList.add( item.headerWidget );
if( item.contentWidget != null )
wList.add( item.contentWidget );
}
}
@Override
public boolean hasNext()
{
return idx < wList.size();
}
@Override
public Widget next()
{
Widget w = wList.get( idx );
idx++;
return w;
}
@Override
public void remove()
{
HexaTools.alert( "Error !!! Remove not implemented in Accordion.java" );
}
}
@Override
public Iterator<Widget> iterator()
{
return new ItWidgets();
}
}