package org.vaadin.mideaas.frontend;
import java.util.regex.Pattern;
import org.vaadin.mideaas.model.ProjectFile;
import org.vaadin.mideaas.model.SharedProject;
import org.vaadin.mideaas.model.User;
import com.vaadin.data.Item;
import com.vaadin.data.Validator;
import com.vaadin.data.fieldgroup.FieldGroup;
import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.util.PropertysetItem;
import com.vaadin.data.validator.AbstractStringValidator;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Window;
@SuppressWarnings("serial")
public class AddNewWindow extends Window {
private static final Pattern validClass = Pattern
.compile("^[A-Z][A-Za-z1-9_]*$");
private static final Pattern validFile = Pattern
.compile("^[A-Za-z1-9_.]+$");
private static final String VIEW_TYPE = "view";
private static final String CLASS_TYPE = "class";
private static final String FILE_TYPE = "file";
private final SharedProject project;
private final User user;
public AddNewWindow(SharedProject project, User user) {
super("Create a new...");
this.project = project;
this.user = user;
setWidth("60%");
setHeight("60%");
center();
}
@Override
public void attach() {
super.attach();
Component form1 = createComponentForm();
Component form2 = createClassForm();
Component form3 = createFileForm();
TabSheet tabs = new TabSheet(form1, form2, form3);
tabs.setSizeFull();
setContent(tabs);
}
private Validator javaClassValidator = new AbstractStringValidator(
"Not a proper Java class name. Start with a capital letter. Example: MyView") {
@Override
protected boolean isValidValue(String value) {
return validClass.matcher(value).matches();
}
};
private Validator javaFileValidator = new AbstractStringValidator(
"Not a proper Java file name. Start with a capital letter. Example: Jee.java") {
@Override
protected boolean isValidValue(String value) {
return !badJavaFileName(value);
}
};
private Validator filenameValidator = new AbstractStringValidator("Not a valid file name.") {
@Override
protected boolean isValidValue(String value) {
return validFile.matcher(value).matches();
}
};
private Validator viewExistsValidator = new AbstractStringValidator("Already exists.") {
@Override
protected boolean isValidValue(String value) {
return !project.containsProjectItem(value);
}
};
private Validator fileExistsValidator = new AbstractStringValidator("Already exists.") {
@Override
protected boolean isValidValue(String value) {
return !project.containsProjectItem(value);
}
};
private Validator reservedWordValidator = new AbstractStringValidator("Java reserved word.") {
@Override
protected boolean isValidValue(String value) {
return !JavaUtil.isJavaReservedWord(value.toLowerCase());
}
};
private Component createComponentForm() {
AddForm form = new AddForm(VIEW_TYPE, "Add View", javaClassValidator, viewExistsValidator, reservedWordValidator);
form.setCaption("View");
return form;
}
private Component createClassForm() {
AddForm form = new AddForm(CLASS_TYPE, "Add Class", javaClassValidator, viewExistsValidator, reservedWordValidator);
form.setCaption("Java Class");
return form;
}
private Component createFileForm() {
AddForm form = new AddForm(FILE_TYPE, "Add File", filenameValidator, fileExistsValidator, javaFileValidator);
form.setCaption("File");
return form;
}
private class AddForm extends FormLayout {
private TextField name = new TextField("Name:");
private AddForm(String type, String addText,
Validator... nameValidators) {
PropertysetItem item = new PropertysetItem();
item.addItemProperty("type", new ObjectProperty<String>(type));
addItemProperties(item);
name.setRequired(true);
addComponent(name);
final FieldGroup binder = new FieldGroup(item);
binder.bindMemberFields(this);
Button b = new Button(addText);
b.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
try {
binder.commit();
addToProject(binder.getItemDataSource());
} catch (CommitException e) {
}
}
});
addComponent(b);
for (Validator v : nameValidators) {
name.addValidator(v);
}
}
protected void addItemProperties(PropertysetItem item) {
item.addItemProperty("name", new ObjectProperty<String>(""));
}
}
private void addToProject(Item item) {
String type = (String) item.getItemProperty("type").getValue();
String className = (String) item.getItemProperty("name").getValue();
if (VIEW_TYPE.equals(type)) {
project.createView(className, user);
}
else if (CLASS_TYPE.equals(type)) {
String cls = project.getPackageName()+"."+className;
String filename = className+".java";
ProjectFile f = ProjectFile.newJavaFile(filename, JavaUtil.generateClass(cls, null), project.getSourceFileLocation(filename), project.getLog());
project.addFile(f, user);
}
else if (FILE_TYPE.equals(type)) {
ProjectFile f = new ProjectFile(className, "", null, project.getSourceFileLocation(className), project.getLog());
project.addFile(f, user);
}
else {
return;
}
close();
}
private static boolean badJavaFileName(String name) {
return name.endsWith(".java")
&& validClass.matcher(name.subSequence(0, name.length() - 5))
.matches();
}
}