package pl.net.bluesoft.rnd.processtool.ui.queues; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.aperteworkflow.util.liferay.LiferayBridge; import org.vaadin.addon.customfield.CustomField; import pl.net.bluesoft.rnd.processtool.model.config.ProcessQueueRight; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import org.aperteworkflow.util.vaadin.GenericVaadinPortlet2BpmApplication; import pl.net.bluesoft.util.lang.Strings; import com.vaadin.data.Container; import com.vaadin.data.Property; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.terminal.Sizeable; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.DefaultFieldFactory; import com.vaadin.ui.Field; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Layout; import com.vaadin.ui.Select; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; public class RightsTable extends CustomField { private Table table = new Table(); private BeanItemContainer<ProcessQueueRight> dataSource = new BeanItemContainer<ProcessQueueRight>(ProcessQueueRight.class); private final I18NSource source; private GenericVaadinPortlet2BpmApplication application; private Window addWindow; private Window addNewWindow; public RightsTable(final I18NSource source, final GenericVaadinPortlet2BpmApplication application) { this.source = source; this.application = application; table.setContainerDataSource(dataSource); table.setTableFieldFactory(new DefaultFieldFactory() { @Override public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) { Field field; if ("roleName".equals(propertyId)) { field = new TextField(); field.setReadOnly(true); field.setWidth("80%"); } else if ("browseAllowed".equals(propertyId)) { field = new CheckBox(); field.setWidth("20%"); } else field = super.createField(container, itemId, propertyId, uiContext); return field; } }); table.setVisibleColumns(new Object[] {"roleName", "browseAllowed"}); table.setColumnHeaders(new String[] {source.getMessage("queues.add.form.rights.roleName"), source.getMessage("queues.add.form.rights.browseAllowed")}); table.setEditable(!isReadOnly()); table.setWidth(100, Sizeable.UNITS_PERCENTAGE); table.setHeight(100, Sizeable.UNITS_PIXELS); table.setSelectable(true); Button addButton = new Button(source.getMessage("queues.add.form.rights.add")); Button addNewButton = new Button(source.getMessage("queues.add.form.rights.addnew")); Button removeButton = new Button(source.getMessage("queues.add.form.rights.remove")); VerticalLayout vl = new VerticalLayout(); vl.setSpacing(true); vl.addComponent(table); HorizontalLayout hl = new HorizontalLayout(); hl.setSpacing(true); hl.addComponent(addButton); hl.addComponent(addNewButton); hl.addComponent(removeButton); vl.addComponent(hl); setCompositionRoot(vl); addButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { VerticalLayout pane = getRoleFinder(); pane.setWidth("400px"); addWindow = getWindow(source.getMessage("queues.add.form.rights.add.title"), pane); getApplication().getMainWindow().addWindow(addWindow); } }); addNewButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { VerticalLayout pane = getNewRoleFinder(); pane.setWidth("400px"); addNewWindow = getWindow(source.getMessage("queues.add.form.rights.add.title"), pane); getApplication().getMainWindow().addWindow(addNewWindow); } }); removeButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { Object o = table.getValue(); if (o == null) return; table.removeItem(o); } }); } @Override public Class<?> getType() { return ArrayList.class; } @Override public Object getValue() { ArrayList<ProcessQueueRight> beans = new ArrayList<ProcessQueueRight>(); for (Object itemId: dataSource.getItemIds()) beans.add(dataSource.getItem(itemId).getBean()); return beans; } @Override public void setPropertyDataSource(Property newDataSource) { Object value = newDataSource.getValue(); if (value instanceof Collection<?>) { @SuppressWarnings("unchecked") Collection<ProcessQueueRight> beans = (ArrayList<ProcessQueueRight>) value; dataSource.removeAllItems(); dataSource.addAll(beans); table.setPageLength(beans.size()); } else throw new ConversionException("Invalid type"); super.setPropertyDataSource(newDataSource); } private VerticalLayout getRoleFinder() { VerticalLayout vl = new VerticalLayout(); vl.setMargin(true); vl.setSpacing(true); List<String> roleNames = LiferayBridge.getRoleNames(application.getUser().getCompanyId()); BeanItemContainer<String> ds = new BeanItemContainer<String>(String.class); ds.addAll(roleNames); final Select select = new Select(source.getMessage("queues.add.form.rights.new.combo")); select.setContainerDataSource(ds); select.setItemCaptionPropertyId("name"); select.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY); select.setNullSelectionAllowed(false); select.setWidth(100, Sizeable.UNITS_PERCENTAGE); Button addButton = new Button(source.getMessage("queues.add.form.rights.new.add")); addButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { if (select.getValue() == null) { return; } String roleName = (String)select.getValue(); ProcessQueueRight bean = new ProcessQueueRight(); bean.setBrowseAllowed(true); bean.setRoleName(roleName); dataSource.addBean(bean); getApplication().getMainWindow().removeWindow(addWindow); } }); vl.addComponent(select); vl.addComponent(addButton); return vl; } private VerticalLayout getNewRoleFinder() { VerticalLayout vl = new VerticalLayout(); vl.setMargin(true); vl.setSpacing(true); final TextField role = new TextField(); role.setWidth(100, Sizeable.UNITS_PERCENTAGE); Button addButton = new Button(source.getMessage("queues.add.form.rights.new.add")); addButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { Object o = role.getValue(); if (o == null) return; String r = (String)o; if (!Strings.hasText(r)) return; ProcessQueueRight bean = new ProcessQueueRight(); bean.setBrowseAllowed(true); bean.setRoleName(r); dataSource.addBean(bean); getApplication().getMainWindow().removeWindow(addNewWindow); } }); vl.addComponent(role); vl.addComponent(addButton); return vl; } private Window getWindow(String caption, Layout lay) { Window window = new Window(caption, lay); window.setClosable(true); window.setModal(true); window.setSizeUndefined(); window.setResizable(false); return window; } }