package fr.lteconsulting.hexa.client.ui.containers;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import fr.lteconsulting.hexa.client.interfaces.IBkgndStackPanel;
import fr.lteconsulting.hexa.client.interfaces.IStackPanel;
import fr.lteconsulting.hexa.client.interfaces.IStackPanelRow;
public class LayeredAbsoluteStackPanel extends ResizeComposite implements MouseWheelHandler, MouseMoveHandler, KeyUpHandler
{
private IBkgndStackPanel.Callback m_callback = null;
private Object m_cookie = null;
private FocusLayoutPanel m_focusPanel = new FocusLayoutPanel();
private AbsolutePanel m_canvas = new AbsolutePanel();
private AbsolutePanel m_backgroundCanvas = new AbsolutePanel();
private FlowPanel m_stacksPanel = new FlowPanel();
private AbsoluteStackPanel m_stackPanel = new AbsoluteStackPanel();
int spaceHeight = 50;
private ScrollPanel m_scroll = new ScrollPanel();
public LayeredAbsoluteStackPanel()
{
m_stacksPanel.add( m_stackPanel );
m_stacksPanel.setWidth( "100%" );
m_scroll.setWidget( m_stacksPanel );
m_scroll.setSize( "100%", "100%" );
m_backgroundCanvas.setSize( "100%", "100%" );
m_canvas.add( m_backgroundCanvas, 0, 0 );
m_canvas.add( m_scroll, 0, spaceHeight );
m_canvas.setSize( "100%", "100%" );
m_focusPanel.add( m_canvas );
m_focusPanel.addMouseWheelHandler( this );
m_focusPanel.addMouseMoveHandler( this );
m_focusPanel.addKeyUpHandler( this );
m_focusPanel.addStyleName( "AroundPanel" );
m_focusPanel.setSize( "100%", "100%" );
initWidget( m_focusPanel );
}
static class FocusLayoutPanel extends FocusPanel implements RequiresResize
{
@Override
public void onResize()
{
Widget child = getWidget();
if( child instanceof RequiresResize )
((RequiresResize) child).onResize();
}
}
public void setCallback( IBkgndStackPanel.Callback callback, Object cookie )
{
m_callback = callback;
m_cookie = cookie;
}
@Override
public void onResize()
{
super.onResize();
}
public void clearBackground()
{
m_backgroundCanvas.clear();
}
IBkgndStackPanel.Background bgProxy = new IBkgndStackPanel.Background()
{
@Override
public void setWidgetPosition( Widget w, int x, int y )
{
m_backgroundCanvas.setWidgetPosition( w, x, y );
}
@Override
public void removeItem( Widget w )
{
m_backgroundCanvas.remove( w );
}
@Override
public void clearAll()
{
m_backgroundCanvas.clear();
}
@Override
public void add( Widget w, int x, int y )
{
m_backgroundCanvas.add( w, x, y );
}
@Override
public void add( Widget w )
{
m_backgroundCanvas.add( w );
}
};
public IBkgndStackPanel.Background getBackgroundCanvas()
{
return bgProxy;
}
public IStackPanel getStackPanel()
{
return m_stackPanel;
}
public interface IStackPanelSized extends IStackPanel
{
void setHeight( int height );
}
public IStackPanelSized createSizedPanel( int height )
{
final AbsoluteStackPanel panel = new AbsoluteStackPanel();
final ScrollPanel scroll = new ScrollPanel( panel );
scroll.setWidth( "100%" );
panel.setWidth( "100%" );
scroll.setHeight( height + "px" );
m_stacksPanel.add( scroll );
return new IStackPanelSized()
{
@Override
public void clear()
{
panel.clear();
}
@Override
public IStackPanelRow addRow()
{
return panel.addRow();
}
@Override
public void setHeight( int height )
{
scroll.setHeight( height + "px" );
}
};
}
public IStackPanel createPanel()
{
AbsoluteStackPanel panel = new AbsoluteStackPanel();
panel.setWidth( "100%" );
m_stacksPanel.add( panel );
return panel;
}
@Override
public void onMouseWheel( MouseWheelEvent event )
{
if( m_callback == null )
return;
event.preventDefault();
int x = event.getRelativeX( m_canvas.getElement() );
int delta = event.getDeltaY();
if( delta > 0 )
delta = 1;
else if( delta < 0 )
delta = -1;
m_callback.onMouseWheel( m_cookie, event, x, delta );
}
@Override
public void onMouseMove( MouseMoveEvent event )
{
if( m_callback == null )
return;
event.preventDefault();
int x = event.getRelativeX( m_canvas.getElement() );
m_callback.onMouseMove( m_cookie, x );
}
@Override
public void onKeyUp( KeyUpEvent event )
{
if( m_callback == null )
return;
event.preventDefault();
m_callback.onKeyUp( m_cookie, event );
}
}