package pl.net.bluesoft.rnd.processtool.ui.generic;
import com.vaadin.Application;
import com.vaadin.ui.*;
import org.aperteworkflow.ui.view.GenericPortletViewRenderer;
import org.aperteworkflow.ui.view.RenderParams;
import org.aperteworkflow.ui.view.ViewRegistry;
import org.aperteworkflow.util.vaadin.GenericVaadinPortlet2BpmApplication;
import org.aperteworkflow.util.vaadin.TransactionProvider;
import org.aperteworkflow.util.vaadin.VaadinUtility;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolGuiCallback;
import pl.net.bluesoft.rnd.util.i18n.I18NSource;
import pl.net.bluesoft.util.lang.cquery.func.F;
import java.util.ArrayList;
import java.util.List;
import static org.aperteworkflow.util.vaadin.VaadinExceptionHandler.Util.withErrorHandling;
import static org.aperteworkflow.util.vaadin.VaadinUtility.horizontalLayout;
import static org.aperteworkflow.util.vaadin.VaadinUtility.refreshIcon;
import static pl.net.bluesoft.rnd.processtool.ProcessToolContext.Util.getThreadProcessToolContext;
import static pl.net.bluesoft.util.lang.cquery.CQuery.from;
/**
* User: POlszewski
* Date: 2012-07-19
* Time: 10:27
*/
public abstract class GenericPortletPanel extends VerticalLayout {
protected Application application;
protected I18NSource i18NSource;
protected ProcessToolBpmSession bpmSession;
protected TransactionProvider transactionProvider;
protected String portletKey;
public GenericPortletPanel(Application application, I18NSource i18NSource, ProcessToolBpmSession bpmSession,
TransactionProvider transactionProvider, String portletKey) {
this.application = application;
this.i18NSource = i18NSource;
this.bpmSession = bpmSession;
this.transactionProvider = transactionProvider;
this.portletKey = portletKey;
}
protected void buildView() {
List<GenericPortletViewRenderer> permittedRenderers = getPermittedRenderers();
if (permittedRenderers.size() > 1) {
addComponent(renderTabSheet(permittedRenderers));
}
else {
addComponent(renderVerticalLayout(permittedRenderers));
}
}
protected Component renderVerticalLayout(List<GenericPortletViewRenderer> permittedRenderers) {
VerticalLayout layout = new VerticalLayout();
layout.setSpacing(true);
layout.setWidth("100%");
for (GenericPortletViewRenderer renderer : permittedRenderers) {
RenderParams params = createParams();
Object gui = renderer.render(params);
if (gui instanceof Component) {
layout.addComponent(addControls((Component)gui, renderer));
}
}
return layout;
}
protected Component renderTabSheet(List<GenericPortletViewRenderer> permittedRenderers) {
TabSheet tabSheet = new TabSheet();
tabSheet.setWidth("100%");
for (GenericPortletViewRenderer renderer : permittedRenderers) {
RenderParams params = createParams();
Object gui = renderer.render(params);
if (gui instanceof Component) {
tabSheet.addTab(addControls((Component)gui, renderer), renderer.getName(i18NSource));
}
}
return tabSheet;
}
private RenderParams createParams() {
RenderParams params = new RenderParams() {
@Override
public void withTransaction(final TransactionCallback callback) {
transactionProvider.withTransaction(new ProcessToolGuiCallback() {
@Override
public void callback(ProcessToolContext ctx, ProcessToolBpmSession session) {
callback.invoke(ctx, session);
}
});
}
};
params.setContext(ProcessToolContext.Util.getThreadProcessToolContext());
params.setBpmSession(bpmSession);
params.setI18NSource(i18NSource);
params.setApplication(application);
return params;
}
private Component addControls(Component gui, GenericPortletViewRenderer renderer) {
Label titleLabel = new Label(renderer.getName(i18NSource));
titleLabel.addStyleName("h1 color processtool-title");
titleLabel.setWidth("100%");
HorizontalLayout headerLayout = new HorizontalLayout();
headerLayout.setWidth("100%");
headerLayout.setSpacing(true);
VerticalLayout layout = new VerticalLayout();
layout.setWidth("100%");
layout.setSpacing(true);
layout.addComponent(horizontalLayout(titleLabel,
gui instanceof VaadinUtility.Refreshable
? getRefreshButton((VaadinUtility.Refreshable)gui)
: new Label()));
layout.addComponent(headerLayout);
layout.addComponent(gui);
return layout;
}
private Component getRefreshButton(VaadinUtility.Refreshable refreshable) {
Button button = refreshIcon(application, refreshable);
return button;
}
protected List<GenericPortletViewRenderer> getPermittedRenderers() {
ViewRegistry viewRegistry = getThreadProcessToolContext().getRegistry().getRegisteredService(ViewRegistry.class);
List<GenericPortletViewRenderer> permittedViews = new ArrayList<GenericPortletViewRenderer>();
for (GenericPortletViewRenderer renderer : viewRegistry.getGenericPortletViews(portletKey)) {
if (isPermitted(renderer)) {
permittedViews.add(renderer);
}
}
permittedViews = arrangeViews(permittedViews);
return permittedViews;
}
protected List<GenericPortletViewRenderer> arrangeViews(List<GenericPortletViewRenderer> permittedViews) {
return from(permittedViews).orderBy(new F<GenericPortletViewRenderer, Comparable>() {
@Override
public Comparable invoke(GenericPortletViewRenderer x) {
return x.getPosition();
}
}).toList();
}
protected boolean isPermitted(GenericPortletViewRenderer renderer) {
return hasRoles(renderer.getRequiredRoles());
}
protected boolean hasRoles(String[] requiredRoles) {
if (requiredRoles != null) {
for (String role : requiredRoles) {
if (!((GenericVaadinPortlet2BpmApplication)application).hasMatchingRole(role)) {
return false;
}
}
}
return true;
}
}