/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) 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
*/
package org.jabylon.rest.ui.wicket.config.sections;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jabylon.common.team.TeamProviderUtil;
import org.jabylon.properties.Project;
import org.jabylon.properties.PropertiesPackage;
import org.jabylon.properties.Workspace;
import org.jabylon.properties.types.PropertyScanner;
import org.jabylon.properties.util.PropertyResourceUtil;
import org.jabylon.rest.ui.model.AttachableModel;
import org.jabylon.rest.ui.model.EObjectPropertyModel;
import org.jabylon.rest.ui.wicket.BasicPanel;
import org.jabylon.rest.ui.wicket.components.ControlGroup;
import org.jabylon.rest.ui.wicket.validators.TerminologyProjectValidator;
import org.jabylon.rest.ui.wicket.validators.UniqueNameValidator;
public class ProjectConfigSection extends BasicPanel<Project> {
private static final long serialVersionUID = 1L;
public ProjectConfigSection(String id, IModel<Project> model) {
super(id, model, new PageParameters());
setOutputMarkupId(true);
ControlGroup nameGroup = new ControlGroup("name-group",nls("ProjectConfigSection.name.label"));
IModel<String> nameProperty = new EObjectPropertyModel<String, Project>(model, PropertiesPackage.Literals.RESOLVABLE__NAME);
TextField<String> field = new RequiredTextField<String>("inputName", nameProperty);
field.add(new UniqueNameValidator(getUsedProjectNames(model)));
nameGroup.add(field);
add(nameGroup);
ControlGroup typeGroup = new ControlGroup("type-group",nls("ProjectConfigSection.project.type.choice"));
EObjectPropertyModel<String, Project> typeModel = new EObjectPropertyModel<String, Project>(model, PropertiesPackage.Literals.PROJECT__PROPERTY_TYPE);
DropDownChoice<String> typeChoice = new DropDownChoice<String>("inputType", typeModel, new ArrayList<String>(PropertyResourceUtil.getPropertyScanners().keySet()));
typeGroup.add(typeChoice);
add(typeGroup);
//use actual service
List<String> teamProviders = new ArrayList<String>();
List<String> availableTeamProviders = TeamProviderUtil.getAvailableTeamProviders();
teamProviders.add("None");
teamProviders.addAll(availableTeamProviders);
ControlGroup teamproviderGroup = new ControlGroup("teamprovider-group", nls("ProjectConfigSection.team.provider.choice"));
EObjectPropertyModel<String, Project> teamProviderModel = new EObjectPropertyModel<String, Project>(model, PropertiesPackage.Literals.PROJECT__TEAM_PROVIDER);
DropDownChoice<String> teamProviderChoice = new DropDownChoice<String>("inputTeamProvider", teamProviderModel, teamProviders);
teamproviderGroup.add(teamProviderChoice);
add(teamproviderGroup);
ControlGroup terminologyGroup = new ControlGroup("terminology-group", nls("ProjectConfigSection.terminology.label"), nls("ProjectConfigSection.terminology.description"));
EObjectPropertyModel<Boolean, Project> terminologyModel = new EObjectPropertyModel<Boolean, Project>(model, PropertiesPackage.Literals.PROJECT__TERMINOLOGY);
CheckBox terminology = new CheckBox("inputTerminology", terminologyModel);
terminology.add(new TerminologyProjectValidator(model));
add(terminologyGroup);
terminologyGroup.add(terminology);
ListView<String> defaultIncludes = new ListView<String>("default-includes",new ArrayList<String>(PropertyResourceUtil.getPropertyScanners().keySet())) {
private static final long serialVersionUID = 9179714969731553212L;
@Override
protected void populateItem(ListItem<String> item) {
item.add(new AttributeAppender("type", item.getModelObject()));
PropertyScanner scanner = PropertyResourceUtil.getPropertyScanners().get(item.getModelObject());
String[] includes = scanner.getDefaultIncludes();
StringBuilder builder = new StringBuilder();
for (String include : includes) {
builder.append(include);
builder.append("\n");
}
item.add(new AttributeAppender("include", builder.toString()));
String[] excludes = scanner.getDefaultExcludes();
builder = new StringBuilder();
for (String exclude : excludes) {
builder.append(exclude);
builder.append("\n");
}
item.add(new AttributeAppender("exclude", builder.toString()));
}
};
add(defaultIncludes);
ControlGroup announceGroup = new ControlGroup("announce-group",nls("ProjectConfigSection.project.announce.label"),nls("ProjectConfigSection.project.announce.help"));
EObjectPropertyModel<String, Project> announceModel = new EObjectPropertyModel<String, Project>(model, PropertiesPackage.Literals.PROJECT__ANNOUNCEMENT);
TextArea<String> announceField = new TextArea<String>("inputAnnounce", announceModel);
announceGroup.add(announceField);
add(announceGroup);
}
private static Set<String> getUsedProjectNames(IModel<Project> model) {
Workspace workspace = model.getObject().getParent();
if(workspace==null) {
if (model instanceof AttachableModel<?>) {
AttachableModel<?> a = (AttachableModel<?>) model;
Object parent = a.getParent().getObject();
if (parent instanceof Workspace) {
workspace = (Workspace) parent;
}
}
}
Set<String> usedNames = new HashSet<String>();
if(workspace!=null) {
for (Project project : workspace.getChildren()) {
if(project!=model.getObject())
usedNames.add(project.getName());
}
}
return usedNames;
}
}