/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.explorer.ui.content; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.task.Attachment; import org.activiti.explorer.ExplorerApp; import org.activiti.explorer.I18nManager; import org.activiti.explorer.Messages; import org.activiti.explorer.ui.custom.PopupWindow; import org.activiti.explorer.ui.event.SubmitEvent; import org.activiti.explorer.ui.mainlayout.ExplorerLayout; import com.vaadin.data.Item; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.terminal.Resource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Embedded; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import com.vaadin.ui.Table.CellStyleGenerator; import com.vaadin.ui.themes.Reindeer; /** * @author Frederik Heremans */ public class CreateAttachmentPopupWindow extends PopupWindow { private static final long serialVersionUID = 1L; protected String taskId; protected String processInstanceId; protected I18nManager i18nManager; protected AttachmentRendererManager attachmentRendererManager; protected TaskService taskService; protected HorizontalLayout layout; protected GridLayout detailLayout; protected AttachmentEditorComponent currentEditor; protected Table attachmentTypes; protected Button okButton; public CreateAttachmentPopupWindow() { this.i18nManager = ExplorerApp.get().getI18nManager(); this.attachmentRendererManager = ExplorerApp.get().getAttachmentRendererManager(); this.taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); setCaption(i18nManager.getMessage(Messages.RELATED_CONTENT_ADD)); setWidth(700, UNITS_PIXELS); setHeight(430, UNITS_PIXELS); center(); setModal(true); addStyleName(Reindeer.WINDOW_LIGHT); layout = new HorizontalLayout(); layout.setSpacing(false); layout.setMargin(true); layout.setSizeFull(); setContent(layout); initTable(); detailLayout = new GridLayout(1,2); detailLayout.setSizeFull(); detailLayout.setMargin(true); detailLayout.setSpacing(true); detailLayout.addStyleName(ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_DETAIL); layout.addComponent(detailLayout); layout.setExpandRatio(detailLayout, 1.0f); detailLayout.setRowExpandRatio(0, 1.0f); detailLayout.setColumnExpandRatio(0, 1.0f); initActions(); } @Override public void attach() { super.attach(); if (attachmentTypes.size() > 0) { attachmentTypes.select(attachmentTypes.firstItemId()); } } protected void initActions() { okButton = new Button(i18nManager.getMessage(Messages.RELATED_CONTENT_CREATE)); detailLayout.addComponent(okButton, 0, 1); okButton.setEnabled(false); okButton.addListener(new ClickListener() { private static final long serialVersionUID = 1L; public void buttonClick(ClickEvent event) { saveAttachment(); } }); detailLayout.setComponentAlignment(okButton, Alignment.BOTTOM_RIGHT); } protected void initTable() { attachmentTypes = new Table(); attachmentTypes.setSizeUndefined(); attachmentTypes.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN); attachmentTypes.setSelectable(true); attachmentTypes.setImmediate(true); attachmentTypes.setNullSelectionAllowed(false); attachmentTypes.setWidth(200, UNITS_PIXELS); attachmentTypes.setHeight(100, UNITS_PERCENTAGE); attachmentTypes.setCellStyleGenerator(new CellStyleGenerator() { private static final long serialVersionUID = 1L; public String getStyle(Object itemId, Object propertyId) { if("name".equals(propertyId)) { return ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_LIST_LAST_COLUMN; } return null; } }); attachmentTypes.addStyleName(ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_LIST); attachmentTypes.addContainerProperty("type", Embedded.class, null); attachmentTypes.setColumnWidth("type", 16); attachmentTypes.addContainerProperty("name", String.class, null); // Add all possible attachment types for (AttachmentEditor editor : attachmentRendererManager.getAttachmentEditors()) { String name = editor.getTitle(i18nManager); Embedded image = null; Resource resource = editor.getImage(); if (resource != null) { image = new Embedded(null, resource); } Item item = attachmentTypes.addItem(editor.getName()); item.getItemProperty("type").setValue(image); item.getItemProperty("name").setValue(name); } // Add listener to show editor component attachmentTypes.addListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; public void valueChange(ValueChangeEvent event) { String type = (String) event.getProperty().getValue(); selectType(type); } }); layout.addComponent(attachmentTypes); } protected void selectType(String type) { if (type != null) { setCurrentEditor(attachmentRendererManager.getEditor(type)); } else { setCurrentEditor(null); } } protected void setCurrentEditor(AttachmentEditor editor) { AttachmentEditorComponent component = editor.getEditor(null, taskId, processInstanceId); this.currentEditor = component; detailLayout.removeComponent(detailLayout.getComponent(0, 0)); if (currentEditor != null) { currentEditor.setSizeFull(); detailLayout.addComponent(currentEditor, 0, 0); okButton.setEnabled(true); } else { okButton.setEnabled(false); } } protected void saveAttachment() { try { // Creation and persistence of attachment is done in editor Attachment attachment = currentEditor.getAttachment(); fireEvent(new SubmitEvent(this, SubmitEvent.SUBMITTED, attachment)); // Finally, close window close(); } catch (InvalidValueException ive) { // Validation error, Editor UI will handle this. } } public void setTaskId(String taskId) { this.taskId = taskId; } public void setProcessInstanceId(String processInstanceId) { this.processInstanceId = processInstanceId; } }