package fr.lteconsulting.mvp.client;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.Widget;
public class WorkPanelController implements IsWidget
{
private final LayoutPanel panel = new LayoutPanel();
private final List<WPInfo> panels = new ArrayList<>();
public WorkPanelController()
{
}
@Override
public Widget asWidget()
{
return panel;
}
public void startWorkPanel( IWorkPanel workPanel, XWPExec callback, WPDisplayMode mode )
{
WPInfo info = new WPInfo( workPanel, callback, mode );
panels.add( info );
info.startPanel();
}
private class WPInfo implements IWPContext
{
final IWorkPanel workPanel;
final XWPExec callback;
WPDisplayMode mode;
IsWidget view;
WPInfo( IWorkPanel workPanel, XWPExec callback, WPDisplayMode mode )
{
this.workPanel = workPanel;
this.callback = callback;
this.mode = mode;
}
void startPanel()
{
workPanel.start( this );
}
@Override
public void display( IsWidget view )
{
removeView();
setView( view );
}
@Override
public void setDisplayMode( WPDisplayMode mode )
{
this.mode = mode;
updateViewMode();
}
@Override
public void exit()
{
removeView();
panels.remove( this );
if( callback != null )
callback.onCancel();
}
@Override
public void exit( Throwable throwable )
{
removeView();
panels.remove( this );
if( callback != null )
callback.onError( throwable );
}
@Override
public void exit( Object result )
{
removeView();
panels.remove( this );
if( callback != null )
callback.onResult( result );
}
private void setView( IsWidget view )
{
if( view == null )
return;
this.view = view;
panel.add( view );
updateViewMode();
}
private void updateViewMode()
{
if( view == null )
return;
switch( mode )
{
case FULL:
panel.setWidgetTopBottom( view, 0, Unit.PX, 0, Unit.PX );
panel.setWidgetLeftRight( view, 0, Unit.PX, 0, Unit.PX );
break;
case DIALOG:
panel.setWidgetTopBottom( view, 25, Unit.PCT, 25, Unit.PCT );
panel.setWidgetLeftRight( view, 25, Unit.PCT, 25, Unit.PCT );
break;
}
}
private void removeView()
{
if( view != null )
panel.remove( view );
view = null;
}
}
}