/**
* Copyright (c) 2011 committers of YAKINDU 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.generator.genmodel.ui.wizard;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.yakindu.sct.generator.genmodel.ui.wizard.GeneratorComposite.ValidateCallback;
/**
*
* @author holger willebrandt - Initial contribution and API
*/
public class WorkspaceGeneratorWizardPage1 extends IProjectWizardPage {
private static final String GENERATOR_CLASS_REGEX = "([a-zA-Z_][a-zA-Z0-9_]*\\.)+[a-zA-Z_][a-zA-Z0-9_]*"; //$NON-NLS-1$
// project will be an OSGI bundle, so there are some name restrictions
private static final String PROJECT_REGEX = "[A-Za-z0-9\\._]+"; //$NON-NLS-1$
private Text txtProjectName;
private Text txtGeneratorClass;
private Button cbXtend;
private final KeyListenerAdapter textBoxListener = new KeyListenerAdapter() {
@Override
public void keyReleased(KeyEvent e) {
validate();
}
};
private GeneratorComposite generatorComposite;
protected WorkspaceGeneratorWizardPage1(String pageName) {
super(pageName);
}
public void createControl(Composite container) {
Composite parent = new Composite(container, SWT.NULL);
setControl(parent);
parent.setLayout(new GridLayout(1, false));
Composite projectNameGroup = new Composite(parent, SWT.NULL);
projectNameGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true,
false, 1, 1));
projectNameGroup.setLayout(new GridLayout(2, false));
Label lblProjectName = new Label(projectNameGroup, SWT.WRAP);
lblProjectName.setText("Project name:");
txtProjectName = new Text(projectNameGroup, SWT.SINGLE | SWT.BORDER);
txtProjectName.addKeyListener(textBoxListener);
GridDataFactory.fillDefaults().grab(true, false)
.applyTo(txtProjectName);
Label lblGeneratorClass = new Label(projectNameGroup, SWT.WRAP);
lblGeneratorClass.setText("Generator class:");
txtGeneratorClass = new Text(projectNameGroup, SWT.SINGLE | SWT.BORDER);
txtGeneratorClass.addKeyListener(textBoxListener);
GridDataFactory.fillDefaults().grab(true, false)
.applyTo(txtGeneratorClass);
Composite generatorCheckboxGroup = new Composite(parent, SWT.NULL);
generatorCheckboxGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP,
true, false, 1, 1));
generatorCheckboxGroup.setLayout(new GridLayout(2, false));
cbXtend = new Button(generatorCheckboxGroup, SWT.CHECK);
cbXtend.setText("Use Xtend");
ValidateCallback callback = new ValidateCallback() {
public void validate() {
WorkspaceGeneratorWizardPage1.this.validate();
}
};
generatorComposite = new GeneratorComposite(parent, SWT.NONE, callback);
generatorComposite.disableGeneratorClass();
generatorComposite.setGroupEnabled(false);
setPageComplete(false);
}
protected final void validate() {
setPageComplete(checkPageComplete());
}
protected boolean checkPageComplete() {
boolean complete = checkProjectName() && checkGeneratorOptions();
if (complete) {
setErrorMessage(null);
}
return complete;
}
private boolean checkProjectName() {
if (txtProjectName.getText().isEmpty()) {
setErrorMessage("Project name must be set");
return false;
}
if (!txtProjectName.getText().matches(PROJECT_REGEX)) {
setErrorMessage("Invalid Project name");
return false;
}
if (ResourcesPlugin.getWorkspace().getRoot()
.getProject(txtProjectName.getText()).exists()) {
setErrorMessage("Project already exists");
return false;
}
return true;
}
private boolean checkGeneratorOptions() {
if (txtGeneratorClass.getText().isEmpty()) {
setErrorMessage("Generator class must be set");
return false;
}
if (!txtGeneratorClass.getText().matches(GENERATOR_CLASS_REGEX)) {
setErrorMessage("Generator class must be a full qualified java identifier");
return false;
}
String message = generatorComposite.validate();
if (message != null) {
setErrorMessage(message);
return false;
}
return true;
}
@Override
public ProjectData getProjectData() {
ProjectData data = new ProjectData();
data.projectName = txtProjectName.getText().trim();
data.generatorClass = txtGeneratorClass.getText().trim();
data.generatorType = cbXtend.getSelection() ? GeneratorType.Xtend
: GeneratorType.Java;
data.generatorDescription = generatorComposite.getTxtGeneratorDesc()
.getText().trim();
data.generatorId = generatorComposite.getTxtGeneratorId().getText()
.trim();
data.generatorName = generatorComposite.getTxtGeneratorName().getText()
.trim();
data.pluginExport = generatorComposite.isGeneratePlugin();
data.typeLibrary = generatorComposite.isGenerateLibrary();
return data;
}
static abstract class SelectionListenerAdapter implements SelectionListener {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
}
static abstract class KeyListenerAdapter implements KeyListener {
public void keyPressed(KeyEvent e) {
// empty
}
public void keyReleased(KeyEvent e) {
// empty
}
}
}