| /******************************************************************************* |
| * Copyright (c) 2010-2014 SAP AG and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.skalli.view.ext.impl.internal.forms; |
| |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.skalli.model.EntityBase; |
| import org.eclipse.skalli.model.Project; |
| import org.eclipse.skalli.model.PropertyName; |
| import org.eclipse.skalli.services.Services; |
| import org.eclipse.skalli.services.entity.EntityServices; |
| import org.eclipse.skalli.services.project.ProjectService; |
| import org.eclipse.skalli.services.template.NoSuchTemplateException; |
| import org.eclipse.skalli.services.template.ProjectTemplate; |
| import org.eclipse.skalli.services.template.ProjectTemplateService; |
| import org.eclipse.skalli.view.component.PhaseSelect; |
| import org.eclipse.skalli.view.ext.AbstractExtensionFormService; |
| import org.eclipse.skalli.view.ext.DefaultProjectFieldFactory; |
| import org.eclipse.skalli.view.ext.ProjectEditContext; |
| |
| import com.vaadin.data.Item; |
| import com.vaadin.data.Property.ValueChangeEvent; |
| import com.vaadin.data.Property.ValueChangeListener; |
| import com.vaadin.data.util.BeanItem; |
| import com.vaadin.data.util.IndexedContainer; |
| import com.vaadin.ui.AbstractSelect; |
| import com.vaadin.ui.AbstractSelect.Filtering; |
| import com.vaadin.ui.ComboBox; |
| import com.vaadin.ui.Field; |
| import com.vaadin.ui.FormFieldFactory; |
| import com.vaadin.ui.TextField; |
| |
| public class ProjectBasicsEditForm extends AbstractExtensionFormService<Project> { |
| |
| @Override |
| public String getIconPath() { |
| return DEFAULT_ICON; |
| } |
| |
| @Override |
| public float getRank() { |
| return 0.0f; //always first position |
| } |
| |
| @Override |
| protected String[] getVisibleItemProperties() { |
| return new String[] { |
| Project.PROPERTY_PROJECTID, |
| Project.PROPERTY_NAME, |
| Project.PROPERTY_SHORT_NAME, |
| Project.PROPERTY_DESCRIPTION_FORMAT, |
| Project.PROPERTY_DESCRIPTION, |
| Project.PROPERTY_TEMPLATEID, |
| Project.PROPERTY_PARENT_ENTITY, |
| Project.PROPERTY_PHASE |
| }; |
| } |
| |
| @Override |
| protected FormFieldFactory getFieldFactory(Project project, ProjectEditContext context) { |
| return new FieldFactory(project, context); |
| } |
| |
| @Override |
| protected Item getItemDataSource(Project project) { |
| return new BeanItem<Project>(project); |
| } |
| |
| private class FieldFactory extends DefaultProjectFieldFactory<Project> { |
| private static final long serialVersionUID = 8076143381081743513L; |
| private Project project; |
| |
| public FieldFactory(Project project, ProjectEditContext context) { |
| super(project, Project.class, context); |
| this.project = project; |
| } |
| |
| @Override |
| protected Field createField(Object propertyId, String caption) { |
| Field field = null; |
| if (Project.PROPERTY_TEMPLATEID.equals(propertyId)) { |
| field = new ComboBox(caption, new ProjectTemplateDataSource(project)); |
| } else if (Project.PROPERTY_PARENT_ENTITY.equals(propertyId)) { |
| field = new ComboBox(caption, new ProjectParentDataSource(project)); |
| } else if (Project.PROPERTY_PHASE.equals(propertyId)) { |
| field = new PhaseSelect(caption, |
| projectTemplate.getAllowedValues(getExtensionClass().getName(), Project.PROPERTY_PHASE), |
| project, isAdmin); |
| } else if (Project.PROPERTY_DESCRIPTION_FORMAT.equals(propertyId)){ |
| field = new ComboBox(caption, Project.TEXT_FORMATS); |
| } |
| return field; |
| } |
| |
| @SuppressWarnings({ "serial" }) |
| @Override |
| protected void initializeField(Object propertyId, Field field) { |
| if (Project.PROPERTY_TEMPLATEID.equals(propertyId)) { |
| ComboBox cb = (ComboBox) field; |
| cb.setItemCaptionPropertyId(ProjectTemplateDataSource.PROPERTY_DISPLAYNAME); |
| cb.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); |
| cb.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); |
| cb.setNewItemsAllowed(false); |
| cb.setNullSelectionAllowed(true); |
| cb.setNullSelectionItemId(ProjectTemplate.DEFAULT_ID); |
| cb.select(project.getProjectTemplateId()); |
| } else if (Project.PROPERTY_PARENT_ENTITY.equals(propertyId)) { |
| final ComboBox cb = (ComboBox) field; |
| cb.setItemCaptionPropertyId(ProjectParentDataSource.PROPERTY_DISPLAYNAME); |
| cb.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); |
| cb.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); |
| cb.setNewItemsAllowed(false); |
| cb.setNullSelectionAllowed(true); |
| cb.select(project.getParentEntity()); |
| cb.addListener(new ValueChangeListener() { |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| context.onPropertyChanged(EntityBase.class.getName(), |
| EntityBase.PROPERTY_PARENT_ENTITY, (EntityBase) cb.getValue()); |
| } |
| }); |
| } else if (Project.PROPERTY_PHASE.equals(propertyId)) { |
| final PhaseSelect cb = (PhaseSelect) field; |
| cb.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH); |
| cb.setNewItemsAllowed(true); |
| cb.setNullSelectionAllowed(false); |
| cb.select(project.getPhase()); |
| } else if (Project.PROPERTY_PROJECTID.equals(propertyId)) { |
| TextField tf = (TextField) field; |
| tf.setCaption(tf.getCaption() + "*"); |
| } else if (Project.PROPERTY_NAME.equals(propertyId)) { |
| TextField tf = (TextField) field; |
| tf.setCaption(tf.getCaption() + "*"); |
| } else if (Project.PROPERTY_DESCRIPTION.equals(propertyId)) { |
| TextField tf = (TextField) field; |
| tf.setRows(3); |
| } else if (Project.PROPERTY_DESCRIPTION_FORMAT.equals(propertyId)){ |
| final ComboBox cb = (ComboBox) field; |
| cb.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH); |
| cb.setNewItemsAllowed(false); |
| cb.setNullSelectionAllowed(false); |
| cb.select(project.getDescriptionFormat()); |
| } |
| } |
| } |
| |
| private static class ProjectParentDataSource extends IndexedContainer { |
| private static final long serialVersionUID = -4944225199628809161L; |
| |
| @PropertyName(position = 0) |
| public static final Object PROPERTY_DISPLAYNAME = "displayName"; |
| |
| public ProjectParentDataSource(Project thisProject) { |
| super(); |
| addContainerProperty(Project.PROPERTY_NAME, String.class, null); |
| addContainerProperty(Project.PROPERTY_PROJECTID, String.class, null); |
| addContainerProperty(PROPERTY_DISPLAYNAME, String.class, null); |
| |
| ProjectTemplateService templateService = Services.getRequiredService(ProjectTemplateService.class); |
| ProjectTemplate thisProjectTemplate = templateService.getProjectTemplateById(thisProject |
| .getProjectTemplateId()); |
| if (thisProjectTemplate == null) { |
| throw new NoSuchTemplateException(thisProject.getUuid(), thisProject.getProjectTemplateId()); |
| } |
| |
| ProjectService projectService = ((ProjectService)EntityServices.getByEntityClass(Project.class)); |
| List<Project> projects = projectService.getAll(); |
| for (Project project : projects) { |
| // skip all projects that thisProject cannot be assigned to |
| // because projectTemplate of the target project does not allow thisProjectTemplate, |
| // and skip all projects that are already in the parent chain of thisProject |
| // to avoid cycles in the parent hierarchy |
| ProjectTemplate projectTemplate = templateService |
| .getProjectTemplateById(project.getProjectTemplateId()); |
| if (projectTemplate == null) { |
| throw new NoSuchTemplateException(project.getUuid(), project.getProjectTemplateId()); |
| } |
| List<Project> parents = projectService.getParentChain(project.getUuid()); |
| if (projectTemplate.isAllowedSubprojectTemplate(thisProjectTemplate) && !parents.contains(thisProject)) { |
| addItem(project); |
| } |
| } |
| sort(new Object[] { Project.PROPERTY_NAME, Project.PROPERTY_PROJECTID }, new boolean[] { true, true }); |
| } |
| |
| private Item addItem(Project project) { |
| // item key = project instance |
| Item item = getItem(project); |
| if (item == null) { |
| item = super.addItem(project); // IndexedContainer#addItem return null, if entry already exists!!! |
| } |
| if (item != null) { |
| String projectId = project.getProjectId(); |
| String name = project.getName(); |
| item.getItemProperty(Project.PROPERTY_NAME).setValue(name); |
| item.getItemProperty(Project.PROPERTY_PROJECTID).setValue(projectId); |
| item.getItemProperty(PROPERTY_DISPLAYNAME).setValue(name + " <" + projectId + ">"); |
| } |
| return item; |
| } |
| } |
| |
| private static class ProjectTemplateDataSource extends IndexedContainer { |
| private static final long serialVersionUID = -5676330321132278052L; |
| |
| @PropertyName(position = 0) |
| public static final Object PROPERTY_DISPLAYNAME = "displayName"; //$NON-NLS-1$ |
| @PropertyName(position = 1) |
| public static final Object PROPERTY_ISDEFAULT = "isDefault"; //$NON-NLS-1$ |
| |
| public ProjectTemplateDataSource(Project thisProject) { |
| super(); |
| addContainerProperty(PROPERTY_ISDEFAULT, Boolean.class, null); |
| addContainerProperty(PROPERTY_DISPLAYNAME, String.class, null); |
| |
| // retrieve the template of the parent project (if any) |
| ProjectTemplate parentProjectTemplate = null; |
| Project parentProject = thisProject.getParentProject(); |
| if (parentProject != null) { |
| ProjectTemplateService templateService = Services.getRequiredService(ProjectTemplateService.class); |
| parentProjectTemplate = templateService.getProjectTemplateById(parentProject.getProjectTemplateId()); |
| if (parentProjectTemplate == null) { |
| throw new NoSuchTemplateException(parentProject.getUuid(), parentProject.getProjectTemplateId()); |
| } |
| } |
| |
| Iterator<ProjectTemplate> it = Services.getServiceIterator(ProjectTemplate.class); |
| while (it.hasNext()) { |
| // skip templates that are not compatible with the template of the parent project (if any) |
| ProjectTemplate projectTemplate = it.next(); |
| if (parentProjectTemplate == null || parentProjectTemplate.isAllowedSubprojectTemplate(projectTemplate)) { |
| addItem(projectTemplate); |
| } |
| } |
| |
| // ensure that "default" is always the first entry in the list; rest ordered by display name |
| sort(new Object[] { PROPERTY_ISDEFAULT, PROPERTY_DISPLAYNAME }, new boolean[] { false, true }); |
| } |
| |
| private Item addItem(ProjectTemplate projectTemplate) { |
| // item key = template identifier |
| String templateId = projectTemplate.getId(); |
| Item item = getItem(templateId); |
| if (item == null) { |
| item = addItem(templateId); // IndexedContainer#addItem return null, if entry already exists!!! |
| } |
| if (item != null) { |
| item.getItemProperty(PROPERTY_ISDEFAULT).setValue( |
| ProjectTemplate.DEFAULT_ID.equals(projectTemplate.getId())); |
| item.getItemProperty(PROPERTY_DISPLAYNAME).setValue(projectTemplate.getDisplayName()); |
| } |
| return item; |
| } |
| } |
| |
| @Override |
| public Class<Project> getExtensionClass() { |
| return Project.class; |
| } |
| |
| @Override |
| public Project newExtensionInstance() { |
| return new Project(); |
| } |
| |
| } |