package rtt.ui.dialogs;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionDialog;
import rtt.ui.content.main.ProjectContent;
import rtt.ui.model.RttProject;
/**
* @author C. B�rger
*/
public class JUnitExportDialog extends TitleAreaDialog {
private Text adapterClassText;
private Button overwriteButton;
private Color red;
private RttProject project;
private IPackageFragment adapterPackage;
private String adapterClass;
public JUnitExportDialog(Shell parentShell, ProjectContent projectContent) {
super(parentShell);
setHelpAvailable(false);
setShellStyle(SWT.DIALOG_TRIM);
red = new Color(null, 255, 150, 150);
this.project = projectContent.getProject();
}
@Override
protected void finalize() throws Throwable {
red.dispose();
super.finalize();
}
@Override
protected Control createDialogArea(Composite parent) {
super.setMessage("Generate a JUnit test suite that executes the selected RTT test suite.",
IMessageProvider.INFORMATION);
super.setTitle("Generate JUnit Adapter ...");
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new GridLayout(3, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
Label packageLabel = new Label(container, SWT.NONE);
packageLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
packageLabel.setText("Package:");
final Text adapterPackageText = new Text(container, SWT.BORDER);
adapterPackageText.setEditable(false);
adapterPackageText.setText("");
adapterPackageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
final Shell parentShell = this.getParentShell();
Button btnSelectPackage = new Button(container, SWT.NONE);
btnSelectPackage.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnSelectPackage.setText("Find ...");
btnSelectPackage.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
SelectionDialog createPackageDialog =
JavaUI.createPackageDialog(parentShell, project.getJavaProject(), 0);
if (createPackageDialog.open() == Dialog.OK) {
adapterPackage = (IPackageFragment)createPackageDialog.getResult()[0];
adapterPackageText.setText(adapterPackage.getElementName().equals("") ?
"(default package)" :
adapterPackage.getElementName());
setOkButtonEnabled(true);
}
} catch (JavaModelException e1) {
throw new RuntimeException("RTT Plugin (JUnit export): Cannot open package selection dialog.");
}
}
});
Label classLabel = new Label(container, SWT.NONE);
classLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
classLabel.setText("Class:");
adapterClassText = new Text(container, SWT.BORDER);
adapterClassText.setBackground(red);
adapterClassText.setText("");
adapterClassText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
adapterClassText.addModifyListener(
new ModifyListener() {
@Override public void modifyText(ModifyEvent e) {setOkButtonEnabled(true);}
});
overwriteButton = new Button(container, SWT.CHECK);
overwriteButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
overwriteButton.setAlignment(SWT.CENTER);
overwriteButton.setText("Overwrite");
overwriteButton.setSelection(false);
overwriteButton.addSelectionListener(
new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {setOkButtonEnabled(true);}
});
return area;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
Button okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true);
okButton.setEnabled(false);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
}
public void setOkButtonEnabled(boolean enable) { // Handle invalid selections (enable OK button only if valid)
final String adapterClassName = adapterClassText.getText().trim();
boolean error = true;
if (project.getActiveConfiguration() == null) {
adapterClassText.setBackground(red);
setErrorMessage("Cannot generate JUnit adapter - no active configuration.");
} else if (!isJavaClassName(adapterClassName)) {
adapterClassText.setBackground(red);
setErrorMessage("Please specify a valid class name for the JUnit adapter to generate.");
} else {
if (adapterPackage == null) {
adapterClassText.setBackground(red);
setErrorMessage("Please specify a package for the JUnit adapter to generate.");
} else if (adapterPackage.getCompilationUnit(adapterClassName + ".java").exists() &&
!overwriteButton.getSelection()) {
adapterClassText.setBackground(red);
setErrorMessage("A class with the given name already exists.");
} else {
adapterClassText.setBackground(null);
setErrorMessage(null);
error = false;
}
}
Button okButton = this.getButton(OK);
if (okButton != null) {
getButton(OK).setEnabled(enable && !error);
}
}
private boolean isJavaClassName(String name) {
CharacterIterator iter = new StringCharacterIterator(name);
char c = iter.first();
if (c == CharacterIterator.DONE)
return false;
if (!Character.isJavaIdentifierStart(c) && !Character.isIdentifierIgnorable(c))
return false;
for (c = iter.next(); c != CharacterIterator.DONE; c = iter.next()) {
if (!Character.isJavaIdentifierPart(c) && !Character.isIdentifierIgnorable(c))
return false;
}
return true;
}
@Override
protected void okPressed() {
adapterClass = adapterClassText.getText().trim();
super.okPressed();
}
@Override
protected Point getInitialSize() {
return new Point(500, 200);
}
public String getAdapterClass() {
return adapterClass;
}
public IPackageFragment getAdaperPackage() {
return adapterPackage;
}
}