blob: fec77415e48524fa5433ace977f86966c295acdb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.dltk.internal.ui.refactoring.reorg;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.dltk.internal.corext.refactoring.reorg.IConfirmQuery;
import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgQueries;
import org.eclipse.dltk.internal.ui.dialogs.ListDialog;
import org.eclipse.dltk.ui.ModelElementLabelProvider;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
public class ReorgQueries implements IReorgQueries {
private final Wizard fWizard;
private final Shell fShell;
public ReorgQueries(Wizard wizard){
Assert.isNotNull(wizard);
fWizard= wizard;
fShell= null;
}
public ReorgQueries(Shell shell){
Assert.isNotNull(shell);
fWizard= null;
fShell= shell;
}
private Shell getShell() {
Assert.isTrue(fShell == null || fWizard == null);
Assert.isTrue(fShell != null || fWizard != null);
if (fWizard != null)
return fWizard.getContainer().getShell();
else
return fShell;
}
public IConfirmQuery createYesYesToAllNoNoToAllQuery(String dialogTitle, boolean allowCancel, int queryID) {
return new YesYesToAllNoNoToAllQuery(getShell(), allowCancel, dialogTitle);
}
public IConfirmQuery createYesNoQuery(String dialogTitle, boolean allowCancel, int queryID) {
return new YesNoQuery(getShell(), allowCancel, dialogTitle);
}
public IConfirmQuery createSkipQuery(String dialogTitle, int queryID) {
return new SkipQuery(getShell(), dialogTitle);
}
private static class YesYesToAllNoNoToAllQuery implements IConfirmQuery{
private final boolean fAllowCancel;
private boolean fYesToAll= false;
private boolean fNoToAll= false;
private final Shell fShell;
private final String fDialogTitle;
YesYesToAllNoNoToAllQuery(Shell parent, boolean allowCancel, String dialogTitle){
fShell= parent;
fDialogTitle= dialogTitle;
fAllowCancel= allowCancel;
}
public boolean confirm(final String question) throws OperationCanceledException {
if (fYesToAll)
return true;
if (fNoToAll)
return false;
final int[] result= new int[1];
fShell.getDisplay().syncExec(createQueryRunnable(question, result));
return getResult(result);
}
public boolean confirm(String question, Object[] elements) throws OperationCanceledException {
if (fYesToAll)
return true;
if (fNoToAll)
return false;
final int[] result= new int[1];
fShell.getDisplay().syncExec(createQueryRunnable(question, elements, result));
return getResult(result);
}
private Runnable createQueryRunnable(final String question, final int[] result) {
return new Runnable() {
public void run() {
int[] resultId= getResultIDs();
MessageDialog dialog= new MessageDialog(
fShell,
fDialogTitle,
null,
question,
MessageDialog.QUESTION,
getButtonLabels(),
0);
dialog.open();
if (dialog.getReturnCode() == -1) { //MessageDialog closed without choice => cancel | no
//see also https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400
result[0]= fAllowCancel ? IDialogConstants.CANCEL_ID : IDialogConstants.NO_ID;
} else {
result[0]= resultId[dialog.getReturnCode()];
}
}
private String[] getButtonLabels() {
if (YesYesToAllNoNoToAllQuery.this.fAllowCancel)
return new String[] {
IDialogConstants.YES_LABEL,
IDialogConstants.YES_TO_ALL_LABEL,
IDialogConstants.NO_LABEL,
IDialogConstants.NO_TO_ALL_LABEL,
IDialogConstants.CANCEL_LABEL };
else
return new String[] {
IDialogConstants.YES_LABEL,
IDialogConstants.YES_TO_ALL_LABEL,
IDialogConstants.NO_LABEL,
IDialogConstants.NO_TO_ALL_LABEL};
}
private int[] getResultIDs() {
if (YesYesToAllNoNoToAllQuery.this.fAllowCancel)
return new int[] {
IDialogConstants.YES_ID,
IDialogConstants.YES_TO_ALL_ID,
IDialogConstants.NO_ID,
IDialogConstants.NO_TO_ALL_ID,
IDialogConstants.CANCEL_ID};
else
return new int[] {
IDialogConstants.YES_ID,
IDialogConstants.YES_TO_ALL_ID,
IDialogConstants.NO_ID,
IDialogConstants.NO_TO_ALL_ID};
}
};
}
private Runnable createQueryRunnable(final String question, final Object[] elements, final int[] result) {
return new Runnable() {
public void run() {
ListDialog dialog= new YesNoListDialog(fShell, true);
dialog.setAddCancelButton(false);
dialog.setBlockOnOpen(true);
dialog.setContentProvider(new ArrayContentProvider());
dialog.setLabelProvider(new ModelElementLabelProvider());
dialog.setTitle(fDialogTitle);
dialog.setMessage(question);
dialog.setInput(elements);
dialog.open();
result[0]= dialog.getReturnCode();
}
};
}
private boolean getResult(int[] result) throws OperationCanceledException {
switch(result[0]){
case IDialogConstants.YES_TO_ALL_ID:
fYesToAll= true;
return true;
case IDialogConstants.YES_ID:
return true;
case IDialogConstants.CANCEL_ID:
throw new OperationCanceledException();
case IDialogConstants.NO_ID:
return false;
case IDialogConstants.NO_TO_ALL_ID:
fNoToAll= true;
return false;
default:
Assert.isTrue(false);
return false;
}
}
}
private static class YesNoQuery implements IConfirmQuery{
private final Shell fShell;
private final String fDialogTitle;
private final boolean fAllowCancel;
YesNoQuery(Shell parent, boolean allowCancel, String dialogTitle){
fShell= parent;
fDialogTitle= dialogTitle;
fAllowCancel= allowCancel;
}
public boolean confirm(String question) throws OperationCanceledException {
final int[] result= new int[1];
fShell.getDisplay().syncExec(createQueryRunnable(question, result));
return getResult(result);
}
public boolean confirm(String question, Object[] elements) throws OperationCanceledException {
final int[] result= new int[1];
fShell.getDisplay().syncExec(createQueryRunnable(question, elements, result));
return getResult(result);
}
private Runnable createQueryRunnable(final String question, final int[] result){
return new Runnable() {
public void run() {
MessageDialog dialog= new MessageDialog(
fShell,
fDialogTitle,
null,
question,
MessageDialog.QUESTION,
getButtonLabels(),
0);
dialog.open();
switch (dialog.getReturnCode()) {
case -1 : //MessageDialog closed without choice => cancel | no
//see also https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400
result[0]= fAllowCancel ? IDialogConstants.CANCEL_ID : IDialogConstants.NO_ID;
break;
case 0 :
result[0]= IDialogConstants.YES_ID;
break;
case 1 :
result[0]= IDialogConstants.NO_ID;
break;
case 2 :
if (fAllowCancel)
result[0]= IDialogConstants.CANCEL_ID;
else
Assert.isTrue(false);
break;
default :
Assert.isTrue(false);
break;
}
}
private String[] getButtonLabels() {
if (fAllowCancel)
return new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL };
else
return new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL};
}
};
}
private Runnable createQueryRunnable(final String question, final Object[] elements, final int[] result) {
return new Runnable() {
public void run() {
ListDialog dialog= new YesNoListDialog(fShell, false);
dialog.setAddCancelButton(false);
dialog.setBlockOnOpen(true);
dialog.setContentProvider(new ArrayContentProvider());
dialog.setLabelProvider(new ModelElementLabelProvider());
dialog.setTitle(fDialogTitle);
dialog.setMessage(question);
dialog.setInput(elements);
dialog.open();
result[0]= dialog.getReturnCode();
}
};
}
private boolean getResult(int[] result) throws OperationCanceledException {
switch(result[0]){
case IDialogConstants.YES_ID:
return true;
case IDialogConstants.CANCEL_ID:
throw new OperationCanceledException();
case IDialogConstants.NO_ID:
return false;
default:
Assert.isTrue(false);
return false;
}
}
}
private static class SkipQuery implements IConfirmQuery{
private final Shell fShell;
private final String fDialogTitle;
private boolean fSkipAll;
SkipQuery(Shell parent, String dialogTitle){
fShell= parent;
fDialogTitle= dialogTitle;
fSkipAll= false;
}
public boolean confirm(String question) throws OperationCanceledException {
if (fSkipAll)
return false;
final int[] result= new int[1];
fShell.getDisplay().syncExec(createQueryRunnable(question, result));
return getResult(result);
}
public boolean confirm(String question, Object[] elements) throws OperationCanceledException {
throw new UnsupportedOperationException("Not supported for skip queries"); //$NON-NLS-1$
}
private Runnable createQueryRunnable(final String question, final int[] result){
return new Runnable() {
public void run() {
MessageDialog dialog= new MessageDialog(
fShell,
fDialogTitle,
null,
question,
MessageDialog.QUESTION,
getButtonLabels(),
0);
dialog.open();
switch (dialog.getReturnCode()) {
case -1 : //MessageDialog closed without choice => cancel | no
//see also https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400
result[0]= IDialogConstants.CANCEL_ID;
break;
default:
result[0]= dialog.getReturnCode();
}
}
private String[] getButtonLabels() {
return new String[] {IDialogConstants.SKIP_LABEL, ReorgMessages.ReorgQueries_skip_all, IDialogConstants.CANCEL_LABEL};
}
};
}
private boolean getResult(int[] result) throws OperationCanceledException {
switch(result[0]){
// skip button
case 0:
return false;
// skip all button
case 1:
fSkipAll= true;
return false;
// Cancel button
case 2:
throw new OperationCanceledException();
default:
return false;
}
}
}
private static final class YesNoListDialog extends ListDialog {
private final boolean fYesToAllNoToAll;
private YesNoListDialog(Shell parent, boolean includeYesToAllNoToAll) {
super(parent, SWT.TITLE | SWT.BORDER | SWT.RESIZE | SWT.APPLICATION_MODAL);
fYesToAllNoToAll= includeYesToAllNoToAll;
}
protected void buttonPressed(int buttonId) {
super.buttonPressed(buttonId);
setReturnCode(buttonId);
close();
}
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
if (fYesToAllNoToAll)
createButton(parent, IDialogConstants.YES_TO_ALL_ID, IDialogConstants.YES_TO_ALL_LABEL, false);
createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false);
if (fYesToAllNoToAll)
createButton(parent, IDialogConstants.NO_TO_ALL_ID, IDialogConstants.NO_TO_ALL_LABEL, false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
}
}