package org.eclipse.ui.tests.internal.util; | |
import java.util.Iterator; | |
import org.eclipse.jface.dialogs.Dialog; | |
import org.eclipse.jface.dialogs.IDialogConstants; | |
import org.eclipse.jface.dialogs.TitleAreaDialog; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.events.SelectionAdapter; | |
import org.eclipse.swt.events.SelectionEvent; | |
import org.eclipse.swt.events.ShellAdapter; | |
import org.eclipse.swt.events.ShellEvent; | |
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.Group; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Shell; | |
/* | |
* This dialog is intended to verify a dialogs in a testing | |
* environment. The tester can test for sizing, initial focus, | |
* or accessibility. | |
*/ | |
public class VerifyDialog extends TitleAreaDialog { | |
private int SIZING_WIDTH = 400; | |
private static int TEST_TYPE; | |
public static final int TEST_SIZING = 0; | |
public static final int TEST_FOCUS = 1; | |
public static final int TEST_ACCESS = 2; | |
private IDialogTestPass _dialogTests[] = new IDialogTestPass[3]; | |
private Dialog _testDialog; //the dialog to test | |
private Point _testDialogSize; | |
private Label _queryLabel; | |
private Button _yesButton; | |
private Button _noButton; | |
private Button _checkList[]; | |
private String _failureText; | |
/* | |
* Create an instance of the verification dialog. | |
*/ | |
public VerifyDialog(Shell parent) { | |
super(parent); | |
if ( !(TEST_TYPE <= 2) && !(TEST_TYPE >= 0) ) { | |
TEST_TYPE = TEST_SIZING; | |
} | |
_failureText = ""; | |
_dialogTests[0] = new SizingTestPass(); | |
_dialogTests[1] = new FocusTestPass(); | |
_dialogTests[2] = new AccessibilityTestPass(); | |
} | |
/* (non-Javadoc) | |
* Method declared on Window. | |
*/ | |
protected void configureShell(Shell newShell) { | |
super.configureShell(newShell); | |
newShell.setText("Dialog Verification"); | |
setShellStyle(SWT.NONE); | |
} | |
/* (non-Javadoc) | |
* Method declared on Dialog. | |
*/ | |
protected void createButtonsForButtonBar(Composite parent) { | |
_yesButton = createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true); | |
_noButton = createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false); | |
} | |
/* (non-Javadoc) | |
* Method declared on Dialog. | |
*/ | |
protected void buttonPressed(int buttonId) { | |
if (IDialogConstants.YES_ID == buttonId) { | |
setReturnCode(IDialogConstants.YES_ID); | |
if (_testDialog.getShell() != null) { | |
_testDialog.close(); | |
} | |
close(); | |
} else if (IDialogConstants.NO_ID == buttonId) { | |
handleFailure(); | |
} | |
} | |
/* (non-Javadoc) | |
* Method declared on Dialog. | |
*/ | |
protected Control createDialogArea(Composite parent) { | |
// top level composite | |
Composite parentComposite = (Composite)super.createDialogArea(parent); | |
// create a composite with standard margins and spacing | |
Composite composite = new Composite(parentComposite, SWT.NONE); | |
composite.setSize(SIZING_WIDTH, SWT.DEFAULT); | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); | |
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); | |
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); | |
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); | |
composite.setLayout(layout); | |
composite.setLayoutData(new GridData(GridData.FILL_BOTH)); | |
createTestSelectionGroup(composite); | |
createCheckListGroup(composite); | |
_queryLabel = new Label(composite, SWT.NONE); | |
_queryLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); | |
initializeTest(); | |
return composite; | |
} | |
/* | |
* Group for selecting type of test. | |
*/ | |
private void createTestSelectionGroup(Composite parent) { | |
Group group = new Group(parent, SWT.SHADOW_NONE); | |
group.setText("Testing:"); | |
group.setLayout( new GridLayout() ); | |
GridData data = new GridData(GridData.FILL_HORIZONTAL); | |
group.setLayoutData(data); | |
for (int i = 0; i < _dialogTests.length; i++) { | |
Button radio = new Button(group, SWT.RADIO); | |
radio.setText( _dialogTests[i].label() ); | |
final int testID = _dialogTests[i].getID(); | |
radio.addSelectionListener(new SelectionAdapter() { | |
public void widgetSelected(SelectionEvent e) { | |
TEST_TYPE = testID; | |
initializeTest(); | |
_yesButton.setEnabled(true); | |
} | |
}); | |
if ( TEST_TYPE == _dialogTests[i].getID() ) { | |
radio.setSelection(true); | |
} | |
} | |
} | |
/* | |
* Initializes the checklist with empty checks. | |
*/ | |
private void createCheckListGroup(Composite parent) { | |
Group group = new Group(parent, SWT.SHADOW_NONE); | |
group.setText("Verify that:"); | |
group.setLayout( new GridLayout() ); | |
GridData data = new GridData(GridData.FILL_HORIZONTAL); | |
group.setLayoutData(data); | |
int checkListSize = 0; | |
for (int i = 0; i < _dialogTests.length; i++) { | |
int size = _dialogTests[i].checkListTexts().size(); | |
if (size > checkListSize) { | |
checkListSize = size; | |
} | |
} | |
_checkList = new Button[checkListSize]; | |
SelectionAdapter selectionAdapter = new SelectionAdapter() { | |
public void widgetSelected(SelectionEvent e) { | |
checkYesEnable(); | |
} | |
}; | |
for (int i = 0; i < checkListSize; i++) { | |
_checkList[i] = new Button(group, SWT.CHECK); | |
_checkList[i].addSelectionListener(selectionAdapter); | |
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); | |
data.grabExcessHorizontalSpace = true; | |
_checkList[i].setLayoutData(data); | |
} | |
} | |
/* | |
* Disables the yes button if any of the items in the checklist | |
* are unchecked. Enables the yes button otherwise. | |
*/ | |
private void checkYesEnable() { | |
boolean enable = true; | |
for (int i = 0; i < _checkList.length; i++) { | |
if ( !_checkList[i].getSelection() ) { | |
enable = false; | |
} | |
} | |
_yesButton.setEnabled(enable); | |
} | |
/* | |
* Initializes the checklist, banner texts, and query label | |
*/ | |
private void initializeTest() { | |
IDialogTestPass test = _dialogTests[TEST_TYPE]; | |
setTitle( test.title() ); | |
setMessage( test.description() ); | |
Iterator iterator = test.checkListTexts().iterator(); | |
for (int i = 0; i < _checkList.length; i++) { | |
if ( iterator.hasNext() ) { | |
_checkList[i].setText( iterator.next().toString() ); | |
_checkList[i].setVisible(true); | |
_checkList[i].update(); | |
} else { | |
_checkList[i].setVisible(false); | |
_checkList[i].update(); | |
} | |
_checkList[i].setSelection(true); | |
} | |
_queryLabel.setText( test.queryText() ); | |
} | |
public String getFailureText() { | |
return _failureText; | |
} | |
/* | |
* Can't open the verification dialog without a specified | |
* test dialog, this simply returns a failure and prevents | |
* opening. Should use open(Dialog) instead. | |
* | |
*/ | |
public int open() { | |
_failureText = "Testing dialog is required, use VerifyDialog::open(Dialog)"; | |
return IDialogConstants.NO_ID; | |
} | |
/* | |
* Opens the verification dialog to test the specified dialog. | |
*/ | |
public int open(Dialog testDialog) { | |
if (getShell() == null) { | |
create(); | |
} | |
getShell().setLocation(0, 0); | |
getShell().setSize(Math.max(SIZING_WIDTH, getShell().getSize().x), getShell().getSize().y); | |
_testDialog = testDialog; | |
if (_testDialog.getShell() == null) { | |
_testDialog.create(); | |
} | |
_testDialogSize = _testDialog.getShell().getSize(); | |
openNewTestDialog(); | |
return super.open(); | |
} | |
/* | |
* Opens the dialog to be verified. | |
*/ | |
private void openNewTestDialog() { | |
if (_testDialog.getShell() == null) { | |
_testDialog.create(); | |
} | |
_testDialog.setBlockOnOpen(false); | |
_testDialog.getShell().setLocation(getShell().getSize().x + 1, 0); | |
_testDialog.getShell().setSize(_testDialogSize); | |
_testDialog.getShell().addShellListener(new ShellAdapter() { | |
public void shellClosed(ShellEvent e) { | |
e.doit = false; | |
} | |
}); | |
_testDialog.open(); | |
} | |
/* | |
* The test dialog failed, open the failure dialog. | |
*/ | |
private void handleFailure() { | |
IDialogTestPass test = _dialogTests[TEST_TYPE]; | |
StringBuffer text = new StringBuffer(); | |
String label = test.label(); | |
label = label.substring(0, label.indexOf("&")) + | |
label.substring(label.indexOf("&") + 1); | |
text.append(label). | |
append(" failed on the "). | |
append(SWT.getPlatform()). | |
append(" platform:\n"); | |
String failureMessages[] = test.failureTexts(); | |
for (int i = 0; i < test.checkListTexts().size(); i++) { | |
if ( !_checkList[i].getSelection() ) { | |
text.append("- ").append(failureMessages[i]).append("\n"); | |
} | |
} | |
FailureDialog dialog = new FailureDialog( getShell() ); | |
dialog.create(); | |
String temp = text.toString(); | |
dialog.setText( text.toString() ); | |
if (dialog.open() == IDialogConstants.OK_ID) { | |
_failureText = dialog.toString(); | |
setReturnCode(IDialogConstants.NO_ID); | |
if (_testDialog.getShell() != null) { | |
_testDialog.close(); | |
} | |
close(); | |
} | |
} | |
/* | |
* In case the shell was closed by a means other than | |
* the NO button. | |
*/ | |
protected void handleShellCloseEvent() { | |
handleFailure(); | |
} | |
} | |