/******************************************************************************* | |
* Copyright (c) 2011 CEA LIST. | |
* 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: | |
* Nicolas Bros (Mia-Software) - Bug 366367 - To be able to change the "CanBePresentedInTheTable" query | |
* Gregoire Dupe (Mia-Software) - Bug 373248 - Clean PMD errors | |
* Gregoire Dupe (Mia-Software) - Bug 374903 - [Table] ITableWidget.setLoadedFacetSets | |
*******************************************************************************/ | |
package org.eclipse.modisco.facet.util.ui.internal.dialog; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.eclipse.modisco.facet.util.ui.internal.Messages; | |
import org.eclipse.modisco.facet.util.ui.internal.exported.dialog.IDialogCallback; | |
import org.eclipse.modisco.facet.util.ui.internal.exported.dialog.IQuestionDialog; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.events.SelectionAdapter; | |
import org.eclipse.swt.events.SelectionEvent; | |
import org.eclipse.swt.graphics.Point; | |
import org.eclipse.swt.graphics.Rectangle; | |
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.Display; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Shell; | |
/** | |
* A yes/no dialog, that replicates the JFace MessageDialog#openQuestion, but is designed to be easily testable with JUnit | |
* | |
* @since 0.2 | |
*/ | |
public class QuestionDialog implements IQuestionDialog { | |
private static final int SHELL_WIDTH = 450; | |
private static final int SHELL_HEIGHT = 170; | |
private final Shell parentShell; | |
private final List<Runnable> listeners = new ArrayList<Runnable>(); | |
private Boolean result = null; | |
private Shell shell; | |
private Button btnYes; | |
private Button btnNo; | |
private final String title; | |
private final String message; | |
private IDialogCallback<Boolean> callback; | |
public QuestionDialog(final Shell parent, final String title, | |
final String message, final IDialogCallback<Boolean> callback) { | |
this.parentShell = parent; | |
this.title = title; | |
this.message = message; | |
this.callback = callback; | |
createContents(); | |
} | |
/** | |
* Open the dialog. | |
* | |
* @return the result | |
*/ | |
public final void open() { | |
this.shell.layout(); | |
// center the shell on its parent (if not parent shell then it will not be centered) | |
if (this.parentShell != null) { | |
final Rectangle parentShellBounds = this.parentShell.getBounds(); | |
final Point shellSize = this.shell.getSize(); | |
this.shell.setLocation( | |
parentShellBounds.x + (parentShellBounds.width - shellSize.x) / 2, | |
parentShellBounds.y + (parentShellBounds.height - shellSize.y) / 2); | |
} | |
this.shell.open(); | |
} | |
/** Create the contents of the dialog. */ | |
private void createContents() { | |
final int buttonWidthHint = 80; | |
this.shell = new Shell(this.parentShell, SWT.BORDER | SWT.RESIZE | SWT.TITLE | |
| SWT.APPLICATION_MODAL); | |
this.shell.setSize(QuestionDialog.SHELL_WIDTH, | |
QuestionDialog.SHELL_HEIGHT); | |
this.shell.setText(this.title); | |
final GridLayout shellLayout = new GridLayout(2, false); | |
// constants to make checkstyle happy | |
final int marginLeft = 5; | |
final int marginTop = 8; | |
final int verticalSpacing = 10; | |
final int horizontalSpacing = 15; | |
shellLayout.marginLeft = marginLeft; | |
shellLayout.marginTop = marginTop; | |
shellLayout.verticalSpacing = verticalSpacing; | |
shellLayout.horizontalSpacing = horizontalSpacing; | |
this.shell.setLayout(shellLayout); | |
final Label image = new Label(this.shell, SWT.NONE); | |
image.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); | |
image.setImage(Display.getDefault().getSystemImage(SWT.ICON_QUESTION)); | |
final Label labelMessage = new Label(this.shell, SWT.WRAP); | |
labelMessage.setText(this.message); | |
labelMessage.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
final Composite buttonsComposite = new Composite(this.shell, SWT.NONE); | |
final int buttonsCompositeColumns = 3; | |
buttonsComposite.setLayout(new GridLayout(buttonsCompositeColumns, false)); | |
buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); | |
final Composite paddingComposite = new Composite(buttonsComposite, SWT.NONE); | |
final GridData paddingCompositeGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); | |
paddingCompositeGridData.heightHint = 0; | |
paddingComposite.setLayoutData(paddingCompositeGridData); | |
this.btnYes = new Button(buttonsComposite, SWT.NONE); | |
final GridData button1GridData = new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1); | |
button1GridData.widthHint = buttonWidthHint; | |
this.btnYes.setLayoutData(button1GridData); | |
this.btnYes.setText(Messages.QuestionDialog_yes); | |
this.btnYes.addSelectionListener(new SelectionAdapter() { | |
@Override | |
public void widgetSelected(final SelectionEvent e) { | |
pressYes(); | |
} | |
}); | |
this.btnNo = new Button(buttonsComposite, SWT.NONE); | |
final GridData button2GridData = new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1); | |
button2GridData.widthHint = buttonWidthHint; | |
this.btnNo.setLayoutData(button2GridData); | |
this.btnNo.setText(Messages.QuestionDialog_no); | |
this.btnNo.addSelectionListener(new SelectionAdapter() { | |
@Override | |
public void widgetSelected(final SelectionEvent e) { | |
pressNo(); | |
} | |
}); | |
} | |
public final void pressYes() { | |
if (this.shell.isDisposed()) { | |
throw new UnsupportedOperationException("Dialog is disposed"); //$NON-NLS-1$ | |
} | |
this.result = Boolean.TRUE; | |
this.shell.dispose(); | |
notifyListeners(); | |
} | |
public final void pressNo() { | |
if (this.shell.isDisposed()) { | |
throw new UnsupportedOperationException("Dialog is disposed"); //$NON-NLS-1$ | |
} | |
this.result = Boolean.FALSE; | |
this.shell.dispose(); | |
notifyListeners(); | |
} | |
private synchronized void notifyListeners() { | |
if (this.callback != null) { | |
this.callback.committed(getResult()); | |
} | |
for (final Runnable listener : new ArrayList<Runnable>(this.listeners)) { | |
listener.run(); | |
} | |
} | |
public synchronized void addCloseListener(final Runnable runnable) { | |
this.listeners.add(runnable); | |
} | |
public final Boolean getResult() { | |
return this.result; | |
} | |
public final Shell getShell() { | |
return this.shell; | |
} | |
} |